diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,22 @@
 # Revision history for haskell-lsp-types
 
+## 0.7.0.0 -- 2018-08-14
+
+* Update CompletionItem
+ * Add `commitCharacters` field
+ * Add `MarkupContent` option for `documentation`
+ * Add `preselect` field
+* Add CompletionContext
+* Add new server capabilities
+* Add workspace folder support
+* Add document color and color presentation
+* Add folding range support
+* Add goto type support
+* s/TH/Types/g
+ * Move all types into haskell-lsp-types
+ * Hide Language.Haskell.LSP.TH.DataTypesJSON - Use Language.Haskell.LSP.Types instead
+* Add lenses for Language.Haskell.LSP.Types.Capabilities
+
 ## 0.6.0.0  -- 2018-08-06
 
 * Add new DocumentSymbol type and hierarchal support
diff --git a/haskell-lsp-types.cabal b/haskell-lsp-types.cabal
--- a/haskell-lsp-types.cabal
+++ b/haskell-lsp-types.cabal
@@ -1,5 +1,5 @@
 name:                haskell-lsp-types
-version:             0.6.0.0
+version:             0.7.0.0
 synopsis:            Haskell library for the Microsoft Language Server Protocol, data types
 
 description:         An implementation of the types to allow language implementors to
@@ -17,24 +17,30 @@
 cabal-version:       >=1.10
 
 library
-  exposed-modules:     Language.Haskell.LSP.TH.ClientCapabilities
-                     , Language.Haskell.LSP.TH.Constants
-                     , Language.Haskell.LSP.TH.DataTypesJSON
-                     , Language.Haskell.LSP.TH.MessageFuncs
-                     , Language.Haskell.LSP.TH.Utils
-  other-modules:       Language.Haskell.LSP.TH.CodeAction
-                     , Language.Haskell.LSP.TH.Command
-                     , Language.Haskell.LSP.TH.Completion
-                     , Language.Haskell.LSP.TH.Diagnostic
-                     , Language.Haskell.LSP.TH.DocumentFilter
-                     , Language.Haskell.LSP.TH.List
-                     , Language.Haskell.LSP.TH.Location
-                     , Language.Haskell.LSP.TH.MarkupContent
-                     , Language.Haskell.LSP.TH.Message
-                     , Language.Haskell.LSP.TH.Symbol
-                     , Language.Haskell.LSP.TH.TextDocument
-                     , Language.Haskell.LSP.TH.Uri
-                     , Language.Haskell.LSP.TH.WorkspaceEdit
+  exposed-modules:     Language.Haskell.LSP.Types
+                     , Language.Haskell.LSP.Types.Capabilities
+                     , Language.Haskell.LSP.Types.Constants
+                     , Language.Haskell.LSP.Types.MessageFuncs
+                     , Language.Haskell.LSP.Types.Utils
+  other-modules:       Language.Haskell.LSP.Types.ClientCapabilities
+                     , Language.Haskell.LSP.Types.CodeAction
+                     , Language.Haskell.LSP.Types.Color
+                     , Language.Haskell.LSP.Types.Command
+                     , Language.Haskell.LSP.Types.Completion
+                     , Language.Haskell.LSP.Types.DataTypesJSON
+                     , Language.Haskell.LSP.Types.Diagnostic
+                     , Language.Haskell.LSP.Types.DocumentFilter
+                     , Language.Haskell.LSP.Types.FoldingRange
+                     , Language.Haskell.LSP.Types.Lens
+                     , Language.Haskell.LSP.Types.List
+                     , Language.Haskell.LSP.Types.Location
+                     , Language.Haskell.LSP.Types.MarkupContent
+                     , Language.Haskell.LSP.Types.Message
+                     , Language.Haskell.LSP.Types.Symbol
+                     , Language.Haskell.LSP.Types.TextDocument
+                     , Language.Haskell.LSP.Types.Uri
+                     , Language.Haskell.LSP.Types.WorkspaceEdit
+                     , Language.Haskell.LSP.Types.WorkspaceFolders
  -- other-extensions:
   ghc-options:         -Wall
   -- ghc-options:         -Werror
diff --git a/src/Language/Haskell/LSP/TH/ClientCapabilities.hs b/src/Language/Haskell/LSP/TH/ClientCapabilities.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/ClientCapabilities.hs
+++ /dev/null
@@ -1,1013 +0,0 @@
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE TemplateHaskell       #-}
-
-module Language.Haskell.LSP.TH.ClientCapabilities where
-
-import           Data.Aeson.TH
-import qualified Data.Aeson as A
-import Language.Haskell.LSP.TH.Constants
-import Language.Haskell.LSP.TH.CodeAction
-import Language.Haskell.LSP.TH.Completion
-import Language.Haskell.LSP.TH.List
-import Language.Haskell.LSP.TH.MarkupContent
-import Language.Haskell.LSP.TH.Symbol
-import Data.Default
-
-{-# ANN module "HLint: ignore Use newtype instead of data" #-}
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-/**
- * Workspace specific client capabilities.
- */
-export interface WorkspaceClientCapabilities {
-        /**
-         * The client supports applying batch edits to the workspace by supporting
-         * the request 'workspace/applyEdit'
-         */
-        applyEdit?: boolean;
-
-        /**
-         * Capabilities specific to `WorkspaceEdit`s
-         */
-        workspaceEdit?: {
-                /**
-                 * The client supports versioned document changes in `WorkspaceEdit`s
-                 */
-                documentChanges?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `workspace/didChangeConfiguration` notification.
-         */
-        didChangeConfiguration?: {
-                /**
-                 * Did change configuration notification supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
-         */
-        didChangeWatchedFiles?: {
-                /**
-                 * Did change watched files notification supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `workspace/symbol` request.
-         */
-        symbol?: {
-                /**
-                 * Symbol request supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-
-                /**
-                 * Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
-                 */
-                symbolKind?: {
-                        /**
-                         * The symbol kind values the client supports. When this
-                         * property exists the client also guarantees that it will
-                         * handle values outside its set gracefully and falls back
-                         * to a default value when unknown.
-                         *
-                         * If this property is not present the client only supports
-                         * the symbol kinds from `File` to `Array` as defined in
-                         * the initial version of the protocol.
-                         */
-                        valueSet?: SymbolKind[];
-                }
-        };
-
-        /**
-         * Capabilities specific to the `workspace/executeCommand` request.
-         */
-        executeCommand?: {
-                /**
-                 * Execute command supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * The client has support for workspace folders.
-         *
-         * Since 3.6.0
-         */
-        workspaceFolders?: boolean;
-
-        /**
-         * The client supports `workspace/configuration` requests.
-         *
-         * Since 3.6.0
-         */
-        configuration?: boolean;
-}
--}
-
--- -------------------------------------
-
-data WorkspaceEditClientCapabilities =
-  WorkspaceEditClientCapabilities
-  { _documentChanges :: Maybe Bool -- ^The client supports versioned document
-                                   -- changes in `WorkspaceEdit`s
-  } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''WorkspaceEditClientCapabilities)
-
--- -------------------------------------
-
-data DidChangeConfigurationClientCapabilities =
-  DidChangeConfigurationClientCapabilities
-    { _dynamicRegistration :: Maybe Bool -- ^Did change configuration
-                                         -- notification supports dynamic
-                                         -- registration.
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''DidChangeConfigurationClientCapabilities)
-
--- -------------------------------------
-
-data DidChangeWatchedFilesClientCapabilities =
-  DidChangeWatchedFilesClientCapabilities
-    { _dynamicRegistration :: Maybe Bool -- ^Did change watched files
-                                         -- notification supports dynamic
-                                         -- registration.
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''DidChangeWatchedFilesClientCapabilities)
-
--- -------------------------------------
-
-data SymbolKindClientCapabilities =
-  SymbolKindClientCapabilities
-   { -- | The symbol kind values the client supports. When this
-     -- property exists the client also guarantees that it will
-     -- handle values outside its set gracefully and falls back
-     -- to a default value when unknown.
-     -- 
-     -- If this property is not present the client only supports
-     -- the symbol kinds from `File` to `Array` as defined in
-     -- the initial version of the protocol. 
-     _valueSet :: Maybe (List SymbolKind)
-   } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''SymbolKindClientCapabilities)
-
-instance Default SymbolKindClientCapabilities where
-  def = SymbolKindClientCapabilities (Just $ List allKinds)
-    where allKinds = [ SkFile
-                     , SkModule
-                     , SkNamespace
-                     , SkPackage
-                     , SkClass
-                     , SkMethod
-                     , SkProperty
-                     , SkField
-                     , SkConstructor
-                     , SkEnum
-                     , SkInterface
-                     , SkFunction
-                     , SkVariable
-                     , SkConstant
-                     , SkString
-                     , SkNumber
-                     , SkBoolean
-                     , SkArray
-                     ]
-
-data SymbolClientCapabilities =
-  SymbolClientCapabilities
-    { _dynamicRegistration :: Maybe Bool -- ^Symbol request supports dynamic
-                                         -- registration.
-    , _symbolKind :: Maybe SymbolKindClientCapabilities -- ^ Specific capabilities for the `SymbolKind`.
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''SymbolClientCapabilities)
-
--- -------------------------------------
-
-data ExecuteClientCapabilities =
-  ExecuteClientCapabilities
-    { _dynamicRegistration :: Maybe Bool -- ^Execute command supports dynamic
-                                         -- registration.
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''ExecuteClientCapabilities)
-
--- -------------------------------------
-
-data WorkspaceClientCapabilities =
-  WorkspaceClientCapabilities
-    { -- | The client supports applying batch edits to the workspace by supporting
-      -- the request 'workspace/applyEdit'
-      _applyEdit :: Maybe Bool
-
-      -- | Capabilities specific to `WorkspaceEdit`s
-    , _workspaceEdit :: Maybe WorkspaceEditClientCapabilities
-
-      -- | Capabilities specific to the `workspace/didChangeConfiguration` notification.
-    , _didChangeConfiguration :: Maybe DidChangeConfigurationClientCapabilities
-
-       -- | Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
-    , _didChangeWatchedFiles :: Maybe DidChangeWatchedFilesClientCapabilities
-
-      -- | Capabilities specific to the `workspace/symbol` request.
-    , _symbol :: Maybe SymbolClientCapabilities
-
-      -- | Capabilities specific to the `workspace/executeCommand` request.
-    , _executeCommand :: Maybe ExecuteClientCapabilities
-
-      -- | The client has support for workspace folders.
-    , _workspaceFolders :: Maybe Bool
-
-      -- | The client supports `workspace/configuration` requests.
-    , _configuration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''WorkspaceClientCapabilities)
-
-instance Default WorkspaceClientCapabilities where
-  def = WorkspaceClientCapabilities def def def def def def def def
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-/**
- * Text document specific client capabilities.
- */
-export interface TextDocumentClientCapabilities {
-
-        synchronization?: {
-                /**
-                 * Whether text document synchronization supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-
-                /**
-                 * The client supports sending will save notifications.
-                 */
-                willSave?: boolean;
-
-                /**
-                 * The client supports sending a will save request and
-                 * waits for a response providing text edits which will
-                 * be applied to the document before it is saved.
-                 */
-                willSaveWaitUntil?: boolean;
-
-                /**
-                 * The client supports did save notifications.
-                 */
-                didSave?: boolean;
-        }
-
-        /**
-         * Capabilities specific to the `textDocument/completion`
-         */
-        completion?: {
-                /**
-                 * Whether completion supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-
-                /**
-                 * The client supports the following `CompletionItem` specific
-                 * capabilities.
-                 */
-                completionItem?: {
-                        /**
-                         * Client supports snippets as insert text.
-                         *
-                         * A snippet can define tab stops and placeholders with `$1`, `$2`
-                         * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
-                         * the end of the snippet. Placeholders with equal identifiers are linked,
-                         * that is typing in one will update others too.
-                         */
-                        snippetSupport?: boolean;
-
-                        /**
-                         * Client supports commit characters on a completion item.
-                         */
-                        commitCharactersSupport?: boolean
-
-                        /**
-                         * Client supports the follow content formats for the documentation
-                         * property. The order describes the preferred format of the client.
-                         */
-                        documentationFormat?: MarkupKind[];
-
-                        /**
-                         * Client supports the deprecated property on a completion item.
-                         */
-                        deprecatedSupport?: boolean;
-
-                        /**
-                         * Client supports the preselect property on a completion item.
-                         */
-                        preselectSupport?: boolean;
-                }
-
-                completionItemKind?: {
-                        /**
-                         * The completion item kind values the client supports. When this
-                         * property exists the client also guarantees that it will
-                         * handle values outside its set gracefully and falls back
-                         * to a default value when unknown.
-                         *
-                         * If this property is not present the client only supports
-                         * the completion items kinds from `Text` to `Reference` as defined in
-                         * the initial version of the protocol.
-                         */
-                        valueSet?: CompletionItemKind[];
-                },
-
-                /**
-                 * The client supports to send additional context information for a
-                 * `textDocument/completion` request.
-                 */
-                contextSupport?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/hover`
-         */
-        hover?: {
-                /**
-                 * Whether hover supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-
-                /**
-                 * Client supports the follow content formats for the content
-                 * property. The order describes the preferred format of the client.
-                 */
-                contentFormat?: MarkupKind[];
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/signatureHelp`
-         */
-        signatureHelp?: {
-                /**
-                 * Whether signature help supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-
-                /**
-                 * The client supports the following `SignatureInformation`
-                 * specific properties.
-                 */
-                signatureInformation?: {
-                        /**
-                         * Client supports the follow content formats for the documentation
-                         * property. The order describes the preferred format of the client.
-                         */
-                        documentationFormat?: MarkupKind[];
-                };
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/references`
-         */
-        references?: {
-                /**
-                 * Whether references supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/documentHighlight`
-         */
-        documentHighlight?: {
-                /**
-                 * Whether document highlight supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/documentSymbol`
-         */
-        documentSymbol?: {
-                /**
-                 * Whether document symbol supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-
-                /**
-                 * Specific capabilities for the `SymbolKind`.
-                 */
-                symbolKind?: {
-                        /**
-                         * The symbol kind values the client supports. When this
-                         * property exists the client also guarantees that it will
-                         * handle values outside its set gracefully and falls back
-                         * to a default value when unknown.
-                         *
-                         * If this property is not present the client only supports
-                         * the symbol kinds from `File` to `Array` as defined in
-                         * the initial version of the protocol.
-                         */
-                        valueSet?: SymbolKind[];
-                }
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/formatting`
-         */
-        formatting?: {
-                /**
-                 * Whether formatting supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/rangeFormatting`
-         */
-        rangeFormatting?: {
-                /**
-                 * Whether range formatting supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/onTypeFormatting`
-         */
-        onTypeFormatting?: {
-                /**
-                 * Whether on type formatting supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/definition`
-         */
-        definition?: {
-                /**
-                 * Whether definition supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/typeDefinition`
-         *
-         * Since 3.6.0
-         */
-        typeDefinition?: {
-                /**
-                 * Whether typeDefinition supports dynamic registration. If this is set to `true`
-                 * the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-                 * return value for the corresponding server capability as well.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/implementation`.
-         *
-         * Since 3.6.0
-         */
-        implementation?: {
-                /**
-                 * Whether implementation supports dynamic registration. If this is set to `true`
-                 * the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-                 * return value for the corresponding server capability as well.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/codeAction`
-         */
-        codeAction?: {
-                /**
-                 * Whether code action supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-                /**
-                 * The client support code action literals as a valid
-                 * response of the `textDocument/codeAction` request.
-                 *
-                 * Since 3.8.0
-                 */
-                codeActionLiteralSupport?: {
-                        /**
-                         * The code action kind is support with the following value
-                         * set.
-                         */
-                        codeActionKind: {
-
-                                /**
-                                 * The code action kind values the client supports. When this
-                                 * property exists the client also guarantees that it will
-                                 * handle values outside its set gracefully and falls back
-                                 * to a default value when unknown.
-                                 */
-                                valueSet: CodeActionKind[];
-                        };
-                };
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/codeLens`
-         */
-        codeLens?: {
-                /**
-                 * Whether code lens supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/documentLink`
-         */
-        documentLink?: {
-                /**
-                 * Whether document link supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to the `textDocument/documentColor` and the
-         * `textDocument/colorPresentation` request.
-         *
-         * Since 3.6.0
-         */
-        colorProvider?: {
-                /**
-                 * Whether colorProvider supports dynamic registration. If this is set to `true`
-                 * the client supports the new `(ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-                 * return value for the corresponding server capability as well.
-                 */
-                dynamicRegistration?: boolean;
-        }
-
-        /**
-         * Capabilities specific to the `textDocument/rename`
-         */
-        rename?: {
-                /**
-                 * Whether rename supports dynamic registration.
-                 */
-                dynamicRegistration?: boolean;
-        };
-
-        /**
-         * Capabilities specific to `textDocument/publishDiagnostics`.
-         */
-        publishDiagnostics?: {
-                /**
-                 * Whether the clients accepts diagnostics with related information.
-                 */
-                relatedInformation?: boolean;
-        };
-}
-
--}
-
--- -------------------------------------
-
--- TODO:AZ: this name is Java-ridiculously long
-data SynchronizationTextDocumentClientCapabilities =
-  SynchronizationTextDocumentClientCapabilities
-    { -- | Whether text document synchronization supports dynamic registration.
-      _dynamicRegistration :: Maybe Bool
-
-      -- | The client supports sending will save notifications.
-    , _willSave :: Maybe Bool
-
-      -- | The client supports sending a will save request and waits for a
-      -- response providing text edits which will be applied to the document
-      -- before it is saved.
-    , _willSaveWaitUntil :: Maybe Bool
-
-      -- | The client supports did save notifications.
-    , _didSave :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''SynchronizationTextDocumentClientCapabilities)
-
-instance Default SynchronizationTextDocumentClientCapabilities where
-  def = SynchronizationTextDocumentClientCapabilities def def def def
-
--- -------------------------------------
-
-data CompletionItemClientCapabilities =
-  CompletionItemClientCapabilities
-    { -- | Client supports snippets as insert text.
-      --
-      -- A snippet can define tab stops and placeholders with `$1`, `$2` and
-      -- `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of
-      -- the snippet. Placeholders with equal identifiers are linked, that is
-      -- typing in one will update others too.
-      _snippetSupport :: Maybe Bool
-
-      -- | Client supports commit characters on a completion item.
-    , _commitCharactersSupport :: Maybe Bool
-
-      -- | Client supports the follow content formats for the documentation
-      -- property. The order describes the preferred format of the client.
-    , _documentationFormat :: Maybe (List MarkupKind)
-
-      -- | Client supports the deprecated property on a completion item.
-    , _deprecatedSupport :: Maybe Bool
-
-      -- | Client supports the preselect property on a completion item.
-    , _preselectSupport :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''CompletionItemClientCapabilities)
-
-data CompletionItemKindClientCapabilities =
-  CompletionItemKindClientCapabilities
-    { -- | The completion item kind values the client supports. When this
-      -- property exists the client also guarantees that it will
-      --  handle values outside its set gracefully and falls back
-      --  to a default value when unknown.
-      _valueSet :: Maybe (List CompletionItemKind)
-    }
-  deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''CompletionItemKindClientCapabilities)
-
-data CompletionClientCapabilities =
-  CompletionClientCapabilities
-    { _dynamicRegistration :: Maybe Bool -- ^Whether completion supports dynamic
-                                         -- registration.
-    , _completionItem :: Maybe CompletionItemClientCapabilities
-    , _completionItemKind :: Maybe CompletionItemKindClientCapabilities
-    , _contextSupport :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''CompletionClientCapabilities)
-
--- -------------------------------------
-
-data HoverClientCapabilities =
-  HoverClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    , _contentFormat :: Maybe (List MarkupKind)
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''HoverClientCapabilities)
-
--- -------------------------------------
-
-data SignatureInformationClientCapabilities = 
-  SignatureInformationClientCapabilities
-    { -- | Client supports the follow content formats for the documentation
-      -- property. The order describes the preferred format of the client.
-      documentationFormat :: Maybe (List MarkupKind)
-    }
-  deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''SignatureInformationClientCapabilities)
-
-data SignatureHelpClientCapabilities =
-  SignatureHelpClientCapabilities
-    { -- | Whether signature help supports dynamic registration.
-      _dynamicRegistration :: Maybe Bool
-      
-      -- | The client supports the following `SignatureInformation`
-      -- specific properties.
-    , _signatureInformation :: Maybe SignatureInformationClientCapabilities
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''SignatureHelpClientCapabilities)
-
--- -------------------------------------
-
-data ReferencesClientCapabilities =
-  ReferencesClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''ReferencesClientCapabilities)
-
--- -------------------------------------
-
-data DocumentHighlightClientCapabilities =
-  DocumentHighlightClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''DocumentHighlightClientCapabilities)
-
--- -------------------------------------
-
-data DocumentSymbolKindClientCapabilities =
-  DocumentSymbolKindClientCapabilities
-    { -- | The symbol kind values the client supports. When this
-      --  property exists the client also guarantees that it will
-      --  handle values outside its set gracefully and falls back
-      --  to a default value when unknown.
-      --  
-      --  If this property is not present the client only supports
-      --  the symbol kinds from `File` to `Array` as defined in
-      --  the initial version of the protocol.
-      _valueSet :: Maybe (List SymbolKind)
-    }
-  deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''DocumentSymbolKindClientCapabilities)
-
-data DocumentSymbolClientCapabilities =
-  DocumentSymbolClientCapabilities
-    { -- | Whether document symbol supports dynamic registration.
-      _dynamicRegistration :: Maybe Bool
-      -- | Specific capabilities for the `SymbolKind`.
-    , _symbolKind :: Maybe DocumentSymbolKindClientCapabilities
-    , _hierarchicalDocumentSymbolSupport :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''DocumentSymbolClientCapabilities)
-
--- -------------------------------------
-
-data FormattingClientCapabilities =
-  FormattingClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''FormattingClientCapabilities)
-
--- -------------------------------------
-
-data RangeFormattingClientCapabilities =
-  RangeFormattingClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''RangeFormattingClientCapabilities)
-
--- -------------------------------------
-
-data OnTypeFormattingClientCapabilities =
-  OnTypeFormattingClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''OnTypeFormattingClientCapabilities)
-
--- -------------------------------------
-
-data DefinitionClientCapabilities =
-  DefinitionClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''DefinitionClientCapabilities)
-
--- -------------------------------------
-
-data TypeDefinitionClientCapabilities =
-  TypeDefinitionClientCapabilities
-    { -- | Whether typeDefinition supports dynamic registration. If this is set to `true`
-      --  the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-      --  return value for the corresponding server capability as well.
-      _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''TypeDefinitionClientCapabilities)
-
--- -------------------------------------
---
-data ImplementationClientCapabilities =
-  ImplementationClientCapabilities
-    { -- | Whether implementation supports dynamic registration. If this is set to `true`
-      -- the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-      -- return value for the corresponding server capability as well.
-      _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''ImplementationClientCapabilities)
-
--- -------------------------------------
-
-data CodeActionKindClientCapabilities =
-  CodeActionKindClientCapabilities
-   { -- | The code action kind values the client supports. When this
-     -- property exists the client also guarantees that it will
-     -- handle values outside its set gracefully and falls back
-     -- to a default value when unknown.
-      _valueSet :: List CodeActionKind
-   } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''CodeActionKindClientCapabilities)
-
-instance Default CodeActionKindClientCapabilities where
-  def = CodeActionKindClientCapabilities (List allKinds)
-    where allKinds = [ CodeActionQuickFix
-                     , CodeActionRefactor
-                     , CodeActionRefactorExtract
-                     , CodeActionRefactorInline
-                     , CodeActionRefactorRewrite
-                     , CodeActionSource
-                     , CodeActionSourceOrganizeImports
-                     ]
-
-data CodeActionLiteralSupport =
-  CodeActionLiteralSupport
-    { _codeActionKind :: CodeActionKindClientCapabilities -- ^ The code action kind is support with the following value set.
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''CodeActionLiteralSupport)
-
-data CodeActionClientCapabilities =
-  CodeActionClientCapabilities
-    { _dynamicRegistration      :: Maybe Bool -- ^ Whether code action supports dynamic registration.
-    , _codeActionLiteralSupport :: Maybe CodeActionLiteralSupport -- ^ The client support code action literals as a valid response
-                                                                  -- of the `textDocument/codeAction` request.
-                                                                  -- Since 3.8.0
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''CodeActionClientCapabilities)
-
--- -------------------------------------
-
-data CodeLensClientCapabilities =
-  CodeLensClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''CodeLensClientCapabilities)
-
--- -------------------------------------
-
-data DocumentLinkClientCapabilities =
-  DocumentLinkClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''DocumentLinkClientCapabilities)
-
--- -------------------------------------
-
-data ColorProviderClientCapabilities =
-  ColorProviderClientCapabilities
-    { -- | Whether colorProvider supports dynamic registration. If this is set to `true`
-      --  the client supports the new `(ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
-      --  return value for the corresponding server capability as well.
-      _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''ColorProviderClientCapabilities)
-
--- -------------------------------------
-
-data RenameClientCapabilities =
-  RenameClientCapabilities
-    { _dynamicRegistration :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''RenameClientCapabilities)
-
--- -------------------------------------
-
-data PublishDiagnosticsClientCapabilities =
-  PublishDiagnosticsClientCapabilities
-    { -- | Whether the clients accepts diagnostics with related information.
-      _relatedInformation :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''PublishDiagnosticsClientCapabilities)
-
--- -------------------------------------
-
-data TextDocumentClientCapabilities =
-  TextDocumentClientCapabilities
-    { _synchronization :: Maybe SynchronizationTextDocumentClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/completion`
-    , _completion :: Maybe CompletionClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/hover`
-    , _hover :: Maybe HoverClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/signatureHelp`
-    , _signatureHelp :: Maybe SignatureHelpClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/references`
-    , _references :: Maybe ReferencesClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/documentHighlight`
-    , _documentHighlight :: Maybe DocumentHighlightClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/documentSymbol`
-    , _documentSymbol :: Maybe DocumentSymbolClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/formatting`
-    , _formatting :: Maybe FormattingClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/rangeFormatting`
-    , _rangeFormatting :: Maybe RangeFormattingClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/onTypeFormatting`
-    , _onTypeFormatting :: Maybe OnTypeFormattingClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/definition`
-    , _definition :: Maybe DefinitionClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/typeDefinition`
-    , _typeDefinition :: Maybe TypeDefinitionClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/implementation`
-    , _implementation :: Maybe ImplementationClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/codeAction`
-    , _codeAction :: Maybe CodeActionClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/codeLens`
-    , _codeLens :: Maybe CodeLensClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/documentLink`
-    , _documentLink :: Maybe DocumentLinkClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/documentColor` and the
-      -- `textDocument/colorPresentation` request
-    , _colorProvider :: Maybe ColorProviderClientCapabilities
-
-      -- | Capabilities specific to the `textDocument/rename`
-    , _rename :: Maybe RenameClientCapabilities
-
-      -- | Capabilities specific to `textDocument/publishDiagnostics`
-    , _publishDiagnostics :: Maybe PublishDiagnosticsClientCapabilities
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''TextDocumentClientCapabilities)
-
-instance Default TextDocumentClientCapabilities where
-  def = TextDocumentClientCapabilities def def def def def def def def
-                                       def def def def def def def def
-                                       def def def
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-
------------
-
-ClientCapabilities
-
-now define capabilities for dynamic registration, workspace and text document
-features the client supports. The experimental can be used to pass experimential
-capabilities under development. For future compatibility a ClientCapabilities
-object literal can have more properties set than currently defined. Servers
-receiving a ClientCapabilities object literal with unknown properties should
-ignore these properties. A missing property should be interpreted as an absence
-of the capability. If a property is missing that defines sub properties all sub
-properties should be interpreted as an absence of the capability.
-
-Client capabilities got introduced with the version 3.0 of the protocol. They
-therefore only describe capabilities that got introduced in 3.x or later.
-Capabilities that existed in the 2.x version of the protocol are still mandatory
-for clients. Clients cannot opt out of providing them. So even if a client omits
-the ClientCapabilities.textDocument.synchronization it is still required that
-the client provides text document synchronization (e.g. open, changed and close
-notifications).
-
-interface ClientCapabilities {
-        /**
-         * Workspace specific client capabilities.
-         */
-        workspace?: WorkspaceClientCapabilities;
-
-        /**
-         * Text document specific client capabilities.
-         */
-        textDocument?: TextDocumentClientCapabilities;
-
-        /**
-         * Experimental client capabilities.
-         */
-        experimental?: any;
-}
--}
-
-data ClientCapabilities =
-  ClientCapabilities
-    { _workspace    :: Maybe WorkspaceClientCapabilities
-    , _textDocument :: Maybe TextDocumentClientCapabilities
-    , _experimental :: Maybe A.Object
-    } deriving (Show, Read, Eq)
-
-$(deriveJSON lspOptions ''ClientCapabilities)
-
-instance Default ClientCapabilities where
-  def = ClientCapabilities def def def
diff --git a/src/Language/Haskell/LSP/TH/CodeAction.hs b/src/Language/Haskell/LSP/TH/CodeAction.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/CodeAction.hs
+++ /dev/null
@@ -1,293 +0,0 @@
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE OverloadedStrings          #-}
-{-# LANGUAGE TemplateHaskell            #-}
-module Language.Haskell.LSP.TH.CodeAction where
-
-import           Control.Applicative
-import qualified Data.Aeson                    as A
-import           Data.Aeson.TH
-import           Data.Aeson.Types
-import           Data.Text                      ( Text )
-import           Language.Haskell.LSP.TH.Command
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.Diagnostic
-import           Language.Haskell.LSP.TH.List
-import           Language.Haskell.LSP.TH.Location
-import           Language.Haskell.LSP.TH.Message
-import           Language.Haskell.LSP.TH.TextDocument
-import           Language.Haskell.LSP.TH.WorkspaceEdit
-
-
-{-
-Code Action Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#code-action-request
-
-The code action request is sent from the client to the server tocompute commands
-for a given text document and range. These commands are typically code fixes to
-either fix problems or to beautify/refactor code. The result of a
-textDocument/codeAction request is an array of Command literals which are
-typically presented in the user interface. When the command is selected the
-server should be contacted again (via the workspace/executeCommand) request to
-execute the command.
-
-Since version 3.8.0: support for CodeAction litarals to enable the following
-scenarios:
-
-the ability to directly return a workspace edit from e code action request. This
-avoids having another server roundtrip to execute an actual code action. However
-server providers should be aware that if the code action is expensive to compute
-or the edits are huge it might still be beneficial if the result is imply a
-command and the actual edit is only computed when needed. the ability to group
-code actions using a kind. Clients are allowed to ignore that information.
-However it allows them to better group code action for example into
-corresponding menus (e.g. all refactor code actions into a refactor menu).
-Clients need to announce there support code action literals and code action
-kinds via the corresponding client capability
-textDocument.codeAction.codeActionLiteralSupport.
-
-Request
-
-    method: 'textDocument/codeAction'
-    params: CodeActionParams defined as follows:
-
-/**
- * Params for the CodeActionRequest
- */
-interface CodeActionParams {
-	/**
-	 * The document in which the command was invoked.
-	 */
-	textDocument: TextDocumentIdentifier;
-
-	/**
-	 * The range for which the command was invoked.
-	 */
-	range: Range;
-
-	/**
-	 * Context carrying additional information.
-	 */
-	context: CodeActionContext;
-}
-
-/**
- * The kind of a code action.
- *
- * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`.
- *
- * The set of kinds is open and client needs to announce the kinds it supports to the server during
- * initialization.
- */
-export type CodeActionKind = string;
-
-/**
- * A set of predefined code action kinds
- */
-export namespace CodeActionKind {
-	/**
-	 * Base kind for quickfix actions: 'quickfix'
-	 */
-	export const QuickFix: CodeActionKind = 'quickfix';
-
-	/**
-	 * Base kind for refactoring actions: 'refactor'
-	 */
-	export const Refactor: CodeActionKind = 'refactor';
-
-	/**
-	 * Base kind for refactoring extraction actions: 'refactor.extract'
-	 *
-	 * Example extract actions:
-	 *
-	 * - Extract method
-	 * - Extract function
-	 * - Extract variable
-	 * - Extract interface from class
-	 * - ...
-	 */
-	export const RefactorExtract: CodeActionKind = 'refactor.extract';
-
-	/**
-	 * Base kind for refactoring inline actions: 'refactor.inline'
-	 *
-	 * Example inline actions:
-	 *
-	 * - Inline function
-	 * - Inline variable
-	 * - Inline constant
-	 * - ...
-	 */
-	export const RefactorInline: CodeActionKind = 'refactor.inline';
-
-	/**
-	 * Base kind for refactoring rewrite actions: 'refactor.rewrite'
-	 *
-	 * Example rewrite actions:
-	 *
-	 * - Convert JavaScript function to class
-	 * - Add or remove parameter
-	 * - Encapsulate field
-	 * - Make method static
-	 * - Move method to base class
-	 * - ...
-	 */
-	export const RefactorRewrite: CodeActionKind = 'refactor.rewrite';
-
-	/**
-	 * Base kind for source actions: `source`
-	 *
-	 * Source code actions apply to the entire file.
-	 */
-	export const Source: CodeActionKind = 'source';
-
-	/**
-	 * Base kind for an organize imports source action: `source.organizeImports`
-	 */
-	export const SourceOrganizeImports: CodeActionKind = 'source.organizeImports';
-}
-
-/**
- * Contains additional diagnostic information about the context in which
- * a code action is run.
- */
-interface CodeActionContext {
-	/**
-	 * An array of diagnostics.
-	 */
-	diagnostics: Diagnostic[];
-
-	/**
-	 * Requested kind of actions to return.
-	 *
-	 * Actions not of this kind are filtered out by the client before being shown. So servers
-	 * can omit computing them.
-	 */
-	only?: CodeActionKind[];
-}
-
-Response
-
-    result: (Command | CodeAction)[] | null where CodeAction is defined as follows:
-        /**
-    * A code action represents a change that can be performed in code, e.g. to fix a problem or
-    * to refactor code.
-    *
-    * A CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed.
-    */
-    export interface CodeAction {
-
-        /**
-        * A short, human-readable, title for this code action.
-        */
-        title: string;
-
-        /**
-        * The kind of the code action.
-        *
-        * Used to filter code actions.
-        */
-        kind?: CodeActionKind;
-
-        /**
-        * The diagnostics that this code action resolves.
-        */
-        diagnostics?: Diagnostic[];
-
-        /**
-        * The workspace edit this code action performs.
-        */
-        edit?: WorkspaceEdit;
-
-        /**
-        * A command this code action executes. If a code action
-        * provides an edit and a command, first the edit is
-        * executed and then the command.
-        */
-        command?: Command;
-    }
-    error: code and message set in case an exception happens during the code
-           action request.
-
--}
-
-data CodeActionKind = CodeActionQuickFix
-                    | CodeActionRefactor
-                    | CodeActionRefactorExtract
-                    | CodeActionRefactorInline
-                    | CodeActionRefactorRewrite
-                    | CodeActionSource
-                    | CodeActionSourceOrganizeImports
-                    | CodeActionUnknown Text
-  deriving (Read,Show,Eq)
-
-instance ToJSON CodeActionKind where
-  toJSON CodeActionQuickFix                   = String "quickfix"
-  toJSON CodeActionRefactor                   = String "refactor"
-  toJSON CodeActionRefactorExtract            = String "refactor.extract"
-  toJSON CodeActionRefactorInline             = String "refactor.inline"
-  toJSON CodeActionRefactorRewrite            = String "refactor.rewrite"
-  toJSON CodeActionSource                     = String "source"
-  toJSON CodeActionSourceOrganizeImports      = String "source.organizeImports"
-  toJSON (CodeActionUnknown s)                = String s
-
-instance FromJSON CodeActionKind where
-  parseJSON (String "quickfix")               = pure CodeActionQuickFix
-  parseJSON (String "refactor")               = pure CodeActionRefactor
-  parseJSON (String "refactor.extract")       = pure CodeActionRefactorExtract
-  parseJSON (String "refactor.inline")        = pure CodeActionRefactorInline
-  parseJSON (String "refactor.rewrite")       = pure CodeActionRefactorRewrite
-  parseJSON (String "source")                 = pure CodeActionSource
-  parseJSON (String "source.organizeImports") = pure CodeActionSourceOrganizeImports
-  parseJSON (String s)                        = pure (CodeActionUnknown s)
-  parseJSON _                                 = mempty
-
-data CodeActionContext =
-  CodeActionContext
-    { _diagnostics :: List Diagnostic
-    , only         :: Maybe (List CodeActionKind)
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''CodeActionContext
-
-
-data CodeActionParams =
-  CodeActionParams
-    { _textDocument :: TextDocumentIdentifier
-    , _range        :: Range
-    , _context      :: CodeActionContext
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''CodeActionParams
-
-data CodeAction =
-  -- | A code action represents a change that can be performed in code, e.g. to fix a problem or
-  -- to refactor code.
-  --
-  -- A CodeAction must set either '_edit' and/or a '_command'. If both are supplied,
-  -- the '_edit' is applied first, then the '_command' is executed.
-  CodeAction
-    { _title       :: Text -- ^ A short, human-readable, title for this code action.
-    , _kind        :: Maybe CodeActionKind -- ^ The kind of the code action. Used to filter code actions.
-    , _diagnostics :: Maybe (List Diagnostic) -- ^ The diagnostics that this code action resolves.
-    , _edit        :: Maybe WorkspaceEdit -- ^ The workspace edit this code action performs.
-    , _command     :: Maybe Command -- ^ A command this code action executes. If a code action
-                                    -- provides an edit and a command, first the edit is
-                                    -- executed and then the command.
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''CodeAction
-
-data CAResult = CACommand Command
-              | CACodeAction CodeAction
-  deriving (Read,Show,Eq)
-
-instance FromJSON CAResult where
-  parseJSON x = CACommand <$> parseJSON x <|> CACodeAction <$> parseJSON x
-
-instance ToJSON CAResult where
-  toJSON (CACommand x) = toJSON x
-  toJSON (CACodeAction x) = toJSON x
-
-type CodeActionRequest  = RequestMessage ClientMethod CodeActionParams (List CAResult)
-type CodeActionResponse = ResponseMessage (List CAResult)
diff --git a/src/Language/Haskell/LSP/TH/Command.hs b/src/Language/Haskell/LSP/TH/Command.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Command.hs
+++ /dev/null
@@ -1,45 +0,0 @@
-{-# LANGUAGE TemplateHaskell            #-}
-
-module Language.Haskell.LSP.TH.Command where
-
-import           Data.Aeson
-import           Data.Aeson.TH
-import           Data.Text
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.List
--- ---------------------------------------------------------------------
-{-
-Command
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#command
-
-Represents a reference to a command. Provides a title which will be used to
-represent a command in the UI. Commands are identitifed using a string
-identifier and the protocol currently doesn't specify a set of well known
-commands. So executing a command requires some tool extension code.
-
-interface Command {
-    /**
-     * Title of the command, like `save`.
-     */
-    title: string;
-    /**
-     * The identifier of the actual command handler.
-     */
-    command: string;
-    /**
-     * Arguments that the command handler should be
-     * invoked with.
-     */
-    arguments?: any[];
-}
--}
-
-data Command =
-  Command
-    { _title     :: Text
-    , _command   :: Text
-    , _arguments :: Maybe (List Value)
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''Command
diff --git a/src/Language/Haskell/LSP/TH/Completion.hs b/src/Language/Haskell/LSP/TH/Completion.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Completion.hs
+++ /dev/null
@@ -1,421 +0,0 @@
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE OverloadedStrings          #-}
-{-# LANGUAGE TemplateHaskell            #-}
-module Language.Haskell.LSP.TH.Completion where
-
-import qualified Data.Aeson                    as A
-import           Data.Aeson.TH
-import           Data.Text                      ( Text )
-import           Language.Haskell.LSP.TH.Command
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.DocumentFilter
-import           Language.Haskell.LSP.TH.List
-import           Language.Haskell.LSP.TH.Message
-import           Language.Haskell.LSP.TH.TextDocument
-import           Language.Haskell.LSP.TH.Utils
-import           Language.Haskell.LSP.TH.WorkspaceEdit
-
-data CompletionItemKind = CiText
-                        | CiMethod
-                        | CiFunction
-                        | CiConstructor
-                        | CiField
-                        | CiVariable
-                        | CiClass
-                        | CiInterface
-                        | CiModule
-                        | CiProperty
-                        | CiUnit
-                        | CiValue
-                        | CiEnum
-                        | CiKeyword
-                        | CiSnippet
-                        | CiColor
-                        | CiFile
-                        | CiReference
-                        | CiFolder
-                        | CiEnumMember
-                        | CiConstant
-                        | CiStruct
-                        | CiEvent
-                        | CiOperator
-                        | CiTypeParameter
-         deriving (Read,Show,Eq,Ord)
-
-instance A.ToJSON CompletionItemKind where
-  toJSON CiText          = A.Number 1
-  toJSON CiMethod        = A.Number 2
-  toJSON CiFunction      = A.Number 3
-  toJSON CiConstructor   = A.Number 4
-  toJSON CiField         = A.Number 5
-  toJSON CiVariable      = A.Number 6
-  toJSON CiClass         = A.Number 7
-  toJSON CiInterface     = A.Number 8
-  toJSON CiModule        = A.Number 9
-  toJSON CiProperty      = A.Number 10
-  toJSON CiUnit          = A.Number 11
-  toJSON CiValue         = A.Number 12
-  toJSON CiEnum          = A.Number 13
-  toJSON CiKeyword       = A.Number 14
-  toJSON CiSnippet       = A.Number 15
-  toJSON CiColor         = A.Number 16
-  toJSON CiFile          = A.Number 17
-  toJSON CiReference     = A.Number 18
-  toJSON CiFolder        = A.Number 19
-  toJSON CiEnumMember    = A.Number 20
-  toJSON CiConstant      = A.Number 21
-  toJSON CiStruct        = A.Number 22
-  toJSON CiEvent         = A.Number 23
-  toJSON CiOperator      = A.Number 24
-  toJSON CiTypeParameter = A.Number 25
-
-instance A.FromJSON CompletionItemKind where
-  parseJSON (A.Number  1) = pure CiText
-  parseJSON (A.Number  2) = pure CiMethod
-  parseJSON (A.Number  3) = pure CiFunction
-  parseJSON (A.Number  4) = pure CiConstructor
-  parseJSON (A.Number  5) = pure CiField
-  parseJSON (A.Number  6) = pure CiVariable
-  parseJSON (A.Number  7) = pure CiClass
-  parseJSON (A.Number  8) = pure CiInterface
-  parseJSON (A.Number  9) = pure CiModule
-  parseJSON (A.Number 10) = pure CiProperty
-  parseJSON (A.Number 11) = pure CiUnit
-  parseJSON (A.Number 12) = pure CiValue
-  parseJSON (A.Number 13) = pure CiEnum
-  parseJSON (A.Number 14) = pure CiKeyword
-  parseJSON (A.Number 15) = pure CiSnippet
-  parseJSON (A.Number 16) = pure CiColor
-  parseJSON (A.Number 17) = pure CiFile
-  parseJSON (A.Number 18) = pure CiReference
-  parseJSON (A.Number 19) = pure CiFolder
-  parseJSON (A.Number 20) = pure CiEnumMember
-  parseJSON (A.Number 21) = pure CiConstant
-  parseJSON (A.Number 22) = pure CiStruct
-  parseJSON (A.Number 23) = pure CiEvent
-  parseJSON (A.Number 24) = pure CiOperator
-  parseJSON (A.Number 25) = pure CiTypeParameter
-  parseJSON _             = mempty
-
-
--- ---------------------------------------------------------------------
-{-
-Completion Request
-
-The Completion request is sent from the client to the server to compute
-completion items at a given cursor position. Completion items are presented in
-the IntelliSense user interface. If computing full completion items is
-expensive, servers can additionally provide a handler for the completion item
-resolve request ('completionItem/resolve'). This request is sent when a
-completion item is selected in the user interface. A typically use case is for
-example: the 'textDocument/completion' request doesn't fill in the documentation
-property for returned completion items since it is expensive to compute. When
-the item is selected in the user interface then a 'completionItem/resolve'
-request is sent with the selected completion item as a param. The returned
-completion item should have the documentation property filled in.
-
-    Changed: In 2.0 the request uses TextDocumentPositionParams with a proper
-    textDocument and position property. In 1.0 the uri of the referenced text
-    document was inlined into the params object.
-
-Request
-
-    method: 'textDocument/completion'
-    params: TextDocumentPositionParams
--}
-
--- -------------------------------------
-
-{-
-
-Response
-
-    result: CompletionItem[] | CompletionList
-
-/**
- * Represents a collection of [completion items](#CompletionItem) to be presented
- * in the editor.
- */
-interface CompletionList {
-    /**
-     * This list it not complete. Further typing should result in recomputing
-     * this list.
-     */
-    isIncomplete: boolean;
-    /**
-     * The completion items.
-     */
-    items: CompletionItem[];
-}
-
-
-New in 3.0 : InsertTextFormat
-
-/**
- * Defines whether the insert text in a completion item should be interpreted as
- * plain text or a snippet.
- */
-namespace InsertTextFormat {
-        /**
-         * The primary text to be inserted is treated as a plain string.
-         */
-        export const PlainText = 1;
-
-        /**
-         * The primary text to be inserted is treated as a snippet.
-         *
-         * A snippet can define tab stops and placeholders with `$1`, `$2`
-         * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
-         * the end of the snippet. Placeholders with equal identifiers are linked,
-         * that is typing in one will update others too.
-         *
-         * See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
-         */
-        export const Snippet = 2;
-}
-
-
-
-interface CompletionItem {
-    /**
-     * The label of this completion item. By default
-     * also the text that is inserted when selecting
-     * this completion.
-     */
-    label: string;
-    /**
-     * The kind of this completion item. Based of the kind
-     * an icon is chosen by the editor.
-     */
-    kind?: number;
-    /**
-     * A human-readable string with additional information
-     * about this item, like type or symbol information.
-     */
-    detail?: string;
-    /**
-     * A human-readable string that represents a doc-comment.
-     */
-    documentation?: string;
-    /**
-     * A string that shoud be used when comparing this item
-     * with other items. When `falsy` the label is used.
-     */
-    sortText?: string;
-    /**
-     * A string that should be used when filtering a set of
-     * completion items. When `falsy` the label is used.
-     */
-    filterText?: string;
-    /**
-     * A string that should be inserted a document when selecting
-     * this completion. When `falsy` the label is used.
-     */
-    insertText?: string;
-    -- Following field is new in 3.0
-        /**
-         * The format of the insert text. The format applies to both the `insertText` property
-         * and the `newText` property of a provided `textEdit`.
-         */
-    insertTextFormat?: InsertTextFormat;
-        /**
-         * An edit which is applied to a document when selecting this completion. When an edit is provided the value of
-         * `insertText` is ignored.
-         *
-         * *Note:* The range of the edit must be a single line range and it must contain the position at which completion
-         * has been requested.
-         */
-
-    textEdit?: TextEdit;
-
-    -- Following field is new in 3.0
-        /**
-         * An optional array of additional text edits that are applied when
-         * selecting this completion. Edits must not overlap with the main edit
-         * nor with themselves.
-         */
-    additionalTextEdits?: TextEdit[];
-    -- Following field is new in 3.0
-        /**
-         * An optional command that is executed *after* inserting this completion. *Note* that
-         * additional modifications to the current document should be described with the
-         * additionalTextEdits-property.
-         */
-
-    command?: Command;
-        /**
-         * An data entry field that is preserved on a completion item between
-         * a completion and a completion resolve request.
-         */
-
-    data?: any
-}
-
-Where CompletionItemKind is defined as follows:
-
-/**
- * The kind of a completion entry.
- */
-enum CompletionItemKind {
-    Text = 1,
-    Method = 2,
-    Function = 3,
-    Constructor = 4,
-    Field = 5,
-    Variable = 6,
-    Class = 7,
-    Interface = 8,
-    Module = 9,
-    Property = 10,
-    Unit = 11,
-    Value = 12,
-    Enum = 13,
-    Keyword = 14,
-    Snippet = 15,
-    Color = 16,
-    File = 17,
-    Reference = 18
-}
-
-    error: code and message set in case an exception happens during the completion request.
--}
-
--- -------------------------------------
-
-data InsertTextFormat
-  = PlainText -- ^The primary text to be inserted is treated as a plain string.
-  | Snippet
-      -- ^ The primary text to be inserted is treated as a snippet.
-      --
-      -- A snippet can define tab stops and placeholders with `$1`, `$2`
-      -- and `${3:foo}`. `$0` defines the final tab stop, it defaults to
-      -- the end of the snippet. Placeholders with equal identifiers are linked,
-      -- that is typing in one will update others too.
-      --
-      -- See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
-    deriving (Show, Read, Eq)
-
-instance A.ToJSON InsertTextFormat where
-  toJSON PlainText = A.Number 1
-  toJSON Snippet   = A.Number 2
-
-instance A.FromJSON InsertTextFormat where
-  parseJSON (A.Number  1) = pure PlainText
-  parseJSON (A.Number  2) = pure Snippet
-  parseJSON _             = mempty
-
-data CompletionItem =
-  CompletionItem
-    { _label               :: Text -- ^ The label of this completion item. By default also
-                       -- the text that is inserted when selecting this
-                       -- completion.
-    , _kind                :: Maybe CompletionItemKind
-    , _detail              :: Maybe Text -- ^ A human-readable string with additional
-                              -- information about this item, like type or
-                              -- symbol information.
-    , _documentation       :: Maybe Text -- ^ A human-readable string that represents
-                                    -- a doc-comment.
-    , _sortText            :: Maybe Text -- ^ A string that should be used when filtering
-                                -- a set of completion items. When `falsy` the
-                                -- label is used.
-    , _filterText          :: Maybe Text -- ^ A string that should be used when
-                                  -- filtering a set of completion items. When
-                                  -- `falsy` the label is used.
-    , _insertText          :: Maybe Text -- ^ A string that should be inserted a
-                                  -- document when selecting this completion.
-                                  -- When `falsy` the label is used.
-    , _insertTextFormat    :: Maybe InsertTextFormat
-         -- ^ The format of the insert text. The format applies to both the
-         -- `insertText` property and the `newText` property of a provided
-         -- `textEdit`.
-    , _textEdit            :: Maybe TextEdit
-         -- ^ An edit which is applied to a document when selecting this
-         -- completion. When an edit is provided the value of `insertText` is
-         -- ignored.
-         --
-         -- *Note:* The range of the edit must be a single line range and it
-         -- must contain the position at which completion has been requested.
-    , _additionalTextEdits :: Maybe (List TextEdit)
-         -- ^ An optional array of additional text edits that are applied when
-         -- selecting this completion. Edits must not overlap with the main edit
-         -- nor with themselves.
-    , _command             :: Maybe Command
-        -- ^ An optional command that is executed *after* inserting this
-        -- completion. *Note* that additional modifications to the current
-        -- document should be described with the additionalTextEdits-property.
-    , _xdata               :: Maybe A.Value -- ^ An data entry field that is preserved on a
-                              -- completion item between a completion and a
-                              -- completion resolve request.
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''CompletionItem
-
-data CompletionListType =
-  CompletionListType
-    { _isIncomplete :: Bool
-    , _items        :: List CompletionItem
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''CompletionListType
-
-data CompletionResponseResult
-  = CompletionList CompletionListType
-  | Completions (List CompletionItem)
-  deriving (Read,Show,Eq)
-
-deriveJSON defaultOptions { fieldLabelModifier = rdrop (length ("CompletionResponseResult"::String)), sumEncoding = UntaggedValue } ''CompletionResponseResult
-
-type CompletionResponse = ResponseMessage CompletionResponseResult
-type CompletionRequest = RequestMessage ClientMethod TextDocumentPositionParams CompletionResponseResult
-
--- -------------------------------------
-{-
-New in 3.0
------------
-Registration Options: CompletionRegistrationOptions options defined as follows:
-
-export interface CompletionRegistrationOptions extends TextDocumentRegistrationOptions {
-        /**
-         * The characters that trigger completion automatically.
-         */
-        triggerCharacters?: string[];
-
-        /**
-         * The server provides support to resolve additional
-         * information for a completion item.
-         */
-        resolveProvider?: boolean;
-}
--}
-
-data CompletionRegistrationOptions =
-  CompletionRegistrationOptions
-    { _documentSelector  :: Maybe DocumentSelector
-    , _triggerCharacters :: Maybe (List String)
-    , _resolveProvider   :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''CompletionRegistrationOptions
-
--- ---------------------------------------------------------------------
-{-
-Completion Item Resolve Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#completion-item-resolve-request
-
-The request is sent from the client to the server to resolve additional
-information for a given completion item.
-
-Request
-
-    method: 'completionItem/resolve'
-    params: CompletionItem
-
-Response
-
-    result: CompletionItem
-    error: code and message set in case an exception happens during the completion resolve request.
--}
-
-type CompletionItemResolveRequest  = RequestMessage ClientMethod CompletionItem CompletionItem
-type CompletionItemResolveResponse = ResponseMessage CompletionItem
diff --git a/src/Language/Haskell/LSP/TH/Constants.hs b/src/Language/Haskell/LSP/TH/Constants.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Constants.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-
-module Language.Haskell.LSP.TH.Constants where
-
-import           Data.Aeson.TH
-
--- ---------------------------------------------------------------------
-
--- | Standard options for use when generating JSON instances
-lspOptions :: Options
-lspOptions = defaultOptions { omitNothingFields = True, fieldLabelModifier = drop 1 }
- -- NOTE: This needs to be in a separate file because of the TH stage restriction
-
-customModifier :: String -> String
-customModifier "_xdata" = "data"
-customModifier "_xtype" = "type"
-customModifier xs = drop 1 xs
-
diff --git a/src/Language/Haskell/LSP/TH/DataTypesJSON.hs b/src/Language/Haskell/LSP/TH/DataTypesJSON.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/DataTypesJSON.hs
+++ /dev/null
@@ -1,2732 +0,0 @@
-{-# LANGUAGE CPP                        #-}
-{-# LANGUAGE DeriveGeneric              #-}
-{-# LANGUAGE DeriveTraversable          #-}
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE FlexibleInstances          #-}
-{-# LANGUAGE FunctionalDependencies     #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE MultiParamTypeClasses      #-}
-{-# LANGUAGE OverloadedStrings          #-}
-{-# LANGUAGE TemplateHaskell            #-}
-{-# LANGUAGE TypeSynonymInstances       #-}
-
-module Language.Haskell.LSP.TH.DataTypesJSON
-    ( module Language.Haskell.LSP.TH.DataTypesJSON
-    , module Language.Haskell.LSP.TH.CodeAction
-    , module Language.Haskell.LSP.TH.Command
-    , module Language.Haskell.LSP.TH.Completion
-    , module Language.Haskell.LSP.TH.Diagnostic
-    , module Language.Haskell.LSP.TH.DocumentFilter
-    , module Language.Haskell.LSP.TH.List
-    , module Language.Haskell.LSP.TH.Location
-    , module Language.Haskell.LSP.TH.MarkupContent
-    , module Language.Haskell.LSP.TH.Message
-    , module Language.Haskell.LSP.TH.Symbol
-    , module Language.Haskell.LSP.TH.TextDocument
-    , module Language.Haskell.LSP.TH.Uri
-    , module Language.Haskell.LSP.TH.WorkspaceEdit
-    ) where
-
-import           Control.Applicative
-import           Control.Lens.TH                            (makeFieldsNoPrefix)
-import qualified Data.Aeson                                 as A
-import           Data.Aeson.TH
-import           Data.Aeson.Types
-import           Data.Text                                  (Text)
-import qualified Data.Text                                  as T
-
-import           Language.Haskell.LSP.TH.ClientCapabilities
-import           Language.Haskell.LSP.TH.CodeAction
-import           Language.Haskell.LSP.TH.Command
-import           Language.Haskell.LSP.TH.Completion
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.Diagnostic
-import           Language.Haskell.LSP.TH.DocumentFilter
-import           Language.Haskell.LSP.TH.List
-import           Language.Haskell.LSP.TH.Location
-import           Language.Haskell.LSP.TH.MarkupContent
-import           Language.Haskell.LSP.TH.Message
-import           Language.Haskell.LSP.TH.Symbol
-import           Language.Haskell.LSP.TH.TextDocument
-import           Language.Haskell.LSP.TH.Uri
-import           Language.Haskell.LSP.TH.WorkspaceEdit
-
--- =====================================================================
--- ACTUAL PROTOCOL -----------------------------------------------------
--- =====================================================================
-
--- ---------------------------------------------------------------------
--- Initialize Request
--- ---------------------------------------------------------------------
-{-
-Initialize Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#initialize-request
-
-The initialize request is sent as the first request from the client to the server.
-
-Request
-
-    method: 'initialize'
-    params: InitializeParams defined as follows:
-
-interface InitializeParams {
-        /**
-         * The process Id of the parent process that started
-         * the server. Is null if the process has not been started by another process.
-         * If the parent process is not alive then the server should exit (see exit notification) its process.
-         */
-        processId: number | null;
-
-        /**
-         * The rootPath of the workspace. Is null
-         * if no folder is open.
-         *
-         * @deprecated in favour of rootUri.
-         */
-        rootPath?: string | null;
-
-        /**
-         * The rootUri of the workspace. Is null if no
-         * folder is open. If both `rootPath` and `rootUri` are set
-         * `rootUri` wins.
-         */
-        rootUri: DocumentUri | null;
-
-        /**
-         * User provided initialization options.
-         */
-        initializationOptions?: any;
-
-        /**
-         * The capabilities provided by the client (editor or tool)
-         */
-        capabilities: ClientCapabilities;
-
-        /**
-         * The initial trace setting. If omitted trace is disabled ('off').
-         */
-        trace?: 'off' | 'messages' | 'verbose';
-}
--}
-
-data Trace = TraceOff | TraceMessages | TraceVerbose
-           deriving (Show, Read, Eq)
-
-instance A.ToJSON Trace where
-  toJSON TraceOff      = A.String (T.pack "off")
-  toJSON TraceMessages = A.String (T.pack "messages")
-  toJSON TraceVerbose  = A.String (T.pack "verbose")
-
-instance A.FromJSON Trace where
-  parseJSON (A.String s) = case T.unpack s of
-    "off"      -> return TraceOff
-    "messages" -> return TraceMessages
-    "verbose"  -> return TraceVerbose
-    _          -> mempty
-  parseJSON _                               = mempty
-
-data InitializeParams =
-  InitializeParams {
-    _processId             :: Maybe Int
-  , _rootPath              :: Maybe Text -- ^ Deprecated in favour of _rootUri
-  , _rootUri               :: Maybe Uri
-  , _initializationOptions :: Maybe A.Value
-  , _capabilities          :: ClientCapabilities
-  , _trace                 :: Maybe Trace
-  } deriving (Show, Read, Eq)
-
-
-deriveJSON lspOptions ''InitializeParams
-makeFieldsNoPrefix ''InitializeParams
-
--- ---------------------------------------------------------------------
--- Initialize Response
--- ---------------------------------------------------------------------
-{-
-
-    error.data:
-
-interface InitializeError {
-    /**
-     * Indicates whether the client should retry to send the
-     * initilize request after showing the message provided
-     * in the ResponseError.
-     */
-    retry: boolean;
--
--}
-data InitializeError =
-  InitializeError
-    { _retry :: Bool
-    } deriving (Read, Show, Eq)
-
-deriveJSON lspOptions ''InitializeError
-makeFieldsNoPrefix ''InitializeError
-
--- ---------------------------------------------------------------------
-{-
-The server can signal the following capabilities:
-
-/**
- * Defines how the host (editor) should sync document changes to the language server.
- */
-enum TextDocumentSyncKind {
-    /**
-     * Documents should not be synced at all.
-     */
-    None = 0,
-    /**
-     * Documents are synced by always sending the full content of the document.
-     */
-    Full = 1,
-    /**
-     * Documents are synced by sending the full content on open. After that only incremental
-     * updates to the document are sent.
-     */
-    Incremental = 2
-}
--}
-
--- ^ Note: Omitting this parameter from the capabilities is effectively a fourth
--- state, where DidSave events are generated without sending document contents.
-data TextDocumentSyncKind = TdSyncNone
-                          | TdSyncFull
-                          | TdSyncIncremental
-       deriving (Read,Eq,Show)
-
-instance A.ToJSON TextDocumentSyncKind where
-  toJSON TdSyncNone        = A.Number 0
-  toJSON TdSyncFull        = A.Number 1
-  toJSON TdSyncIncremental = A.Number 2
-
-instance A.FromJSON TextDocumentSyncKind where
-  parseJSON (A.Number 0) = pure TdSyncNone
-  parseJSON (A.Number 1) = pure TdSyncFull
-  parseJSON (A.Number 2) = pure TdSyncIncremental
-  parseJSON _            = mempty
-
--- ---------------------------------------------------------------------
-{-
-/**
- * Completion options.
- */
-interface CompletionOptions {
-    /**
-     * The server provides support to resolve additional information for a completion item.
-     */
-    resolveProvider?: boolean;
-
-    /**
-     * The characters that trigger completion automatically.
-     */
-    triggerCharacters?: string[];
-}
--}
-
-data CompletionOptions =
-  CompletionOptions
-    { _resolveProvider   :: Maybe Bool
-    , _triggerCharacters :: Maybe [String]
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions {omitNothingFields = True } ''CompletionOptions
-makeFieldsNoPrefix ''CompletionOptions
-
--- ---------------------------------------------------------------------
-{-
-/**
- * Signature help options.
- */
-interface SignatureHelpOptions {
-    /**
-     * The characters that trigger signature help automatically.
-     */
-    triggerCharacters?: string[];
--}
-
-data SignatureHelpOptions =
-  SignatureHelpOptions
-    { _triggerCharacters :: Maybe [String]
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''SignatureHelpOptions
-makeFieldsNoPrefix ''SignatureHelpOptions
-
--- ---------------------------------------------------------------------
-{-
-/**
- * Code Lens options.
- */
-interface CodeLensOptions {
-    /**
-     * Code lens has a resolve provider as well.
-     */
-    resolveProvider?: boolean;
-}
--}
-
-data CodeLensOptions =
-  CodeLensOptions
-    { _resolveProvider :: Maybe Bool
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''CodeLensOptions
-makeFieldsNoPrefix ''CodeLensOptions
-
--- ---------------------------------------------------------------------
-{-
-/**
- * Format document on type options
- */
-interface DocumentOnTypeFormattingOptions {
-    /**
-     * A character on which formatting should be triggered, like `}`.
-     */
-    firstTriggerCharacter: string;
-    /**
-     * More trigger characters.
-     */
-    moreTriggerCharacter?: string[]
-}
--}
-data DocumentOnTypeFormattingOptions =
-  DocumentOnTypeFormattingOptions
-    { _firstTriggerCharacter :: Text
-    , _moreTriggerCharacter  :: Maybe [String]
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DocumentOnTypeFormattingOptions
-makeFieldsNoPrefix ''DocumentOnTypeFormattingOptions
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-/**
- * Document link options
- */
-export interface DocumentLinkOptions {
-        /**
-         * Document links have a resolve provider as well.
-         */
-        resolveProvider?: boolean;
-}
--}
-
-data DocumentLinkOptions =
-  DocumentLinkOptions
-    { -- |Document links have a resolve provider as well.
-      _resolveProvider :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''DocumentLinkOptions
-makeFieldsNoPrefix ''DocumentLinkOptions
-
--- ---------------------------------------------------------------------
-
-{-
-New in 3.0
------------
-
-/**
- * Execute command options.
- */
-export interface ExecuteCommandOptions {
-        /**
-         * The commands to be executed on the server
-         */
-        commands: string[]
-}
--}
-
-data ExecuteCommandOptions =
-  ExecuteCommandOptions
-    { -- | The commands to be executed on the server
-      _commands :: List Text
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''ExecuteCommandOptions
-makeFieldsNoPrefix ''ExecuteCommandOptions
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-/**
- * Save options.
- */
-export interface SaveOptions {
-        /**
-         * The client is supposed to include the content on save.
-         */
-        includeText?: boolean;
-}
--}
-data SaveOptions =
-  SaveOptions
-    { -- |The client is supposed to include the content on save.
-      _includeText :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''SaveOptions
-makeFieldsNoPrefix ''SaveOptions
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-export interface TextDocumentSyncOptions {
-        /**
-         * Open and close notifications are sent to the server.
-         */
-        openClose?: boolean;
-        /**
-         * Change notificatins are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
-         * and TextDocumentSyncKindIncremental.
-         */
-        change?: number;
-        /**
-         * Will save notifications are sent to the server.
-         */
-        willSave?: boolean;
-        /**
-         * Will save wait until requests are sent to the server.
-         */
-        willSaveWaitUntil?: boolean;
-        /**
-         * Save notifications are sent to the server.
-         */
-        save?: SaveOptions;
-}
--}
-
-data TextDocumentSyncOptions =
-  TextDocumentSyncOptions
-    { -- | Open and close notifications are sent to the server.
-      _openClose         :: Maybe Bool
-
-      -- | Change notificatins are sent to the server. See
-      -- TextDocumentSyncKind.None, TextDocumentSyncKind.Full and
-      -- TextDocumentSyncKindIncremental.
-    , _change            :: Maybe TextDocumentSyncKind
-
-      -- | Will save notifications are sent to the server.
-    , _willSave          :: Maybe Bool
-
-      -- | Will save wait until requests are sent to the server.
-    , _willSaveWaitUntil :: Maybe Bool
-
-      -- |Save notifications are sent to the server.
-    , _save              :: Maybe SaveOptions
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TextDocumentSyncOptions
-makeFieldsNoPrefix ''TextDocumentSyncOptions
-
--- ---------------------------------------------------------------------
-{-
-
-Extended in 3.0
----------------
-
-interface ServerCapabilities {
-        /**
-         * Defines how text documents are synced. Is either a detailed structure defining each notification or
-         * for backwards compatibility the TextDocumentSyncKind number.
-         */
-        textDocumentSync?: TextDocumentSyncOptions | number;
-        /**
-         * The server provides hover support.
-         */
-        hoverProvider?: boolean;
-        /**
-         * The server provides completion support.
-         */
-        completionProvider?: CompletionOptions;
-        /**
-         * The server provides signature help support.
-         */
-        signatureHelpProvider?: SignatureHelpOptions;
-        /**
-         * The server provides goto definition support.
-         */
-        definitionProvider?: boolean;
-        /**
-         * The server provides find references support.
-         */
-        referencesProvider?: boolean;
-        /**
-         * The server provides document highlight support.
-         */
-        documentHighlightProvider?: boolean;
-        /**
-         * The server provides document symbol support.
-         */
-        documentSymbolProvider?: boolean;
-        /**
-         * The server provides workspace symbol support.
-         */
-        workspaceSymbolProvider?: boolean;
-        /**
-         * The server provides code actions.
-         */
-        codeActionProvider?: boolean;
-        /**
-         * The server provides code lens.
-         */
-        codeLensProvider?: CodeLensOptions;
-        /**
-         * The server provides document formatting.
-         */
-        documentFormattingProvider?: boolean;
-        /**
-         * The server provides document range formatting.
-         */
-        documentRangeFormattingProvider?: boolean;
-        /**
-         * The server provides document formatting on typing.
-         */
-        documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions;
-        /**
-         * The server provides rename support.
-         */
-        renameProvider?: boolean;
-        /**
-         * The server provides document link support.
-         */
-        documentLinkProvider?: DocumentLinkOptions;
-        /**
-         * The server provides execute command support.
-         */
-        executeCommandProvider?: ExecuteCommandOptions;
-        /**
-         * Experimental server capabilities.
-         */
-        experimental?: any;
-}
--}
-
--- | Wrapper for TextDocumentSyncKind fallback.
-data TDS = TDSOptions TextDocumentSyncOptions
-         | TDSKind TextDocumentSyncKind
-    deriving (Show, Read, Eq)
-
-instance FromJSON TDS where
-    parseJSON x = TDSOptions <$> parseJSON x <|> TDSKind <$> parseJSON x
-    
-instance ToJSON TDS where
-    toJSON (TDSOptions x) = toJSON x
-    toJSON (TDSKind x) = toJSON x
-      
-data InitializeResponseCapabilitiesInner =
-  InitializeResponseCapabilitiesInner
-    { _textDocumentSync                 :: Maybe TDS
-    , _hoverProvider                    :: Maybe Bool
-    , _completionProvider               :: Maybe CompletionOptions
-    , _signatureHelpProvider            :: Maybe SignatureHelpOptions
-    , _definitionProvider               :: Maybe Bool
-    , _referencesProvider               :: Maybe Bool
-    , _documentHighlightProvider        :: Maybe Bool
-    , _documentSymbolProvider           :: Maybe Bool
-    , _workspaceSymbolProvider          :: Maybe Bool
-    , _codeActionProvider               :: Maybe Bool
-    , _codeLensProvider                 :: Maybe CodeLensOptions
-    , _documentFormattingProvider       :: Maybe Bool
-    , _documentRangeFormattingProvider  :: Maybe Bool
-    , _documentOnTypeFormattingProvider :: Maybe DocumentOnTypeFormattingOptions
-    , _renameProvider                   :: Maybe Bool
-    -- Following are new in 3.0
-    , _documentLinkProvider             :: Maybe DocumentLinkOptions
-    , _executeCommandProvider           :: Maybe ExecuteCommandOptions
-    , _experimental                     :: Maybe A.Value
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''InitializeResponseCapabilitiesInner
-makeFieldsNoPrefix ''InitializeResponseCapabilitiesInner
-
--- ---------------------------------------------------------------------
--- |
---   Information about the capabilities of a language server
---
-data InitializeResponseCapabilities =
-  InitializeResponseCapabilities {
-    _capabilities :: InitializeResponseCapabilitiesInner
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''InitializeResponseCapabilities
-makeFieldsNoPrefix ''InitializeResponseCapabilities
-
--- ---------------------------------------------------------------------
-
-type InitializeResponse = ResponseMessage InitializeResponseCapabilities
-
-type InitializeRequest = RequestMessage ClientMethod InitializeParams InitializeResponseCapabilities
-
-{-
-    error.code:
-
-/**
- * Known error codes for an `InitializeError`;
- */
-export namespace InitializeError {
-        /**
-         * If the protocol version provided by the client can't be handled by the server.
-         * @deprecated This initialize error got replaced by client capabilities. There is
-         * no version handshake in version 3.0x
-         */
-        export const unknownProtocolVersion: number = 1;
-}
-
-    error.data:
-
-interface InitializeError {
-        /**
-         * Indicates whether the client execute the following retry logic:
-         * (1) show the message provided by the ResponseError to the user
-         * (2) user selects retry or cancel
-         * (3) if user selected retry the initialize method is sent again.
-         */
-        retry: boolean;
-}
--}
-
--- ---------------------------------------------------------------------
-
-{-
-New in 3.0
-----------
-Initialized Notification
-
-The initialized notification is sent from the client to the server after the
-client is fully initialized and is able to listen to arbritary requests and
-notifications sent from the server.
-
-Notification:
-
-    method: 'initialized'
-    params: void
-
--}
-
-data InitializedParams =
-  InitializedParams
-    {
-    } deriving (Show, Read, Eq)
-
-instance A.FromJSON InitializedParams where
-  parseJSON (A.Object _) = pure InitializedParams
-  parseJSON _            = mempty
-
-instance A.ToJSON InitializedParams where
-  toJSON InitializedParams = A.Object mempty
-
-type InitializedNotification = NotificationMessage ClientMethod (Maybe InitializedParams)
-
--- ---------------------------------------------------------------------
-{-
-Shutdown Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#shutdown-request
-
-The shutdown request is sent from the client to the server. It asks the server
-to shut down, but to not exit (otherwise the response might not be delivered
-correctly to the client). There is a separate exit notification that asks the
-server to exit.
-
-Request
-
-    method: 'shutdown'
-    params: undefined
-
-Response
-
-    result: undefined
-    error: code and message set in case an exception happens during shutdown request.
-
-
--}
-
-type ShutdownRequest  = RequestMessage ClientMethod (Maybe A.Value) Text
-type ShutdownResponse = ResponseMessage Text
-
--- ---------------------------------------------------------------------
-{-
-Exit Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#exit-notification
-
-A notification to ask the server to exit its process.
-
-Notification
-
-    method: 'exit'
-
--}
-
--- |
---   Notification from the server to actually exit now, after shutdown acked
---
-data ExitParams =
-  ExitParams
-    {
-    } deriving (Show, Read, Eq)
-
-deriveJSON defaultOptions ''ExitParams
-
-type ExitNotification = NotificationMessage ClientMethod (Maybe ExitParams)
-
--- ---------------------------------------------------------------------
-{-
-ShowMessage Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#showmessage-notification
-
-The show message notification is sent from a server to a client to ask the
-client to display a particular message in the user interface.
-
-Notification:
-
-    method: 'window/showMessage'
-    params: ShowMessageParams defined as follows:
-
-interface ShowMessageParams {
-    /**
-     * The message type. See {@link MessageType}.
-     */
-    type: number;
-
-    /**
-     * The actual message.
-     */
-    message: string;
-}
-
-Where the type is defined as follows:
-
-enum MessageType {
-    /**
-     * An error message.
-     */
-    Error = 1,
-    /**
-     * A warning message.
-     */
-    Warning = 2,
-    /**
-     * An information message.
-     */
-    Info = 3,
-    /**
-     * A log message.
-     */
-    Log = 4
-}
--}
-data MessageType = MtError   -- ^ Error = 1,
-                 | MtWarning -- ^ Warning = 2,
-                 | MtInfo    -- ^ Info = 3,
-                 | MtLog     -- ^ Log = 4
-        deriving (Eq,Ord,Show,Read,Enum)
-
-instance A.ToJSON MessageType where
-  toJSON MtError   = A.Number 1
-  toJSON MtWarning = A.Number 2
-  toJSON MtInfo    = A.Number 3
-  toJSON MtLog     = A.Number 4
-
-instance A.FromJSON MessageType where
-  parseJSON (A.Number 1) = pure MtError
-  parseJSON (A.Number 2) = pure MtWarning
-  parseJSON (A.Number 3) = pure MtInfo
-  parseJSON (A.Number 4) = pure MtLog
-  parseJSON _            = mempty
-
--- ---------------------------------------
-
-
-data ShowMessageParams =
-  ShowMessageParams {
-    _xtype   :: MessageType
-  , _message :: Text
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ShowMessageParams
-makeFieldsNoPrefix ''ShowMessageParams
-
-type ShowMessageNotification = NotificationMessage ServerMethod ShowMessageParams
-
--- ---------------------------------------------------------------------
-{-
-ShowMessage Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#showmessage-request
-
-    New: The show message request is sent from a server to a client to ask the
-    client to display a particular message in the user interface. In addition to
-    the show message notification the request allows to pass actions and to wait
-    for an answer from the client.
-
-Request:
-
-    method: 'window/showMessageRequest'
-    params: ShowMessageRequestParams defined as follows:
-
-Response:
-
-    result: the selected MessageActionItem
-    error: code and message set in case an exception happens during showing a message.
-
-interface ShowMessageRequestParams {
-    /**
-     * The message type. See {@link MessageType}
-     */
-    type: number;
-
-    /**
-     * The actual message
-     */
-    message: string;
-
-    /**
-     * The message action items to present.
-     */
-    actions?: MessageActionItem[];
-}
-
-Where the MessageActionItem is defined as follows:
-
-interface MessageActionItem {
-    /**
-     * A short title like 'Retry', 'Open Log' etc.
-     */
-    title: string;
-}
--}
-
-data MessageActionItem =
-  MessageActionItem
-    { _title :: Text
-    } deriving (Show,Read,Eq)
-
-deriveJSON lspOptions ''MessageActionItem
-makeFieldsNoPrefix ''MessageActionItem
-
-
-data ShowMessageRequestParams =
-  ShowMessageRequestParams
-    { _xtype   :: MessageType
-    , _message :: Text
-    , _actions :: Maybe [MessageActionItem]
-    } deriving (Show,Read,Eq)
-
-deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ShowMessageRequestParams
-makeFieldsNoPrefix ''ShowMessageRequestParams
-
-type ShowMessageRequest = RequestMessage ServerMethod ShowMessageRequestParams Text
-type ShowMessageResponse = ResponseMessage Text
-
--- ---------------------------------------------------------------------
-{-
-LogMessage Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#logmessage-notification
-
-The log message notification is sent from the server to the client to ask the
-client to log a particular message.
-
-Notification:
-
-    method: 'window/logMessage'
-    params: LogMessageParams defined as follows:
-
-interface LogMessageParams {
-    /**
-     * The message type. See {@link MessageType}
-     */
-    type: number;
-
-    /**
-     * The actual message
-     */
-    message: string;
-}
-
-Where type is defined as above.
--}
-
-data LogMessageParams =
-  LogMessageParams {
-    _xtype   :: MessageType
-  , _message :: Text
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''LogMessageParams
-makeFieldsNoPrefix ''LogMessageParams
-
-
-type LogMessageNotification = NotificationMessage ServerMethod LogMessageParams
-
--- ---------------------------------------------------------------------
-{-
-Telemetry Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#telemetry-notification
-
-    New: The telemetry notification is sent from the server to the client to ask
-    the client to log a telemetry event.
-
-Notification:
-
-    method: 'telemetry/event'
-    params: 'any'
--}
-
-
-type TelemetryNotification = NotificationMessage ServerMethod A.Value
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-Register Capability
-
-The client/registerCapability request is sent from the server to the client to
-register for a new capability on the client side. Not all clients need to
-support dynamic capability registration. A client opts in via the
-ClientCapabilities.dynamicRegistration property.
-
-Request:
-
-    method: 'client/registerCapability'
-    params: RegistrationParams
-
-Where RegistrationParams are defined as follows:
-
-/**
- * General paramters to to regsiter for a capability.
- */
-export interface Registration {
-        /**
-         * The id used to register the request. The id can be used to deregister
-         * the request again.
-         */
-        id: string;
-
-        /**
-         * The method / capability to register for.
-         */
-        method: string;
-
-        /**
-         * Options necessary for the registration.
-         */
-        registerOptions?: any;
-}
-
-export interface RegistrationParams {
-        registrations: Registration[];
-}
--}
-
-data Registration =
-  Registration
-    { -- |The id used to register the request. The id can be used to deregister
-      -- the request again.
-      _id              :: Text
-
-       -- | The method / capability to register for.
-    , _method          :: ClientMethod
-
-      -- | Options necessary for the registration.
-    , _registerOptions :: Maybe A.Value
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''Registration
-makeFieldsNoPrefix ''Registration
-
-data RegistrationParams =
-  RegistrationParams
-    { _registrations :: List Registration
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''RegistrationParams
-makeFieldsNoPrefix ''RegistrationParams
-
--- |Note: originates at the server
-type RegisterCapabilityRequest = RequestMessage ServerMethod RegistrationParams ()
-
-type RegisterCapabilityResponse = ResponseMessage ()
-
--- -------------------------------------
-
-{-
-Since most of the registration options require to specify a document selector
-there is a base interface that can be used.
-
-export interface TextDocumentRegistrationOptions {
-        /**
-         * A document selector to identify the scope of the registration. If set to null
-         * the document selector provided on the client side will be used.
-         */
-        documentSelector: DocumentSelector | null;
-}
--}
-
-data TextDocumentRegistrationOptions =
-  TextDocumentRegistrationOptions
-    { _documentSelector :: Maybe DocumentSelector
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TextDocumentRegistrationOptions
-makeFieldsNoPrefix ''TextDocumentRegistrationOptions
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-Unregister Capability
-
-The client/unregisterCapability request is sent from the server to the client to
-unregister a previously register capability.
-
-Request:
-
-    method: 'client/unregisterCapability'
-    params: UnregistrationParams
-
-Where UnregistrationParams are defined as follows:
-
-/**
- * General parameters to unregister a capability.
- */
-export interface Unregistration {
-        /**
-         * The id used to unregister the request or notification. Usually an id
-         * provided during the register request.
-         */
-        id: string;
-
-        /**
-         * The method / capability to unregister for.
-         */
-        method: string;
-}
-
-export interface UnregistrationParams {
-        unregisterations: Unregistration[];
-}
--}
-
-data Unregistration =
-  Unregistration
-    { -- | The id used to unregister the request or notification. Usually an id
-      -- provided during the register request.
-      _id     :: Text
-
-       -- |The method / capability to unregister for.
-    , _method :: Text
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''Unregistration
-makeFieldsNoPrefix ''Unregistration
-
-data UnregistrationParams =
-  UnregistrationParams
-    { _unregistrations :: List Unregistration
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''UnregistrationParams
-makeFieldsNoPrefix ''UnregistrationParams
-
-type UnregisterCapabilityRequest = RequestMessage ServerMethod UnregistrationParams ()
-
-type UnregisterCapabilityResponse = ResponseMessage ()
-
--- ---------------------------------------------------------------------
-{-
-DidChangeConfiguration Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangeconfiguration-notification
-
-A notification sent from the client to the server to signal the change of
-configuration settings.
-
-Notification:
-
-    method: 'workspace/didChangeConfiguration',
-    params: DidChangeConfigurationParams defined as follows:
-
-interface DidChangeConfigurationParams {
-    /**
-     * The actual changed settings
-     */
-    settings: any;
-}
--}
-
-data DidChangeConfigurationParams =
-  DidChangeConfigurationParams {
-    _settings :: A.Value
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''DidChangeConfigurationParams
-makeFieldsNoPrefix ''DidChangeConfigurationParams
-
-
-type DidChangeConfigurationNotification = NotificationMessage ClientMethod DidChangeConfigurationParams
-
--- ---------------------------------------------------------------------
-{-
-DidOpenTextDocument Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didopentextdocument-notification
-
-The document open notification is sent from the client to the server to signal
-newly opened text documents. The document's truth is now managed by the client
-and the server must not try to read the document's truth using the document's
-uri.
-
-Notification:
-
-    method: 'textDocument/didOpen'
-    params: DidOpenTextDocumentParams defined as follows:
-
-interface DidOpenTextDocumentParams {
-    /**
-     * The document that was opened.
-     */
-    textDocument: TextDocumentItem;
-}
-
-Registration Options: TextDocumentRegistrationOptions
--}
-
-data DidOpenTextDocumentParams =
-  DidOpenTextDocumentParams {
-    _textDocument :: TextDocumentItem
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''DidOpenTextDocumentParams
-makeFieldsNoPrefix ''DidOpenTextDocumentParams
-
-type DidOpenTextDocumentNotification = NotificationMessage ClientMethod DidOpenTextDocumentParams
-
--- ---------------------------------------------------------------------
-{-
-DidChangeTextDocument Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangetextdocument-notification
-
-    Changed: The document change notification is sent from the client to the
-    server to signal changes to a text document. In 2.0 the shape of the params
-    has changed to include proper version numbers and language ids.
-
-Notification:
-
-    method: 'textDocument/didChange'
-    params: DidChangeTextDocumentParams defined as follows:
-
-interface DidChangeTextDocumentParams {
-    /**
-     * The document that did change. The version number points
-     * to the version after all provided content changes have
-     * been applied.
-     */
-    textDocument: VersionedTextDocumentIdentifier;
-
-    /**
-     * The actual content changes.
-     */
-    contentChanges: TextDocumentContentChangeEvent[];
-}
-
-/**
- * An event describing a change to a text document. If range and rangeLength are omitted
- * the new text is considered to be the full content of the document.
- */
-interface TextDocumentContentChangeEvent {
-    /**
-     * The range of the document that changed.
-     */
-    range?: Range;
-
-    /**
-     * The length of the range that got replaced.
-     */
-    rangeLength?: number;
-
-    /**
-     * The new text of the document.
-     */
-    text: string;
-}
--}
-data TextDocumentContentChangeEvent =
-  TextDocumentContentChangeEvent
-    { _range       :: Maybe Range
-    , _rangeLength :: Maybe Int
-    , _text        :: Text
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions { omitNothingFields = True } ''TextDocumentContentChangeEvent
-makeFieldsNoPrefix ''TextDocumentContentChangeEvent
-
--- -------------------------------------
-
-data DidChangeTextDocumentParams =
-  DidChangeTextDocumentParams
-    { _textDocument   :: VersionedTextDocumentIdentifier
-    , _contentChanges :: List TextDocumentContentChangeEvent
-    } deriving (Show,Read,Eq)
-
-deriveJSON lspOptions ''DidChangeTextDocumentParams
-makeFieldsNoPrefix ''DidChangeTextDocumentParams
-
-type DidChangeTextDocumentNotification = NotificationMessage ClientMethod DidChangeTextDocumentParams
-{-
-New in 3.0
-----------
-
-Registration Options: TextDocumentChangeRegistrationOptions defined as follows:
-
-/**
- * Descibe options to be used when registered for text document change events.
- */
-export interface TextDocumentChangeRegistrationOptions extends TextDocumentRegistrationOptions {
-        /**
-         * How documents are synced to the server. See TextDocumentSyncKind.Full
-         * and TextDocumentSyncKindIncremental.
-         */
-        syncKind: number;
-}
--}
-
-data TextDocumentChangeRegistrationOptions =
-  TextDocumentChangeRegistrationOptions
-    { _documentSelector :: Maybe DocumentSelector
-    , _syncKind         :: TextDocumentSyncKind
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TextDocumentChangeRegistrationOptions
-makeFieldsNoPrefix ''TextDocumentChangeRegistrationOptions
-
--- ---------------------------------------------------------------------
-{-
-
-New in 3.0
-----------
-
-WillSaveTextDocument Notification
-
-The document will save notification is sent from the client to the server before
-the document is actually saved.
-
-Notification:
-
-    method: 'textDocument/willSave'
-    params: WillSaveTextDocumentParams defined as follows:
-
-/**
- * The parameters send in a will save text document notification.
- */
-export interface WillSaveTextDocumentParams {
-        /**
-         * The document that will be saved.
-         */
-        textDocument: TextDocumentIdentifier;
-
-        /**
-         * The 'TextDocumentSaveReason'.
-         */
-        reason: number;
-}
-
-/**
- * Represents reasons why a text document is saved.
- */
-export namespace TextDocumentSaveReason {
-
-        /**
-         * Manually triggered, e.g. by the user pressing save, by starting debugging,
-         * or by an API call.
-         */
-        export const Manual = 1;
-
-        /**
-         * Automatic after a delay.
-         */
-        export const AfterDelay = 2;
-
-        /**
-         * When the editor lost focus.
-         */
-        export const FocusOut = 3;
-}
-Registration Options: TextDocumentRegistrationOptions
--}
-
-data TextDocumentSaveReason
-  = SaveManual
-         -- ^ Manually triggered, e.g. by the user pressing save, by starting
-         -- debugging, or by an API call.
-  | SaveAfterDelay -- ^ Automatic after a delay
-  | SaveFocusOut   -- ^ When the editor lost focus
-  deriving (Show, Read, Eq)
-
-instance A.ToJSON TextDocumentSaveReason where
-  toJSON SaveManual     = A.Number 1
-  toJSON SaveAfterDelay = A.Number 2
-  toJSON SaveFocusOut   = A.Number 3
-
-instance A.FromJSON TextDocumentSaveReason where
-  parseJSON (A.Number 1) = pure SaveManual
-  parseJSON (A.Number 2) = pure SaveAfterDelay
-  parseJSON (A.Number 3) = pure SaveFocusOut
-  parseJSON _            = mempty
-
-data WillSaveTextDocumentParams =
-  WillSaveTextDocumentParams
-    { _textDocument :: TextDocumentIdentifier
-    , _reason       :: TextDocumentSaveReason
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''WillSaveTextDocumentParams
-makeFieldsNoPrefix ''WillSaveTextDocumentParams
-
-type WillSaveTextDocumentNotification = NotificationMessage ClientMethod WillSaveTextDocumentParams
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-WillSaveWaitUntilTextDocument Request
-
-The document will save request is sent from the client to the server before the
-document is actually saved. The request can return an array of TextEdits which
-will be applied to the text document before it is saved. Please note that
-clients might drop results if computing the text edits took too long or if a
-server constantly fails on this request. This is done to keep the save fast and
-reliable.
-
-Request:
-
-    method: 'textDocument/willSaveWaitUntil'
-    params: WillSaveTextDocumentParams
-
-Response:
-
-    result: TextEdit[]
-    error: code and message set in case an exception happens during the willSaveWaitUntil request.
-
-Registration Options: TextDocumentRegistrationOptions
--}
-
-type WillSaveWaitUntilTextDocumentRequest = RequestMessage ClientMethod WillSaveTextDocumentParams (List TextEdit)
-type WillSaveWaitUntilTextDocumentResponse = ResponseMessage (List TextEdit)
-
--- ---------------------------------------------------------------------
-{-
-DidSaveTextDocument Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didsavetextdocument-notification
-
-    New: The document save notification is sent from the client to the server
-    when the document was saved in the client.
-
-    method: 'textDocument/didSave'
-    params: DidSaveTextDocumentParams defined as follows:
-
-interface DidSaveTextDocumentParams {
-    /**
-     * The document that was saved.
-     */
-    textDocument: TextDocumentIdentifier;
-}
--}
-data DidSaveTextDocumentParams =
-  DidSaveTextDocumentParams
-    { _textDocument :: TextDocumentIdentifier
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DidSaveTextDocumentParams
-makeFieldsNoPrefix ''DidSaveTextDocumentParams
-
-type DidSaveTextDocumentNotification = NotificationMessage ClientMethod DidSaveTextDocumentParams
-
-
-
--- ---------------------------------------------------------------------
-{-
-DidCloseTextDocument Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didclosetextdocument-notification
-
-The document close notification is sent from the client to the server when the
-document got closed in the client. The document's truth now exists where the
-document's uri points to (e.g. if the document's uri is a file uri the truth now
-exists on disk).
-
-    Changed: In 2.0 the params are of type DidCloseTextDocumentParams which
-    contains a reference to a text document.
-
-Notification:
-
-    method: 'textDocument/didClose'
-    params: DidCloseTextDocumentParams defined as follows:
-
-interface DidCloseTextDocumentParams {
-    /**
-     * The document that was closed.
-     */
-    textDocument: TextDocumentIdentifier;
-}
--}
-data DidCloseTextDocumentParams =
-  DidCloseTextDocumentParams
-    { _textDocument :: TextDocumentIdentifier
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DidCloseTextDocumentParams
-makeFieldsNoPrefix ''DidCloseTextDocumentParams
-
-
-type DidCloseTextDocumentNotification = NotificationMessage ClientMethod DidCloseTextDocumentParams
-
--- ---------------------------------------------------------------------
-{-
-DidChangeWatchedFiles Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangewatchedfiles-notification
-
-The watched files notification is sent from the client to the server when the
-client detects changes to files watched by the language client.
-
-Notification:
-
-    method: 'workspace/didChangeWatchedFiles'
-    params: DidChangeWatchedFilesParams defined as follows:
-
-interface DidChangeWatchedFilesParams {
-    /**
-     * The actual file events.
-     */
-    changes: FileEvent[];
-}
-
-Where FileEvents are described as follows:
-
-/**
- * The file event type.
- */
-enum FileChangeType {
-    /**
-     * The file got created.
-     */
-    Created = 1,
-    /**
-     * The file got changed.
-     */
-    Changed = 2,
-    /**
-     * The file got deleted.
-     */
-    Deleted = 3
-}
-
-/**
- * An event describing a file change.
- */
-interface FileEvent {
-    /**
-     * The file's URI.
-     */
-    uri: string;
-    /**
-     * The change type.
-     */
-    type: number;
--}
-data FileChangeType = FcCreated
-                    | FcChanged
-                    | FcDeleted
-       deriving (Read,Show,Eq)
-
-instance A.ToJSON FileChangeType where
-  toJSON FcCreated = A.Number 1
-  toJSON FcChanged = A.Number 2
-  toJSON FcDeleted = A.Number 3
-
-instance A.FromJSON FileChangeType where
-  parseJSON (A.Number 1) = pure FcCreated
-  parseJSON (A.Number 2) = pure FcChanged
-  parseJSON (A.Number 3) = pure FcDeleted
-  parseJSON _            = mempty
-
-
--- -------------------------------------
-
-data FileEvent =
-  FileEvent
-    { _uri   :: Uri
-    , _xtype :: FileChangeType
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''FileEvent
-makeFieldsNoPrefix ''FileEvent
-
-data DidChangeWatchedFilesParams =
-  DidChangeWatchedFilesParams
-    { _changes :: List FileEvent
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DidChangeWatchedFilesParams
-makeFieldsNoPrefix ''DidChangeWatchedFilesParams
-
-
-type DidChangeWatchedFilesNotification = NotificationMessage ClientMethod DidChangeWatchedFilesParams
-
--- ---------------------------------------------------------------------
-{-
-PublishDiagnostics Notification
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#publishdiagnostics-notification
-
-Diagnostics notification are sent from the server to the client to signal
-results of validation runs.
-
-Notification
-
-    method: 'textDocument/publishDiagnostics'
-    params: PublishDiagnosticsParams defined as follows:
-
-interface PublishDiagnosticsParams {
-    /**
-     * The URI for which diagnostic information is reported.
-     */
-    uri: string;
-
-    /**
-     * An array of diagnostic information items.
-     */
-    diagnostics: Diagnostic[];
-}
--}
-
-data PublishDiagnosticsParams =
-  PublishDiagnosticsParams
-    { _uri         :: Uri
-    , _diagnostics :: List Diagnostic
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''PublishDiagnosticsParams
-makeFieldsNoPrefix ''PublishDiagnosticsParams
-
-
-type PublishDiagnosticsNotification = NotificationMessage ServerMethod PublishDiagnosticsParams
-
--- ---------------------------------------------------------------------
-{-
-Hover Request
-
-The hover request is sent from the client to the server to request hover
-information at a given text document position.
-
-    Changed: In 2.0 the request uses TextDocumentPositionParams with a proper
-    textDocument and position property. In 1.0 the uri of the referenced text
-    document was inlined into the params object.
-
-Request
-
-    method: 'textDocument/hover'
-    params: TextDocumentPositionParams
-
-Response
-
-    result: Hover defined as follows:
-
-/**
- * The result of a hove request.
- */
-interface Hover {
-    /**
-     * The hover's content
-     */
-    contents: MarkedString | MarkedString[];
-
-    /**
-     * An optional range
-     */
-    range?: Range;
-}
-
-Where MarkedString is defined as follows:
-/**
- * MarkedString can be used to render human readable text. It is either a markdown string
- * or a code-block that provides a language and a code snippet. The language identifier
- * is sematically equal to the optional language identifier in fenced code blocks in GitHub
- * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
- *
- * The pair of a language and a value is an equivalent to markdown:
- * ```${language}
- * ${value}
- * ```
- *
- * Note that markdown strings will be sanitized - that means html will be escaped.
- */
-type MarkedString = string | { language: string; value: string };
-
-    error: code and message set in case an exception happens during the hover
-    request.
-
-Registration Options: TextDocumentRegistrationOptions
-
--}
-
-data LanguageString =
-  LanguageString
-    { _language :: Text
-    , _value    :: Text
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''LanguageString
-makeFieldsNoPrefix ''LanguageString
-
-data MarkedString =
-    PlainString T.Text
-  | CodeString LanguageString
-    deriving (Eq,Read,Show)
-
-instance ToJSON MarkedString where
-  toJSON (PlainString x) = toJSON x
-  toJSON (CodeString  x) = toJSON x
-instance FromJSON MarkedString where
-  parseJSON (A.String t) = pure $ PlainString t
-  parseJSON o            = CodeString <$> parseJSON o
-
-data Hover =
-  Hover
-    { _contents :: List MarkedString
-    , _range    :: Maybe Range
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''Hover
-makeFieldsNoPrefix ''Hover
-
-
-type HoverRequest = RequestMessage ClientMethod TextDocumentPositionParams Hover
-type HoverResponse = ResponseMessage Hover
-
--- ---------------------------------------------------------------------
-{-
-Signature Help Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#signature-help-request
-
-The signature help request is sent from the client to the server to request
-signature information at a given cursor position.
-
-    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
-    textDocument and position properties. In 1.0 the uri of the referenced text
-    document was inlined into the params object.
-
-Request
-
-    method: 'textDocument/signatureHelp'
-    params: TextDocumentPositionParams
-
-Response
-
-    result: SignatureHelp defined as follows:
-
-/**
- * Signature help represents the signature of something
- * callable. There can be multiple signature but only one
- * active and only one active parameter.
- */
-interface SignatureHelp {
-    /**
-     * One or more signatures.
-     */
-    signatures: SignatureInformation[];
-
-    /**
-     * The active signature.
-     */
-    activeSignature?: number;
-
-    /**
-     * The active parameter of the active signature.
-     */
-    activeParameter?: number;
-}
-
-/**
- * Represents the signature of something callable. A signature
- * can have a label, like a function-name, a doc-comment, and
- * a set of parameters.
- */
-interface SignatureInformation {
-    /**
-     * The label of this signature. Will be shown in
-     * the UI.
-     */
-    label: string;
-
-    /**
-     * The human-readable doc-comment of this signature. Will be shown
-     * in the UI but can be omitted.
-     */
-    documentation?: string;
-
-    /**
-     * The parameters of this signature.
-     */
-    parameters?: ParameterInformation[];
-}
-
-/**
- * Represents a parameter of a callable-signature. A parameter can
- * have a label and a doc-comment.
- */
-interface ParameterInformation {
-    /**
-     * The label of this signature. Will be shown in
-     * the UI.
-     */
-    label: string;
-
-    /**
-     * The human-readable doc-comment of this signature. Will be shown
-     * in the UI but can be omitted.
-     */
-    documentation?: string;
-}
-
-    error: code and message set in case an exception happens during the
-    signature help request.
--}
-
-
-data ParameterInformation =
-  ParameterInformation
-    { _label         :: Text
-    , _documentation :: Maybe Text
-    } deriving (Read,Show,Eq)
-deriveJSON lspOptions ''ParameterInformation
-makeFieldsNoPrefix ''ParameterInformation
-
-
--- -------------------------------------
-
-data SignatureInformation =
-  SignatureInformation
-    { _label         :: Text
-    , _documentation :: Maybe Text
-    , _parameters    :: Maybe [ParameterInformation]
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''SignatureInformation
-makeFieldsNoPrefix ''SignatureInformation
-
-data SignatureHelp =
-  SignatureHelp
-    { _signatures      :: List SignatureInformation
-    , _activeSignature :: Maybe Int -- ^ The active signature
-    , _activeParameter :: Maybe Int -- ^ The active parameter of the active signature
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''SignatureHelp
-makeFieldsNoPrefix ''SignatureHelp
-
-type SignatureHelpRequest = RequestMessage ClientMethod TextDocumentPositionParams SignatureHelp
-type SignatureHelpResponse = ResponseMessage SignatureHelp
-
--- -------------------------------------
-{-
-New in 3.0
-----------
-Registration Options: SignatureHelpRegistrationOptions defined as follows:
-
-export interface SignatureHelpRegistrationOptions extends TextDocumentRegistrationOptions {
-        /**
-         * The characters that trigger signature help
-         * automatically.
-         */
-        triggerCharacters?: string[];
-}
--}
-
-data SignatureHelpRegistrationOptions =
-  SignatureHelpRegistrationOptions
-    { _documentSelector  :: Maybe DocumentSelector
-    , _triggerCharacters :: Maybe (List String)
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''SignatureHelpRegistrationOptions
-makeFieldsNoPrefix ''SignatureHelpRegistrationOptions
-
--- ---------------------------------------------------------------------
-{-
-Goto Definition Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#goto-definition-request
-
-The goto definition request is sent from the client to the server to resolve the
-definition location of a symbol at a given text document position.
-
-    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
-    textDocument and position properties. In 1.0 the uri of the referenced text
-    document was inlined into the params object.
-
-Request
-
-    method: 'textDocument/definition'
-    params: TextDocumentPositionParams
-
-Response:
-
-    result: Location | Location[]
-    error: code and message set in case an exception happens during the definition request.
-
-
--}
-
--- {"jsonrpc":"2.0","id":1,"method":"textDocument/definition","params":{"textDocument":{"uri":"file:///tmp/Foo.hs"},"position":{"line":1,"character":8}}}
-
-data LocationResponseParams = SingleLoc Location | MultiLoc [Location]
-  deriving (Eq,Read,Show)
-
-instance A.ToJSON LocationResponseParams where
-  toJSON (SingleLoc x) = toJSON x
-  toJSON (MultiLoc xs) = toJSON xs
-
-instance A.FromJSON LocationResponseParams where
-  parseJSON xs@(A.Array _) = MultiLoc <$> parseJSON xs
-  parseJSON x              = SingleLoc <$> parseJSON x
-
-type DefinitionRequest  = RequestMessage ClientMethod TextDocumentPositionParams LocationResponseParams
-type DefinitionResponse = ResponseMessage LocationResponseParams
-
--- ---------------------------------------------------------------------
-
-{-
-Goto Implementation Request (:leftwards_arrow_with_hook:)
-Since version 3.6.0
-
-The goto implementation request is sent from the client to the server to resolve the implementation location of a symbol at a given text document position.
-
-Request:
-
-method: ‘textDocument/implementation’
-params: TextDocumentPositionParams
-Response:
-
-result: Location | Location[] | null
-error: code and message set in case an exception happens during the definition request.
-Registration Options: TextDocumentRegistrationOptions
--}
-
-
-type ImplementationRequest  = RequestMessage ClientMethod TextDocumentPositionParams LocationResponseParams
-type ImplementationResponse = ResponseMessage LocationResponseParams
-
--- ---------------------------------------------------------------------
-
-{-
-Find References Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#find-references-request
-
-The references request is sent from the client to the server to resolve
-project-wide references for the symbol denoted by the given text document
-position.
-
-    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
-    textDocument and position properties. In 1.0 the uri of the referenced text
-    document was inlined into the params object.
-
-Request
-
-    method: 'textDocument/references'
-    params: ReferenceParams defined as follows:
-
-interface ReferenceParams extends TextDocumentPositionParams {
-    context: ReferenceContext
-}
-
-interface ReferenceContext {
-    /**
-     * Include the declaration of the current symbol.
-     */
-    includeDeclaration: boolean;
-}
-
-Response:
-
-    result: Location[]
-    error: code and message set in case an exception happens during the
-           reference request.
--}
-
-data ReferenceContext =
-  ReferenceContext
-    { _includeDeclaration :: Bool
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''ReferenceContext
-makeFieldsNoPrefix ''ReferenceContext
-
-
-data ReferenceParams =
-  ReferenceParams
-    { _textDocument :: TextDocumentIdentifier
-    , _position     :: Position
-    , _context      :: ReferenceContext
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''ReferenceParams
-makeFieldsNoPrefix ''ReferenceParams
-
-
-type ReferencesRequest  = RequestMessage ClientMethod ReferenceParams (List Location)
-type ReferencesResponse = ResponseMessage (List Location)
-
--- ---------------------------------------------------------------------
-{-
-Document Highlights Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-highlights-request
-
-The document highlight request is sent from the client to the server to resolve
-a document highlights for a given text document position. For programming
-languages this usually highlights all references to the symbol scoped to this
-file. However we kept 'textDocument/documentHighlight' and
-'textDocument/references' separate requests since the first one is allowed to be
-more fuzzy. Symbol matches usually have a DocumentHighlightKind of Read or Write
-whereas fuzzy or textual matches use Textas the kind.
-
-    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
-    textDocument and position properties. In 1.0 the uri of the referenced text
-    document was inlined into the params object.
-
-Request
-
-    method: 'textDocument/documentHighlight'
-    params: TextDocumentPositionParams
-
-Response
-
-    result: DocumentHighlight[] defined as follows:
-
-/**
- * A document highlight is a range inside a text document which deserves
- * special attention. Usually a document highlight is visualized by changing
- * the background color of its range.
- *
- */
-interface DocumentHighlight {
-    /**
-     * The range this highlight applies to.
-     */
-    range: Range;
-
-    /**
-     * The highlight kind, default is DocumentHighlightKind.Text.
-     */
-    kind?: number;
-}
-
-/**
- * A document highlight kind.
- */
-enum DocumentHighlightKind {
-    /**
-     * A textual occurrance.
-     */
-    Text = 1,
-
-    /**
-     * Read-access of a symbol, like reading a variable.
-     */
-    Read = 2,
-
-    /**
-     * Write-access of a symbol, like writing to a variable.
-     */
-    Write = 3
-}
-
-    error: code and message set in case an exception happens during the document
-           highlight request.
-
-Registration Options: TextDocumentRegistrationOptions
-
--}
-
-data DocumentHighlightKind = HkText | HkRead | HkWrite
-  deriving (Read,Show,Eq)
-
-instance A.ToJSON DocumentHighlightKind where
-  toJSON HkText  = A.Number 1
-  toJSON HkRead  = A.Number 2
-  toJSON HkWrite = A.Number 3
-
-instance A.FromJSON DocumentHighlightKind where
-  parseJSON (A.Number 1) = pure HkText
-  parseJSON (A.Number 2) = pure HkRead
-  parseJSON (A.Number 3) = pure HkWrite
-  parseJSON _            = mempty
-
--- -------------------------------------
-
-data DocumentHighlight =
-  DocumentHighlight
-    { _range :: Range
-    , _kind  :: Maybe DocumentHighlightKind
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DocumentHighlight
-makeFieldsNoPrefix ''DocumentHighlight
-
-type DocumentHighlightRequest = RequestMessage ClientMethod TextDocumentPositionParams (List DocumentHighlight)
-type DocumentHighlightsResponse = ResponseMessage (List DocumentHighlight)
-
--- ---------------------------------------------------------------------
-{-
-Workspace Symbols Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#workspace-symbols-request
-
-The workspace symbol request is sent from the client to the server to list
-project-wide symbols matching the query string.
-
-Request
-
-    method: 'workspace/symbol'
-    params: WorkspaceSymbolParams defined as follows:
-
-/**
- * The parameters of a Workspace Symbol Request.
- */
-interface WorkspaceSymbolParams {
-    /**
-     * A non-empty query string
-     */
-    query: string;
-}
-
-Response
-
-    result: SymbolInformation[] as defined above.
-    error: code and message set in case an exception happens during the
-           workspace symbol request.
--}
-
-data WorkspaceSymbolParams =
-  WorkspaceSymbolParams
-    { _query :: Text
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''WorkspaceSymbolParams
-makeFieldsNoPrefix ''WorkspaceSymbolParams
-
-type WorkspaceSymbolRequest  = RequestMessage ClientMethod WorkspaceSymbolParams (List SymbolInformation)
-type WorkspaceSymbolsResponse = ResponseMessage (List SymbolInformation)
-
--- ---------------------------------------------------------------------
-{-
-Code Lens Request
-
-The code lens request is sent from the client to the server to compute code
-lenses for a given text document.
-
-    Changed: In 2.0 the request uses CodeLensParams instead of a single uri.
-
-Request
-
-    method: 'textDocument/codeLens'
-    params: CodeLensParams defined as follows:
-
-interface CodeLensParams {
-    /**
-     * The document to request code lens for.
-     */
-    textDocument: TextDocumentIdentifier;
-}
-
-Response
-
-    result: CodeLens[] defined as follows:
-
-/**
- * A code lens represents a command that should be shown along with
- * source text, like the number of references, a way to run tests, etc.
- *
- * A code lens is _unresolved_ when no command is associated to it. For performance
- * reasons the creation of a code lens and resolving should be done in two stages.
- */
-interface CodeLens {
-    /**
-     * The range in which this code lens is valid. Should only span a single line.
-     */
-    range: Range;
-
-    /**
-     * The command this code lens represents.
-     */
-    command?: Command;
-
-    /**
-     * A data entry field that is preserved on a code lens item between
-     * a code lens and a code lens resolve request.
-     */
-    data?: any
-}
-
-    error: code and message set in case an exception happens during the code
-           lens request.
--}
-
-data CodeLensParams =
-  CodeLensParams
-    { _textDocument :: TextDocumentIdentifier
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''CodeLensParams
-makeFieldsNoPrefix ''CodeLensParams
-
-
--- -------------------------------------
-
-data CodeLens =
-  CodeLens
-    { _range   :: Range
-    , _command :: Maybe Command
-    , _xdata   :: Maybe A.Value
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''CodeLens
-makeFieldsNoPrefix ''CodeLens
-
-
-type CodeLensRequest = RequestMessage ClientMethod CodeLensParams (List CodeLens)
-type CodeLensResponse = ResponseMessage (List CodeLens)
-
--- -------------------------------------
-{-
-Registration Options: CodeLensRegistrationOptions defined as follows:
-
-export interface CodeLensRegistrationOptions extends TextDocumentRegistrationOptions {
-        /**
-         * Code lens has a resolve provider as well.
-         */
-        resolveProvider?: boolean;
-}
--}
-
-data CodeLensRegistrationOptions =
-  CodeLensRegistrationOptions
-    { _documentSelector :: Maybe DocumentSelector
-    , _resolveProvider  :: Maybe Bool
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''CodeLensRegistrationOptions
-makeFieldsNoPrefix ''CodeLensRegistrationOptions
-
--- ---------------------------------------------------------------------
-{-
-Code Lens Resolve Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#code-lens-resolve-request
-
-The code lens resolve request is sent from the client to the server to resolve
-the command for a given code lens item.
-
-Request
-
-    method: 'codeLens/resolve'
-    params: CodeLens
-
-Response
-
-    result: CodeLens
-    error: code and message set in case an exception happens during the code
-           lens resolve request.
-
-
--}
-
-type CodeLensResolveRequest  = RequestMessage ClientMethod CodeLens (List CodeLens)
-type CodeLensResolveResponse = ResponseMessage (List CodeLens)
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-Document Link Request
-
-The document links request is sent from the client to the server to request the
-location of links in a document.
-
-Request:
-
-    method: 'textDocument/documentLink'
-    params: DocumentLinkParams, defined as follows
-
-interface DocumentLinkParams {
-        /**
-         * The document to provide document links for.
-         */
-        textDocument: TextDocumentIdentifier;
-}
-
-Response:
-
-    result: An array of DocumentLink, or null.
-
-/**
- * A document link is a range in a text document that links to an internal or external resource, like another
- * text document or a web site.
- */
-interface DocumentLink {
-        /**
-         * The range this link applies to.
-         */
-        range: Range;
-        /**
-         * The uri this link points to. If missing a resolve request is sent later.
-         */
-        target?: DocumentUri;
-}
-
-    error: code and message set in case an exception happens during the document link request.
-
-Registration Options: DocumentLinkRegistrationOptions defined as follows:
-
-export interface DocumentLinkRegistrationOptions extends TextDocumentRegistrationOptions {
-        /**
-         * Document links have a resolve provider as well.
-         */
-        resolveProvider?: boolean;
-}
--}
-
-data DocumentLinkParams =
-  DocumentLinkParams
-    { _textDocument :: TextDocumentIdentifier
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DocumentLinkParams
-makeFieldsNoPrefix ''DocumentLinkParams
-
-data DocumentLink =
-  DocumentLink
-    { _range  :: Range
-    , _target :: Maybe Text
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''DocumentLink
-makeFieldsNoPrefix ''DocumentLink
-
-type DocumentLinkRequest = RequestMessage ClientMethod DocumentLinkParams (List DocumentLink)
-type DocumentLinkResponse = ResponseMessage (List DocumentLink)
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-Document Link Resolve Request
-
-The document link resolve request is sent from the client to the server to resolve the target of a given document link.
-
-Request:
-
-    method: 'documentLink/resolve'
-    params: DocumentLink
-
-Response:
-
-    result: DocumentLink
-    error: code and message set in case an exception happens during the document link resolve request.
-
--}
-
-type DocumentLinkResolveRequest  = RequestMessage ClientMethod DocumentLink DocumentLink
-type DocumentLinkResolveResponse = ResponseMessage DocumentLink
-
--- ---------------------------------------------------------------------
-{-
-Document Formatting Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-formatting-request
-
-The document formatting request is sent from the server to the client to format
-a whole document.
-
-Request
-
-    method: 'textDocument/formatting'
-    params: DocumentFormattingParams defined as follows
-
-interface DocumentFormattingParams {
-    /**
-     * The document to format.
-     */
-    textDocument: TextDocumentIdentifier;
-
-    /**
-     * The format options.
-     */
-    options: FormattingOptions;
-}
-
-/**
- * Value-object describing what options formatting should use.
- */
-interface FormattingOptions {
-    /**
-     * Size of a tab in spaces.
-     */
-    tabSize: number;
-
-    /**
-     * Prefer spaces over tabs.
-     */
-    insertSpaces: boolean;
-
-    /**
-     * Signature for further properties.
-     */
-    [key: string]: boolean | number | string;
-}
-
-Response
-
-    result: TextEdit[] describing the modification to the document to be
-            formatted.
-    error: code and message set in case an exception happens during the
-           formatting request.
-
-Registration Options: TextDocumentRegistrationOptions
--}
-
-data FormattingOptions =
-  FormattingOptions
-    { _tabSize      :: Int
-    , _insertSpaces :: Bool -- ^ Prefer spaces over tabs
-    -- Note: May be more properties
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''FormattingOptions
-makeFieldsNoPrefix ''FormattingOptions
-
-data DocumentFormattingParams =
-  DocumentFormattingParams
-    { _textDocument :: TextDocumentIdentifier
-    , _options      :: FormattingOptions
-    } deriving (Show,Read,Eq)
-
-deriveJSON lspOptions ''DocumentFormattingParams
-makeFieldsNoPrefix ''DocumentFormattingParams
-
-type DocumentFormattingRequest  = RequestMessage ClientMethod DocumentFormattingParams (List TextEdit)
-type DocumentFormattingResponse = ResponseMessage (List TextEdit)
-
--- ---------------------------------------------------------------------
-{-
-Document Range Formatting Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-range-formatting-request
-
-The document range formatting request is sent from the client to the server to
-format a given range in a document.
-
-Request
-
-    method: 'textDocument/rangeFormatting',
-    params: DocumentRangeFormattingParams defined as follows
-
-interface DocumentRangeFormattingParams {
-    /**
-     * The document to format.
-     */
-    textDocument: TextDocumentIdentifier;
-
-    /**
-     * The range to format
-     */
-    range: Range;
-
-    /**
-     * The format options
-     */
-    options: FormattingOptions;
-}
-
-Response
-
-    result: TextEdit[] describing the modification to the document to be
-            formatted.
-    error: code and message set in case an exception happens during the range
-           formatting request.
--}
-
-data DocumentRangeFormattingParams =
-  DocumentRangeFormattingParams
-    { _textDocument :: TextDocumentIdentifier
-    , _range        :: Range
-    , _options      :: FormattingOptions
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DocumentRangeFormattingParams
-makeFieldsNoPrefix ''DocumentRangeFormattingParams
-
-type DocumentRangeFormattingRequest  = RequestMessage ClientMethod DocumentRangeFormattingParams (List TextEdit)
-type DocumentRangeFormattingResponse = ResponseMessage (List TextEdit)
-
--- ---------------------------------------------------------------------
-{-
-Document on Type Formatting Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-on-type-formatting-request
-
-The document on type formatting request is sent from the client to the server to
-format parts of the document during typing.
-
-Request
-
-    method: 'textDocument/onTypeFormatting'
-    params: DocumentOnTypeFormattingParams defined as follows
-
-interface DocumentOnTypeFormattingParams {
-    /**
-     * The document to format.
-     */
-    textDocument: TextDocumentIdentifier;
-
-    /**
-     * The position at which this request was sent.
-     */
-    position: Position;
-
-    /**
-     * The character that has been typed.
-     */
-    ch: string;
-
-    /**
-     * The format options.
-     */
-    options: FormattingOptions;
-}
-
-Response
-
-    result: TextEdit[] describing the modification to the document.
-    error: code and message set in case an exception happens during the range
-           formatting request.
-
-Registration Options: DocumentOnTypeFormattingRegistrationOptions defined as follows:
-
-export interface DocumentOnTypeFormattingRegistrationOptions extends TextDocumentRegistrationOptions {
-        /**
-         * A character on which formatting should be triggered, like `}`.
-         */
-        firstTriggerCharacter: string;
-        /**
-         * More trigger characters.
-         */
-        moreTriggerCharacter?: string[]
-}
--}
-
-data DocumentOnTypeFormattingParams =
-  DocumentOnTypeFormattingParams
-    { _textDocument :: TextDocumentIdentifier
-    , _position     :: Position
-    , _ch           :: Text
-    , _options      :: FormattingOptions
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DocumentOnTypeFormattingParams
-makeFieldsNoPrefix ''DocumentOnTypeFormattingParams
-
-type DocumentOnTypeFormattingRequest  = RequestMessage ClientMethod DocumentOnTypeFormattingParams (List TextEdit)
-type DocumentOnTypeFormattingResponse = ResponseMessage (List TextEdit)
-
-data DocumentOnTypeFormattingRegistrationOptions =
-  DocumentOnTypeFormattingRegistrationOptions
-    { _firstTriggerCharacter :: Text
-    , _moreTriggerCharacter  :: Maybe (List String)
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''DocumentOnTypeFormattingRegistrationOptions
-
--- ---------------------------------------------------------------------
-{-
-Rename Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#rename-request
-
-The rename request is sent from the client to the server to perform a
-workspace-wide rename of a symbol.
-
-Request
-
-    method: 'textDocument/rename'
-    params: RenameParams defined as follows
-
-interface RenameParams {
-    /**
-     * The document to format.
-     */
-    textDocument: TextDocumentIdentifier;
-
-    /**
-     * The position at which this request was sent.
-     */
-    position: Position;
-
-    /**
-     * The new name of the symbol. If the given name is not valid the
-     * request must return a [ResponseError](#ResponseError) with an
-     * appropriate message set.
-     */
-    newName: string;
-}
-
-Response
-
-    result: WorkspaceEdit describing the modification to the workspace.
-    error: code and message set in case an exception happens during the rename
-           request.
-
-Registration Options: TextDocumentRegistrationOptions
-
--}
-data RenameParams =
-  RenameParams
-    { _textDocument :: TextDocumentIdentifier
-    , _position     :: Position
-    , _newName      :: Text
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''RenameParams
-makeFieldsNoPrefix ''RenameParams
-
-
--- {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"textDocument/rename\",\"params\":{\"textDocument\":{\"uri\":\"file:///home/alanz/mysrc/github/alanz/haskell-lsp/src/HieVscode.hs\"},\"position\":{\"line\":37,\"character\":17},\"newName\":\"getArgs'\"}}
-
-type RenameRequest  = RequestMessage ClientMethod RenameParams WorkspaceEdit
-type RenameResponse = ResponseMessage WorkspaceEdit
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-Execute a command
-
-The workspace/executeCommand request is sent from the client to the server to
-trigger command execution on the server. In most cases the server creates a
-WorkspaceEdit structure and applies the changes to the workspace using the
-request workspace/applyEdit which is sent from the server to the client.
-
-Request:
-
-    method: 'workspace/executeCommand'
-    params: ExecuteCommandParams defined as follows:
-
-export interface ExecuteCommandParams {
-
-        /**
-         * The identifier of the actual command handler.
-         */
-        command: string;
-        /**
-         * Arguments that the command should be invoked with.
-         */
-        arguments?: any[];
-}
-
-The arguments are typically specified when a command is returned from the server
-to the client. Example requests that return a command are
-textDocument/codeAction or textDocument/codeLens.
-
-Response:
-
-    result: any
-    error: code and message set in case an exception happens during the request.
-
-Registration Options: ExecuteCommandRegistrationOptions defined as follows:
-
-/**
- * Execute command registration options.
- */
-export interface ExecuteCommandRegistrationOptions {
-        /**
-         * The commands to be executed on the server
-         */
-        commands: string[]
-}
--}
-
-data ExecuteCommandParams =
-  ExecuteCommandParams
-    { _command   :: Text
-    , _arguments :: Maybe (List A.Value)
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''ExecuteCommandParams
-makeFieldsNoPrefix ''ExecuteCommandParams
-
-type ExecuteCommandRequest = RequestMessage ClientMethod ExecuteCommandParams A.Value
-type ExecuteCommandResponse = ResponseMessage A.Value
-
-data ExecuteCommandRegistrationOptions =
-  ExecuteCommandRegistrationOptions
-    { _commands :: List Text
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''ExecuteCommandRegistrationOptions
-makeFieldsNoPrefix ''ExecuteCommandRegistrationOptions
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-Applies a WorkspaceEdit
-
-The workspace/applyEdit request is sent from the server to the client to modify
-resource on the client side.
-
-Request:
-
-    method: 'workspace/applyEdit'
-    params: ApplyWorkspaceEditParams defined as follows:
-
-export interface ApplyWorkspaceEditParams {
-        /**
-         * The edits to apply.
-         */
-        edit: WorkspaceEdit;
-}
-
-Response:
-
-    result: ApplyWorkspaceEditResponse defined as follows:
-
-export interface ApplyWorkspaceEditResponse {
-        /**
-         * Indicates whether the edit was applied or not.
-         */
-        applied: boolean;
-}
-
-    error: code and message set in case an exception happens during the request.
-
--}
-data ApplyWorkspaceEditParams =
-  ApplyWorkspaceEditParams
-    { _edit :: WorkspaceEdit
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''ApplyWorkspaceEditParams
-makeFieldsNoPrefix ''ApplyWorkspaceEditParams
-
-data ApplyWorkspaceEditResponseBody =
-  ApplyWorkspaceEditResponseBody
-    { _applied :: Bool
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''ApplyWorkspaceEditResponseBody
-makeFieldsNoPrefix ''ApplyWorkspaceEditResponseBody
-
--- | Sent from the server to the client
-type ApplyWorkspaceEditRequest  = RequestMessage ServerMethod ApplyWorkspaceEditParams ApplyWorkspaceEditResponseBody
-type ApplyWorkspaceEditResponse = ResponseMessage ApplyWorkspaceEditResponseBody
-
--- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
--- ---------------------------------------------------------------------
-
-data TraceParams =
-  TraceParams {
-    _value :: Text
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TraceParams
-makeFieldsNoPrefix ''TraceParams
-
-
-data TraceNotification =
-  TraceNotification {
-    _params :: TraceParams
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TraceNotification
-makeFieldsNoPrefix ''TraceNotification
-
-
-
--- ---------------------------------------------------------------------
-
--- Generating lenses
--- Need to do this all in one file or else we get duplicate functions
-
--- Location
-makeFieldsNoPrefix ''Position
-makeFieldsNoPrefix ''Range
-makeFieldsNoPrefix ''Location
-
--- Completion
-makeFieldsNoPrefix ''CompletionItem
-makeFieldsNoPrefix ''CompletionListType
-makeFieldsNoPrefix ''CompletionRegistrationOptions
-
--- CodeActions
-makeFieldsNoPrefix ''CodeActionContext
-makeFieldsNoPrefix ''CodeActionParams
-makeFieldsNoPrefix ''CodeAction
-
--- DocumentFilter
-makeFieldsNoPrefix ''DocumentFilter
-
--- WorkspaceEdit
-makeFieldsNoPrefix ''TextEdit
-makeFieldsNoPrefix ''VersionedTextDocumentIdentifier
-makeFieldsNoPrefix ''TextDocumentEdit
-makeFieldsNoPrefix ''WorkspaceEdit
-
--- Message
-makeFieldsNoPrefix ''RequestMessage
-makeFieldsNoPrefix ''ResponseError
-makeFieldsNoPrefix ''ResponseMessage
-makeFieldsNoPrefix ''NotificationMessage
-makeFieldsNoPrefix ''CancelParams
-
--- TextDocument
-makeFieldsNoPrefix ''TextDocumentItem
-makeFieldsNoPrefix ''TextDocumentIdentifier
-makeFieldsNoPrefix ''TextDocumentPositionParams
-
--- Command
-makeFieldsNoPrefix ''Command
-
--- Diagnostic
-makeFieldsNoPrefix ''Diagnostic
-makeFieldsNoPrefix ''DiagnosticRelatedInformation
-
--- Symbol
-makeFieldsNoPrefix ''DocumentSymbolParams
-makeFieldsNoPrefix ''DocumentSymbol
-makeFieldsNoPrefix ''SymbolInformation
diff --git a/src/Language/Haskell/LSP/TH/Diagnostic.hs b/src/Language/Haskell/LSP/TH/Diagnostic.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Diagnostic.hs
+++ /dev/null
@@ -1,139 +0,0 @@
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE TemplateHaskell            #-}
-
-module Language.Haskell.LSP.TH.Diagnostic where
-
-import qualified Data.Aeson                                 as A
-import           Data.Aeson.TH
-import           Data.Text
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.List
-import           Language.Haskell.LSP.TH.Location
-
--- ---------------------------------------------------------------------
-{-
-The protocol currently supports the following diagnostic severities:
-
-enum DiagnosticSeverity {
-    /**
-     * Reports an error.
-     */
-    Error = 1,
-    /**
-     * Reports a warning.
-     */
-    Warning = 2,
-    /**
-     * Reports an information.
-     */
-    Information = 3,
-    /**
-     * Reports a hint.
-     */
-    Hint = 4
-}
--}
-data DiagnosticSeverity
-  = DsError   -- ^ Error = 1,
-  | DsWarning -- ^ Warning = 2,
-  | DsInfo    -- ^ Info = 3,
-  | DsHint    -- ^ Hint = 4
-  deriving (Eq,Ord,Show,Read)
-
-instance A.ToJSON DiagnosticSeverity where
-  toJSON DsError   = A.Number 1
-  toJSON DsWarning = A.Number 2
-  toJSON DsInfo    = A.Number 3
-  toJSON DsHint    = A.Number 4
-
-instance A.FromJSON DiagnosticSeverity where
-  parseJSON (A.Number 1) = pure DsError
-  parseJSON (A.Number 2) = pure DsWarning
-  parseJSON (A.Number 3) = pure DsInfo
-  parseJSON (A.Number 4) = pure DsHint
-  parseJSON _            = mempty
-
--- ---------------------------------------------------------------------
-{-
-Represents a related message and source code location for a diagnostic. This should be
-used to point to code locations that cause or related to a diagnostics, e.g when duplicating
-a symbol in a scope.
-
-export interface DiagnosticRelatedInformation {
-  /**
-   * The location of this related diagnostic information.
-   */
-  location: Location;
-
-  /**
-   * The message of this related diagnostic information.
-   */
-  message: string;
-}
--}
-
-data DiagnosticRelatedInformation =
-  DiagnosticRelatedInformation
-    { _location :: Location
-    , _message  :: Text
-    } deriving (Show, Read, Eq, Ord)
-
-deriveJSON lspOptions ''DiagnosticRelatedInformation
-
--- ---------------------------------------------------------------------
-{-
-Diagnostic
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#diagnostic
-
-Represents a diagnostic, such as a compiler error or warning. Diagnostic objects
-are only valid in the scope of a resource.
-
-interface Diagnostic {
-    /**
-     * The range at which the message applies.
-     */
-    range: Range;
-
-    /**
-     * The diagnostic's severity. Can be omitted. If omitted it is up to the
-     * client to interpret diagnostics as error, warning, info or hint.
-     */
-    severity?: number;
-
-    /**
-     * The diagnostic's code. Can be omitted.
-     */
-    code?: number | string;
-
-    /**
-     * A human-readable string describing the source of this
-     * diagnostic, e.g. 'typescript' or 'super lint'.
-     */
-    source?: string;
-
-    /**
-     * The diagnostic's message.
-     */
-    message: string;
-
-    /**
-     * An array of related diagnostic information, e.g. when symbol-names within
-     * a scope collide all definitions can be marked via this property.
-     */
-    relatedInformation?: DiagnosticRelatedInformation[];
-}
--}
-
-type DiagnosticSource = Text
-data Diagnostic =
-  Diagnostic
-    { _range              :: Range
-    , _severity           :: Maybe DiagnosticSeverity
-    , _code               :: Maybe Text -- Note: Protocol allows Int too.
-    , _source             :: Maybe DiagnosticSource
-    , _message            :: Text
-    , _relatedInformation :: Maybe (List DiagnosticRelatedInformation)
-    } deriving (Show, Read, Eq, Ord)
-
-deriveJSON lspOptions ''Diagnostic
diff --git a/src/Language/Haskell/LSP/TH/DocumentFilter.hs b/src/Language/Haskell/LSP/TH/DocumentFilter.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/DocumentFilter.hs
+++ /dev/null
@@ -1,55 +0,0 @@
-{-# LANGUAGE TemplateHaskell            #-}
-module Language.Haskell.LSP.TH.DocumentFilter where
-
-import           Data.Aeson.TH
-import           Data.Text                      ( Text )
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.List
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-DocumentFilter
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#new-documentfilter
-
-A document filter denotes a document through properties like language, schema or
-pattern. Examples are a filter that applies to TypeScript files on disk or a
-filter the applies to JSON files with name package.json:
-
-    { language: 'typescript', scheme: 'file' }
-    { language: 'json', pattern: '**/package.json' }
-
-export interface DocumentFilter {
-        /**
-         * A language id, like `typescript`.
-         */
-        language?: string;
-
-        /**
-         * A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
-         */
-        scheme?: string;
-
-        /**
-         * A glob pattern, like `*.{ts,js}`.
-         */
-        pattern?: string;
-}
--}
-data DocumentFilter =
-  DocumentFilter
-    { _language :: Text
-    , _scheme   :: Text
-    , _pattern  :: Maybe Text
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''DocumentFilter
-
-{-
-A document selector is the combination of one or many document filters.
-
-export type DocumentSelector = DocumentFilter[];
--}
-type DocumentSelector = List DocumentFilter
diff --git a/src/Language/Haskell/LSP/TH/List.hs b/src/Language/Haskell/LSP/TH/List.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/List.hs
+++ /dev/null
@@ -1,26 +0,0 @@
--- Need to split these types out into a separate module since
--- ClientCapabilities also depends on them
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE DeriveTraversable          #-}
-module Language.Haskell.LSP.TH.List where
-
-import qualified Data.Aeson                                 as A
-import           Data.Aeson.Types
-
--- | This data type is used to host a FromJSON instance for the encoding used by
--- elisp, where an empty list shows up as "null"
-newtype List a = List [a]
-                deriving (Show,Read,Eq,Ord,Monoid,Functor,Foldable,Traversable)
-
-instance (A.ToJSON a) => A.ToJSON (List a) where
-  toJSON (List ls) = toJSON ls
-
-instance (A.FromJSON a) => A.FromJSON (List a) where
-  parseJSON A.Null = return (List [])
-  parseJSON v      = List <$> parseJSON v
-
-#if __GLASGOW_HASKELL__ >= 804
-instance Semigroup (List a) where
-  (<>) = mappend
-#endif
diff --git a/src/Language/Haskell/LSP/TH/Location.hs b/src/Language/Haskell/LSP/TH/Location.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Location.hs
+++ /dev/null
@@ -1,93 +0,0 @@
-{-# LANGUAGE TemplateHaskell            #-}
-module Language.Haskell.LSP.TH.Location where
-
-import           Data.Aeson.TH
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.Uri
-
--- ---------------------------------------------------------------------
-
-{-
-The current protocol is talored for textual documents which content can be
-represented as a string. There is currently no support for binary documents.
-Positions inside a document (see Position definition below) are expressed as a
-zero-based line and character offset. To ensure that both client and server
-split the string into the same line representation the protocol specs the
-following end of line sequences: '\n', '\r\n' and '\r'.
-
-export const EOL: string[] = ['\n', '\r\n', '\r'];
--}
-{-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#position
-
-Position in a text document expressed as zero-based line and character offset. A
-position is between two characters like an 'insert' cursor in a editor.
-
-interface Position {
-    /**
-     * Line position in a document (zero-based).
-     */
-    line: number;
-
-    /**
-     * Character offset on a line in a document (zero-based).
-     */
-    character: number;
-}
--}
-data Position =
-  Position
-    { _line      :: Int
-    , _character :: Int
-    } deriving (Show, Read, Eq, Ord)
-
-deriveJSON lspOptions ''Position
-
--- ---------------------------------------------------------------------
-{-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#range
-
-A range in a text document expressed as (zero-based) start and end positions. A
-range is comparable to a selection in an editor. Therefore the end position is
-exclusive.
-
-interface Range {
-    /**
-     * The range's start position.
-     */
-    start: Position;
-
-    /**
-     * The range's end position.
-     */
-    end: Position;
-}
--}
-
-data Range =
-  Range
-    { _start :: Position
-    , _end   :: Position
-    } deriving (Show, Read, Eq, Ord)
-
-deriveJSON lspOptions ''Range
-
--- ---------------------------------------------------------------------
-{-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#location
-
-Represents a location inside a resource, such as a line inside a text file.
-
-interface Location {
-    uri: string;
-    range: Range;
-}
--}
-
-data Location =
-  Location
-    { _uri   :: Uri
-    , _range :: Range
-    } deriving (Show, Read, Eq, Ord)
-
-deriveJSON lspOptions ''Location
diff --git a/src/Language/Haskell/LSP/TH/MarkupContent.hs b/src/Language/Haskell/LSP/TH/MarkupContent.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/MarkupContent.hs
+++ /dev/null
@@ -1,122 +0,0 @@
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE OverloadedStrings          #-}
-{-# LANGUAGE TemplateHaskell            #-}
-
--- | A MarkupContent literal represents a string value which content can
--- be represented in different formats.
--- Currently plaintext and markdown are supported formats.
--- A MarkupContent is usually used in documentation properties of result
--- literals like CompletionItem or SignatureInformation.
-module Language.Haskell.LSP.TH.MarkupContent where
-
-import           Data.Aeson
-import           Data.Aeson.TH
-import           Data.Text                                      (Text)
-import           Language.Haskell.LSP.TH.Constants
-
-{-
-/**
- * Describes the content type that a client supports in various
- * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
- *
- * Please note that `MarkupKinds` must not start with a `$`. This kinds
- * are reserved for internal usage.
- */
-export namespace MarkupKind {
-	/**
-	 * Plain text is supported as a content format
-	 */
-	export const PlainText: 'plaintext' = 'plaintext';
-
-	/**
-	 * Markdown is supported as a content format
-	 */
-	export const Markdown: 'markdown' = 'markdown';
-}
-export type MarkupKind = 'plaintext' | 'markdown';
--}
-
--- |  Describes the content type that a client supports in various
--- result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
-data MarkupKind = MkPlainText -- ^ Plain text is supported as a content format
-                | MkMarkdown -- ^ Markdown is supported as a content format
-  deriving (Read, Show, Eq)
-
-instance ToJSON MarkupKind where
-  toJSON MkPlainText = String "plaintext"
-  toJSON MkMarkdown  = String "markdown"
-
-instance FromJSON MarkupKind where
-  parseJSON (String "plaintext") = pure MkPlainText
-  parseJSON (String "markdown")  = pure MkMarkdown
-  parseJSON _                    = mempty
-
-
-{-
-/**
- * A `MarkupContent` literal represents a string value which content is interpreted base on its
- * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
- *
- * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
- * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
- *
- * Here is an example how such a string can be constructed using JavaScript / TypeScript:
- * ```ts
- * let markdown: MarkdownContent = {
- *  kind: MarkupKind.Markdown,
- *	value: [
- *		'# Header',
- *		'Some text',
- *		'```typescript',
- *		'someCode();',
- *		'```'
- *	].join('\n')
- * };
- * ```
- *
- * *Please Note* that clients might sanitize the return markdown. A client could decide to
- * remove HTML from the markdown to avoid script execution.
- */
-export interface MarkupContent {
-	/**
-	 * The type of the Markup
-	 */
-	kind: MarkupKind;
-
-	/**
-	 * The content itself
-	 */
-	value: string;
-}
--}
-
--- | A `MarkupContent` literal represents a string value which content is interpreted base on its
--- | kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
--- |
--- | If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
--- | See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
--- |
--- | Here is an example how such a string can be constructed using JavaScript / TypeScript:
--- | ```ts
--- | let markdown: MarkdownContent = {
--- |  kind: MarkupKind.Markdown,
--- |	value: [
--- |		'# Header',
--- |		'Some text',
--- |		'```typescript',
--- |		'someCode();',
--- |		'```'
--- |	].join('\n')
--- | };
--- | ```
--- |
--- | *Please Note* that clients might sanitize the return markdown. A client could decide to
--- | remove HTML from the markdown to avoid script execution.
-data MarkupContent =
-  MarkupContent
-    { _kind  :: MarkupKind -- ^ The type of the Markup
-    , _value :: Text -- ^ The content itself
-    }
-  deriving (Read, Show, Eq)
-
-deriveJSON lspOptions ''MarkupContent
diff --git a/src/Language/Haskell/LSP/TH/Message.hs b/src/Language/Haskell/LSP/TH/Message.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Message.hs
+++ /dev/null
@@ -1,420 +0,0 @@
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE OverloadedStrings          #-}
-{-# LANGUAGE TemplateHaskell            #-}
-module Language.Haskell.LSP.TH.Message where
-
-import qualified Data.Aeson                                 as A
-import           Data.Aeson.TH
-import           Data.Aeson.Types
-import           Data.Hashable
--- For <= 8.2.2
-import           Data.Monoid                                ((<>))
-import           Data.Text                                  (Text)
-import qualified Data.Text                                  as T
-import           Language.Haskell.LSP.TH.Constants
-
-
--- | Id used for a request, Can be either a String or an Int
-data LspId = IdInt Int | IdString Text
-            deriving (Show,Read,Eq,Ord)
-
-instance A.ToJSON LspId where
-  toJSON (IdInt i)    = toJSON i
-  toJSON (IdString s) = toJSON s
-
-instance A.FromJSON LspId where
-  parseJSON v@(A.Number _) = IdInt <$> parseJSON v
-  parseJSON  (A.String  s) = return (IdString s)
-  parseJSON _              = mempty
-
-instance Hashable LspId where
-  hashWithSalt salt (IdInt i) = hashWithSalt salt i
-  hashWithSalt salt (IdString s) = hashWithSalt salt s
-
--- ---------------------------------------------------------------------
-
--- | Id used for a response, Can be either a String or an Int, or Null. If a
--- request doesn't provide a result value the receiver of a request still needs
--- to return a response message to conform to the JSON RPC specification. The
--- result property of the ResponseMessage should be set to null in this case to
--- signal a successful request.
-data LspIdRsp = IdRspInt Int | IdRspString Text | IdRspNull
-            deriving (Show,Read,Eq)
-
-instance A.ToJSON LspIdRsp where
-  toJSON (IdRspInt i)    = toJSON i
-  toJSON (IdRspString s) = toJSON s
-  toJSON IdRspNull       = A.Null
-
-instance A.FromJSON LspIdRsp where
-  parseJSON v@(A.Number _) = IdRspInt <$> parseJSON v
-  parseJSON  (A.String  s) = return $ IdRspString s
-  parseJSON  A.Null        = return IdRspNull
-  parseJSON _              = mempty
-
-instance Hashable LspIdRsp where
-  hashWithSalt salt (IdRspInt i) = hashWithSalt salt i
-  hashWithSalt salt (IdRspString s) = hashWithSalt salt s
-  hashWithSalt _ IdRspNull = 0
-
--- | Converts an LspId to its LspIdRsp counterpart.
-responseId :: LspId -> LspIdRsp
-responseId (IdInt    i) = IdRspInt i
-responseId (IdString s) = IdRspString s
-
--- | Converts an LspIdRsp to its LspId counterpart.
-requestId :: LspIdRsp -> LspId
-requestId (IdRspInt    i) = IdInt i
-requestId (IdRspString s) = IdString s
-requestId IdRspNull       = error "Null response id"
-
--- ---------------------------------------------------------------------
-
--- Client Methods
-data ClientMethod =
- -- General
-   Initialize
- | Initialized
- | Shutdown
- | Exit
- | CancelRequest
- -- Workspace
- | WorkspaceDidChangeConfiguration
- | WorkspaceDidChangeWatchedFiles
- | WorkspaceSymbol
- | WorkspaceExecuteCommand
- -- Document
- | TextDocumentDidOpen
- | TextDocumentDidChange
- | TextDocumentWillSave
- | TextDocumentWillSaveWaitUntil
- | TextDocumentDidSave
- | TextDocumentDidClose
- | TextDocumentCompletion
- | CompletionItemResolve
- | TextDocumentHover
- | TextDocumentSignatureHelp
- | TextDocumentReferences
- | TextDocumentDocumentHighlight
- | TextDocumentDocumentSymbol
- | TextDocumentFormatting
- | TextDocumentRangeFormatting
- | TextDocumentOnTypeFormatting
- | TextDocumentDefinition
- | TextDocumentImplementation
- | TextDocumentCodeAction
- | TextDocumentCodeLens
- | CodeLensResolve
- | TextDocumentDocumentLink
- | DocumentLinkResolve
- | TextDocumentRename
- -- Messages of the form $/message
- -- Implementation Dependent, can be ignored
- | Misc Text
-   deriving (Eq,Ord,Read,Show)
-
-instance A.FromJSON ClientMethod where
-  -- General
-  parseJSON (A.String "initialize")                       = return Initialize
-  parseJSON (A.String "initialized")                      = return Initialized
-  parseJSON (A.String "shutdown")                         = return Shutdown
-  parseJSON (A.String "exit")                             = return Exit
-  parseJSON (A.String "$/cancelRequest")                  = return CancelRequest
- -- Workspace
-  parseJSON (A.String "workspace/didChangeConfiguration") = return WorkspaceDidChangeConfiguration
-  parseJSON (A.String "workspace/didChangeWatchedFiles")  = return WorkspaceDidChangeWatchedFiles
-  parseJSON (A.String "workspace/symbol")                 = return WorkspaceSymbol
-  parseJSON (A.String "workspace/executeCommand")         = return WorkspaceExecuteCommand
- -- Document
-  parseJSON (A.String "textDocument/didOpen")             = return TextDocumentDidOpen
-  parseJSON (A.String "textDocument/didChange")           = return TextDocumentDidChange
-  parseJSON (A.String "textDocument/willSave")            = return TextDocumentWillSave
-  parseJSON (A.String "textDocument/willSaveWaitUntil")   = return TextDocumentWillSaveWaitUntil
-  parseJSON (A.String "textDocument/didSave")             = return TextDocumentDidSave
-  parseJSON (A.String "textDocument/didClose")            = return TextDocumentDidClose
-  parseJSON (A.String "textDocument/completion")          = return TextDocumentCompletion
-  parseJSON (A.String "completionItem/resolve")           = return CompletionItemResolve
-  parseJSON (A.String "textDocument/hover")               = return TextDocumentHover
-  parseJSON (A.String "textDocument/signatureHelp")       = return TextDocumentSignatureHelp
-  parseJSON (A.String "textDocument/references")          = return TextDocumentReferences
-  parseJSON (A.String "textDocument/documentHighlight")   = return TextDocumentDocumentHighlight
-  parseJSON (A.String "textDocument/documentSymbol")      = return TextDocumentDocumentSymbol
-  parseJSON (A.String "textDocument/formatting")          = return TextDocumentFormatting
-  parseJSON (A.String "textDocument/rangeFormatting")     = return TextDocumentRangeFormatting
-  parseJSON (A.String "textDocument/onTypeFormatting")    = return TextDocumentOnTypeFormatting
-  parseJSON (A.String "textDocument/definition")          = return TextDocumentDefinition
-  parseJSON (A.String "textDocument/implementation")      = return TextDocumentImplementation
-  parseJSON (A.String "textDocument/codeAction")          = return TextDocumentCodeAction
-  parseJSON (A.String "textDocument/codeLens")            = return TextDocumentCodeLens
-  parseJSON (A.String "codeLens/resolve")                 = return CodeLensResolve
-  parseJSON (A.String "textDocument/documentLink")        = return TextDocumentDocumentLink
-  parseJSON (A.String "documentLink/resolve")             = return DocumentLinkResolve
-  parseJSON (A.String "textDocument/rename")              = return TextDocumentRename
-  parseJSON (A.String x)                                  = if T.isPrefixOf "$/" x
-                                                               then return $ Misc (T.drop 2 x)
-                                                            else mempty
-  parseJSON _                                             = mempty
-
-instance A.ToJSON ClientMethod where
-  -- General
-  toJSON Initialize                      = A.String "initialize"
-  toJSON Initialized                     = A.String "initialized"
-  toJSON Shutdown                        = A.String "shutdown"
-  toJSON Exit                            = A.String "exit"
-  toJSON CancelRequest                   = A.String "$/cancelRequest"
-  -- Workspace
-  toJSON WorkspaceDidChangeConfiguration = A.String "workspace/didChangeConfiguration"
-  toJSON WorkspaceDidChangeWatchedFiles  = A.String "workspace/didChangeWatchedFiles"
-  toJSON WorkspaceSymbol                 = A.String "workspace/symbol"
-  toJSON WorkspaceExecuteCommand         = A.String "workspace/executeCommand"
-  -- Document
-  toJSON TextDocumentDidOpen             = A.String "textDocument/didOpen"
-  toJSON TextDocumentDidChange           = A.String "textDocument/didChange"
-  toJSON TextDocumentWillSave            = A.String "textDocument/willSave"
-  toJSON TextDocumentWillSaveWaitUntil   = A.String "textDocument/willSaveWaitUntil"
-  toJSON TextDocumentDidSave             = A.String "textDocument/didSave"
-  toJSON TextDocumentDidClose            = A.String "textDocument/didClose"
-  toJSON TextDocumentCompletion          = A.String "textDocument/completion"
-  toJSON CompletionItemResolve           = A.String "completionItem/resolve"
-  toJSON TextDocumentHover               = A.String "textDocument/hover"
-  toJSON TextDocumentSignatureHelp       = A.String "textDocument/signatureHelp"
-  toJSON TextDocumentReferences          = A.String "textDocument/references"
-  toJSON TextDocumentDocumentHighlight   = A.String "textDocument/documentHighlight"
-  toJSON TextDocumentDocumentSymbol      = A.String "textDocument/documentSymbol"
-  toJSON TextDocumentFormatting          = A.String "textDocument/formatting"
-  toJSON TextDocumentRangeFormatting     = A.String "textDocument/rangeFormatting"
-  toJSON TextDocumentOnTypeFormatting    = A.String "textDocument/onTypeFormatting"
-  toJSON TextDocumentDefinition          = A.String "textDocument/definition"
-  toJSON TextDocumentImplementation      = A.String "textDocument/implementation"
-  toJSON TextDocumentCodeAction          = A.String "textDocument/codeAction"
-  toJSON TextDocumentCodeLens            = A.String "textDocument/codeLens"
-  toJSON CodeLensResolve                 = A.String "codeLens/resolve"
-  toJSON TextDocumentRename              = A.String "textDocument/rename"
-  toJSON TextDocumentDocumentLink        = A.String "textDocument/documentLink"
-  toJSON DocumentLinkResolve             = A.String "documentLink/resolve"
-  toJSON (Misc xs)                       = A.String $ "$/" <> xs
-
-data ServerMethod =
-  -- Window
-    WindowShowMessage
-  | WindowShowMessageRequest
-  | WindowLogMessage
-  | TelemetryEvent
-  -- Client
-  | ClientRegisterCapability
-  | ClientUnregisterCapability
-  -- Workspace
-  | WorkspaceApplyEdit
-  -- Document
-  | TextDocumentPublishDiagnostics
-  -- Cancelling
-  | CancelRequestServer
-   deriving (Eq,Ord,Read,Show)
-
-instance A.FromJSON ServerMethod where
-  -- Window
-  parseJSON (A.String "window/showMessage")              = return WindowShowMessage
-  parseJSON (A.String "window/showMessageRequest")       = return WindowShowMessageRequest
-  parseJSON (A.String "window/logMessage")               = return WindowLogMessage
-  parseJSON (A.String "telemetry/event")                 = return TelemetryEvent
-  -- Client
-  parseJSON (A.String "client/registerCapability")       = return ClientRegisterCapability
-  parseJSON (A.String "client/unregisterCapability")     = return ClientUnregisterCapability
-  -- Workspace
-  parseJSON (A.String "workspace/applyEdit")             = return WorkspaceApplyEdit
-  -- Document
-  parseJSON (A.String "textDocument/publishDiagnostics") = return TextDocumentPublishDiagnostics
-  -- Cancelling
-  parseJSON (A.String "$/cancelRequest")                 = return CancelRequestServer
-  parseJSON _                                            = mempty
-
-instance A.ToJSON ServerMethod where
-  -- Window
-  toJSON WindowShowMessage = A.String "window/showMessage"
-  toJSON WindowShowMessageRequest = A.String "window/showMessageRequest"
-  toJSON WindowLogMessage = A.String "window/logMessage"
-  toJSON TelemetryEvent = A.String "telemetry/event"
-  -- Client
-  toJSON ClientRegisterCapability = A.String "client/registerCapability"
-  toJSON ClientUnregisterCapability = A.String "client/unregisterCapability"
-  -- Workspace
-  toJSON WorkspaceApplyEdit = A.String "workspace/applyEdit"
-  -- Document
-  toJSON TextDocumentPublishDiagnostics = A.String "textDocument/publishDiagnostics"
-  -- Cancelling
-  toJSON CancelRequestServer = A.String "$/cancelRequest"
-
-data RequestMessage m req resp =
-  RequestMessage
-    { _jsonrpc :: Text
-    , _id      :: LspId
-    , _method  :: m
-    , _params  :: req
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''RequestMessage
-
--- ---------------------------------------------------------------------
-{-
-interface ResponseError<D> {
-    /**
-     * A number indicating the error type that occurred.
-     */
-    code: number;
-
-    /**
-     * A string providing a short description of the error.
-     */
-    message: string;
-
-    /**
-     * A Primitive or Structured value that contains additional
-     * information about the error. Can be omitted.
-     */
-    data?: D;
-}
-
-export namespace ErrorCodes {
-        // Defined by JSON RPC
-        export const ParseError: number = -32700;
-        export const InvalidRequest: number = -32600;
-        export const MethodNotFound: number = -32601;
-        export const InvalidParams: number = -32602;
-        export const InternalError: number = -32603;
-        export const serverErrorStart: number = -32099;
-        export const serverErrorEnd: number = -32000;
-        export const ServerNotInitialized: number = -32002;
-        export const UnknownErrorCode: number = -32001;
-
-        // Defined by the protocol.
-        export const RequestCancelled: number = -32800;
-}
--}
-
-data ErrorCode = ParseError
-               | InvalidRequest
-               | MethodNotFound
-               | InvalidParams
-               | InternalError
-               | ServerErrorStart
-               | ServerErrorEnd
-               | ServerNotInitialized
-               | UnknownErrorCode
-               | RequestCancelled
-               -- ^ Note: server error codes are reserved from -32099 to -32000
-               deriving (Read,Show,Eq)
-
-instance A.ToJSON ErrorCode where
-  toJSON ParseError           = A.Number (-32700)
-  toJSON InvalidRequest       = A.Number (-32600)
-  toJSON MethodNotFound       = A.Number (-32601)
-  toJSON InvalidParams        = A.Number (-32602)
-  toJSON InternalError        = A.Number (-32603)
-  toJSON ServerErrorStart     = A.Number (-32099)
-  toJSON ServerErrorEnd       = A.Number (-32000)
-  toJSON ServerNotInitialized = A.Number (-32002)
-  toJSON UnknownErrorCode     = A.Number (-32001)
-  toJSON RequestCancelled     = A.Number (-32800)
-
-instance A.FromJSON ErrorCode where
-  parseJSON (A.Number (-32700)) = pure ParseError
-  parseJSON (A.Number (-32600)) = pure InvalidRequest
-  parseJSON (A.Number (-32601)) = pure MethodNotFound
-  parseJSON (A.Number (-32602)) = pure InvalidParams
-  parseJSON (A.Number (-32603)) = pure InternalError
-  parseJSON (A.Number (-32099)) = pure ServerErrorStart
-  parseJSON (A.Number (-32000)) = pure ServerErrorEnd
-  parseJSON (A.Number (-32002)) = pure ServerNotInitialized
-  parseJSON (A.Number (-32001)) = pure UnknownErrorCode
-  parseJSON (A.Number (-32800)) = pure RequestCancelled
-  parseJSON _                   = mempty
-
--- -------------------------------------
-
-data ResponseError =
-  ResponseError
-    { _code    :: ErrorCode
-    , _message :: Text
-    , _xdata   :: Maybe A.Value
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ResponseError
-
--- ---------------------------------------------------------------------
-
-data ResponseMessage a =
-  ResponseMessage
-    { _jsonrpc :: Text
-    , _id      :: LspIdRsp
-    , _result  :: Maybe a
-    , _error   :: Maybe ResponseError
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''ResponseMessage
-
-type ErrorResponse = ResponseMessage ()
-
--- ---------------------------------------------------------------------
-
-type BareResponseMessage = ResponseMessage A.Value
-
--- ---------------------------------------------------------------------
-{-
-$ Notifications and Requests
-
-Notification and requests ids starting with '$/' are messages which are protocol
-implementation dependent and might not be implementable in all clients or
-servers. For example if the server implementation uses a single threaded
-synchronous programming language then there is little a server can do to react
-to a '$/cancelRequest'. If a server or client receives notifications or requests
-starting with '$/' it is free to ignore them if they are unknown.
--}
-
-data NotificationMessage m a =
-  NotificationMessage
-    { _jsonrpc :: Text
-    , _method  :: m
-    , _params  :: a
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''NotificationMessage
-
--- ---------------------------------------------------------------------
-{-
-Cancellation Support
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#cancellation-support
-
-    New: The base protocol now offers support for request cancellation. To
-    cancel a request, a notification message with the following properties is
-    sent:
-
-Notification:
-
-    method: '$/cancelRequest'
-    params: CancelParams defined as follows:
-
-interface CancelParams {
-    /**
-     * The request id to cancel.
-     */
-    id: number | string;
-}
-
-A request that got canceled still needs to return from the server and send a
-response back. It can not be left open / hanging. This is in line with the JSON
-RPC protocol that requires that every request sends a response back. In addition
-it allows for returning partial results on cancel.
--}
-
-data CancelParams =
-  CancelParams
-    { _id :: LspId
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''CancelParams
-
-type CancelNotification = NotificationMessage ClientMethod CancelParams
-type CancelNotificationServer = NotificationMessage ServerMethod CancelParams
-
--- ---------------------------------------------------------------------
diff --git a/src/Language/Haskell/LSP/TH/MessageFuncs.hs b/src/Language/Haskell/LSP/TH/MessageFuncs.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/MessageFuncs.hs
+++ /dev/null
@@ -1,310 +0,0 @@
-{-# LANGUAGE GADTs               #-}
-{-# LANGUAGE MultiWayIf          #-}
-{-# LANGUAGE BinaryLiterals      #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-
-module Language.Haskell.LSP.TH.MessageFuncs (
-  -- * General
-    fmClientInitializeRequest
-  , fmClientInitializedNotification
-  , fmClientShutdownRequest
-  , fmClientExitNotification
-  , fmClientCancelNotification
-
-  -- * Window
-  , fmServerShowMessageNotification
-  , fmServerShowMessageRequest
-  , fmServerLogMessageNotification
-  , fmServerTelemetryNotification
-
-  -- * Client
-  , fmServerRegisterCapabilityRequest
-  , fmServerUnregisterCapabilityRequest
-
-  -- * Workspace
-  , fmClientDidChangeConfigurationNotification
-  , fmClientDidChangeWatchedFilesNotification
-  , fmClientWorkspaceSymbolRequest
-  , fmClientExecuteCommandRequest
-  , fmServerApplyWorkspaceEditRequest
-
-  -- * Document
-  , fmServerPublishDiagnosticsNotification
-  , fmClientDidOpenTextDocumentNotification
-  , fmClientDidChangeTextDocumentNotification
-  , fmClientWillSaveTextDocumentNotification
-  , fmClientWillSaveWaitUntilRequest
-  , fmClientDidSaveTextDocumentNotification
-  , fmClientDidCloseTextDocumentNotification
-  , fmClientCompletionRequest
-  , fmClientCompletionItemResolveRequest
-  , fmClientHoverRequest
-  , fmClientSignatureHelpRequest
-  , fmClientReferencesRequest
-  , fmClientDocumentHighlightRequest
-  , fmClientDocumentSymbolRequest
-  , fmClientDocumentFormattingRequest
-  , fmClientDocumentRangeFormattingRequest
-  , fmClientDocumentOnTypeFormattingRequest
-  , fmClientDefinitionRequest
-  , fmClientCodeActionRequest
-  , fmClientCodeLensRequest
-  , fmClientCodeLensResolveRequest
-  , fmClientDocumentLinkRequest
-  , fmClientDocumentLinkResolveRequest
-  , fmClientRenameRequest
-  ) where
-
-import qualified Data.Aeson as J
-import           Data.Text ( Text )
-import qualified Language.Haskell.LSP.TH.DataTypesJSON      as J
-
--- ---------------------------------------------------------------------
-{-# ANN module ("HLint: ignore Eta reduce"         :: String) #-}
-{-# ANN module ("HLint: ignore Redundant do"       :: String) #-}
-{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
--- ---------------------------------------------------------------------
-
--- ----------------------------------------------------------------------
--- General
--- ----------------------------------------------------------------------
-
--- * :leftwards_arrow_with_hook: [initialize](#initialize)
-
-fmClientInitializeRequest :: J.LspId -> J.InitializeParams -> J.InitializeRequest
-fmClientInitializeRequest rid params
-  = J.RequestMessage  "2.0" rid J.Initialize params
-
--- ----------------------------------------------------------------------
--- * **New** :arrow_right: [initialized](#initialized)
-
--- | From 3.0
-fmClientInitializedNotification :: J.InitializedNotification
-fmClientInitializedNotification = J.NotificationMessage "2.0" J.Initialized Nothing
-
--- ----------------------------------------------------------------------
--- * :leftwards_arrow_with_hook: [shutdown](#shutdown)
-
-fmClientShutdownRequest :: J.LspId -> Maybe J.Value -> J.ShutdownRequest
-fmClientShutdownRequest rid params
-  = J.RequestMessage  "2.0" rid J.Shutdown params
-
--- ----------------------------------------------------------------------
--- * :arrow_right: [exit](#exit)
-
-fmClientExitNotification :: J.ExitNotification
-fmClientExitNotification = J.NotificationMessage "2.0" J.Exit Nothing
-
--- ----------------------------------------------------------------------
--- * :arrow_right: [$/cancelRequest](#cancelRequest)
-
-fmClientCancelNotification :: J.LspId -> J.CancelNotification
-fmClientCancelNotification idToCancel
-  = J.NotificationMessage "2.0" J.CancelRequest  (J.CancelParams idToCancel)
-
--- ----------------------------------------------------------------------
--- Window
--- ----------------------------------------------------------------------
-
--- * :arrow_left: [window/showMessage](#window_showMessage)
-
-fmServerShowMessageNotification :: J.MessageType -> Text -> J.ShowMessageNotification
-fmServerShowMessageNotification mt msg
-  = J.NotificationMessage "2.0" J.WindowShowMessage (J.ShowMessageParams mt msg)
-
--- ----------------------------------------------------------------------
--- * :arrow_right_hook: [window/showMessageRequest](#window_showMessageRequest)
-
-fmServerShowMessageRequest :: J.LspId -> J.ShowMessageRequestParams -> J.ShowMessageRequest
-fmServerShowMessageRequest rid params
-  = J.RequestMessage  "2.0" rid J.WindowShowMessageRequest params
-
--- ----------------------------------------------------------------------
--- * :arrow_left: [window/logMessage](#window_logMessage)
-
-fmServerLogMessageNotification :: J.MessageType -> Text -> J.LogMessageNotification
-fmServerLogMessageNotification mt msg
-  = J.NotificationMessage "2.0" J.WindowLogMessage (J.LogMessageParams mt msg)
-
--- ----------------------------------------------------------------------
--- * :arrow_left: [telemetry/event](#telemetry_event)
-
-fmServerTelemetryNotification :: J.Value  -> J.TelemetryNotification
-fmServerTelemetryNotification params
-  = J.NotificationMessage "2.0" J.TelemetryEvent params
-
--- ----------------------------------------------------------------------
---  Client
--- ----------------------------------------------------------------------
-
--- * :arrow_right_hook: [client/registerCapability](#client_registerCapability)
--- | from 3.0
-fmServerRegisterCapabilityRequest :: J.LspId -> J.RegistrationParams -> J.RegisterCapabilityRequest
-fmServerRegisterCapabilityRequest rid params
-  = J.RequestMessage  "2.0" rid J.ClientRegisterCapability params
-
--- * :arrow_right_hook: [client/unregisterCapability](#client_unregisterCapability)
--- | from 3.0
-fmServerUnregisterCapabilityRequest :: J.LspId -> J.UnregistrationParams -> J.UnregisterCapabilityRequest
-fmServerUnregisterCapabilityRequest rid params
-  = J.RequestMessage  "2.0" rid J.ClientUnregisterCapability params
-
--- ----------------------------------------------------------------------
--- Workspace
--- ----------------------------------------------------------------------
-
--- * :arrow_right: [workspace/didChangeConfiguration](#workspace_didChangeConfiguration)
-fmClientDidChangeConfigurationNotification :: J.DidChangeConfigurationParams -> J.DidChangeConfigurationNotification
-fmClientDidChangeConfigurationNotification params
-  = J.NotificationMessage "2.0" J.WorkspaceDidChangeConfiguration params
-
--- * :arrow_right: [workspace/didChangeWatchedFiles](#workspace_didChangeWatchedFiles)
-fmClientDidChangeWatchedFilesNotification :: J.DidChangeWatchedFilesParams -> J.DidChangeWatchedFilesNotification
-fmClientDidChangeWatchedFilesNotification params
-  = J.NotificationMessage "2.0" J.WorkspaceDidChangeWatchedFiles params
-
--- * :leftwards_arrow_with_hook: [workspace/symbol](#workspace_symbol)
-fmClientWorkspaceSymbolRequest :: J.LspId -> J.WorkspaceSymbolParams -> J.WorkspaceSymbolRequest
-fmClientWorkspaceSymbolRequest rid params
-  = J.RequestMessage  "2.0" rid J.WorkspaceSymbol params
-
--- * **New** :leftwards_arrow_with_hook: [workspace/executeCommand](#workspace_executeCommand)
--- | From 3.0
-fmClientExecuteCommandRequest :: J.LspId -> J.ExecuteCommandParams -> J.ExecuteCommandRequest
-fmClientExecuteCommandRequest rid params
-  = J.RequestMessage  "2.0" rid J.WorkspaceExecuteCommand params
-
--- * **New** :arrow_right_hook: [workspace/applyEdit](#workspace_applyEdit)
--- | From 3.0
-fmServerApplyWorkspaceEditRequest :: J.LspId -> J.ApplyWorkspaceEditParams -> J.ApplyWorkspaceEditRequest
-fmServerApplyWorkspaceEditRequest rid params
-  = J.RequestMessage  "2.0" rid J.WorkspaceApplyEdit params
-
--- ----------------------------------------------------------------------
- -- Document
--- ----------------------------------------------------------------------
-
--- * :arrow_left: [textDocument/publishDiagnostics](#textDocument_publishDiagnostics)
-fmServerPublishDiagnosticsNotification :: J.PublishDiagnosticsParams -> J.PublishDiagnosticsNotification
-fmServerPublishDiagnosticsNotification params
-  = J.NotificationMessage "2.0" J.TextDocumentPublishDiagnostics params
-
--- * :arrow_right: [textDocument/didOpen](#textDocument_didOpen)
-fmClientDidOpenTextDocumentNotification :: J.DidOpenTextDocumentParams -> J.DidOpenTextDocumentNotification
-fmClientDidOpenTextDocumentNotification params
-  = J.NotificationMessage "2.0" J.TextDocumentDidOpen params
-
--- * :arrow_right: [textDocument/didChange](#textDocument_didChange)
-fmClientDidChangeTextDocumentNotification :: J.DidChangeTextDocumentParams -> J.DidChangeTextDocumentNotification
-fmClientDidChangeTextDocumentNotification params
-  = J.NotificationMessage "2.0" J.TextDocumentDidChange params
-
--- * :arrow_right: [textDocument/willSave](#textDocument_willSave)
-fmClientWillSaveTextDocumentNotification :: J.WillSaveTextDocumentParams -> J.WillSaveTextDocumentNotification
-fmClientWillSaveTextDocumentNotification params
-  = J.NotificationMessage "2.0" J.TextDocumentWillSave params
-
--- * **New** :leftwards_arrow_with_hook: [textDocument/willSaveWaitUntil](#textDocument_willSaveWaitUntil)
--- | From 3.0
-fmClientWillSaveWaitUntilRequest :: J.LspId -> J.WillSaveTextDocumentParams -> J.WillSaveWaitUntilTextDocumentRequest
-fmClientWillSaveWaitUntilRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentWillSaveWaitUntil params
-
--- * **New** :arrow_right: [textDocument/didSave](#textDocument_didSave)
--- | 3.0
-fmClientDidSaveTextDocumentNotification :: J.DidSaveTextDocumentParams -> J.DidSaveTextDocumentNotification
-fmClientDidSaveTextDocumentNotification params
-  = J.NotificationMessage "2.0" J.TextDocumentDidSave params
-
--- * :arrow_right: [textDocument/didClose](#textDocument_didClose)
-fmClientDidCloseTextDocumentNotification :: J.DidCloseTextDocumentParams -> J.DidCloseTextDocumentNotification
-fmClientDidCloseTextDocumentNotification params
-  = J.NotificationMessage "2.0" J.TextDocumentDidClose params
-
--- * :leftwards_arrow_with_hook: [textDocument/completion](#textDocument_completion)
-fmClientCompletionRequest :: J.LspId -> J.TextDocumentPositionParams -> J.CompletionRequest
-fmClientCompletionRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentCompletion params
-
--- * :leftwards_arrow_with_hook: [completionItem/resolve](#completionItem_resolve)
-fmClientCompletionItemResolveRequest :: J.LspId -> J.CompletionItem -> J.CompletionItemResolveRequest
-fmClientCompletionItemResolveRequest rid params
-  = J.RequestMessage "2.0" rid J.CompletionItemResolve params
-
--- * :leftwards_arrow_with_hook: [textDocument/hover](#textDocument_hover)
-fmClientHoverRequest :: J.LspId -> J.TextDocumentPositionParams -> J.HoverRequest
-fmClientHoverRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentHover params
-
--- * :leftwards_arrow_with_hook: [textDocument/signatureHelp](#textDocument_signatureHelp)
-fmClientSignatureHelpRequest :: J.LspId -> J.TextDocumentPositionParams -> J.SignatureHelpRequest
-fmClientSignatureHelpRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentSignatureHelp params
-
--- * :leftwards_arrow_with_hook: [textDocument/references](#textDocument_references)
-fmClientReferencesRequest :: J.LspId -> J.ReferenceParams -> J.ReferencesRequest
-fmClientReferencesRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentReferences params
-
--- * :leftwards_arrow_with_hook: [textDocument/documentHighlight](#textDocument_documentHighlight)
-fmClientDocumentHighlightRequest :: J.LspId -> J.TextDocumentPositionParams -> J.DocumentHighlightRequest
-fmClientDocumentHighlightRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentDocumentHighlight params
-
--- * :leftwards_arrow_with_hook: [textDocument/documentSymbol](#textDocument_documentSymbol)
-fmClientDocumentSymbolRequest :: J.LspId -> J.DocumentSymbolParams -> J.DocumentSymbolRequest
-fmClientDocumentSymbolRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentDocumentSymbol params
-
--- * :leftwards_arrow_with_hook: [textDocument/formatting](#textDocument_formatting)
-fmClientDocumentFormattingRequest :: J.LspId -> J.DocumentFormattingParams -> J.DocumentFormattingRequest
-fmClientDocumentFormattingRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentFormatting params
-
--- * :leftwards_arrow_with_hook: [textDocument/rangeFormatting](#textDocument_rangeFormatting)
-fmClientDocumentRangeFormattingRequest :: J.LspId -> J.DocumentRangeFormattingParams -> J.DocumentRangeFormattingRequest
-fmClientDocumentRangeFormattingRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentRangeFormatting params
-
--- * :leftwards_arrow_with_hook: [textDocument/onTypeFormatting](#textDocument_onTypeFormatting)
-fmClientDocumentOnTypeFormattingRequest :: J.LspId -> J.DocumentOnTypeFormattingParams -> J.DocumentOnTypeFormattingRequest
-fmClientDocumentOnTypeFormattingRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentOnTypeFormatting params
-
--- * :leftwards_arrow_with_hook: [textDocument/definition](#textDocument_definition)
-fmClientDefinitionRequest :: J.LspId -> J.TextDocumentPositionParams -> J.DefinitionRequest
-fmClientDefinitionRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentDefinition params
-
--- * :leftwards_arrow_with_hook: [textDocument/codeAction](#textDocument_codeAction)
-fmClientCodeActionRequest :: J.LspId -> J.CodeActionParams -> J.CodeActionRequest
-fmClientCodeActionRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentCodeAction params
-
--- * :leftwards_arrow_with_hook: [textDocument/codeLens](#textDocument_codeLens)
-fmClientCodeLensRequest :: J.LspId -> J.CodeLensParams -> J.CodeLensRequest
-fmClientCodeLensRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentCodeLens params
-
--- * :leftwards_arrow_with_hook: [codeLens/resolve](#codeLens_resolve)
-fmClientCodeLensResolveRequest :: J.LspId -> J.CodeLens -> J.CodeLensResolveRequest
-fmClientCodeLensResolveRequest rid params
-  = J.RequestMessage "2.0" rid J.CodeLensResolve params
-
--- * :leftwards_arrow_with_hook: [textDocument/documentLink](#textDocument_documentLink)
-fmClientDocumentLinkRequest :: J.LspId -> J.DocumentLinkParams -> J.DocumentLinkRequest
-fmClientDocumentLinkRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentDocumentLink params
-
--- * :leftwards_arrow_with_hook: [documentLink/resolve](#documentLink_resolve)
-fmClientDocumentLinkResolveRequest :: J.LspId -> J.DocumentLink -> J.DocumentLinkResolveRequest
-fmClientDocumentLinkResolveRequest rid params
-  = J.RequestMessage "2.0" rid J.DocumentLinkResolve params
-
--- * :leftwards_arrow_with_hook: [textDocument/rename](#textDocument_rename)
-fmClientRenameRequest :: J.LspId -> J.RenameParams -> J.RenameRequest
-fmClientRenameRequest rid params
-  = J.RequestMessage "2.0" rid J.TextDocumentRename params
-
diff --git a/src/Language/Haskell/LSP/TH/Symbol.hs b/src/Language/Haskell/LSP/TH/Symbol.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Symbol.hs
+++ /dev/null
@@ -1,271 +0,0 @@
-{-# LANGUAGE TemplateHaskell            #-}
-{-# LANGUAGE DuplicateRecordFields      #-}
-module Language.Haskell.LSP.TH.Symbol where
-
-import           Control.Applicative
-import           Data.Aeson
-import           Data.Aeson.TH
-import           Data.Scientific
-import           Data.Text                                      (Text)
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.TextDocument
-import           Language.Haskell.LSP.TH.List
-import           Language.Haskell.LSP.TH.Location
-import           Language.Haskell.LSP.TH.Message
-
--- ---------------------------------------------------------------------
-{-
-Document Symbols Request
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-symbols-request
-
-The document symbol request is sent from the client to the server to list all
-symbols found in a given text document.
-
-    Changed: In 2.0 the request uses DocumentSymbolParams instead of a single
-             uri.
-
-Request
-
-    method: 'textDocument/documentSymbol'
-    params: DocumentSymbolParams defined as follows:
-
-interface DocumentSymbolParams {
-    /**
-     * The text document.
-     */
-    textDocument: TextDocumentIdentifier;
-}
-
-Response
-
-    result: SymbolInformation[] defined as follows:
-
-/**
- * Represents information about programming constructs like variables, classes,
- * interfaces etc.
- */
-interface SymbolInformation {
-    /**
-     * The name of this symbol.
-     */
-    name: string;
-
-    /**
-     * The kind of this symbol.
-     */
-    kind: number;
-
-    /**
-     * The location of this symbol.
-     */
-    location: Location;
-
-    /**
-     * The name of the symbol containing this symbol.
-     */
-    containerName?: string;
-}
-
-Where the kind is defined like this:
-
-/**
- * A symbol kind.
- */
-export enum SymbolKind {
-    File = 1,
-    Module = 2,
-    Namespace = 3,
-    Package = 4,
-    Class = 5,
-    Method = 6,
-    Property = 7,
-    Field = 8,
-    Constructor = 9,
-    Enum = 10,
-    Interface = 11,
-    Function = 12,
-    Variable = 13,
-    Constant = 14,
-    Text = 15,
-    Number = 16,
-    Boolean = 17,
-    Array = 18,
-}
-
-    error: code and message set in case an exception happens during the document
-           symbol request.
-
-Registration Options: TextDocumentRegistrationOptions
--}
-
-data DocumentSymbolParams =
-  DocumentSymbolParams
-    { _textDocument :: TextDocumentIdentifier
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DocumentSymbolParams
-
--- -------------------------------------
-
-data SymbolKind
-    = SkFile
-    | SkModule
-    | SkNamespace
-    | SkPackage
-    | SkClass
-    | SkMethod
-    | SkProperty
-    | SkField
-    | SkConstructor
-    | SkEnum
-    | SkInterface
-    | SkFunction
-    | SkVariable
-    | SkConstant
-    | SkString
-    | SkNumber
-    | SkBoolean
-    | SkArray
-    | SkObject
-    | SkKey
-    | SkNull
-    | SkEnumMember
-    | SkStruct
-    | SkEvent
-    | SkOperator
-    | SkTypeParameter
-    | SkUnknown Scientific
-    deriving (Read,Show,Eq)
-
-instance ToJSON SymbolKind where
-  toJSON SkFile          = Number 1
-  toJSON SkModule        = Number 2
-  toJSON SkNamespace     = Number 3
-  toJSON SkPackage       = Number 4
-  toJSON SkClass         = Number 5
-  toJSON SkMethod        = Number 6
-  toJSON SkProperty      = Number 7
-  toJSON SkField         = Number 8
-  toJSON SkConstructor   = Number 9
-  toJSON SkEnum          = Number 10
-  toJSON SkInterface     = Number 11
-  toJSON SkFunction      = Number 12
-  toJSON SkVariable      = Number 13
-  toJSON SkConstant      = Number 14
-  toJSON SkString        = Number 15
-  toJSON SkNumber        = Number 16
-  toJSON SkBoolean       = Number 17
-  toJSON SkArray         = Number 18
-  toJSON SkObject        = Number 19
-  toJSON SkKey           = Number 20
-  toJSON SkNull          = Number 21
-  toJSON SkEnumMember    = Number 22
-  toJSON SkStruct        = Number 23
-  toJSON SkEvent         = Number 24
-  toJSON SkOperator      = Number 25
-  toJSON SkTypeParameter = Number 26
-  toJSON (SkUnknown x)   = Number x
-
-instance FromJSON SymbolKind where
-  parseJSON (Number  1) = pure SkFile
-  parseJSON (Number  2) = pure SkModule
-  parseJSON (Number  3) = pure SkNamespace
-  parseJSON (Number  4) = pure SkPackage
-  parseJSON (Number  5) = pure SkClass
-  parseJSON (Number  6) = pure SkMethod
-  parseJSON (Number  7) = pure SkProperty
-  parseJSON (Number  8) = pure SkField
-  parseJSON (Number  9) = pure SkConstructor
-  parseJSON (Number 10) = pure SkEnum
-  parseJSON (Number 11) = pure SkInterface
-  parseJSON (Number 12) = pure SkFunction
-  parseJSON (Number 13) = pure SkVariable
-  parseJSON (Number 14) = pure SkConstant
-  parseJSON (Number 15) = pure SkString
-  parseJSON (Number 16) = pure SkNumber
-  parseJSON (Number 17) = pure SkBoolean
-  parseJSON (Number 18) = pure SkArray
-  parseJSON (Number 19) = pure SkObject
-  parseJSON (Number 20) = pure SkKey
-  parseJSON (Number 21) = pure SkNull
-  parseJSON (Number 22) = pure SkEnumMember
-  parseJSON (Number 23) = pure SkStruct
-  parseJSON (Number 24) = pure SkEvent
-  parseJSON (Number 25) = pure SkOperator
-  parseJSON (Number 26) = pure SkTypeParameter
-  parseJSON (Number x)  = pure (SkUnknown x)
-  parseJSON _           = mempty
-
--- ---------------------------------------------------------------------
-
--- | Represents programming constructs like variables, classes, interfaces etc.
--- that appear in a document. Document symbols can be hierarchical and they
--- have two ranges: one that encloses its definition and one that points to its
--- most interesting range, e.g. the range of an identifier.
-data DocumentSymbol =
-  DocumentSymbol
-    { _name           :: Text -- ^ The name of this symbol.
-    -- | More detail for this symbol, e.g the signature of a function. If not
-    -- provided the name is used.
-    , _detail         :: Maybe Text
-    , _kind           :: SymbolKind -- ^ The kind of this symbol.
-    , _deprecated     :: Maybe Bool -- ^ Indicates if this symbol is deprecated.
-    -- | The range enclosing this symbol not including leading/trailing
-    -- whitespace but everything else like comments. This information is
-    -- typically used to determine if the the clients cursor is inside the symbol
-    -- to reveal in the symbol in the UI.
-    , _range          :: Range
-    -- | The range that should be selected and revealed when this symbol is being
-    -- picked, e.g the name of a function. Must be contained by the the '_range'.
-    , _selectionRange :: Range
-    -- | Children of this symbol, e.g. properties of a class.
-    , _children       :: Maybe (List DocumentSymbol)
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''DocumentSymbol
-
--- ---------------------------------------------------------------------
-
--- | Represents information about programming constructs like variables, classes,
--- interfaces etc.
-data SymbolInformation =
-  SymbolInformation
-    { _name          :: Text -- ^ The name of this symbol.
-    , _kind          :: SymbolKind -- ^ The kind of this symbol.
-    , _deprecated    :: Maybe Bool -- ^ Indicates if this symbol is deprecated.
-    -- | The location of this symbol. The location's range is used by a tool
-    -- to reveal the location in the editor. If the symbol is selected in the
-    -- tool the range's start information is used to position the cursor. So
-    -- the range usually spans more then the actual symbol's name and does
-    -- normally include things like visibility modifiers.
-    --
-    -- The range doesn't have to denote a node range in the sense of a abstract
-    -- syntax tree. It can therefore not be used to re-construct a hierarchy of
-    -- the symbols.
-    , _location      :: Location
-    -- | The name of the symbol containing this symbol. This information is for
-    -- user interface purposes (e.g. to render a qualifier in the user interface
-    -- if necessary). It can't be used to re-infer a hierarchy for the document
-    -- symbols.
-    , _containerName :: Maybe Text
-    } deriving (Read,Show,Eq)
-
-deriveJSON lspOptions ''SymbolInformation
-
--- -------------------------------------
-
-data DSResult = DSDocumentSymbols (List DocumentSymbol)
-              | DSSymbolInformation (List SymbolInformation)
-  deriving (Read,Show,Eq)
-
-instance FromJSON DSResult where
-  parseJSON x = DSDocumentSymbols <$> parseJSON x <|> DSSymbolInformation <$> parseJSON x
-
-instance ToJSON DSResult where
-  toJSON (DSDocumentSymbols x) = toJSON x
-  toJSON (DSSymbolInformation x) = toJSON x
-
-
-type DocumentSymbolRequest = RequestMessage ClientMethod DocumentSymbolParams DSResult
-type DocumentSymbolsResponse = ResponseMessage DSResult
diff --git a/src/Language/Haskell/LSP/TH/TextDocument.hs b/src/Language/Haskell/LSP/TH/TextDocument.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/TextDocument.hs
+++ /dev/null
@@ -1,103 +0,0 @@
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE TemplateHaskell            #-}
-module Language.Haskell.LSP.TH.TextDocument where
-
-import           Data.Aeson.TH
-import           Data.Text                      ( Text )
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.Location
-import           Language.Haskell.LSP.TH.Uri
-
--- ---------------------------------------------------------------------
-{-
-TextDocumentIdentifier
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentidentifier
-
-Text documents are identified using a URI. On the protocol level, URIs are
-passed as strings. The corresponding JSON structure looks like this:
-
-interface TextDocumentIdentifier {
-    /**
-     * The text document's URI.
-     */
-    uri: string;
-}
--}
-data TextDocumentIdentifier =
-  TextDocumentIdentifier
-    { _uri :: Uri
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TextDocumentIdentifier
-
-{-
-TextDocumentItem
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentitem
-
-    New: An item to transfer a text document from the client to the server.
-
-interface TextDocumentItem {
-    /**
-     * The text document's URI.
-     */
-    uri: string;
-
-    /**
-     * The text document's language identifier.
-     */
-    languageId: string;
-
-    /**
-     * The version number of this document (it will strictly increase after each
-     * change, including undo/redo).
-     */
-    version: number;
-
-    /**
-     * The content of the opened text document.
-     */
-    text: string;
-}
--}
-
-data TextDocumentItem =
-  TextDocumentItem {
-    _uri        :: Uri
-  , _languageId :: Text
-  , _version    :: Int
-  , _text       :: Text
-  } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TextDocumentItem
-
--- ---------------------------------------------------------------------
-{-
-TextDocumentPositionParams
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentpositionparams
-
-    Changed: Was TextDocumentPosition in 1.0 with inlined parameters
-
-
-interface TextDocumentPositionParams {
-    /**
-     * The text document.
-     */
-    textDocument: TextDocumentIdentifier;
-
-    /**
-     * The position inside the text document.
-     */
-    position: Position;
-}
-
--}
-data TextDocumentPositionParams =
-  TextDocumentPositionParams
-    { _textDocument :: TextDocumentIdentifier
-    , _position     :: Position
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TextDocumentPositionParams
diff --git a/src/Language/Haskell/LSP/TH/Uri.hs b/src/Language/Haskell/LSP/TH/Uri.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Uri.hs
+++ /dev/null
@@ -1,62 +0,0 @@
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-module Language.Haskell.LSP.TH.Uri where
-
-import qualified Data.Aeson                                 as A
-import           Data.Hashable
-import           Data.Text                                  (Text)
-import qualified Data.Text                                  as T
-import           Network.URI
-import qualified System.FilePath.Posix                      as FPP
-import qualified System.FilePath.Windows                    as FPW
-import qualified System.Info
-
-newtype Uri = Uri { getUri :: Text }
-  deriving (Eq,Ord,Read,Show,A.FromJSON,A.ToJSON,Hashable,A.ToJSONKey,A.FromJSONKey)
-
-fileScheme :: String
-fileScheme = "file:"
-
-windowsOS :: String
-windowsOS = "mingw32"
-
-type SystemOS = String
-
-uriToFilePath :: Uri -> Maybe FilePath
-uriToFilePath = platformAwareUriToFilePath System.Info.os
-
-platformAwareUriToFilePath :: String -> Uri -> Maybe FilePath
-platformAwareUriToFilePath systemOS (Uri uri) = do
-  parsedUri <- parseURI $ T.unpack uri
-  if uriScheme parsedUri == fileScheme
-    then return $ (platformAdjustFromUriPath systemOS . unEscapeString . uriPath) parsedUri
-    else Nothing
-
-platformAdjustFromUriPath :: SystemOS -> String -> FilePath
-platformAdjustFromUriPath systemOS srcPath =
-  if systemOS /= windowsOS || null srcPath then srcPath
-    else let
-      firstSegment:rest = (FPP.splitDirectories . tail) srcPath  -- Drop leading '/' for absolute Windows paths
-      drive = if FPW.isDrive firstSegment then FPW.addTrailingPathSeparator firstSegment else firstSegment
-      in FPW.joinDrive drive $ FPW.joinPath rest
-
-filePathToUri :: FilePath -> Uri
-filePathToUri = platformAwareFilePathToUri System.Info.os
-
-platformAwareFilePathToUri :: SystemOS -> FilePath -> Uri
-platformAwareFilePathToUri systemOS fp = Uri . T.pack . show $ URI
-  { uriScheme = fileScheme
-  , uriAuthority = Just $ URIAuth "" "" ""
-  , uriPath = platformAdjustToUriPath systemOS fp
-  , uriQuery = ""
-  , uriFragment = ""
-  }
-
-platformAdjustToUriPath :: SystemOS -> FilePath -> String
-platformAdjustToUriPath systemOS srcPath =
-  if systemOS /= windowsOS then srcPath
-    else let
-      drive:rest = FPW.splitDirectories srcPath
-      leaveCharUnescaped = (/= ':')
-      removePathSeparator = filter (not . FPW.isPathSeparator)
-      escapedDrive = removePathSeparator $ escapeURIString leaveCharUnescaped drive
-      in '/' : FPP.joinPath (escapedDrive : rest)
diff --git a/src/Language/Haskell/LSP/TH/Utils.hs b/src/Language/Haskell/LSP/TH/Utils.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/Utils.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-module Language.Haskell.LSP.TH.Utils where
-
--- ---------------------------------------------------------------------
-
-rdrop :: Int -> [a] -> [a]
-rdrop cnt = reverse . drop cnt . reverse
diff --git a/src/Language/Haskell/LSP/TH/WorkspaceEdit.hs b/src/Language/Haskell/LSP/TH/WorkspaceEdit.hs
deleted file mode 100644
--- a/src/Language/Haskell/LSP/TH/WorkspaceEdit.hs
+++ /dev/null
@@ -1,160 +0,0 @@
-{-# LANGUAGE CPP                        #-}
-{-# LANGUAGE DuplicateRecordFields      #-}
-{-# LANGUAGE TemplateHaskell            #-}
-module Language.Haskell.LSP.TH.WorkspaceEdit where
-
-import           Data.Aeson.TH
-import qualified Data.HashMap.Strict                        as H
--- For <= 8.2.2
-import           Data.Monoid                                ((<>))
-import           Data.Text                                  (Text)
-import           Language.Haskell.LSP.TH.Constants
-import           Language.Haskell.LSP.TH.List
-import           Language.Haskell.LSP.TH.Location
-import           Language.Haskell.LSP.TH.Uri
-
--- ---------------------------------------------------------------------
-{-
-TextEdit
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textedit
-
-A textual edit applicable to a text document.
-
-interface TextEdit {
-    /**
-     * The range of the text document to be manipulated. To insert
-     * text into a document create a range where start === end.
-     */
-    range: Range;
-
-    /**
-     * The string to be inserted. For delete operations use an
-     * empty string.
-     */
-    newText: string;
-}
-
-
--}
-
-data TextEdit =
-  TextEdit
-    { _range   :: Range
-    , _newText :: Text
-    } deriving (Show,Read,Eq)
-
-deriveJSON lspOptions ''TextEdit
-
--- ---------------------------------------------------------------------
-{-
-VersionedTextDocumentIdentifier
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#versionedtextdocumentidentifier
-
-    New: An identifier to denote a specific version of a text document.
-
-interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
-    /**
-	 * The version number of this document. If a versioned text document identifier
-	 * is sent from the server to the client and the file is not open in the editor
-	 * (the server has not received an open notification before) the server can send
-	 * `null` to indicate that the version is known and the content on disk is the
-	 * truth (as speced with document content ownership)
-	 */
-	version: number | null;
--}
-
-type TextDocumentVersion = Maybe Int
-
-data VersionedTextDocumentIdentifier =
-  VersionedTextDocumentIdentifier
-    { _uri     :: Uri
-    , _version :: TextDocumentVersion
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''VersionedTextDocumentIdentifier
-
--- ---------------------------------------------------------------------
-{-
-New in 3.0
-----------
-
-TextDocumentEdit
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#new-textdocumentedit
-
-If multiple TextEdits are applied to a text document, all text edits describe
-changes made to the initial document version. Execution wise text edits should
-applied from the bottom to the top of the text document. Overlapping text edits
-are not supported.
-
-export interface TextDocumentEdit {
-        /**
-         * The text document to change.
-         */
-        textDocument: VersionedTextDocumentIdentifier;
-
-        /**
-         * The edits to be applied.
-         */
-        edits: TextEdit[];
-}
-
--}
-
-data TextDocumentEdit =
-  TextDocumentEdit
-    { _textDocument :: VersionedTextDocumentIdentifier
-    , _edits        :: List TextEdit
-    } deriving (Show, Read, Eq)
-
-deriveJSON lspOptions ''TextDocumentEdit
-
--- ---------------------------------------------------------------------
-{-
-Changed in 3.0
---------------
-
-WorkspaceEdit
-
-https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#workspaceedit
-
-
-Changed A workspace edit represents changes to many resources managed in the
-workspace. The edit should either provide changes or documentChanges. If
-documentChanges are present they are preferred over changes if the client can
-handle versioned document edits.
-
-export interface WorkspaceEdit {
-        /**
-         * Holds changes to existing resources.
-         */
-        changes?: { [uri: string]: TextEdit[]; };
-
-        /**
-         * An array of `TextDocumentEdit`s to express changes to specific a specific
-         * version of a text document. Whether a client supports versioned document
-         * edits is expressed via `WorkspaceClientCapabilities.versionedWorkspaceEdit`.
-         */
-        documentChanges?: TextDocumentEdit[];
-}
--}
-
-type WorkspaceEditMap = H.HashMap Uri (List TextEdit)
-
-data WorkspaceEdit =
-  WorkspaceEdit
-    { _changes         :: Maybe WorkspaceEditMap
-    , _documentChanges :: Maybe (List TextDocumentEdit)
-    } deriving (Show, Read, Eq)
-
-instance Monoid WorkspaceEdit where
-  mempty = WorkspaceEdit Nothing Nothing
-  mappend (WorkspaceEdit a b) (WorkspaceEdit c d) = WorkspaceEdit (a <> c) (b <> d)
-
-deriveJSON lspOptions ''WorkspaceEdit
-
-#if __GLASGOW_HASKELL__ >= 804
-instance Semigroup WorkspaceEdit where
-  (<>) = mappend
-#endif
diff --git a/src/Language/Haskell/LSP/Types.hs b/src/Language/Haskell/LSP/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types.hs
@@ -0,0 +1,40 @@
+module Language.Haskell.LSP.Types
+  ( module Language.Haskell.LSP.Types.DataTypesJSON
+  , module Language.Haskell.LSP.Types.Lens
+  , module Language.Haskell.LSP.Types.CodeAction
+  , module Language.Haskell.LSP.Types.Color
+  , module Language.Haskell.LSP.Types.Command
+  , module Language.Haskell.LSP.Types.Completion
+  , module Language.Haskell.LSP.Types.Diagnostic
+  , module Language.Haskell.LSP.Types.DocumentFilter
+  , module Language.Haskell.LSP.Types.FoldingRange
+  , module Language.Haskell.LSP.Types.List
+  , module Language.Haskell.LSP.Types.Location
+  , module Language.Haskell.LSP.Types.MarkupContent
+  , module Language.Haskell.LSP.Types.Message
+  , module Language.Haskell.LSP.Types.Symbol
+  , module Language.Haskell.LSP.Types.TextDocument
+  , module Language.Haskell.LSP.Types.Uri
+  , module Language.Haskell.LSP.Types.WorkspaceEdit
+  , module Language.Haskell.LSP.Types.WorkspaceFolders
+  )
+where
+
+import           Language.Haskell.LSP.Types.DataTypesJSON
+import           Language.Haskell.LSP.Types.Lens
+import           Language.Haskell.LSP.Types.CodeAction
+import           Language.Haskell.LSP.Types.Color
+import           Language.Haskell.LSP.Types.Command
+import           Language.Haskell.LSP.Types.Completion
+import           Language.Haskell.LSP.Types.Diagnostic
+import           Language.Haskell.LSP.Types.DocumentFilter
+import           Language.Haskell.LSP.Types.FoldingRange
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.MarkupContent
+import           Language.Haskell.LSP.Types.Message
+import           Language.Haskell.LSP.Types.Symbol
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.Uri
+import           Language.Haskell.LSP.Types.WorkspaceEdit
+import           Language.Haskell.LSP.Types.WorkspaceFolders
diff --git a/src/Language/Haskell/LSP/Types/Capabilities.hs b/src/Language/Haskell/LSP/Types/Capabilities.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Capabilities.hs
@@ -0,0 +1,211 @@
+module Language.Haskell.LSP.Types.Capabilities
+  (
+    module Language.Haskell.LSP.Types.ClientCapabilities
+  , fullCaps
+  , LSPVersion(..)
+  , capsForVersion
+  ) where
+
+import Prelude hiding (min)
+import Language.Haskell.LSP.Types.ClientCapabilities
+import Language.Haskell.LSP.Types
+
+-- | The whole shebang. The real deal.
+-- Capabilities for full conformance to the current (v3.10) LSP specification.
+fullCaps :: ClientCapabilities
+fullCaps = capsForVersion (LSPVersion maxBound maxBound)
+
+-- | A specific version of the LSP specification.
+data LSPVersion = LSPVersion Int Int -- ^ Construct a major.minor version
+
+-- | Capabilities for full conformance to the LSP specification up until a version.
+-- Some important milestones:
+--
+-- * 3.9 completion item preselect
+-- * 3.8 codeAction literals
+-- * 3.7 related information in diagnostics
+-- * 3.6 workspace folders, colors, goto type/implementation
+-- * 3.4 extended completion item and symbol item kinds
+-- * 3.0 dynamic registration
+capsForVersion :: LSPVersion -> ClientCapabilities
+capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) Nothing
+  where
+    w = WorkspaceClientCapabilities
+          (Just True)
+          (Just (WorkspaceEditClientCapabilities (Just True)))
+          (Just (DidChangeConfigurationClientCapabilities dynamicReg))
+          (Just (DidChangeWatchedFilesClientCapabilities dynamicReg))
+          (Just symbolCapabilities)
+          (Just (ExecuteClientCapabilities dynamicReg))
+          (since 3 6 True)
+          (since 3 6 True)
+
+    symbolCapabilities = SymbolClientCapabilities
+      dynamicReg
+      (since 3 4 symbolKindCapabilities)
+
+    symbolKindCapabilities =
+      SymbolKindClientCapabilities (Just sKs)
+
+    sKs
+      | maj >= 3 && min >= 4 = List (oldSKs ++ newSKs)
+      | otherwise            = List oldSKs
+
+    oldSKs =   [ SkFile
+               , SkModule
+               , SkNamespace
+               , SkPackage
+               , SkClass
+               , SkMethod
+               , SkProperty
+               , SkField
+               , SkConstructor
+               , SkEnum
+               , SkInterface
+               , SkFunction
+               , SkVariable
+               , SkConstant
+               , SkString
+               , SkNumber
+               , SkBoolean
+               , SkArray
+               ]
+
+    newSKs = [ SkObject
+             , SkKey
+             , SkNull
+             , SkEnumMember
+             , SkStruct
+             , SkEvent
+             , SkOperator
+             , SkTypeParameter
+             ]
+
+    td = TextDocumentClientCapabilities
+          (Just sync)
+          (Just completionCapability)
+          (Just hoverCapability)
+          (Just signatureHelpCapability)
+          (Just (ReferencesClientCapabilities dynamicReg))
+          (Just (DocumentHighlightClientCapabilities dynamicReg))
+          (Just documentSymbolCapability)
+          (Just (FormattingClientCapabilities (Just True)))
+          (Just (RangeFormattingClientCapabilities dynamicReg))
+          (Just (OnTypeFormattingClientCapabilities dynamicReg))
+          (Just (DefinitionClientCapabilities dynamicReg))
+          (since 3 6 (TypeDefinitionClientCapabilities dynamicReg))
+          (since 3 6 (ImplementationClientCapabilities dynamicReg))
+          (Just codeActionCapability)
+          (Just (CodeLensClientCapabilities dynamicReg))
+          (Just (DocumentLinkClientCapabilities dynamicReg))
+          (since 3 6 (ColorProviderClientCapabilities dynamicReg))
+          (Just (RenameClientCapabilities dynamicReg))
+          (Just (PublishDiagnosticsClientCapabilities (since 3 7 True)))
+          (since 3 10 foldingRangeCapability)
+    sync =
+      SynchronizationTextDocumentClientCapabilities
+        dynamicReg
+        (Just True)
+        (Just True)
+        (Just True)
+
+    completionCapability =
+      CompletionClientCapabilities
+        dynamicReg
+        (Just completionItemCapabilities)
+        (since 3 4 completionItemKindCapabilities)
+        (since 3 3 True)
+
+    completionItemCapabilities = CompletionItemClientCapabilities
+      (Just True)
+      (Just True)
+      (since 3 3 (List [MkPlainText, MkMarkdown]))
+      (Just True)
+      (since 3 9 True)
+
+    completionItemKindCapabilities =
+      CompletionItemKindClientCapabilities (Just ciKs)
+
+    ciKs
+      | maj >= 3 && min >= 4 = List (oldCiKs ++ newCiKs)
+      | otherwise            = List oldCiKs
+
+    oldCiKs =   [ CiText
+                , CiMethod
+                , CiFunction
+                , CiConstructor
+                , CiField
+                , CiVariable
+                , CiClass
+                , CiInterface
+                , CiModule
+                , CiProperty
+                , CiUnit
+                , CiValue
+                , CiEnum
+                , CiKeyword
+                , CiSnippet
+                , CiColor
+                , CiFile
+                , CiReference
+                ]
+
+    newCiKs =   [ CiFolder
+                , CiEnumMember
+                , CiConstant
+                , CiStruct
+                , CiEvent
+                , CiOperator
+                , CiTypeParameter
+                ]
+
+    hoverCapability =
+      HoverClientCapabilities
+        dynamicReg
+        (since 3 3 (List [MkPlainText, MkMarkdown]))
+
+    codeActionCapability
+      = CodeActionClientCapabilities
+          dynamicReg
+          (since 3 8 (CodeActionLiteralSupport caKs))
+    caKs = CodeActionKindClientCapabilities
+              (List [ CodeActionQuickFix
+                    , CodeActionRefactor
+                    , CodeActionRefactorExtract
+                    , CodeActionRefactorInline
+                    , CodeActionRefactorRewrite
+                    , CodeActionSource
+                    , CodeActionSourceOrganizeImports
+                    ])
+
+    signatureHelpCapability =
+      SignatureHelpClientCapabilities
+        dynamicReg
+        (Just signatureInformationCapability)
+
+    signatureInformationCapability =
+      SignatureInformationClientCapabilities
+        (Just (List [MkPlainText, MkMarkdown]))
+
+    documentSymbolCapability =
+      DocumentSymbolClientCapabilities
+        dynamicReg
+        (since 3 4 documentSymbolKind)
+        (since 3 10 True)
+
+    documentSymbolKind =
+      DocumentSymbolKindClientCapabilities
+        (Just sKs) -- same as workspace symbol kinds
+
+    foldingRangeCapability =
+      FoldingRangeClientCapabilities
+        dynamicReg
+        Nothing
+        (Just False)
+
+    dynamicReg
+      | maj >= 3  = Just True
+      | otherwise = Nothing
+    since x y a
+      | maj >= x && min >= y = Just a
+      | otherwise            = Nothing
diff --git a/src/Language/Haskell/LSP/Types/ClientCapabilities.hs b/src/Language/Haskell/LSP/Types/ClientCapabilities.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/ClientCapabilities.hs
@@ -0,0 +1,1058 @@
+{-# LANGUAGE DuplicateRecordFields  #-}
+{-# LANGUAGE TemplateHaskell        #-}
+
+module Language.Haskell.LSP.Types.ClientCapabilities where
+
+import           Data.Aeson.TH
+import qualified Data.Aeson as A
+import Data.Default
+import Language.Haskell.LSP.Types.Constants
+import Language.Haskell.LSP.Types.CodeAction
+import Language.Haskell.LSP.Types.Completion
+import Language.Haskell.LSP.Types.List
+import Language.Haskell.LSP.Types.MarkupContent
+import Language.Haskell.LSP.Types.Symbol
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+/**
+ * Workspace specific client capabilities.
+ */
+export interface WorkspaceClientCapabilities {
+        /**
+         * The client supports applying batch edits to the workspace by supporting
+         * the request 'workspace/applyEdit'
+         */
+        applyEdit?: boolean;
+
+        /**
+         * Capabilities specific to `WorkspaceEdit`s
+         */
+        workspaceEdit?: {
+                /**
+                 * The client supports versioned document changes in `WorkspaceEdit`s
+                 */
+                documentChanges?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `workspace/didChangeConfiguration` notification.
+         */
+        didChangeConfiguration?: {
+                /**
+                 * Did change configuration notification supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+         */
+        didChangeWatchedFiles?: {
+                /**
+                 * Did change watched files notification supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `workspace/symbol` request.
+         */
+        symbol?: {
+                /**
+                 * Symbol request supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+
+                /**
+                 * Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
+                 */
+                symbolKind?: {
+                        /**
+                         * The symbol kind values the client supports. When this
+                         * property exists the client also guarantees that it will
+                         * handle values outside its set gracefully and falls back
+                         * to a default value when unknown.
+                         *
+                         * If this property is not present the client only supports
+                         * the symbol kinds from `File` to `Array` as defined in
+                         * the initial version of the protocol.
+                         */
+                        valueSet?: SymbolKind[];
+                }
+        };
+
+        /**
+         * Capabilities specific to the `workspace/executeCommand` request.
+         */
+        executeCommand?: {
+                /**
+                 * Execute command supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * The client has support for workspace folders.
+         *
+         * Since 3.6.0
+         */
+        workspaceFolders?: boolean;
+
+        /**
+         * The client supports `workspace/configuration` requests.
+         *
+         * Since 3.6.0
+         */
+        configuration?: boolean;
+}
+-}
+
+-- -------------------------------------
+
+data WorkspaceEditClientCapabilities =
+  WorkspaceEditClientCapabilities
+  { _documentChanges :: Maybe Bool -- ^The client supports versioned document
+                                   -- changes in `WorkspaceEdit`s
+  } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''WorkspaceEditClientCapabilities)
+
+-- -------------------------------------
+
+data DidChangeConfigurationClientCapabilities =
+  DidChangeConfigurationClientCapabilities
+    { _dynamicRegistration :: Maybe Bool -- ^Did change configuration
+                                         -- notification supports dynamic
+                                         -- registration.
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''DidChangeConfigurationClientCapabilities)
+
+-- -------------------------------------
+
+data DidChangeWatchedFilesClientCapabilities =
+  DidChangeWatchedFilesClientCapabilities
+    { _dynamicRegistration :: Maybe Bool -- ^Did change watched files
+                                         -- notification supports dynamic
+                                         -- registration.
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''DidChangeWatchedFilesClientCapabilities)
+
+-- -------------------------------------
+
+data SymbolKindClientCapabilities =
+  SymbolKindClientCapabilities
+   { -- | The symbol kind values the client supports. When this
+     -- property exists the client also guarantees that it will
+     -- handle values outside its set gracefully and falls back
+     -- to a default value when unknown.
+     -- 
+     -- If this property is not present the client only supports
+     -- the symbol kinds from `File` to `Array` as defined in
+     -- the initial version of the protocol. 
+     _valueSet :: Maybe (List SymbolKind)
+   } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''SymbolKindClientCapabilities)
+
+instance Default SymbolKindClientCapabilities where
+  def = SymbolKindClientCapabilities (Just $ List allKinds)
+    where allKinds = [ SkFile
+                     , SkModule
+                     , SkNamespace
+                     , SkPackage
+                     , SkClass
+                     , SkMethod
+                     , SkProperty
+                     , SkField
+                     , SkConstructor
+                     , SkEnum
+                     , SkInterface
+                     , SkFunction
+                     , SkVariable
+                     , SkConstant
+                     , SkString
+                     , SkNumber
+                     , SkBoolean
+                     , SkArray
+                     ]
+
+data SymbolClientCapabilities =
+  SymbolClientCapabilities
+    { _dynamicRegistration :: Maybe Bool -- ^Symbol request supports dynamic
+                                         -- registration.
+    , _symbolKind :: Maybe SymbolKindClientCapabilities -- ^ Specific capabilities for the `SymbolKind`.
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''SymbolClientCapabilities)
+
+-- -------------------------------------
+
+data ExecuteClientCapabilities =
+  ExecuteClientCapabilities
+    { _dynamicRegistration :: Maybe Bool -- ^Execute command supports dynamic
+                                         -- registration.
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''ExecuteClientCapabilities)
+
+-- -------------------------------------
+
+data WorkspaceClientCapabilities =
+  WorkspaceClientCapabilities
+    { -- | The client supports applying batch edits to the workspace by supporting
+      -- the request 'workspace/applyEdit'
+      _applyEdit :: Maybe Bool
+
+      -- | Capabilities specific to `WorkspaceEdit`s
+    , _workspaceEdit :: Maybe WorkspaceEditClientCapabilities
+
+      -- | Capabilities specific to the `workspace/didChangeConfiguration` notification.
+    , _didChangeConfiguration :: Maybe DidChangeConfigurationClientCapabilities
+
+       -- | Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
+    , _didChangeWatchedFiles :: Maybe DidChangeWatchedFilesClientCapabilities
+
+      -- | Capabilities specific to the `workspace/symbol` request.
+    , _symbol :: Maybe SymbolClientCapabilities
+
+      -- | Capabilities specific to the `workspace/executeCommand` request.
+    , _executeCommand :: Maybe ExecuteClientCapabilities
+
+      -- | The client has support for workspace folders.
+    , _workspaceFolders :: Maybe Bool
+
+      -- | The client supports `workspace/configuration` requests.
+    , _configuration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''WorkspaceClientCapabilities)
+
+instance Default WorkspaceClientCapabilities where
+  def = WorkspaceClientCapabilities def def def def def def def def
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+/**
+ * Text document specific client capabilities.
+ */
+export interface TextDocumentClientCapabilities {
+
+        synchronization?: {
+                /**
+                 * Whether text document synchronization supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+
+                /**
+                 * The client supports sending will save notifications.
+                 */
+                willSave?: boolean;
+
+                /**
+                 * The client supports sending a will save request and
+                 * waits for a response providing text edits which will
+                 * be applied to the document before it is saved.
+                 */
+                willSaveWaitUntil?: boolean;
+
+                /**
+                 * The client supports did save notifications.
+                 */
+                didSave?: boolean;
+        }
+
+        /**
+         * Capabilities specific to the `textDocument/completion`
+         */
+        completion?: {
+                /**
+                 * Whether completion supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+
+                /**
+                 * The client supports the following `CompletionItem` specific
+                 * capabilities.
+                 */
+                completionItem?: {
+                        /**
+                         * Client supports snippets as insert text.
+                         *
+                         * A snippet can define tab stops and placeholders with `$1`, `$2`
+                         * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+                         * the end of the snippet. Placeholders with equal identifiers are linked,
+                         * that is typing in one will update others too.
+                         */
+                        snippetSupport?: boolean;
+
+                        /**
+                         * Client supports commit characters on a completion item.
+                         */
+                        commitCharactersSupport?: boolean
+
+                        /**
+                         * Client supports the follow content formats for the documentation
+                         * property. The order describes the preferred format of the client.
+                         */
+                        documentationFormat?: MarkupKind[];
+
+                        /**
+                         * Client supports the deprecated property on a completion item.
+                         */
+                        deprecatedSupport?: boolean;
+
+                        /**
+                         * Client supports the preselect property on a completion item.
+                         */
+                        preselectSupport?: boolean;
+                }
+
+                completionItemKind?: {
+                        /**
+                         * The completion item kind values the client supports. When this
+                         * property exists the client also guarantees that it will
+                         * handle values outside its set gracefully and falls back
+                         * to a default value when unknown.
+                         *
+                         * If this property is not present the client only supports
+                         * the completion items kinds from `Text` to `Reference` as defined in
+                         * the initial version of the protocol.
+                         */
+                        valueSet?: CompletionItemKind[];
+                },
+
+                /**
+                 * The client supports to send additional context information for a
+                 * `textDocument/completion` request.
+                 */
+                contextSupport?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/hover`
+         */
+        hover?: {
+                /**
+                 * Whether hover supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+
+                /**
+                 * Client supports the follow content formats for the content
+                 * property. The order describes the preferred format of the client.
+                 */
+                contentFormat?: MarkupKind[];
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/signatureHelp`
+         */
+        signatureHelp?: {
+                /**
+                 * Whether signature help supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+
+                /**
+                 * The client supports the following `SignatureInformation`
+                 * specific properties.
+                 */
+                signatureInformation?: {
+                        /**
+                         * Client supports the follow content formats for the documentation
+                         * property. The order describes the preferred format of the client.
+                         */
+                        documentationFormat?: MarkupKind[];
+                };
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/references`
+         */
+        references?: {
+                /**
+                 * Whether references supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/documentHighlight`
+         */
+        documentHighlight?: {
+                /**
+                 * Whether document highlight supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/documentSymbol`
+         */
+        documentSymbol?: {
+                /**
+                 * Whether document symbol supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+
+                /**
+                 * Specific capabilities for the `SymbolKind`.
+                 */
+                symbolKind?: {
+                        /**
+                         * The symbol kind values the client supports. When this
+                         * property exists the client also guarantees that it will
+                         * handle values outside its set gracefully and falls back
+                         * to a default value when unknown.
+                         *
+                         * If this property is not present the client only supports
+                         * the symbol kinds from `File` to `Array` as defined in
+                         * the initial version of the protocol.
+                         */
+                        valueSet?: SymbolKind[];
+                }
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/formatting`
+         */
+        formatting?: {
+                /**
+                 * Whether formatting supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/rangeFormatting`
+         */
+        rangeFormatting?: {
+                /**
+                 * Whether range formatting supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/onTypeFormatting`
+         */
+        onTypeFormatting?: {
+                /**
+                 * Whether on type formatting supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/definition`
+         */
+        definition?: {
+                /**
+                 * Whether definition supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/typeDefinition`
+         *
+         * Since 3.6.0
+         */
+        typeDefinition?: {
+                /**
+                 * Whether typeDefinition supports dynamic registration. If this is set to `true`
+                 * the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+                 * return value for the corresponding server capability as well.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/implementation`.
+         *
+         * Since 3.6.0
+         */
+        implementation?: {
+                /**
+                 * Whether implementation supports dynamic registration. If this is set to `true`
+                 * the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+                 * return value for the corresponding server capability as well.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/codeAction`
+         */
+        codeAction?: {
+                /**
+                 * Whether code action supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+                /**
+                 * The client support code action literals as a valid
+                 * response of the `textDocument/codeAction` request.
+                 *
+                 * Since 3.8.0
+                 */
+                codeActionLiteralSupport?: {
+                        /**
+                         * The code action kind is support with the following value
+                         * set.
+                         */
+                        codeActionKind: {
+
+                                /**
+                                 * The code action kind values the client supports. When this
+                                 * property exists the client also guarantees that it will
+                                 * handle values outside its set gracefully and falls back
+                                 * to a default value when unknown.
+                                 */
+                                valueSet: CodeActionKind[];
+                        };
+                };
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/codeLens`
+         */
+        codeLens?: {
+                /**
+                 * Whether code lens supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/documentLink`
+         */
+        documentLink?: {
+                /**
+                 * Whether document link supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to the `textDocument/documentColor` and the
+         * `textDocument/colorPresentation` request.
+         *
+         * Since 3.6.0
+         */
+        colorProvider?: {
+                /**
+                 * Whether colorProvider supports dynamic registration. If this is set to `true`
+                 * the client supports the new `(ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+                 * return value for the corresponding server capability as well.
+                 */
+                dynamicRegistration?: boolean;
+        }
+
+        /**
+         * Capabilities specific to the `textDocument/rename`
+         */
+        rename?: {
+                /**
+                 * Whether rename supports dynamic registration.
+                 */
+                dynamicRegistration?: boolean;
+        };
+
+        /**
+         * Capabilities specific to `textDocument/publishDiagnostics`.
+         */
+        publishDiagnostics?: {
+                /**
+                 * Whether the clients accepts diagnostics with related information.
+                 */
+                relatedInformation?: boolean;
+        };
+        
+        /**
+	 * Capabilities specific to `textDocument/foldingRange` requests.
+	 * 
+	 * Since 3.10.0
+	 */
+	foldingRange?: {
+		/**
+		 * Whether implementation supports dynamic registration for folding range providers. If this is set to `true`
+		 * the client supports the new `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+		 * return value for the corresponding server capability as well.
+		 */
+		dynamicRegistration?: boolean;
+		/**
+		 * The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
+		 * hint, servers are free to follow the limit.
+		 */
+		rangeLimit?: number;
+		/**
+		 * If set, the client signals that it only supports folding complete lines. If set, client will
+		 * ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
+		 */
+		lineFoldingOnly?: boolean;
+	};
+}
+
+-}
+
+-- -------------------------------------
+
+-- TODO:AZ: this name is Java-ridiculously long
+data SynchronizationTextDocumentClientCapabilities =
+  SynchronizationTextDocumentClientCapabilities
+    { -- | Whether text document synchronization supports dynamic registration.
+      _dynamicRegistration :: Maybe Bool
+
+      -- | The client supports sending will save notifications.
+    , _willSave :: Maybe Bool
+
+      -- | The client supports sending a will save request and waits for a
+      -- response providing text edits which will be applied to the document
+      -- before it is saved.
+    , _willSaveWaitUntil :: Maybe Bool
+
+      -- | The client supports did save notifications.
+    , _didSave :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''SynchronizationTextDocumentClientCapabilities)
+
+instance Default SynchronizationTextDocumentClientCapabilities where
+  def = SynchronizationTextDocumentClientCapabilities def def def def
+
+-- -------------------------------------
+
+data CompletionItemClientCapabilities =
+  CompletionItemClientCapabilities
+    { -- | Client supports snippets as insert text.
+      --
+      -- A snippet can define tab stops and placeholders with `$1`, `$2` and
+      -- `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of
+      -- the snippet. Placeholders with equal identifiers are linked, that is
+      -- typing in one will update others too.
+      _snippetSupport :: Maybe Bool
+
+      -- | Client supports commit characters on a completion item.
+    , _commitCharactersSupport :: Maybe Bool
+
+      -- | Client supports the follow content formats for the documentation
+      -- property. The order describes the preferred format of the client.
+    , _documentationFormat :: Maybe (List MarkupKind)
+
+      -- | Client supports the deprecated property on a completion item.
+    , _deprecatedSupport :: Maybe Bool
+
+      -- | Client supports the preselect property on a completion item.
+    , _preselectSupport :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''CompletionItemClientCapabilities)
+
+data CompletionItemKindClientCapabilities =
+  CompletionItemKindClientCapabilities
+    { -- | The completion item kind values the client supports. When this
+      -- property exists the client also guarantees that it will
+      --  handle values outside its set gracefully and falls back
+      --  to a default value when unknown.
+      _valueSet :: Maybe (List CompletionItemKind)
+    }
+  deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''CompletionItemKindClientCapabilities)
+
+data CompletionClientCapabilities =
+  CompletionClientCapabilities
+    { _dynamicRegistration :: Maybe Bool -- ^Whether completion supports dynamic
+                                         -- registration.
+    , _completionItem :: Maybe CompletionItemClientCapabilities
+    , _completionItemKind :: Maybe CompletionItemKindClientCapabilities
+    , _contextSupport :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''CompletionClientCapabilities)
+
+-- -------------------------------------
+
+data HoverClientCapabilities =
+  HoverClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    , _contentFormat :: Maybe (List MarkupKind)
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''HoverClientCapabilities)
+
+-- -------------------------------------
+
+data SignatureInformationClientCapabilities = 
+  SignatureInformationClientCapabilities
+    { -- | Client supports the follow content formats for the documentation
+      -- property. The order describes the preferred format of the client.
+      documentationFormat :: Maybe (List MarkupKind)
+    }
+  deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''SignatureInformationClientCapabilities)
+
+data SignatureHelpClientCapabilities =
+  SignatureHelpClientCapabilities
+    { -- | Whether signature help supports dynamic registration.
+      _dynamicRegistration :: Maybe Bool
+      
+      -- | The client supports the following `SignatureInformation`
+      -- specific properties.
+    , _signatureInformation :: Maybe SignatureInformationClientCapabilities
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''SignatureHelpClientCapabilities)
+
+-- -------------------------------------
+
+data ReferencesClientCapabilities =
+  ReferencesClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''ReferencesClientCapabilities)
+
+-- -------------------------------------
+
+data DocumentHighlightClientCapabilities =
+  DocumentHighlightClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''DocumentHighlightClientCapabilities)
+
+-- -------------------------------------
+
+data DocumentSymbolKindClientCapabilities =
+  DocumentSymbolKindClientCapabilities
+    { -- | The symbol kind values the client supports. When this
+      --  property exists the client also guarantees that it will
+      --  handle values outside its set gracefully and falls back
+      --  to a default value when unknown.
+      --  
+      --  If this property is not present the client only supports
+      --  the symbol kinds from `File` to `Array` as defined in
+      --  the initial version of the protocol.
+      _valueSet :: Maybe (List SymbolKind)
+    }
+  deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''DocumentSymbolKindClientCapabilities)
+
+data DocumentSymbolClientCapabilities =
+  DocumentSymbolClientCapabilities
+    { -- | Whether document symbol supports dynamic registration.
+      _dynamicRegistration :: Maybe Bool
+      -- | Specific capabilities for the `SymbolKind`.
+    , _symbolKind :: Maybe DocumentSymbolKindClientCapabilities
+    , _hierarchicalDocumentSymbolSupport :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''DocumentSymbolClientCapabilities)
+
+-- -------------------------------------
+
+data FormattingClientCapabilities =
+  FormattingClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''FormattingClientCapabilities)
+
+-- -------------------------------------
+
+data RangeFormattingClientCapabilities =
+  RangeFormattingClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''RangeFormattingClientCapabilities)
+
+-- -------------------------------------
+
+data OnTypeFormattingClientCapabilities =
+  OnTypeFormattingClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''OnTypeFormattingClientCapabilities)
+
+-- -------------------------------------
+
+data DefinitionClientCapabilities =
+  DefinitionClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''DefinitionClientCapabilities)
+
+-- -------------------------------------
+
+data TypeDefinitionClientCapabilities =
+  TypeDefinitionClientCapabilities
+    { -- | Whether typeDefinition supports dynamic registration. If this is set to `true`
+      --  the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+      --  return value for the corresponding server capability as well.
+      _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''TypeDefinitionClientCapabilities)
+
+-- -------------------------------------
+--
+data ImplementationClientCapabilities =
+  ImplementationClientCapabilities
+    { -- | Whether implementation supports dynamic registration. If this is set to `true`
+      -- the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+      -- return value for the corresponding server capability as well.
+      _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''ImplementationClientCapabilities)
+
+-- -------------------------------------
+
+data CodeActionKindClientCapabilities =
+  CodeActionKindClientCapabilities
+   { -- | The code action kind values the client supports. When this
+     -- property exists the client also guarantees that it will
+     -- handle values outside its set gracefully and falls back
+     -- to a default value when unknown.
+      _valueSet :: List CodeActionKind
+   } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''CodeActionKindClientCapabilities)
+
+instance Default CodeActionKindClientCapabilities where
+  def = CodeActionKindClientCapabilities (List allKinds)
+    where allKinds = [ CodeActionQuickFix
+                     , CodeActionRefactor
+                     , CodeActionRefactorExtract
+                     , CodeActionRefactorInline
+                     , CodeActionRefactorRewrite
+                     , CodeActionSource
+                     , CodeActionSourceOrganizeImports
+                     ]
+
+data CodeActionLiteralSupport =
+  CodeActionLiteralSupport
+    { _codeActionKind :: CodeActionKindClientCapabilities -- ^ The code action kind is support with the following value set.
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''CodeActionLiteralSupport)
+
+data CodeActionClientCapabilities =
+  CodeActionClientCapabilities
+    { _dynamicRegistration      :: Maybe Bool -- ^ Whether code action supports dynamic registration.
+    , _codeActionLiteralSupport :: Maybe CodeActionLiteralSupport -- ^ The client support code action literals as a valid response
+                                                                  -- of the `textDocument/codeAction` request.
+                                                                  -- Since 3.8.0
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''CodeActionClientCapabilities)
+
+-- -------------------------------------
+
+data CodeLensClientCapabilities =
+  CodeLensClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''CodeLensClientCapabilities)
+
+-- -------------------------------------
+
+data DocumentLinkClientCapabilities =
+  DocumentLinkClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''DocumentLinkClientCapabilities)
+
+-- -------------------------------------
+
+data ColorProviderClientCapabilities =
+  ColorProviderClientCapabilities
+    { -- | Whether colorProvider supports dynamic registration. If this is set to `true`
+      --  the client supports the new `(ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+      --  return value for the corresponding server capability as well.
+      _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''ColorProviderClientCapabilities)
+
+-- -------------------------------------
+
+data RenameClientCapabilities =
+  RenameClientCapabilities
+    { _dynamicRegistration :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''RenameClientCapabilities)
+
+-- -------------------------------------
+
+data PublishDiagnosticsClientCapabilities =
+  PublishDiagnosticsClientCapabilities
+    { -- | Whether the clients accepts diagnostics with related information.
+      _relatedInformation :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''PublishDiagnosticsClientCapabilities)
+
+-- -------------------------------------
+
+data FoldingRangeClientCapabilities =
+  FoldingRangeClientCapabilities
+    { -- | Whether implementation supports dynamic registration for folding range
+      -- providers. If this is set to `true` the client supports the new
+      -- `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
+      -- return value for the corresponding server capability as well.
+      _dynamicRegistration :: Maybe Bool
+      -- | The maximum number of folding ranges that the client prefers to receive
+      -- per document. The value serves as a hint, servers are free to follow the limit.
+    , _rangeLimit          :: Maybe Int
+      -- | If set, the client signals that it only supports folding complete lines. If set,
+      -- client will ignore specified `startCharacter` and `endCharacter` properties in a
+      -- FoldingRange.
+    , _lineFoldingOnly     :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''FoldingRangeClientCapabilities)
+
+-- -------------------------------------
+
+data TextDocumentClientCapabilities =
+  TextDocumentClientCapabilities
+    { _synchronization :: Maybe SynchronizationTextDocumentClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/completion`
+    , _completion :: Maybe CompletionClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/hover`
+    , _hover :: Maybe HoverClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/signatureHelp`
+    , _signatureHelp :: Maybe SignatureHelpClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/references`
+    , _references :: Maybe ReferencesClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/documentHighlight`
+    , _documentHighlight :: Maybe DocumentHighlightClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/documentSymbol`
+    , _documentSymbol :: Maybe DocumentSymbolClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/formatting`
+    , _formatting :: Maybe FormattingClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/rangeFormatting`
+    , _rangeFormatting :: Maybe RangeFormattingClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/onTypeFormatting`
+    , _onTypeFormatting :: Maybe OnTypeFormattingClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/definition`
+    , _definition :: Maybe DefinitionClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/typeDefinition`
+    , _typeDefinition :: Maybe TypeDefinitionClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/implementation`
+    , _implementation :: Maybe ImplementationClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/codeAction`
+    , _codeAction :: Maybe CodeActionClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/codeLens`
+    , _codeLens :: Maybe CodeLensClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/documentLink`
+    , _documentLink :: Maybe DocumentLinkClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/documentColor` and the
+      -- `textDocument/colorPresentation` request
+    , _colorProvider :: Maybe ColorProviderClientCapabilities
+
+      -- | Capabilities specific to the `textDocument/rename`
+    , _rename :: Maybe RenameClientCapabilities
+
+      -- | Capabilities specific to `textDocument/publishDiagnostics`
+    , _publishDiagnostics :: Maybe PublishDiagnosticsClientCapabilities
+
+      -- | Capabilities specific to `textDocument/foldingRange` requests. Since LSP 3.10, @since 0.7.0.0
+    , _foldingRange :: Maybe FoldingRangeClientCapabilities
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''TextDocumentClientCapabilities)
+
+instance Default TextDocumentClientCapabilities where
+  def = TextDocumentClientCapabilities def def def def def def def def
+                                       def def def def def def def def
+                                       def def def def
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+
+-----------
+
+ClientCapabilities
+
+now define capabilities for dynamic registration, workspace and text document
+features the client supports. The experimental can be used to pass experimential
+capabilities under development. For future compatibility a ClientCapabilities
+object literal can have more properties set than currently defined. Servers
+receiving a ClientCapabilities object literal with unknown properties should
+ignore these properties. A missing property should be interpreted as an absence
+of the capability. If a property is missing that defines sub properties all sub
+properties should be interpreted as an absence of the capability.
+
+Client capabilities got introduced with the version 3.0 of the protocol. They
+therefore only describe capabilities that got introduced in 3.x or later.
+Capabilities that existed in the 2.x version of the protocol are still mandatory
+for clients. Clients cannot opt out of providing them. So even if a client omits
+the ClientCapabilities.textDocument.synchronization it is still required that
+the client provides text document synchronization (e.g. open, changed and close
+notifications).
+
+interface ClientCapabilities {
+        /**
+         * Workspace specific client capabilities.
+         */
+        workspace?: WorkspaceClientCapabilities;
+
+        /**
+         * Text document specific client capabilities.
+         */
+        textDocument?: TextDocumentClientCapabilities;
+
+        /**
+         * Experimental client capabilities.
+         */
+        experimental?: any;
+}
+-}
+
+data ClientCapabilities =
+  ClientCapabilities
+    { _workspace    :: Maybe WorkspaceClientCapabilities
+    , _textDocument :: Maybe TextDocumentClientCapabilities
+    , _experimental :: Maybe A.Object
+    } deriving (Show, Read, Eq)
+
+$(deriveJSON lspOptions ''ClientCapabilities)
+
+instance Default ClientCapabilities where
+  def = ClientCapabilities def def def
diff --git a/src/Language/Haskell/LSP/Types/CodeAction.hs b/src/Language/Haskell/LSP/Types/CodeAction.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/CodeAction.hs
@@ -0,0 +1,293 @@
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.CodeAction where
+
+import           Control.Applicative
+import qualified Data.Aeson                    as A
+import           Data.Aeson.TH
+import           Data.Aeson.Types
+import           Data.Text                      ( Text )
+import           Language.Haskell.LSP.Types.Command
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.Diagnostic
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.Message
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.WorkspaceEdit
+
+
+{-
+Code Action Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#code-action-request
+
+The code action request is sent from the client to the server tocompute commands
+for a given text document and range. These commands are typically code fixes to
+either fix problems or to beautify/refactor code. The result of a
+textDocument/codeAction request is an array of Command literals which are
+typically presented in the user interface. When the command is selected the
+server should be contacted again (via the workspace/executeCommand) request to
+execute the command.
+
+Since version 3.8.0: support for CodeAction litarals to enable the following
+scenarios:
+
+the ability to directly return a workspace edit from e code action request. This
+avoids having another server roundtrip to execute an actual code action. However
+server providers should be aware that if the code action is expensive to compute
+or the edits are huge it might still be beneficial if the result is imply a
+command and the actual edit is only computed when needed. the ability to group
+code actions using a kind. Clients are allowed to ignore that information.
+However it allows them to better group code action for example into
+corresponding menus (e.g. all refactor code actions into a refactor menu).
+Clients need to announce there support code action literals and code action
+kinds via the corresponding client capability
+textDocument.codeAction.codeActionLiteralSupport.
+
+Request
+
+    method: 'textDocument/codeAction'
+    params: CodeActionParams defined as follows:
+
+/**
+ * Params for the CodeActionRequest
+ */
+interface CodeActionParams {
+	/**
+	 * The document in which the command was invoked.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The range for which the command was invoked.
+	 */
+	range: Range;
+
+	/**
+	 * Context carrying additional information.
+	 */
+	context: CodeActionContext;
+}
+
+/**
+ * The kind of a code action.
+ *
+ * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`.
+ *
+ * The set of kinds is open and client needs to announce the kinds it supports to the server during
+ * initialization.
+ */
+export type CodeActionKind = string;
+
+/**
+ * A set of predefined code action kinds
+ */
+export namespace CodeActionKind {
+	/**
+	 * Base kind for quickfix actions: 'quickfix'
+	 */
+	export const QuickFix: CodeActionKind = 'quickfix';
+
+	/**
+	 * Base kind for refactoring actions: 'refactor'
+	 */
+	export const Refactor: CodeActionKind = 'refactor';
+
+	/**
+	 * Base kind for refactoring extraction actions: 'refactor.extract'
+	 *
+	 * Example extract actions:
+	 *
+	 * - Extract method
+	 * - Extract function
+	 * - Extract variable
+	 * - Extract interface from class
+	 * - ...
+	 */
+	export const RefactorExtract: CodeActionKind = 'refactor.extract';
+
+	/**
+	 * Base kind for refactoring inline actions: 'refactor.inline'
+	 *
+	 * Example inline actions:
+	 *
+	 * - Inline function
+	 * - Inline variable
+	 * - Inline constant
+	 * - ...
+	 */
+	export const RefactorInline: CodeActionKind = 'refactor.inline';
+
+	/**
+	 * Base kind for refactoring rewrite actions: 'refactor.rewrite'
+	 *
+	 * Example rewrite actions:
+	 *
+	 * - Convert JavaScript function to class
+	 * - Add or remove parameter
+	 * - Encapsulate field
+	 * - Make method static
+	 * - Move method to base class
+	 * - ...
+	 */
+	export const RefactorRewrite: CodeActionKind = 'refactor.rewrite';
+
+	/**
+	 * Base kind for source actions: `source`
+	 *
+	 * Source code actions apply to the entire file.
+	 */
+	export const Source: CodeActionKind = 'source';
+
+	/**
+	 * Base kind for an organize imports source action: `source.organizeImports`
+	 */
+	export const SourceOrganizeImports: CodeActionKind = 'source.organizeImports';
+}
+
+/**
+ * Contains additional diagnostic information about the context in which
+ * a code action is run.
+ */
+interface CodeActionContext {
+	/**
+	 * An array of diagnostics.
+	 */
+	diagnostics: Diagnostic[];
+
+	/**
+	 * Requested kind of actions to return.
+	 *
+	 * Actions not of this kind are filtered out by the client before being shown. So servers
+	 * can omit computing them.
+	 */
+	only?: CodeActionKind[];
+}
+
+Response
+
+    result: (Command | CodeAction)[] | null where CodeAction is defined as follows:
+        /**
+    * A code action represents a change that can be performed in code, e.g. to fix a problem or
+    * to refactor code.
+    *
+    * A CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed.
+    */
+    export interface CodeAction {
+
+        /**
+        * A short, human-readable, title for this code action.
+        */
+        title: string;
+
+        /**
+        * The kind of the code action.
+        *
+        * Used to filter code actions.
+        */
+        kind?: CodeActionKind;
+
+        /**
+        * The diagnostics that this code action resolves.
+        */
+        diagnostics?: Diagnostic[];
+
+        /**
+        * The workspace edit this code action performs.
+        */
+        edit?: WorkspaceEdit;
+
+        /**
+        * A command this code action executes. If a code action
+        * provides an edit and a command, first the edit is
+        * executed and then the command.
+        */
+        command?: Command;
+    }
+    error: code and message set in case an exception happens during the code
+           action request.
+
+-}
+
+data CodeActionKind = CodeActionQuickFix
+                    | CodeActionRefactor
+                    | CodeActionRefactorExtract
+                    | CodeActionRefactorInline
+                    | CodeActionRefactorRewrite
+                    | CodeActionSource
+                    | CodeActionSourceOrganizeImports
+                    | CodeActionUnknown Text
+  deriving (Read,Show,Eq)
+
+instance ToJSON CodeActionKind where
+  toJSON CodeActionQuickFix                   = String "quickfix"
+  toJSON CodeActionRefactor                   = String "refactor"
+  toJSON CodeActionRefactorExtract            = String "refactor.extract"
+  toJSON CodeActionRefactorInline             = String "refactor.inline"
+  toJSON CodeActionRefactorRewrite            = String "refactor.rewrite"
+  toJSON CodeActionSource                     = String "source"
+  toJSON CodeActionSourceOrganizeImports      = String "source.organizeImports"
+  toJSON (CodeActionUnknown s)                = String s
+
+instance FromJSON CodeActionKind where
+  parseJSON (String "quickfix")               = pure CodeActionQuickFix
+  parseJSON (String "refactor")               = pure CodeActionRefactor
+  parseJSON (String "refactor.extract")       = pure CodeActionRefactorExtract
+  parseJSON (String "refactor.inline")        = pure CodeActionRefactorInline
+  parseJSON (String "refactor.rewrite")       = pure CodeActionRefactorRewrite
+  parseJSON (String "source")                 = pure CodeActionSource
+  parseJSON (String "source.organizeImports") = pure CodeActionSourceOrganizeImports
+  parseJSON (String s)                        = pure (CodeActionUnknown s)
+  parseJSON _                                 = mempty
+
+data CodeActionContext =
+  CodeActionContext
+    { _diagnostics :: List Diagnostic
+    , only         :: Maybe (List CodeActionKind)
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''CodeActionContext
+
+
+data CodeActionParams =
+  CodeActionParams
+    { _textDocument :: TextDocumentIdentifier
+    , _range        :: Range
+    , _context      :: CodeActionContext
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''CodeActionParams
+
+data CodeAction =
+  -- | A code action represents a change that can be performed in code, e.g. to fix a problem or
+  -- to refactor code.
+  --
+  -- A CodeAction must set either '_edit' and/or a '_command'. If both are supplied,
+  -- the '_edit' is applied first, then the '_command' is executed.
+  CodeAction
+    { _title       :: Text -- ^ A short, human-readable, title for this code action.
+    , _kind        :: Maybe CodeActionKind -- ^ The kind of the code action. Used to filter code actions.
+    , _diagnostics :: Maybe (List Diagnostic) -- ^ The diagnostics that this code action resolves.
+    , _edit        :: Maybe WorkspaceEdit -- ^ The workspace edit this code action performs.
+    , _command     :: Maybe Command -- ^ A command this code action executes. If a code action
+                                    -- provides an edit and a command, first the edit is
+                                    -- executed and then the command.
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''CodeAction
+
+data CAResult = CACommand Command
+              | CACodeAction CodeAction
+  deriving (Read,Show,Eq)
+
+instance FromJSON CAResult where
+  parseJSON x = CACommand <$> parseJSON x <|> CACodeAction <$> parseJSON x
+
+instance ToJSON CAResult where
+  toJSON (CACommand x) = toJSON x
+  toJSON (CACodeAction x) = toJSON x
+
+type CodeActionRequest  = RequestMessage ClientMethod CodeActionParams (List CAResult)
+type CodeActionResponse = ResponseMessage (List CAResult)
diff --git a/src/Language/Haskell/LSP/Types/Color.hs b/src/Language/Haskell/LSP/Types/Color.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Color.hs
@@ -0,0 +1,200 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TemplateHaskell       #-}
+module Language.Haskell.LSP.Types.Color where
+
+import           Data.Aeson.TH
+import           Data.Text                      ( Text )
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.Message
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.WorkspaceEdit
+
+{-
+Document Color Request (:leftwards_arrow_with_hook:)
+Since version 3.6.0
+
+The document color request is sent from the client to the server to list all
+color references found in a given text document. Along with the range, a color
+value in RGB is returned.
+
+Clients can use the result to decorate color references in an editor. For example:
+
+Color boxes showing the actual color next to the reference
+Show a color picker when a color reference is edited
+Request:
+
+method: ‘textDocument/documentColor’
+params: DocumentColorParams defined as follows
+interface DocumentColorParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+}
+Response:
+
+result: ColorInformation[] defined as follows:
+interface ColorInformation {
+	/**
+	 * The range in the document where this color appears.
+	 */
+	range: Range;
+
+	/**
+	 * The actual color value for this color range.
+	 */
+	color: Color;
+}
+
+/**
+ * Represents a color in RGBA space.
+ */
+interface Color {
+
+	/**
+	 * The red component of this color in the range [0-1].
+	 */
+	readonly red: number;
+
+	/**
+	 * The green component of this color in the range [0-1].
+	 */
+	readonly green: number;
+
+	/**
+	 * The blue component of this color in the range [0-1].
+	 */
+	readonly blue: number;
+
+	/**
+	 * The alpha component of this color in the range [0-1].
+	 */
+	readonly alpha: number;
+}
+error: code and message set in case an exception happens during the
+‘textDocument/documentColor’ request
+-}
+
+-- | Represents a color in RGBA space.
+data Color =
+  Color
+    { _red   :: Int -- ^ The red component of this color in the range [0-1].
+    , _green :: Int -- ^ The green component of this color in the range [0-1].
+    , _blue  :: Int -- ^ The blue component of this color in the range [0-1].
+    , _alpha :: Int -- ^ The alpha component of this color in the range [0-1].
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''Color
+
+data ColorInformation =
+  ColorInformation
+    { _range :: Range -- ^ The range in the document where this color appears.
+    , _color :: Color -- ^ The actual color value for this color range.
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''ColorInformation
+
+data DocumentColorParams =
+  DocumentColorParams
+    { _textDocument :: TextDocumentIdentifier -- ^ The text document.
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''DocumentColorParams
+
+type DocumentColorRequest =
+  RequestMessage ClientMethod DocumentColorParams (List ColorInformation)
+type DocumentColorResponse = ResponseMessage (List ColorInformation)
+
+{-
+Color Presentation Request (:leftwards_arrow_with_hook:)
+Since version 3.6.0
+
+The color presentation request is sent from the client to the server to obtain a list of
+presentations for a color value at a given location. Clients can use the result to
+
+modify a color reference.
+show in a color picker and let users pick one of the presentations
+Request:
+
+method: ‘textDocument/colorPresentation’
+params: DocumentColorParams defined as follows
+interface ColorPresentationParams {
+	/**
+	 * The text document.
+	 */
+	textDocument: TextDocumentIdentifier;
+
+	/**
+	 * The color information to request presentations for.
+	 */
+	color: Color;
+
+	/**
+	 * The range where the color would be inserted. Serves as a context.
+	 */
+	range: Range;
+}
+Response:
+
+result: ColorPresentation[] defined as follows:
+interface ColorPresentation {
+	/**
+	 * The label of this color presentation. It will be shown
+         * on the color picker header. By default this is also the
+         * text that is inserted when selecting
+	 * this color presentation.
+	 */
+	label: string;
+	/**
+	 * An [edit](#TextEdit) which is applied to a document when selecting
+         * this presentation for the color.
+         * When `falsy` the [label](#ColorPresentation.label) is used.
+	 */
+	textEdit?: TextEdit;
+	/**
+	 * An optional array of additional [text edits](#TextEdit) that are applied when
+         * selecting this color presentation. Edits must not overlap with the main
+         * [edit](#ColorPresentation.textEdit) nor with themselves.
+	 */
+	additionalTextEdits?: TextEdit[];
+}
+error: code and message set in case an exception happens during the 
+‘textDocument/colorPresentation’ request
+-}
+
+data ColorPresentationParams =
+  ColorPresentationParams
+    { -- | The text document.
+      _textDocument :: TextDocumentIdentifier
+      -- | The color information to request presentations for.
+    , _color        :: Color
+      -- | The range where the color would be inserted.
+      -- Serves as a context.
+    , _range        :: Range
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''ColorPresentationParams
+
+data ColorPresentation =
+  ColorPresentation
+    { -- | The label of this color presentation. It will be shown on the color
+      -- picker header. By default this is also the text that is inserted when selecting
+      -- this color presentation.
+      _label               :: Text
+      -- | A 'TextEdit' which is applied to a document when selecting
+      -- this presentation for the color.  When `falsy` the '_label'
+      -- is used.
+    , _textEdit            :: Maybe TextEdit
+      -- | An optional array of additional 'TextEdit's that are applied when
+      -- selecting this color presentation. Edits must not overlap with the main
+      -- '_textEdit' nor with themselves.
+    , _additionalTextEdits :: Maybe (List TextEdit)
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''ColorPresentation
+
+type ColorPresentationRequest = 
+  RequestMessage ClientMethod ColorPresentationParams (List ColorPresentation)
+type ColorPresentationResponse = ResponseMessage (List ColorPresentation)
diff --git a/src/Language/Haskell/LSP/Types/Command.hs b/src/Language/Haskell/LSP/Types/Command.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Command.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE TemplateHaskell            #-}
+
+module Language.Haskell.LSP.Types.Command where
+
+import           Data.Aeson
+import           Data.Aeson.TH
+import           Data.Text
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.List
+-- ---------------------------------------------------------------------
+{-
+Command
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#command
+
+Represents a reference to a command. Provides a title which will be used to
+represent a command in the UI. Commands are identitifed using a string
+identifier and the protocol currently doesn't specify a set of well known
+commands. So executing a command requires some tool extension code.
+
+interface Command {
+    /**
+     * Title of the command, like `save`.
+     */
+    title: string;
+    /**
+     * The identifier of the actual command handler.
+     */
+    command: string;
+    /**
+     * Arguments that the command handler should be
+     * invoked with.
+     */
+    arguments?: any[];
+}
+-}
+
+data Command =
+  Command
+    { _title     :: Text
+    , _command   :: Text
+    , _arguments :: Maybe (List Value)
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''Command
diff --git a/src/Language/Haskell/LSP/Types/Completion.hs b/src/Language/Haskell/LSP/Types/Completion.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Completion.hs
@@ -0,0 +1,496 @@
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.Completion where
+
+import           Control.Applicative
+import qualified Data.Aeson                    as A
+import           Data.Aeson.TH
+import           Data.Scientific                ( Scientific )
+import           Data.Text                      ( Text )
+import           Language.Haskell.LSP.Types.Command
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.DocumentFilter
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.MarkupContent
+import           Language.Haskell.LSP.Types.Message
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.Utils
+import           Language.Haskell.LSP.Types.WorkspaceEdit
+
+data CompletionItemKind = CiText
+                        | CiMethod
+                        | CiFunction
+                        | CiConstructor
+                        | CiField
+                        | CiVariable
+                        | CiClass
+                        | CiInterface
+                        | CiModule
+                        | CiProperty
+                        | CiUnit
+                        | CiValue
+                        | CiEnum
+                        | CiKeyword
+                        | CiSnippet
+                        | CiColor
+                        | CiFile
+                        | CiReference
+                        | CiFolder
+                        | CiEnumMember
+                        | CiConstant
+                        | CiStruct
+                        | CiEvent
+                        | CiOperator
+                        | CiTypeParameter
+         deriving (Read,Show,Eq,Ord)
+
+instance A.ToJSON CompletionItemKind where
+  toJSON CiText          = A.Number 1
+  toJSON CiMethod        = A.Number 2
+  toJSON CiFunction      = A.Number 3
+  toJSON CiConstructor   = A.Number 4
+  toJSON CiField         = A.Number 5
+  toJSON CiVariable      = A.Number 6
+  toJSON CiClass         = A.Number 7
+  toJSON CiInterface     = A.Number 8
+  toJSON CiModule        = A.Number 9
+  toJSON CiProperty      = A.Number 10
+  toJSON CiUnit          = A.Number 11
+  toJSON CiValue         = A.Number 12
+  toJSON CiEnum          = A.Number 13
+  toJSON CiKeyword       = A.Number 14
+  toJSON CiSnippet       = A.Number 15
+  toJSON CiColor         = A.Number 16
+  toJSON CiFile          = A.Number 17
+  toJSON CiReference     = A.Number 18
+  toJSON CiFolder        = A.Number 19
+  toJSON CiEnumMember    = A.Number 20
+  toJSON CiConstant      = A.Number 21
+  toJSON CiStruct        = A.Number 22
+  toJSON CiEvent         = A.Number 23
+  toJSON CiOperator      = A.Number 24
+  toJSON CiTypeParameter = A.Number 25
+
+instance A.FromJSON CompletionItemKind where
+  parseJSON (A.Number  1) = pure CiText
+  parseJSON (A.Number  2) = pure CiMethod
+  parseJSON (A.Number  3) = pure CiFunction
+  parseJSON (A.Number  4) = pure CiConstructor
+  parseJSON (A.Number  5) = pure CiField
+  parseJSON (A.Number  6) = pure CiVariable
+  parseJSON (A.Number  7) = pure CiClass
+  parseJSON (A.Number  8) = pure CiInterface
+  parseJSON (A.Number  9) = pure CiModule
+  parseJSON (A.Number 10) = pure CiProperty
+  parseJSON (A.Number 11) = pure CiUnit
+  parseJSON (A.Number 12) = pure CiValue
+  parseJSON (A.Number 13) = pure CiEnum
+  parseJSON (A.Number 14) = pure CiKeyword
+  parseJSON (A.Number 15) = pure CiSnippet
+  parseJSON (A.Number 16) = pure CiColor
+  parseJSON (A.Number 17) = pure CiFile
+  parseJSON (A.Number 18) = pure CiReference
+  parseJSON (A.Number 19) = pure CiFolder
+  parseJSON (A.Number 20) = pure CiEnumMember
+  parseJSON (A.Number 21) = pure CiConstant
+  parseJSON (A.Number 22) = pure CiStruct
+  parseJSON (A.Number 23) = pure CiEvent
+  parseJSON (A.Number 24) = pure CiOperator
+  parseJSON (A.Number 25) = pure CiTypeParameter
+  parseJSON _             = mempty
+
+
+-- ---------------------------------------------------------------------
+{-
+Completion Request
+
+The Completion request is sent from the client to the server to compute
+completion items at a given cursor position. Completion items are presented in
+the IntelliSense user interface. If computing full completion items is
+expensive, servers can additionally provide a handler for the completion item
+resolve request ('completionItem/resolve'). This request is sent when a
+completion item is selected in the user interface. A typically use case is for
+example: the 'textDocument/completion' request doesn't fill in the documentation
+property for returned completion items since it is expensive to compute. When
+the item is selected in the user interface then a 'completionItem/resolve'
+request is sent with the selected completion item as a param. The returned
+completion item should have the documentation property filled in.
+
+    Changed: In 2.0 the request uses TextDocumentPositionParams with a proper
+    textDocument and position property. In 1.0 the uri of the referenced text
+    document was inlined into the params object.
+
+Request
+
+    method: 'textDocument/completion'
+    params: TextDocumentPositionParams
+-}
+
+-- -------------------------------------
+
+{-
+
+Response
+
+    result: CompletionItem[] | CompletionList
+
+/**
+ * Represents a collection of [completion items](#CompletionItem) to be presented
+ * in the editor.
+ */
+interface CompletionList {
+    /**
+     * This list it not complete. Further typing should result in recomputing
+     * this list.
+     */
+    isIncomplete: boolean;
+    /**
+     * The completion items.
+     */
+    items: CompletionItem[];
+}
+
+
+New in 3.0 : InsertTextFormat
+
+/**
+ * Defines whether the insert text in a completion item should be interpreted as
+ * plain text or a snippet.
+ */
+namespace InsertTextFormat {
+        /**
+         * The primary text to be inserted is treated as a plain string.
+         */
+        export const PlainText = 1;
+
+        /**
+         * The primary text to be inserted is treated as a snippet.
+         *
+         * A snippet can define tab stops and placeholders with `$1`, `$2`
+         * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+         * the end of the snippet. Placeholders with equal identifiers are linked,
+         * that is typing in one will update others too.
+         *
+         * See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
+         */
+        export const Snippet = 2;
+}
+
+
+
+interface CompletionItem {
+    /**
+     * The label of this completion item. By default
+     * also the text that is inserted when selecting
+     * this completion.
+     */
+    label: string;
+    /**
+     * The kind of this completion item. Based of the kind
+     * an icon is chosen by the editor.
+     */
+    kind?: number;
+    /**
+     * A human-readable string with additional information
+     * about this item, like type or symbol information.
+     */
+    detail?: string;
+    /**
+     * A human-readable string that represents a doc-comment.
+     */
+    documentation?: string;
+    /**
+     * A string that shoud be used when comparing this item
+     * with other items. When `falsy` the label is used.
+     */
+    sortText?: string;
+    /**
+     * A string that should be used when filtering a set of
+     * completion items. When `falsy` the label is used.
+     */
+    filterText?: string;
+    /**
+     * A string that should be inserted a document when selecting
+     * this completion. When `falsy` the label is used.
+     */
+    insertText?: string;
+    -- Following field is new in 3.0
+        /**
+         * The format of the insert text. The format applies to both the `insertText` property
+         * and the `newText` property of a provided `textEdit`.
+         */
+    insertTextFormat?: InsertTextFormat;
+        /**
+         * An edit which is applied to a document when selecting this completion. When an edit is provided the value of
+         * `insertText` is ignored.
+         *
+         * *Note:* The range of the edit must be a single line range and it must contain the position at which completion
+         * has been requested.
+         */
+
+    textEdit?: TextEdit;
+
+    -- Following field is new in 3.0
+        /**
+         * An optional array of additional text edits that are applied when
+         * selecting this completion. Edits must not overlap with the main edit
+         * nor with themselves.
+         */
+    additionalTextEdits?: TextEdit[];
+    -- Following field is new in 3.0
+        /**
+         * An optional command that is executed *after* inserting this completion. *Note* that
+         * additional modifications to the current document should be described with the
+         * additionalTextEdits-property.
+         */
+
+    command?: Command;
+        /**
+         * An data entry field that is preserved on a completion item between
+         * a completion and a completion resolve request.
+         */
+
+    data?: any
+}
+
+Where CompletionItemKind is defined as follows:
+
+/**
+ * The kind of a completion entry.
+ */
+enum CompletionItemKind {
+    Text = 1,
+    Method = 2,
+    Function = 3,
+    Constructor = 4,
+    Field = 5,
+    Variable = 6,
+    Class = 7,
+    Interface = 8,
+    Module = 9,
+    Property = 10,
+    Unit = 11,
+    Value = 12,
+    Enum = 13,
+    Keyword = 14,
+    Snippet = 15,
+    Color = 16,
+    File = 17,
+    Reference = 18
+}
+
+    error: code and message set in case an exception happens during the completion request.
+-}
+
+-- -------------------------------------
+
+data InsertTextFormat
+  = PlainText -- ^The primary text to be inserted is treated as a plain string.
+  | Snippet
+      -- ^ The primary text to be inserted is treated as a snippet.
+      --
+      -- A snippet can define tab stops and placeholders with `$1`, `$2`
+      -- and `${3:foo}`. `$0` defines the final tab stop, it defaults to
+      -- the end of the snippet. Placeholders with equal identifiers are linked,
+      -- that is typing in one will update others too.
+      --
+      -- See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
+    deriving (Show, Read, Eq)
+
+instance A.ToJSON InsertTextFormat where
+  toJSON PlainText = A.Number 1
+  toJSON Snippet   = A.Number 2
+
+instance A.FromJSON InsertTextFormat where
+  parseJSON (A.Number  1) = pure PlainText
+  parseJSON (A.Number  2) = pure Snippet
+  parseJSON _             = mempty
+
+data CompletionDoc = CompletionDocString Text
+                   | CompletionDocMarkup MarkupContent
+  deriving (Show, Read, Eq)
+
+instance A.ToJSON CompletionDoc where
+  toJSON (CompletionDocString x) = A.toJSON x
+  toJSON (CompletionDocMarkup x) = A.toJSON x
+
+instance A.FromJSON CompletionDoc where
+  parseJSON x = CompletionDocString <$> A.parseJSON x <|> CompletionDocMarkup <$> A.parseJSON x
+
+data CompletionItem =
+  CompletionItem
+    { _label               :: Text -- ^ The label of this completion item. By default also
+                       -- the text that is inserted when selecting this
+                       -- completion.
+    , _kind                :: Maybe CompletionItemKind
+    , _detail              :: Maybe Text -- ^ A human-readable string with additional
+                              -- information about this item, like type or
+                              -- symbol information.
+    , _documentation       :: Maybe CompletionDoc -- ^ A human-readable string that represents
+                                                  -- a doc-comment.
+    , _deprecated          :: Maybe Bool -- ^ Indicates if this item is deprecated.
+    , _preselect           :: Maybe Bool
+         -- ^ Select this item when showing.
+         -- *Note* that only one completion item can be selected and that the
+         -- tool / client decides which item that is. The rule is that the *first*
+         -- item of those that match best is selected.
+    , _sortText            :: Maybe Text -- ^ A string that should be used when filtering
+                                -- a set of completion items. When `falsy` the
+                                -- label is used.
+    , _filterText          :: Maybe Text -- ^ A string that should be used when
+                                  -- filtering a set of completion items. When
+                                  -- `falsy` the label is used.
+    , _insertText          :: Maybe Text -- ^ A string that should be inserted a
+                                  -- document when selecting this completion.
+                                  -- When `falsy` the label is used.
+    , _insertTextFormat    :: Maybe InsertTextFormat
+         -- ^ The format of the insert text. The format applies to both the
+         -- `insertText` property and the `newText` property of a provided
+         -- `textEdit`.
+    , _textEdit            :: Maybe TextEdit
+         -- ^ An edit which is applied to a document when selecting this
+         -- completion. When an edit is provided the value of `insertText` is
+         -- ignored.
+         --
+         -- *Note:* The range of the edit must be a single line range and it
+         -- must contain the position at which completion has been requested.
+    , _additionalTextEdits :: Maybe (List TextEdit)
+         -- ^ An optional array of additional text edits that are applied when
+         -- selecting this completion. Edits must not overlap with the main edit
+         -- nor with themselves.
+    , _commitCharacters    :: Maybe (List Text)
+         -- ^ An optional set of characters that when pressed while this completion
+         -- is active will accept it first and then type that character. *Note*
+         -- that all commit characters should have `length=1` and that superfluous
+         -- characters will be ignored.
+    , _command             :: Maybe Command
+        -- ^ An optional command that is executed *after* inserting this
+        -- completion. *Note* that additional modifications to the current
+        -- document should be described with the additionalTextEdits-property.
+    , _xdata               :: Maybe A.Value -- ^ An data entry field that is preserved on a
+                              -- completion item between a completion and a
+                              -- completion resolve request.
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''CompletionItem
+
+data CompletionListType =
+  CompletionListType
+    { _isIncomplete :: Bool
+    , _items        :: List CompletionItem
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''CompletionListType
+
+data CompletionResponseResult
+  = CompletionList CompletionListType
+  | Completions (List CompletionItem)
+  deriving (Read,Show,Eq)
+
+deriveJSON defaultOptions { fieldLabelModifier = rdrop (length ("CompletionResponseResult"::String)), sumEncoding = UntaggedValue } ''CompletionResponseResult
+
+-- | How a completion was triggered
+data CompletionTriggerKind = -- | Completion was triggered by typing an identifier (24x7 code
+                             -- complete), manual invocation (e.g Ctrl+Space) or via API.
+                             CtInvoked
+                             -- | Completion was triggered by a trigger character specified by
+                             -- the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
+                           | CtTriggerCharacter
+                             -- | Completion was re-triggered as the current completion list is incomplete.
+                           | CtTriggerForIncompleteCompletions
+                             -- | An unknown 'CompletionTriggerKind' not yet supported in haskell-lsp.
+                           | CtUnknown Scientific
+  deriving (Read, Show, Eq)
+
+instance A.ToJSON CompletionTriggerKind where
+  toJSON CtInvoked                         = A.Number 1
+  toJSON CtTriggerCharacter                = A.Number 2
+  toJSON CtTriggerForIncompleteCompletions = A.Number 3
+  toJSON (CtUnknown x)                     = A.Number x
+
+instance A.FromJSON CompletionTriggerKind where
+  parseJSON (A.Number 1) = pure CtInvoked
+  parseJSON (A.Number 2) = pure CtTriggerCharacter
+  parseJSON (A.Number 3) = pure CtTriggerForIncompleteCompletions
+  parseJSON (A.Number x) = pure (CtUnknown x)
+  parseJSON _          = mempty
+
+data CompletionContext =
+  CompletionContext
+    { _triggerKind      :: CompletionTriggerKind -- ^ How the completion was triggered.
+    , _triggerCharacter :: Maybe Text
+      -- ^ The trigger character (a single character) that has trigger code complete.
+      -- Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
+    }
+  deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''CompletionContext
+
+data CompletionParams =
+  CompletionParams
+    { _textDocument :: TextDocumentIdentifier -- ^ The text document.
+    , _position     :: Position -- ^ The position inside the text document.
+    , _context      :: Maybe CompletionContext
+      -- ^ The completion context. This is only available if the client specifies
+      -- to send this using `ClientCapabilities.textDocument.completion.contextSupport === true`
+    }
+  deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''CompletionParams
+
+type CompletionResponse = ResponseMessage CompletionResponseResult
+type CompletionRequest = RequestMessage ClientMethod CompletionParams CompletionResponseResult
+
+-- -------------------------------------
+{-
+New in 3.0
+-----------
+Registration Options: CompletionRegistrationOptions options defined as follows:
+
+export interface CompletionRegistrationOptions extends TextDocumentRegistrationOptions {
+        /**
+         * The characters that trigger completion automatically.
+         */
+        triggerCharacters?: string[];
+
+        /**
+         * The server provides support to resolve additional
+         * information for a completion item.
+         */
+        resolveProvider?: boolean;
+}
+-}
+
+data CompletionRegistrationOptions =
+  CompletionRegistrationOptions
+    { _documentSelector  :: Maybe DocumentSelector
+    , _triggerCharacters :: Maybe (List String)
+    , _resolveProvider   :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''CompletionRegistrationOptions
+
+-- ---------------------------------------------------------------------
+{-
+Completion Item Resolve Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#completion-item-resolve-request
+
+The request is sent from the client to the server to resolve additional
+information for a given completion item.
+
+Request
+
+    method: 'completionItem/resolve'
+    params: CompletionItem
+
+Response
+
+    result: CompletionItem
+    error: code and message set in case an exception happens during the completion resolve request.
+-}
+
+type CompletionItemResolveRequest  = RequestMessage ClientMethod CompletionItem CompletionItem
+type CompletionItemResolveResponse = ResponseMessage CompletionItem
diff --git a/src/Language/Haskell/LSP/Types/Constants.hs b/src/Language/Haskell/LSP/Types/Constants.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Constants.hs
@@ -0,0 +1,17 @@
+
+module Language.Haskell.LSP.Types.Constants where
+
+import           Data.Aeson.TH
+
+-- ---------------------------------------------------------------------
+
+-- | Standard options for use when generating JSON instances
+lspOptions :: Options
+lspOptions = defaultOptions { omitNothingFields = True, fieldLabelModifier = drop 1 }
+ -- NOTE: This needs to be in a separate file because of the TH stage restriction
+
+customModifier :: String -> String
+customModifier "_xdata" = "data"
+customModifier "_xtype" = "type"
+customModifier xs = drop 1 xs
+
diff --git a/src/Language/Haskell/LSP/Types/DataTypesJSON.hs b/src/Language/Haskell/LSP/Types/DataTypesJSON.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/DataTypesJSON.hs
@@ -0,0 +1,2855 @@
+{-# LANGUAGE CPP                        #-}
+{-# LANGUAGE DeriveGeneric              #-}
+{-# LANGUAGE DeriveTraversable          #-}
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE FunctionalDependencies     #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MultiParamTypeClasses      #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE TemplateHaskell            #-}
+{-# LANGUAGE TypeSynonymInstances       #-}
+
+module Language.Haskell.LSP.Types.DataTypesJSON where
+
+import           Control.Applicative
+import qualified Data.Aeson                                 as A
+import           Data.Aeson.TH
+import           Data.Aeson.Types
+import           Data.Text                                  (Text)
+import qualified Data.Text                                  as T
+import           Language.Haskell.LSP.Types.Command
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.ClientCapabilities
+import           Language.Haskell.LSP.Types.Diagnostic
+import           Language.Haskell.LSP.Types.DocumentFilter
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Message
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.Symbol
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.Uri
+import           Language.Haskell.LSP.Types.WorkspaceEdit
+import           Language.Haskell.LSP.Types.WorkspaceFolders
+
+-- =====================================================================
+-- ACTUAL PROTOCOL -----------------------------------------------------
+-- =====================================================================
+
+-- ---------------------------------------------------------------------
+-- Initialize Request
+-- ---------------------------------------------------------------------
+{-
+Initialize Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#initialize-request
+
+The initialize request is sent as the first request from the client to the server.
+
+Request
+
+    method: 'initialize'
+    params: InitializeParams defined as follows:
+
+interface InitializeParams {
+        /**
+         * The process Id of the parent process that started
+         * the server. Is null if the process has not been started by another process.
+         * If the parent process is not alive then the server should exit (see exit notification) its process.
+         */
+        processId: number | null;
+
+        /**
+         * The rootPath of the workspace. Is null
+         * if no folder is open.
+         *
+         * @deprecated in favour of rootUri.
+         */
+        rootPath?: string | null;
+
+        /**
+         * The rootUri of the workspace. Is null if no
+         * folder is open. If both `rootPath` and `rootUri` are set
+         * `rootUri` wins.
+         */
+        rootUri: DocumentUri | null;
+
+        /**
+         * User provided initialization options.
+         */
+        initializationOptions?: any;
+
+        /**
+         * The capabilities provided by the client (editor or tool)
+         */
+        capabilities: ClientCapabilities;
+
+        /**
+         * The initial trace setting. If omitted trace is disabled ('off').
+         */
+        trace?: 'off' | 'messages' | 'verbose';
+}
+-}
+
+data Trace = TraceOff | TraceMessages | TraceVerbose
+           deriving (Show, Read, Eq)
+
+instance A.ToJSON Trace where
+  toJSON TraceOff      = A.String (T.pack "off")
+  toJSON TraceMessages = A.String (T.pack "messages")
+  toJSON TraceVerbose  = A.String (T.pack "verbose")
+
+instance A.FromJSON Trace where
+  parseJSON (A.String s) = case T.unpack s of
+    "off"      -> return TraceOff
+    "messages" -> return TraceMessages
+    "verbose"  -> return TraceVerbose
+    _          -> mempty
+  parseJSON _                               = mempty
+
+data InitializeParams =
+  InitializeParams {
+    _processId             :: Maybe Int
+  , _rootPath              :: Maybe Text -- ^ Deprecated in favour of _rootUri
+  , _rootUri               :: Maybe Uri
+  , _initializationOptions :: Maybe A.Value
+  , _capabilities          :: ClientCapabilities
+  , _trace                 :: Maybe Trace
+  -- |  The workspace folders configured in the client when the server starts.
+  -- This property is only available if the client supports workspace folders.
+  -- It can be `null` if the client supports workspace folders but none are
+  -- configured.
+  -- Since LSP 3.6, @since 0.7.0.0
+  , _workspaceFolders      :: Maybe (List WorkspaceFolder)
+  } deriving (Show, Read, Eq)
+
+{-# DEPRECATED _rootPath "Use _rootUri" #-}
+
+deriveJSON lspOptions ''InitializeParams
+
+-- ---------------------------------------------------------------------
+-- Initialize Response
+-- ---------------------------------------------------------------------
+{-
+
+    error.data:
+
+interface InitializeError {
+    /**
+     * Indicates whether the client should retry to send the
+     * initilize request after showing the message provided
+     * in the ResponseError.
+     */
+    retry: boolean;
+-
+-}
+data InitializeError =
+  InitializeError
+    { _retry :: Bool
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''InitializeError
+
+-- ---------------------------------------------------------------------
+{-
+The server can signal the following capabilities:
+
+/**
+ * Defines how the host (editor) should sync document changes to the language server.
+ */
+enum TextDocumentSyncKind {
+    /**
+     * Documents should not be synced at all.
+     */
+    None = 0,
+    /**
+     * Documents are synced by always sending the full content of the document.
+     */
+    Full = 1,
+    /**
+     * Documents are synced by sending the full content on open. After that only incremental
+     * updates to the document are sent.
+     */
+    Incremental = 2
+}
+-}
+
+-- ^ Note: Omitting this parameter from the capabilities is effectively a fourth
+-- state, where DidSave events are generated without sending document contents.
+data TextDocumentSyncKind = TdSyncNone
+                          | TdSyncFull
+                          | TdSyncIncremental
+       deriving (Read,Eq,Show)
+
+instance A.ToJSON TextDocumentSyncKind where
+  toJSON TdSyncNone        = A.Number 0
+  toJSON TdSyncFull        = A.Number 1
+  toJSON TdSyncIncremental = A.Number 2
+
+instance A.FromJSON TextDocumentSyncKind where
+  parseJSON (A.Number 0) = pure TdSyncNone
+  parseJSON (A.Number 1) = pure TdSyncFull
+  parseJSON (A.Number 2) = pure TdSyncIncremental
+  parseJSON _            = mempty
+
+-- ---------------------------------------------------------------------
+{-
+/**
+ * Completion options.
+ */
+interface CompletionOptions {
+    /**
+     * The server provides support to resolve additional information for a completion item.
+     */
+    resolveProvider?: boolean;
+
+    /**
+     * The characters that trigger completion automatically.
+     */
+    triggerCharacters?: string[];
+}
+-}
+
+data CompletionOptions =
+  CompletionOptions
+    { _resolveProvider   :: Maybe Bool
+    , _triggerCharacters :: Maybe [String]
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions {omitNothingFields = True } ''CompletionOptions
+
+-- ---------------------------------------------------------------------
+{-
+/**
+ * Signature help options.
+ */
+interface SignatureHelpOptions {
+    /**
+     * The characters that trigger signature help automatically.
+     */
+    triggerCharacters?: string[];
+-}
+
+data SignatureHelpOptions =
+  SignatureHelpOptions
+    { _triggerCharacters :: Maybe [String]
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''SignatureHelpOptions
+
+-- ---------------------------------------------------------------------
+{-
+/**
+ * Code Lens options.
+ */
+interface CodeLensOptions {
+    /**
+     * Code lens has a resolve provider as well.
+     */
+    resolveProvider?: boolean;
+}
+-}
+
+data CodeLensOptions =
+  CodeLensOptions
+    { _resolveProvider :: Maybe Bool
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''CodeLensOptions
+
+-- ---------------------------------------------------------------------
+{-
+/**
+ * Format document on type options
+ */
+interface DocumentOnTypeFormattingOptions {
+    /**
+     * A character on which formatting should be triggered, like `}`.
+     */
+    firstTriggerCharacter: string;
+    /**
+     * More trigger characters.
+     */
+    moreTriggerCharacter?: string[]
+}
+-}
+data DocumentOnTypeFormattingOptions =
+  DocumentOnTypeFormattingOptions
+    { _firstTriggerCharacter :: Text
+    , _moreTriggerCharacter  :: Maybe [String]
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DocumentOnTypeFormattingOptions
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+/**
+ * Document link options
+ */
+export interface DocumentLinkOptions {
+        /**
+         * Document links have a resolve provider as well.
+         */
+        resolveProvider?: boolean;
+}
+-}
+
+data DocumentLinkOptions =
+  DocumentLinkOptions
+    { -- |Document links have a resolve provider as well.
+      _resolveProvider :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''DocumentLinkOptions
+
+-- ---------------------------------------------------------------------
+
+{-
+New in 3.0
+-----------
+
+/**
+ * Execute command options.
+ */
+export interface ExecuteCommandOptions {
+        /**
+         * The commands to be executed on the server
+         */
+        commands: string[]
+}
+-}
+
+data ExecuteCommandOptions =
+  ExecuteCommandOptions
+    { -- | The commands to be executed on the server
+      _commands :: List Text
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''ExecuteCommandOptions
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+/**
+ * Save options.
+ */
+export interface SaveOptions {
+        /**
+         * The client is supposed to include the content on save.
+         */
+        includeText?: boolean;
+}
+-}
+data SaveOptions =
+  SaveOptions
+    { -- |The client is supposed to include the content on save.
+      _includeText :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''SaveOptions
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+export interface TextDocumentSyncOptions {
+        /**
+         * Open and close notifications are sent to the server.
+         */
+        openClose?: boolean;
+        /**
+         * Change notificatins are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
+         * and TextDocumentSyncKindIncremental.
+         */
+        change?: number;
+        /**
+         * Will save notifications are sent to the server.
+         */
+        willSave?: boolean;
+        /**
+         * Will save wait until requests are sent to the server.
+         */
+        willSaveWaitUntil?: boolean;
+        /**
+         * Save notifications are sent to the server.
+         */
+        save?: SaveOptions;
+}
+-}
+
+data TextDocumentSyncOptions =
+  TextDocumentSyncOptions
+    { -- | Open and close notifications are sent to the server.
+      _openClose         :: Maybe Bool
+
+      -- | Change notificatins are sent to the server. See
+      -- TextDocumentSyncKind.None, TextDocumentSyncKind.Full and
+      -- TextDocumentSyncKindIncremental.
+    , _change            :: Maybe TextDocumentSyncKind
+
+      -- | Will save notifications are sent to the server.
+    , _willSave          :: Maybe Bool
+
+      -- | Will save wait until requests are sent to the server.
+    , _willSaveWaitUntil :: Maybe Bool
+
+      -- |Save notifications are sent to the server.
+    , _save              :: Maybe SaveOptions
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TextDocumentSyncOptions
+
+-- ---------------------------------------------------------------------
+{-
+
+Extended in 3.0
+---------------
+
+interface ServerCapabilities {
+        /**
+         * Defines how text documents are synced. Is either a detailed structure defining each notification or
+         * for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to `TextDocumentSyncKind.None`.
+         */
+        textDocumentSync?: TextDocumentSyncOptions | number;
+        /**
+         * The server provides hover support.
+         */
+        hoverProvider?: boolean;
+        /**
+         * The server provides completion support.
+         */
+        completionProvider?: CompletionOptions;
+        /**
+         * The server provides signature help support.
+         */
+        signatureHelpProvider?: SignatureHelpOptions;
+        /**
+         * The server provides goto definition support.
+         */
+        definitionProvider?: boolean;
+        /**
+         * The server provides Goto Type Definition support.
+         *
+         * Since 3.6.0
+         */
+        typeDefinitionProvider?: boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions);
+        /**
+         * The server provides Goto Implementation support.
+         *
+         * Since 3.6.0
+         */
+        implementationProvider?: boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions);
+        /**
+         * The server provides find references support.
+         */
+        referencesProvider?: boolean;
+        /**
+         * The server provides document highlight support.
+         */
+        documentHighlightProvider?: boolean;
+        /**
+         * The server provides document symbol support.
+         */
+        documentSymbolProvider?: boolean;
+        /**
+         * The server provides workspace symbol support.
+         */
+        workspaceSymbolProvider?: boolean;
+        /**
+         * The server provides code actions.
+         */
+        codeActionProvider?: boolean;
+        /**
+         * The server provides code lens.
+         */
+        codeLensProvider?: CodeLensOptions;
+        /**
+         * The server provides document formatting.
+         */
+        documentFormattingProvider?: boolean;
+        /**
+         * The server provides document range formatting.
+         */
+        documentRangeFormattingProvider?: boolean;
+        /**
+         * The server provides document formatting on typing.
+         */
+        documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions;
+        /**
+         * The server provides rename support.
+         */
+        renameProvider?: boolean;
+        /**
+         * The server provides document link support.
+         */
+        documentLinkProvider?: DocumentLinkOptions;
+        /**
+         * The server provides color provider support.
+         *
+         * Since 3.6.0
+         */
+        colorProvider?: boolean | ColorProviderOptions | (ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions);
+        /**
+         * The server provides folding provider support.
+         *
+         * Since 3.10.0
+         */
+        foldingRangeProvider?: boolean | FoldingRangeProviderOptions | (FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions);     
+        /**
+         * The server provides execute command support.
+         */
+        executeCommandProvider?: ExecuteCommandOptions;
+        /**
+         * Workspace specific server capabilities
+         */
+        workspace?: {
+                /**
+                 * The server supports workspace folder.
+                 *
+                 * Since 3.6.0
+                 */
+                workspaceFolders?: {
+                        /**
+                        * The server has support for workspace folders
+                        */
+                        supported?: boolean;
+                        /**
+                        * Whether the server wants to receive workspace folder
+                        * change notifications.
+                        *
+                        * If a strings is provided the string is treated as a ID
+                        * under which the notification is registered on the client
+                        * side. The ID can be used to unregister for these events
+                        * using the `client/unregisterCapability` request.
+                        */
+                        changeNotifications?: string | boolean;
+                }
+        }
+        /**
+         * Experimental server capabilities.
+         */
+        experimental?: any;
+}
+-}
+
+-- | Wrapper for TextDocumentSyncKind fallback.
+data TDS = TDSOptions TextDocumentSyncOptions
+         | TDSKind TextDocumentSyncKind
+    deriving (Show, Read, Eq)
+
+instance FromJSON TDS where
+    parseJSON x = TDSOptions <$> parseJSON x <|> TDSKind <$> parseJSON x
+    
+instance ToJSON TDS where
+    toJSON (TDSOptions x) = toJSON x
+    toJSON (TDSKind x) = toJSON x
+
+data GotoOptions = GotoOptionsStatic Bool
+                 | GotoOptionsDynamic
+                    { -- | A document selector to identify the scope of the registration. If set to null
+                      -- the document selector provided on the client side will be used.
+                      _documentSelector :: Maybe DocumentSelector 
+                      -- | The id used to register the request. The id can be used to deregister
+                      -- the request again. See also Registration#id.
+                    , _id :: Maybe Text
+                    }
+  deriving (Show, Read, Eq)
+
+deriveJSON lspOptions { sumEncoding = A.UntaggedValue } ''GotoOptions
+-- TODO: Figure out how to make Lens', not Traversal', for sum types
+--makeFieldsNoPrefix ''GotoOptions
+
+data ColorOptions = ColorOptionsStatic Bool
+                  | ColorOptionsDynamic
+                  | ColorOptionsDynamicDocument
+                    { -- | A document selector to identify the scope of the registration. If set to null
+                      -- the document selector provided on the client side will be used.
+                      _documentSelector :: Maybe DocumentSelector
+                      -- | The id used to register the request. The id can be used to deregister
+                      -- the request again. See also Registration#id.
+                    , _id :: Maybe Text
+                    }
+  deriving (Show, Read, Eq)
+
+deriveJSON lspOptions { sumEncoding = A.UntaggedValue } ''ColorOptions
+-- makeFieldsNoPrefix ''ColorOptions
+
+data FoldingRangeOptions = FoldingRangeOptionsStatic Bool
+                         | FoldingRangeOptionsDynamic
+                         | FoldingRangeOptionsDynamicDocument
+                           { -- | A document selector to identify the scope of the registration. If set to null
+                             -- the document selector provided on the client side will be used.
+                             _documentSelector :: Maybe DocumentSelector
+                             -- | The id used to register the request. The id can be used to deregister
+                             -- the request again. See also Registration#id.
+                           , _id :: Maybe Text
+                           }
+  deriving (Show, Read, Eq)
+
+deriveJSON lspOptions { sumEncoding = A.UntaggedValue } ''FoldingRangeOptions
+-- makeFieldsNoPrefix ''FoldingRangeOptions
+
+data WorkspaceFolderChangeNotifications = WorkspaceFolderChangeNotificationsString Text
+                                        | WorkspaceFolderChangeNotificationsBool Bool
+  deriving (Show, Read, Eq)
+
+deriveJSON lspOptions{ sumEncoding = A.UntaggedValue } ''WorkspaceFolderChangeNotifications
+
+data WorkspaceFolderOptions =
+  WorkspaceFolderOptions
+    { -- | The server has support for workspace folders
+      _supported :: Maybe Bool
+      -- | Whether the server wants to receive workspace folder
+      -- change notifications.
+      -- If a strings is provided the string is treated as a ID
+      -- under which the notification is registered on the client
+      -- side. The ID can be used to unregister for these events
+      -- using the `client/unregisterCapability` request.
+    , _changeNotifications :: Maybe WorkspaceFolderChangeNotifications
+    }
+  deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''WorkspaceFolderOptions
+
+data WorkspaceOptions =
+  WorkspaceOptions
+    { -- |The server supports workspace folder. Since LSP 3.6, @since 0.7.0.0
+      _workspaceFolders :: Maybe WorkspaceFolderOptions
+    }
+  deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''WorkspaceOptions
+      
+data InitializeResponseCapabilitiesInner =
+  InitializeResponseCapabilitiesInner
+    { -- | Defines how text documents are synced. Is either a detailed structure
+      -- defining each notification or for backwards compatibility the
+      -- 'TextDocumentSyncKind' number.
+      -- If omitted it defaults to 'TdSyncNone'.
+      _textDocumentSync                 :: Maybe TDS
+      -- | The server provides hover support.
+    , _hoverProvider                    :: Maybe Bool
+      -- | The server provides completion support.
+    , _completionProvider               :: Maybe CompletionOptions
+      -- | The server provides signature help support.
+    , _signatureHelpProvider            :: Maybe SignatureHelpOptions
+      -- | The server provides goto definition support.
+    , _definitionProvider               :: Maybe Bool
+      -- | The server provides Goto Type Definition support. Since LSP 3.6, @since 0.7.0.0
+    , _typeDefinitionProvider           :: Maybe GotoOptions
+      -- | The server provides Goto Implementation support.
+      -- Since LSP 3.6, @since 0.7.0.0
+    , _implementationProvider           :: Maybe GotoOptions
+      -- | The server provides find references support.
+    , _referencesProvider               :: Maybe Bool
+      -- | The server provides document highlight support.
+    , _documentHighlightProvider        :: Maybe Bool
+      -- | The server provides document symbol support.
+    , _documentSymbolProvider           :: Maybe Bool
+      -- | The server provides workspace symbol support.
+    , _workspaceSymbolProvider          :: Maybe Bool
+      -- | The server provides code actions.
+    , _codeActionProvider               :: Maybe Bool
+      -- | The server provides code lens.
+    , _codeLensProvider                 :: Maybe CodeLensOptions
+      -- | The server provides document formatting.
+    , _documentFormattingProvider       :: Maybe Bool
+      -- | The server provides document range formatting.
+    , _documentRangeFormattingProvider  :: Maybe Bool
+      -- | The server provides document formatting on typing.
+    , _documentOnTypeFormattingProvider :: Maybe DocumentOnTypeFormattingOptions
+      -- | The server provides rename support.
+    , _renameProvider                   :: Maybe Bool
+      -- | The server provides document link support.
+    , _documentLinkProvider             :: Maybe DocumentLinkOptions
+      -- | The server provides color provider support. Since LSP 3.6, @since 0.7.0.0
+    , _colorProvider                    :: Maybe ColorOptions
+      -- | The server provides folding provider support. Since LSP 3.10, @since 0.7.0.0
+    , _foldingRangeProvider             :: Maybe FoldingRangeOptions
+      -- | The server provides execute command support.
+    , _executeCommandProvider           :: Maybe ExecuteCommandOptions
+      -- | Workspace specific server capabilities
+    , _workspace                        :: Maybe WorkspaceOptions
+      -- | Experimental server capabilities.
+    , _experimental                     :: Maybe A.Value
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''InitializeResponseCapabilitiesInner
+
+-- ---------------------------------------------------------------------
+-- |
+--   Information about the capabilities of a language server
+--
+data InitializeResponseCapabilities =
+  InitializeResponseCapabilities {
+    _capabilities :: InitializeResponseCapabilitiesInner
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''InitializeResponseCapabilities
+
+-- ---------------------------------------------------------------------
+
+type InitializeResponse = ResponseMessage InitializeResponseCapabilities
+
+type InitializeRequest = RequestMessage ClientMethod InitializeParams InitializeResponseCapabilities
+
+{-
+    error.code:
+
+/**
+ * Known error codes for an `InitializeError`;
+ */
+export namespace InitializeError {
+        /**
+         * If the protocol version provided by the client can't be handled by the server.
+         * @deprecated This initialize error got replaced by client capabilities. There is
+         * no version handshake in version 3.0x
+         */
+        export const unknownProtocolVersion: number = 1;
+}
+
+    error.data:
+
+interface InitializeError {
+        /**
+         * Indicates whether the client execute the following retry logic:
+         * (1) show the message provided by the ResponseError to the user
+         * (2) user selects retry or cancel
+         * (3) if user selected retry the initialize method is sent again.
+         */
+        retry: boolean;
+}
+-}
+
+-- ---------------------------------------------------------------------
+
+{-
+New in 3.0
+----------
+Initialized Notification
+
+The initialized notification is sent from the client to the server after the
+client is fully initialized and is able to listen to arbritary requests and
+notifications sent from the server.
+
+Notification:
+
+    method: 'initialized'
+    params: void
+
+-}
+
+data InitializedParams =
+  InitializedParams
+    {
+    } deriving (Show, Read, Eq)
+
+instance A.FromJSON InitializedParams where
+  parseJSON (A.Object _) = pure InitializedParams
+  parseJSON _            = mempty
+
+instance A.ToJSON InitializedParams where
+  toJSON InitializedParams = A.Object mempty
+
+type InitializedNotification = NotificationMessage ClientMethod (Maybe InitializedParams)
+
+-- ---------------------------------------------------------------------
+{-
+Shutdown Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#shutdown-request
+
+The shutdown request is sent from the client to the server. It asks the server
+to shut down, but to not exit (otherwise the response might not be delivered
+correctly to the client). There is a separate exit notification that asks the
+server to exit.
+
+Request
+
+    method: 'shutdown'
+    params: undefined
+
+Response
+
+    result: undefined
+    error: code and message set in case an exception happens during shutdown request.
+
+
+-}
+
+type ShutdownRequest  = RequestMessage ClientMethod (Maybe A.Value) Text
+type ShutdownResponse = ResponseMessage Text
+
+-- ---------------------------------------------------------------------
+{-
+Exit Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#exit-notification
+
+A notification to ask the server to exit its process.
+
+Notification
+
+    method: 'exit'
+
+-}
+
+-- |
+--   Notification from the server to actually exit now, after shutdown acked
+--
+data ExitParams =
+  ExitParams
+    {
+    } deriving (Show, Read, Eq)
+
+deriveJSON defaultOptions ''ExitParams
+
+type ExitNotification = NotificationMessage ClientMethod (Maybe ExitParams)
+
+-- ---------------------------------------------------------------------
+{-
+ShowMessage Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#showmessage-notification
+
+The show message notification is sent from a server to a client to ask the
+client to display a particular message in the user interface.
+
+Notification:
+
+    method: 'window/showMessage'
+    params: ShowMessageParams defined as follows:
+
+interface ShowMessageParams {
+    /**
+     * The message type. See {@link MessageType}.
+     */
+    type: number;
+
+    /**
+     * The actual message.
+     */
+    message: string;
+}
+
+Where the type is defined as follows:
+
+enum MessageType {
+    /**
+     * An error message.
+     */
+    Error = 1,
+    /**
+     * A warning message.
+     */
+    Warning = 2,
+    /**
+     * An information message.
+     */
+    Info = 3,
+    /**
+     * A log message.
+     */
+    Log = 4
+}
+-}
+data MessageType = MtError   -- ^ Error = 1,
+                 | MtWarning -- ^ Warning = 2,
+                 | MtInfo    -- ^ Info = 3,
+                 | MtLog     -- ^ Log = 4
+        deriving (Eq,Ord,Show,Read,Enum)
+
+instance A.ToJSON MessageType where
+  toJSON MtError   = A.Number 1
+  toJSON MtWarning = A.Number 2
+  toJSON MtInfo    = A.Number 3
+  toJSON MtLog     = A.Number 4
+
+instance A.FromJSON MessageType where
+  parseJSON (A.Number 1) = pure MtError
+  parseJSON (A.Number 2) = pure MtWarning
+  parseJSON (A.Number 3) = pure MtInfo
+  parseJSON (A.Number 4) = pure MtLog
+  parseJSON _            = mempty
+
+-- ---------------------------------------
+
+
+data ShowMessageParams =
+  ShowMessageParams {
+    _xtype   :: MessageType
+  , _message :: Text
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ShowMessageParams
+
+type ShowMessageNotification = NotificationMessage ServerMethod ShowMessageParams
+
+-- ---------------------------------------------------------------------
+{-
+ShowMessage Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#showmessage-request
+
+    New: The show message request is sent from a server to a client to ask the
+    client to display a particular message in the user interface. In addition to
+    the show message notification the request allows to pass actions and to wait
+    for an answer from the client.
+
+Request:
+
+    method: 'window/showMessageRequest'
+    params: ShowMessageRequestParams defined as follows:
+
+Response:
+
+    result: the selected MessageActionItem
+    error: code and message set in case an exception happens during showing a message.
+
+interface ShowMessageRequestParams {
+    /**
+     * The message type. See {@link MessageType}
+     */
+    type: number;
+
+    /**
+     * The actual message
+     */
+    message: string;
+
+    /**
+     * The message action items to present.
+     */
+    actions?: MessageActionItem[];
+}
+
+Where the MessageActionItem is defined as follows:
+
+interface MessageActionItem {
+    /**
+     * A short title like 'Retry', 'Open Log' etc.
+     */
+    title: string;
+}
+-}
+
+data MessageActionItem =
+  MessageActionItem
+    { _title :: Text
+    } deriving (Show,Read,Eq)
+
+deriveJSON lspOptions ''MessageActionItem
+
+
+data ShowMessageRequestParams =
+  ShowMessageRequestParams
+    { _xtype   :: MessageType
+    , _message :: Text
+    , _actions :: Maybe [MessageActionItem]
+    } deriving (Show,Read,Eq)
+
+deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ShowMessageRequestParams
+
+type ShowMessageRequest = RequestMessage ServerMethod ShowMessageRequestParams Text
+type ShowMessageResponse = ResponseMessage Text
+
+-- ---------------------------------------------------------------------
+{-
+LogMessage Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#logmessage-notification
+
+The log message notification is sent from the server to the client to ask the
+client to log a particular message.
+
+Notification:
+
+    method: 'window/logMessage'
+    params: LogMessageParams defined as follows:
+
+interface LogMessageParams {
+    /**
+     * The message type. See {@link MessageType}
+     */
+    type: number;
+
+    /**
+     * The actual message
+     */
+    message: string;
+}
+
+Where type is defined as above.
+-}
+
+data LogMessageParams =
+  LogMessageParams {
+    _xtype   :: MessageType
+  , _message :: Text
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''LogMessageParams
+
+
+type LogMessageNotification = NotificationMessage ServerMethod LogMessageParams
+
+-- ---------------------------------------------------------------------
+{-
+Telemetry Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#telemetry-notification
+
+    New: The telemetry notification is sent from the server to the client to ask
+    the client to log a telemetry event.
+
+Notification:
+
+    method: 'telemetry/event'
+    params: 'any'
+-}
+
+
+type TelemetryNotification = NotificationMessage ServerMethod A.Value
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+Register Capability
+
+The client/registerCapability request is sent from the server to the client to
+register for a new capability on the client side. Not all clients need to
+support dynamic capability registration. A client opts in via the
+ClientCapabilities.dynamicRegistration property.
+
+Request:
+
+    method: 'client/registerCapability'
+    params: RegistrationParams
+
+Where RegistrationParams are defined as follows:
+
+/**
+ * General paramters to to regsiter for a capability.
+ */
+export interface Registration {
+        /**
+         * The id used to register the request. The id can be used to deregister
+         * the request again.
+         */
+        id: string;
+
+        /**
+         * The method / capability to register for.
+         */
+        method: string;
+
+        /**
+         * Options necessary for the registration.
+         */
+        registerOptions?: any;
+}
+
+export interface RegistrationParams {
+        registrations: Registration[];
+}
+-}
+
+data Registration =
+  Registration
+    { -- |The id used to register the request. The id can be used to deregister
+      -- the request again.
+      _id              :: Text
+
+       -- | The method / capability to register for.
+    , _method          :: ClientMethod
+
+      -- | Options necessary for the registration.
+    , _registerOptions :: Maybe A.Value
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''Registration
+
+data RegistrationParams =
+  RegistrationParams
+    { _registrations :: List Registration
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''RegistrationParams
+
+-- |Note: originates at the server
+type RegisterCapabilityRequest = RequestMessage ServerMethod RegistrationParams ()
+
+type RegisterCapabilityResponse = ResponseMessage ()
+
+-- -------------------------------------
+
+{-
+Since most of the registration options require to specify a document selector
+there is a base interface that can be used.
+
+export interface TextDocumentRegistrationOptions {
+        /**
+         * A document selector to identify the scope of the registration. If set to null
+         * the document selector provided on the client side will be used.
+         */
+        documentSelector: DocumentSelector | null;
+}
+-}
+
+data TextDocumentRegistrationOptions =
+  TextDocumentRegistrationOptions
+    { _documentSelector :: Maybe DocumentSelector
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TextDocumentRegistrationOptions
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+Unregister Capability
+
+The client/unregisterCapability request is sent from the server to the client to
+unregister a previously register capability.
+
+Request:
+
+    method: 'client/unregisterCapability'
+    params: UnregistrationParams
+
+Where UnregistrationParams are defined as follows:
+
+/**
+ * General parameters to unregister a capability.
+ */
+export interface Unregistration {
+        /**
+         * The id used to unregister the request or notification. Usually an id
+         * provided during the register request.
+         */
+        id: string;
+
+        /**
+         * The method / capability to unregister for.
+         */
+        method: string;
+}
+
+export interface UnregistrationParams {
+        unregisterations: Unregistration[];
+}
+-}
+
+data Unregistration =
+  Unregistration
+    { -- | The id used to unregister the request or notification. Usually an id
+      -- provided during the register request.
+      _id     :: Text
+
+       -- |The method / capability to unregister for.
+    , _method :: Text
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''Unregistration
+
+data UnregistrationParams =
+  UnregistrationParams
+    { _unregistrations :: List Unregistration
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''UnregistrationParams
+
+type UnregisterCapabilityRequest = RequestMessage ServerMethod UnregistrationParams ()
+
+type UnregisterCapabilityResponse = ResponseMessage ()
+
+-- ---------------------------------------------------------------------
+{-
+DidChangeConfiguration Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangeconfiguration-notification
+
+A notification sent from the client to the server to signal the change of
+configuration settings.
+
+Notification:
+
+    method: 'workspace/didChangeConfiguration',
+    params: DidChangeConfigurationParams defined as follows:
+
+interface DidChangeConfigurationParams {
+    /**
+     * The actual changed settings
+     */
+    settings: any;
+}
+-}
+
+data DidChangeConfigurationParams =
+  DidChangeConfigurationParams {
+    _settings :: A.Value
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''DidChangeConfigurationParams
+
+-- ---------------------------------------------------------------------
+
+type DidChangeConfigurationNotification = NotificationMessage ClientMethod DidChangeConfigurationParams
+
+{-
+Configuration Request (:arrow_right_hook:)
+Since version 3.6.0
+
+The workspace/configuration request is sent from the server to the client to
+fetch configuration settings from the client. The request can fetch n
+configuration settings in one roundtrip. The order of the returned configuration
+settings correspond to the order of the passed ConfigurationItems (e.g. the
+first item in the response is the result for the first configuration item in the
+params).
+
+A ConfigurationItem consist of the configuration section to ask for and an
+additional scope URI. The configuration section ask for is defined by the server
+and doesn’t necessarily need to correspond to the configuration store used be
+the client. So a server might ask for a configuration cpp.formatterOptions but
+the client stores the configuration in a XML store layout differently. It is up
+to the client to do the necessary conversion. If a scope URI is provided the
+client should return the setting scoped to the provided resource. If the client
+for example uses EditorConfig to manage its settings the configuration should be
+returned for the passed resource URI. If the client can’t provide a
+configuration setting for a given scope then null need to be present in the
+returned array.
+
+Request:
+
+method: ‘workspace/configuration’
+params: ConfigurationParams defined as follows
+export interface ConfigurationParams {
+	items: ConfigurationItem[];
+}
+
+export interface ConfigurationItem {
+	/**
+	 * The scope to get the configuration section for.
+	 */
+	scopeUri?: string;
+
+	/**
+	 * The configuration section asked for.
+	 */
+	section?: string;
+}
+Response:
+
+result: any[]
+error: code and message set in case an exception happens during the
+‘workspace/configuration’ request
+-}
+
+data ConfigurationItem =
+  ConfigurationItem
+    { _scopeUri :: Maybe Text -- ^ The scope to get the configuration section for.
+    , _section  :: Maybe Text -- ^ The configuration section asked for.
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''ConfigurationItem
+
+data ConfigurationParams =
+  ConfigurationParams
+    { _items :: List ConfigurationItem
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''ConfigurationParams
+
+type ConfigurationRequest = RequestMessage ServerMethod ConfigurationParams (List A.Value)
+type ConfigurationResponse = ResponseMessage (List A.Value)
+
+-- ---------------------------------------------------------------------
+{-
+DidOpenTextDocument Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didopentextdocument-notification
+
+The document open notification is sent from the client to the server to signal
+newly opened text documents. The document's truth is now managed by the client
+and the server must not try to read the document's truth using the document's
+uri.
+
+Notification:
+
+    method: 'textDocument/didOpen'
+    params: DidOpenTextDocumentParams defined as follows:
+
+interface DidOpenTextDocumentParams {
+    /**
+     * The document that was opened.
+     */
+    textDocument: TextDocumentItem;
+}
+
+Registration Options: TextDocumentRegistrationOptions
+-}
+
+data DidOpenTextDocumentParams =
+  DidOpenTextDocumentParams {
+    _textDocument :: TextDocumentItem
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''DidOpenTextDocumentParams
+
+type DidOpenTextDocumentNotification = NotificationMessage ClientMethod DidOpenTextDocumentParams
+
+-- ---------------------------------------------------------------------
+{-
+DidChangeTextDocument Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangetextdocument-notification
+
+    Changed: The document change notification is sent from the client to the
+    server to signal changes to a text document. In 2.0 the shape of the params
+    has changed to include proper version numbers and language ids.
+
+Notification:
+
+    method: 'textDocument/didChange'
+    params: DidChangeTextDocumentParams defined as follows:
+
+interface DidChangeTextDocumentParams {
+    /**
+     * The document that did change. The version number points
+     * to the version after all provided content changes have
+     * been applied.
+     */
+    textDocument: VersionedTextDocumentIdentifier;
+
+    /**
+     * The actual content changes.
+     */
+    contentChanges: TextDocumentContentChangeEvent[];
+}
+
+/**
+ * An event describing a change to a text document. If range and rangeLength are omitted
+ * the new text is considered to be the full content of the document.
+ */
+interface TextDocumentContentChangeEvent {
+    /**
+     * The range of the document that changed.
+     */
+    range?: Range;
+
+    /**
+     * The length of the range that got replaced.
+     */
+    rangeLength?: number;
+
+    /**
+     * The new text of the document.
+     */
+    text: string;
+}
+-}
+data TextDocumentContentChangeEvent =
+  TextDocumentContentChangeEvent
+    { _range       :: Maybe Range
+    , _rangeLength :: Maybe Int
+    , _text        :: Text
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions { omitNothingFields = True } ''TextDocumentContentChangeEvent
+
+-- -------------------------------------
+
+data DidChangeTextDocumentParams =
+  DidChangeTextDocumentParams
+    { _textDocument   :: VersionedTextDocumentIdentifier
+    , _contentChanges :: List TextDocumentContentChangeEvent
+    } deriving (Show,Read,Eq)
+
+deriveJSON lspOptions ''DidChangeTextDocumentParams
+
+type DidChangeTextDocumentNotification = NotificationMessage ClientMethod DidChangeTextDocumentParams
+{-
+New in 3.0
+----------
+
+Registration Options: TextDocumentChangeRegistrationOptions defined as follows:
+
+/**
+ * Descibe options to be used when registered for text document change events.
+ */
+export interface TextDocumentChangeRegistrationOptions extends TextDocumentRegistrationOptions {
+        /**
+         * How documents are synced to the server. See TextDocumentSyncKind.Full
+         * and TextDocumentSyncKindIncremental.
+         */
+        syncKind: number;
+}
+-}
+
+data TextDocumentChangeRegistrationOptions =
+  TextDocumentChangeRegistrationOptions
+    { _documentSelector :: Maybe DocumentSelector
+    , _syncKind         :: TextDocumentSyncKind
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TextDocumentChangeRegistrationOptions
+
+-- ---------------------------------------------------------------------
+{-
+
+New in 3.0
+----------
+
+WillSaveTextDocument Notification
+
+The document will save notification is sent from the client to the server before
+the document is actually saved.
+
+Notification:
+
+    method: 'textDocument/willSave'
+    params: WillSaveTextDocumentParams defined as follows:
+
+/**
+ * The parameters send in a will save text document notification.
+ */
+export interface WillSaveTextDocumentParams {
+        /**
+         * The document that will be saved.
+         */
+        textDocument: TextDocumentIdentifier;
+
+        /**
+         * The 'TextDocumentSaveReason'.
+         */
+        reason: number;
+}
+
+/**
+ * Represents reasons why a text document is saved.
+ */
+export namespace TextDocumentSaveReason {
+
+        /**
+         * Manually triggered, e.g. by the user pressing save, by starting debugging,
+         * or by an API call.
+         */
+        export const Manual = 1;
+
+        /**
+         * Automatic after a delay.
+         */
+        export const AfterDelay = 2;
+
+        /**
+         * When the editor lost focus.
+         */
+        export const FocusOut = 3;
+}
+Registration Options: TextDocumentRegistrationOptions
+-}
+
+data TextDocumentSaveReason
+  = SaveManual
+         -- ^ Manually triggered, e.g. by the user pressing save, by starting
+         -- debugging, or by an API call.
+  | SaveAfterDelay -- ^ Automatic after a delay
+  | SaveFocusOut   -- ^ When the editor lost focus
+  deriving (Show, Read, Eq)
+
+instance A.ToJSON TextDocumentSaveReason where
+  toJSON SaveManual     = A.Number 1
+  toJSON SaveAfterDelay = A.Number 2
+  toJSON SaveFocusOut   = A.Number 3
+
+instance A.FromJSON TextDocumentSaveReason where
+  parseJSON (A.Number 1) = pure SaveManual
+  parseJSON (A.Number 2) = pure SaveAfterDelay
+  parseJSON (A.Number 3) = pure SaveFocusOut
+  parseJSON _            = mempty
+
+data WillSaveTextDocumentParams =
+  WillSaveTextDocumentParams
+    { _textDocument :: TextDocumentIdentifier
+    , _reason       :: TextDocumentSaveReason
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''WillSaveTextDocumentParams
+
+type WillSaveTextDocumentNotification = NotificationMessage ClientMethod WillSaveTextDocumentParams
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+WillSaveWaitUntilTextDocument Request
+
+The document will save request is sent from the client to the server before the
+document is actually saved. The request can return an array of TextEdits which
+will be applied to the text document before it is saved. Please note that
+clients might drop results if computing the text edits took too long or if a
+server constantly fails on this request. This is done to keep the save fast and
+reliable.
+
+Request:
+
+    method: 'textDocument/willSaveWaitUntil'
+    params: WillSaveTextDocumentParams
+
+Response:
+
+    result: TextEdit[]
+    error: code and message set in case an exception happens during the willSaveWaitUntil request.
+
+Registration Options: TextDocumentRegistrationOptions
+-}
+
+type WillSaveWaitUntilTextDocumentRequest = RequestMessage ClientMethod WillSaveTextDocumentParams (List TextEdit)
+type WillSaveWaitUntilTextDocumentResponse = ResponseMessage (List TextEdit)
+
+-- ---------------------------------------------------------------------
+{-
+DidSaveTextDocument Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didsavetextdocument-notification
+
+    New: The document save notification is sent from the client to the server
+    when the document was saved in the client.
+
+    method: 'textDocument/didSave'
+    params: DidSaveTextDocumentParams defined as follows:
+
+interface DidSaveTextDocumentParams {
+    /**
+     * The document that was saved.
+     */
+    textDocument: TextDocumentIdentifier;
+}
+-}
+data DidSaveTextDocumentParams =
+  DidSaveTextDocumentParams
+    { _textDocument :: TextDocumentIdentifier
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DidSaveTextDocumentParams
+
+type DidSaveTextDocumentNotification = NotificationMessage ClientMethod DidSaveTextDocumentParams
+
+
+
+-- ---------------------------------------------------------------------
+{-
+DidCloseTextDocument Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didclosetextdocument-notification
+
+The document close notification is sent from the client to the server when the
+document got closed in the client. The document's truth now exists where the
+document's uri points to (e.g. if the document's uri is a file uri the truth now
+exists on disk).
+
+    Changed: In 2.0 the params are of type DidCloseTextDocumentParams which
+    contains a reference to a text document.
+
+Notification:
+
+    method: 'textDocument/didClose'
+    params: DidCloseTextDocumentParams defined as follows:
+
+interface DidCloseTextDocumentParams {
+    /**
+     * The document that was closed.
+     */
+    textDocument: TextDocumentIdentifier;
+}
+-}
+data DidCloseTextDocumentParams =
+  DidCloseTextDocumentParams
+    { _textDocument :: TextDocumentIdentifier
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DidCloseTextDocumentParams
+
+
+type DidCloseTextDocumentNotification = NotificationMessage ClientMethod DidCloseTextDocumentParams
+
+-- ---------------------------------------------------------------------
+{-
+DidChangeWatchedFiles Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangewatchedfiles-notification
+
+The watched files notification is sent from the client to the server when the
+client detects changes to files watched by the language client.
+
+Notification:
+
+    method: 'workspace/didChangeWatchedFiles'
+    params: DidChangeWatchedFilesParams defined as follows:
+
+interface DidChangeWatchedFilesParams {
+    /**
+     * The actual file events.
+     */
+    changes: FileEvent[];
+}
+
+Where FileEvents are described as follows:
+
+/**
+ * The file event type.
+ */
+enum FileChangeType {
+    /**
+     * The file got created.
+     */
+    Created = 1,
+    /**
+     * The file got changed.
+     */
+    Changed = 2,
+    /**
+     * The file got deleted.
+     */
+    Deleted = 3
+}
+
+/**
+ * An event describing a file change.
+ */
+interface FileEvent {
+    /**
+     * The file's URI.
+     */
+    uri: string;
+    /**
+     * The change type.
+     */
+    type: number;
+-}
+data FileChangeType = FcCreated
+                    | FcChanged
+                    | FcDeleted
+       deriving (Read,Show,Eq)
+
+instance A.ToJSON FileChangeType where
+  toJSON FcCreated = A.Number 1
+  toJSON FcChanged = A.Number 2
+  toJSON FcDeleted = A.Number 3
+
+instance A.FromJSON FileChangeType where
+  parseJSON (A.Number 1) = pure FcCreated
+  parseJSON (A.Number 2) = pure FcChanged
+  parseJSON (A.Number 3) = pure FcDeleted
+  parseJSON _            = mempty
+
+
+-- -------------------------------------
+
+data FileEvent =
+  FileEvent
+    { _uri   :: Uri
+    , _xtype :: FileChangeType
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''FileEvent
+
+data DidChangeWatchedFilesParams =
+  DidChangeWatchedFilesParams
+    { _changes :: List FileEvent
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DidChangeWatchedFilesParams
+
+
+type DidChangeWatchedFilesNotification = NotificationMessage ClientMethod DidChangeWatchedFilesParams
+
+-- ---------------------------------------------------------------------
+{-
+PublishDiagnostics Notification
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#publishdiagnostics-notification
+
+Diagnostics notification are sent from the server to the client to signal
+results of validation runs.
+
+Notification
+
+    method: 'textDocument/publishDiagnostics'
+    params: PublishDiagnosticsParams defined as follows:
+
+interface PublishDiagnosticsParams {
+    /**
+     * The URI for which diagnostic information is reported.
+     */
+    uri: string;
+
+    /**
+     * An array of diagnostic information items.
+     */
+    diagnostics: Diagnostic[];
+}
+-}
+
+data PublishDiagnosticsParams =
+  PublishDiagnosticsParams
+    { _uri         :: Uri
+    , _diagnostics :: List Diagnostic
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''PublishDiagnosticsParams
+
+
+type PublishDiagnosticsNotification = NotificationMessage ServerMethod PublishDiagnosticsParams
+
+-- ---------------------------------------------------------------------
+{-
+Hover Request
+
+The hover request is sent from the client to the server to request hover
+information at a given text document position.
+
+    Changed: In 2.0 the request uses TextDocumentPositionParams with a proper
+    textDocument and position property. In 1.0 the uri of the referenced text
+    document was inlined into the params object.
+
+Request
+
+    method: 'textDocument/hover'
+    params: TextDocumentPositionParams
+
+Response
+
+    result: Hover defined as follows:
+
+/**
+ * The result of a hove request.
+ */
+interface Hover {
+    /**
+     * The hover's content
+     */
+    contents: MarkedString | MarkedString[];
+
+    /**
+     * An optional range
+     */
+    range?: Range;
+}
+
+Where MarkedString is defined as follows:
+/**
+ * MarkedString can be used to render human readable text. It is either a markdown string
+ * or a code-block that provides a language and a code snippet. The language identifier
+ * is sematically equal to the optional language identifier in fenced code blocks in GitHub
+ * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ *
+ * The pair of a language and a value is an equivalent to markdown:
+ * ```${language}
+ * ${value}
+ * ```
+ *
+ * Note that markdown strings will be sanitized - that means html will be escaped.
+ */
+type MarkedString = string | { language: string; value: string };
+
+    error: code and message set in case an exception happens during the hover
+    request.
+
+Registration Options: TextDocumentRegistrationOptions
+
+-}
+
+data LanguageString =
+  LanguageString
+    { _language :: Text
+    , _value    :: Text
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''LanguageString
+
+data MarkedString =
+    PlainString T.Text
+  | CodeString LanguageString
+    deriving (Eq,Read,Show)
+
+instance ToJSON MarkedString where
+  toJSON (PlainString x) = toJSON x
+  toJSON (CodeString  x) = toJSON x
+instance FromJSON MarkedString where
+  parseJSON (A.String t) = pure $ PlainString t
+  parseJSON o            = CodeString <$> parseJSON o
+
+data Hover =
+  Hover
+    { _contents :: List MarkedString
+    , _range    :: Maybe Range
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''Hover
+
+
+type HoverRequest = RequestMessage ClientMethod TextDocumentPositionParams Hover
+type HoverResponse = ResponseMessage Hover
+
+-- ---------------------------------------------------------------------
+{-
+Signature Help Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#signature-help-request
+
+The signature help request is sent from the client to the server to request
+signature information at a given cursor position.
+
+    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
+    textDocument and position properties. In 1.0 the uri of the referenced text
+    document was inlined into the params object.
+
+Request
+
+    method: 'textDocument/signatureHelp'
+    params: TextDocumentPositionParams
+
+Response
+
+    result: SignatureHelp defined as follows:
+
+/**
+ * Signature help represents the signature of something
+ * callable. There can be multiple signature but only one
+ * active and only one active parameter.
+ */
+interface SignatureHelp {
+    /**
+     * One or more signatures.
+     */
+    signatures: SignatureInformation[];
+
+    /**
+     * The active signature.
+     */
+    activeSignature?: number;
+
+    /**
+     * The active parameter of the active signature.
+     */
+    activeParameter?: number;
+}
+
+/**
+ * Represents the signature of something callable. A signature
+ * can have a label, like a function-name, a doc-comment, and
+ * a set of parameters.
+ */
+interface SignatureInformation {
+    /**
+     * The label of this signature. Will be shown in
+     * the UI.
+     */
+    label: string;
+
+    /**
+     * The human-readable doc-comment of this signature. Will be shown
+     * in the UI but can be omitted.
+     */
+    documentation?: string;
+
+    /**
+     * The parameters of this signature.
+     */
+    parameters?: ParameterInformation[];
+}
+
+/**
+ * Represents a parameter of a callable-signature. A parameter can
+ * have a label and a doc-comment.
+ */
+interface ParameterInformation {
+    /**
+     * The label of this signature. Will be shown in
+     * the UI.
+     */
+    label: string;
+
+    /**
+     * The human-readable doc-comment of this signature. Will be shown
+     * in the UI but can be omitted.
+     */
+    documentation?: string;
+}
+
+    error: code and message set in case an exception happens during the
+    signature help request.
+-}
+
+
+data ParameterInformation =
+  ParameterInformation
+    { _label         :: Text
+    , _documentation :: Maybe Text
+    } deriving (Read,Show,Eq)
+deriveJSON lspOptions ''ParameterInformation
+
+
+-- -------------------------------------
+
+data SignatureInformation =
+  SignatureInformation
+    { _label         :: Text
+    , _documentation :: Maybe Text
+    , _parameters    :: Maybe [ParameterInformation]
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''SignatureInformation
+
+data SignatureHelp =
+  SignatureHelp
+    { _signatures      :: List SignatureInformation
+    , _activeSignature :: Maybe Int -- ^ The active signature
+    , _activeParameter :: Maybe Int -- ^ The active parameter of the active signature
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''SignatureHelp
+
+type SignatureHelpRequest = RequestMessage ClientMethod TextDocumentPositionParams SignatureHelp
+type SignatureHelpResponse = ResponseMessage SignatureHelp
+
+-- -------------------------------------
+{-
+New in 3.0
+----------
+Registration Options: SignatureHelpRegistrationOptions defined as follows:
+
+export interface SignatureHelpRegistrationOptions extends TextDocumentRegistrationOptions {
+        /**
+         * The characters that trigger signature help
+         * automatically.
+         */
+        triggerCharacters?: string[];
+}
+-}
+
+data SignatureHelpRegistrationOptions =
+  SignatureHelpRegistrationOptions
+    { _documentSelector  :: Maybe DocumentSelector
+    , _triggerCharacters :: Maybe (List String)
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''SignatureHelpRegistrationOptions
+
+-- ---------------------------------------------------------------------
+{-
+Goto Definition Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#goto-definition-request
+
+The goto definition request is sent from the client to the server to resolve the
+definition location of a symbol at a given text document position.
+
+    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
+    textDocument and position properties. In 1.0 the uri of the referenced text
+    document was inlined into the params object.
+
+Request
+
+    method: 'textDocument/definition'
+    params: TextDocumentPositionParams
+
+Response:
+
+    result: Location | Location[]
+    error: code and message set in case an exception happens during the definition request.
+
+
+-}
+
+-- {"jsonrpc":"2.0","id":1,"method":"textDocument/definition","params":{"textDocument":{"uri":"file:///tmp/Foo.hs"},"position":{"line":1,"character":8}}}
+
+data LocationResponseParams = SingleLoc Location | MultiLoc [Location]
+  deriving (Eq,Read,Show)
+
+instance A.ToJSON LocationResponseParams where
+  toJSON (SingleLoc x) = toJSON x
+  toJSON (MultiLoc xs) = toJSON xs
+
+instance A.FromJSON LocationResponseParams where
+  parseJSON xs@(A.Array _) = MultiLoc <$> parseJSON xs
+  parseJSON x              = SingleLoc <$> parseJSON x
+
+type DefinitionRequest  = RequestMessage ClientMethod TextDocumentPositionParams LocationResponseParams
+type DefinitionResponse = ResponseMessage LocationResponseParams
+
+-- ---------------------------------------------------------------------
+
+{-
+Goto Type Definition Request (:leftwards_arrow_with_hook:)
+Since version 3.6.0
+
+The goto type definition request is sent from the client to the server to resolve the type definition location of a symbol at a given text document position.
+
+Request:
+
+method: ‘textDocument/typeDefinition’
+params: TextDocumentPositionParams
+Response:
+
+result: Location | Location[] | null
+error: code and message set in case an exception happens during the definition request.
+Registration Options: TextDocumentRegistrationOptions
+-}
+
+type TypeDefinitionRequest = RequestMessage ClientMethod TextDocumentPositionParams LocationResponseParams
+type TypeDefinitionResponse = ResponseMessage LocationResponseParams
+
+-- ---------------------------------------------------------------------
+
+{-
+Goto Implementation Request (:leftwards_arrow_with_hook:)
+Since version 3.6.0
+
+The goto implementation request is sent from the client to the server to resolve the implementation location of a symbol at a given text document position.
+
+Request:
+
+method: ‘textDocument/implementation’
+params: TextDocumentPositionParams
+Response:
+
+result: Location | Location[] | null
+error: code and message set in case an exception happens during the definition request.
+Registration Options: TextDocumentRegistrationOptions
+-}
+
+
+type ImplementationRequest  = RequestMessage ClientMethod TextDocumentPositionParams LocationResponseParams
+type ImplementationResponse = ResponseMessage LocationResponseParams
+
+-- ---------------------------------------------------------------------
+
+{-
+Find References Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#find-references-request
+
+The references request is sent from the client to the server to resolve
+project-wide references for the symbol denoted by the given text document
+position.
+
+    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
+    textDocument and position properties. In 1.0 the uri of the referenced text
+    document was inlined into the params object.
+
+Request
+
+    method: 'textDocument/references'
+    params: ReferenceParams defined as follows:
+
+interface ReferenceParams extends TextDocumentPositionParams {
+    context: ReferenceContext
+}
+
+interface ReferenceContext {
+    /**
+     * Include the declaration of the current symbol.
+     */
+    includeDeclaration: boolean;
+}
+
+Response:
+
+    result: Location[]
+    error: code and message set in case an exception happens during the
+           reference request.
+-}
+
+data ReferenceContext =
+  ReferenceContext
+    { _includeDeclaration :: Bool
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''ReferenceContext
+
+
+data ReferenceParams =
+  ReferenceParams
+    { _textDocument :: TextDocumentIdentifier
+    , _position     :: Position
+    , _context      :: ReferenceContext
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''ReferenceParams
+
+
+type ReferencesRequest  = RequestMessage ClientMethod ReferenceParams (List Location)
+type ReferencesResponse = ResponseMessage (List Location)
+
+-- ---------------------------------------------------------------------
+{-
+Document Highlights Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-highlights-request
+
+The document highlight request is sent from the client to the server to resolve
+a document highlights for a given text document position. For programming
+languages this usually highlights all references to the symbol scoped to this
+file. However we kept 'textDocument/documentHighlight' and
+'textDocument/references' separate requests since the first one is allowed to be
+more fuzzy. Symbol matches usually have a DocumentHighlightKind of Read or Write
+whereas fuzzy or textual matches use Textas the kind.
+
+    Changed: In 2.0 the request uses TextDocumentPositionParams with proper
+    textDocument and position properties. In 1.0 the uri of the referenced text
+    document was inlined into the params object.
+
+Request
+
+    method: 'textDocument/documentHighlight'
+    params: TextDocumentPositionParams
+
+Response
+
+    result: DocumentHighlight[] defined as follows:
+
+/**
+ * A document highlight is a range inside a text document which deserves
+ * special attention. Usually a document highlight is visualized by changing
+ * the background color of its range.
+ *
+ */
+interface DocumentHighlight {
+    /**
+     * The range this highlight applies to.
+     */
+    range: Range;
+
+    /**
+     * The highlight kind, default is DocumentHighlightKind.Text.
+     */
+    kind?: number;
+}
+
+/**
+ * A document highlight kind.
+ */
+enum DocumentHighlightKind {
+    /**
+     * A textual occurrance.
+     */
+    Text = 1,
+
+    /**
+     * Read-access of a symbol, like reading a variable.
+     */
+    Read = 2,
+
+    /**
+     * Write-access of a symbol, like writing to a variable.
+     */
+    Write = 3
+}
+
+    error: code and message set in case an exception happens during the document
+           highlight request.
+
+Registration Options: TextDocumentRegistrationOptions
+
+-}
+
+data DocumentHighlightKind = HkText | HkRead | HkWrite
+  deriving (Read,Show,Eq)
+
+instance A.ToJSON DocumentHighlightKind where
+  toJSON HkText  = A.Number 1
+  toJSON HkRead  = A.Number 2
+  toJSON HkWrite = A.Number 3
+
+instance A.FromJSON DocumentHighlightKind where
+  parseJSON (A.Number 1) = pure HkText
+  parseJSON (A.Number 2) = pure HkRead
+  parseJSON (A.Number 3) = pure HkWrite
+  parseJSON _            = mempty
+
+-- -------------------------------------
+
+data DocumentHighlight =
+  DocumentHighlight
+    { _range :: Range
+    , _kind  :: Maybe DocumentHighlightKind
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DocumentHighlight
+
+type DocumentHighlightRequest = RequestMessage ClientMethod TextDocumentPositionParams (List DocumentHighlight)
+type DocumentHighlightsResponse = ResponseMessage (List DocumentHighlight)
+
+-- ---------------------------------------------------------------------
+{-
+Workspace Symbols Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#workspace-symbols-request
+
+The workspace symbol request is sent from the client to the server to list
+project-wide symbols matching the query string.
+
+Request
+
+    method: 'workspace/symbol'
+    params: WorkspaceSymbolParams defined as follows:
+
+/**
+ * The parameters of a Workspace Symbol Request.
+ */
+interface WorkspaceSymbolParams {
+    /**
+     * A non-empty query string
+     */
+    query: string;
+}
+
+Response
+
+    result: SymbolInformation[] as defined above.
+    error: code and message set in case an exception happens during the
+           workspace symbol request.
+-}
+
+data WorkspaceSymbolParams =
+  WorkspaceSymbolParams
+    { _query :: Text
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''WorkspaceSymbolParams
+
+type WorkspaceSymbolRequest  = RequestMessage ClientMethod WorkspaceSymbolParams (List SymbolInformation)
+type WorkspaceSymbolsResponse = ResponseMessage (List SymbolInformation)
+
+-- ---------------------------------------------------------------------
+{-
+Code Lens Request
+
+The code lens request is sent from the client to the server to compute code
+lenses for a given text document.
+
+    Changed: In 2.0 the request uses CodeLensParams instead of a single uri.
+
+Request
+
+    method: 'textDocument/codeLens'
+    params: CodeLensParams defined as follows:
+
+interface CodeLensParams {
+    /**
+     * The document to request code lens for.
+     */
+    textDocument: TextDocumentIdentifier;
+}
+
+Response
+
+    result: CodeLens[] defined as follows:
+
+/**
+ * A code lens represents a command that should be shown along with
+ * source text, like the number of references, a way to run tests, etc.
+ *
+ * A code lens is _unresolved_ when no command is associated to it. For performance
+ * reasons the creation of a code lens and resolving should be done in two stages.
+ */
+interface CodeLens {
+    /**
+     * The range in which this code lens is valid. Should only span a single line.
+     */
+    range: Range;
+
+    /**
+     * The command this code lens represents.
+     */
+    command?: Command;
+
+    /**
+     * A data entry field that is preserved on a code lens item between
+     * a code lens and a code lens resolve request.
+     */
+    data?: any
+}
+
+    error: code and message set in case an exception happens during the code
+           lens request.
+-}
+
+data CodeLensParams =
+  CodeLensParams
+    { _textDocument :: TextDocumentIdentifier
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''CodeLensParams
+
+
+-- -------------------------------------
+
+data CodeLens =
+  CodeLens
+    { _range   :: Range
+    , _command :: Maybe Command
+    , _xdata   :: Maybe A.Value
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''CodeLens
+
+
+type CodeLensRequest = RequestMessage ClientMethod CodeLensParams (List CodeLens)
+type CodeLensResponse = ResponseMessage (List CodeLens)
+
+-- -------------------------------------
+{-
+Registration Options: CodeLensRegistrationOptions defined as follows:
+
+export interface CodeLensRegistrationOptions extends TextDocumentRegistrationOptions {
+        /**
+         * Code lens has a resolve provider as well.
+         */
+        resolveProvider?: boolean;
+}
+-}
+
+data CodeLensRegistrationOptions =
+  CodeLensRegistrationOptions
+    { _documentSelector :: Maybe DocumentSelector
+    , _resolveProvider  :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''CodeLensRegistrationOptions
+
+-- ---------------------------------------------------------------------
+{-
+Code Lens Resolve Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#code-lens-resolve-request
+
+The code lens resolve request is sent from the client to the server to resolve
+the command for a given code lens item.
+
+Request
+
+    method: 'codeLens/resolve'
+    params: CodeLens
+
+Response
+
+    result: CodeLens
+    error: code and message set in case an exception happens during the code
+           lens resolve request.
+
+
+-}
+
+type CodeLensResolveRequest  = RequestMessage ClientMethod CodeLens (List CodeLens)
+type CodeLensResolveResponse = ResponseMessage (List CodeLens)
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+Document Link Request
+
+The document links request is sent from the client to the server to request the
+location of links in a document.
+
+Request:
+
+    method: 'textDocument/documentLink'
+    params: DocumentLinkParams, defined as follows
+
+interface DocumentLinkParams {
+        /**
+         * The document to provide document links for.
+         */
+        textDocument: TextDocumentIdentifier;
+}
+
+Response:
+
+    result: An array of DocumentLink, or null.
+
+/**
+ * A document link is a range in a text document that links to an internal or external resource, like another
+ * text document or a web site.
+ */
+interface DocumentLink {
+        /**
+         * The range this link applies to.
+         */
+        range: Range;
+        /**
+         * The uri this link points to. If missing a resolve request is sent later.
+         */
+        target?: DocumentUri;
+}
+
+    error: code and message set in case an exception happens during the document link request.
+
+Registration Options: DocumentLinkRegistrationOptions defined as follows:
+
+export interface DocumentLinkRegistrationOptions extends TextDocumentRegistrationOptions {
+        /**
+         * Document links have a resolve provider as well.
+         */
+        resolveProvider?: boolean;
+}
+-}
+
+data DocumentLinkParams =
+  DocumentLinkParams
+    { _textDocument :: TextDocumentIdentifier
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DocumentLinkParams
+
+data DocumentLink =
+  DocumentLink
+    { _range  :: Range
+    , _target :: Maybe Text
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''DocumentLink
+
+type DocumentLinkRequest = RequestMessage ClientMethod DocumentLinkParams (List DocumentLink)
+type DocumentLinkResponse = ResponseMessage (List DocumentLink)
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+Document Link Resolve Request
+
+The document link resolve request is sent from the client to the server to resolve the target of a given document link.
+
+Request:
+
+    method: 'documentLink/resolve'
+    params: DocumentLink
+
+Response:
+
+    result: DocumentLink
+    error: code and message set in case an exception happens during the document link resolve request.
+
+-}
+
+type DocumentLinkResolveRequest  = RequestMessage ClientMethod DocumentLink DocumentLink
+type DocumentLinkResolveResponse = ResponseMessage DocumentLink
+
+-- ---------------------------------------------------------------------
+{-
+Document Formatting Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-formatting-request
+
+The document formatting request is sent from the server to the client to format
+a whole document.
+
+Request
+
+    method: 'textDocument/formatting'
+    params: DocumentFormattingParams defined as follows
+
+interface DocumentFormattingParams {
+    /**
+     * The document to format.
+     */
+    textDocument: TextDocumentIdentifier;
+
+    /**
+     * The format options.
+     */
+    options: FormattingOptions;
+}
+
+/**
+ * Value-object describing what options formatting should use.
+ */
+interface FormattingOptions {
+    /**
+     * Size of a tab in spaces.
+     */
+    tabSize: number;
+
+    /**
+     * Prefer spaces over tabs.
+     */
+    insertSpaces: boolean;
+
+    /**
+     * Signature for further properties.
+     */
+    [key: string]: boolean | number | string;
+}
+
+Response
+
+    result: TextEdit[] describing the modification to the document to be
+            formatted.
+    error: code and message set in case an exception happens during the
+           formatting request.
+
+Registration Options: TextDocumentRegistrationOptions
+-}
+
+data FormattingOptions =
+  FormattingOptions
+    { _tabSize      :: Int
+    , _insertSpaces :: Bool -- ^ Prefer spaces over tabs
+    -- Note: May be more properties
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''FormattingOptions
+
+data DocumentFormattingParams =
+  DocumentFormattingParams
+    { _textDocument :: TextDocumentIdentifier
+    , _options      :: FormattingOptions
+    } deriving (Show,Read,Eq)
+
+deriveJSON lspOptions ''DocumentFormattingParams
+
+type DocumentFormattingRequest  = RequestMessage ClientMethod DocumentFormattingParams (List TextEdit)
+type DocumentFormattingResponse = ResponseMessage (List TextEdit)
+
+-- ---------------------------------------------------------------------
+{-
+Document Range Formatting Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-range-formatting-request
+
+The document range formatting request is sent from the client to the server to
+format a given range in a document.
+
+Request
+
+    method: 'textDocument/rangeFormatting',
+    params: DocumentRangeFormattingParams defined as follows
+
+interface DocumentRangeFormattingParams {
+    /**
+     * The document to format.
+     */
+    textDocument: TextDocumentIdentifier;
+
+    /**
+     * The range to format
+     */
+    range: Range;
+
+    /**
+     * The format options
+     */
+    options: FormattingOptions;
+}
+
+Response
+
+    result: TextEdit[] describing the modification to the document to be
+            formatted.
+    error: code and message set in case an exception happens during the range
+           formatting request.
+-}
+
+data DocumentRangeFormattingParams =
+  DocumentRangeFormattingParams
+    { _textDocument :: TextDocumentIdentifier
+    , _range        :: Range
+    , _options      :: FormattingOptions
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DocumentRangeFormattingParams
+
+type DocumentRangeFormattingRequest  = RequestMessage ClientMethod DocumentRangeFormattingParams (List TextEdit)
+type DocumentRangeFormattingResponse = ResponseMessage (List TextEdit)
+
+-- ---------------------------------------------------------------------
+{-
+Document on Type Formatting Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-on-type-formatting-request
+
+The document on type formatting request is sent from the client to the server to
+format parts of the document during typing.
+
+Request
+
+    method: 'textDocument/onTypeFormatting'
+    params: DocumentOnTypeFormattingParams defined as follows
+
+interface DocumentOnTypeFormattingParams {
+    /**
+     * The document to format.
+     */
+    textDocument: TextDocumentIdentifier;
+
+    /**
+     * The position at which this request was sent.
+     */
+    position: Position;
+
+    /**
+     * The character that has been typed.
+     */
+    ch: string;
+
+    /**
+     * The format options.
+     */
+    options: FormattingOptions;
+}
+
+Response
+
+    result: TextEdit[] describing the modification to the document.
+    error: code and message set in case an exception happens during the range
+           formatting request.
+
+Registration Options: DocumentOnTypeFormattingRegistrationOptions defined as follows:
+
+export interface DocumentOnTypeFormattingRegistrationOptions extends TextDocumentRegistrationOptions {
+        /**
+         * A character on which formatting should be triggered, like `}`.
+         */
+        firstTriggerCharacter: string;
+        /**
+         * More trigger characters.
+         */
+        moreTriggerCharacter?: string[]
+}
+-}
+
+data DocumentOnTypeFormattingParams =
+  DocumentOnTypeFormattingParams
+    { _textDocument :: TextDocumentIdentifier
+    , _position     :: Position
+    , _ch           :: Text
+    , _options      :: FormattingOptions
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DocumentOnTypeFormattingParams
+
+type DocumentOnTypeFormattingRequest  = RequestMessage ClientMethod DocumentOnTypeFormattingParams (List TextEdit)
+type DocumentOnTypeFormattingResponse = ResponseMessage (List TextEdit)
+
+data DocumentOnTypeFormattingRegistrationOptions =
+  DocumentOnTypeFormattingRegistrationOptions
+    { _firstTriggerCharacter :: Text
+    , _moreTriggerCharacter  :: Maybe (List String)
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''DocumentOnTypeFormattingRegistrationOptions
+
+-- ---------------------------------------------------------------------
+{-
+Rename Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#rename-request
+
+The rename request is sent from the client to the server to perform a
+workspace-wide rename of a symbol.
+
+Request
+
+    method: 'textDocument/rename'
+    params: RenameParams defined as follows
+
+interface RenameParams {
+    /**
+     * The document to format.
+     */
+    textDocument: TextDocumentIdentifier;
+
+    /**
+     * The position at which this request was sent.
+     */
+    position: Position;
+
+    /**
+     * The new name of the symbol. If the given name is not valid the
+     * request must return a [ResponseError](#ResponseError) with an
+     * appropriate message set.
+     */
+    newName: string;
+}
+
+Response
+
+    result: WorkspaceEdit describing the modification to the workspace.
+    error: code and message set in case an exception happens during the rename
+           request.
+
+Registration Options: TextDocumentRegistrationOptions
+
+-}
+data RenameParams =
+  RenameParams
+    { _textDocument :: TextDocumentIdentifier
+    , _position     :: Position
+    , _newName      :: Text
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''RenameParams
+
+
+-- {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"textDocument/rename\",\"params\":{\"textDocument\":{\"uri\":\"file:///home/alanz/mysrc/github/alanz/haskell-lsp/src/HieVscode.hs\"},\"position\":{\"line\":37,\"character\":17},\"newName\":\"getArgs'\"}}
+
+type RenameRequest  = RequestMessage ClientMethod RenameParams WorkspaceEdit
+type RenameResponse = ResponseMessage WorkspaceEdit
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+Execute a command
+
+The workspace/executeCommand request is sent from the client to the server to
+trigger command execution on the server. In most cases the server creates a
+WorkspaceEdit structure and applies the changes to the workspace using the
+request workspace/applyEdit which is sent from the server to the client.
+
+Request:
+
+    method: 'workspace/executeCommand'
+    params: ExecuteCommandParams defined as follows:
+
+export interface ExecuteCommandParams {
+
+        /**
+         * The identifier of the actual command handler.
+         */
+        command: string;
+        /**
+         * Arguments that the command should be invoked with.
+         */
+        arguments?: any[];
+}
+
+The arguments are typically specified when a command is returned from the server
+to the client. Example requests that return a command are
+textDocument/codeAction or textDocument/codeLens.
+
+Response:
+
+    result: any
+    error: code and message set in case an exception happens during the request.
+
+Registration Options: ExecuteCommandRegistrationOptions defined as follows:
+
+/**
+ * Execute command registration options.
+ */
+export interface ExecuteCommandRegistrationOptions {
+        /**
+         * The commands to be executed on the server
+         */
+        commands: string[]
+}
+-}
+
+data ExecuteCommandParams =
+  ExecuteCommandParams
+    { _command   :: Text
+    , _arguments :: Maybe (List A.Value)
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''ExecuteCommandParams
+
+type ExecuteCommandRequest = RequestMessage ClientMethod ExecuteCommandParams A.Value
+type ExecuteCommandResponse = ResponseMessage A.Value
+
+data ExecuteCommandRegistrationOptions =
+  ExecuteCommandRegistrationOptions
+    { _commands :: List Text
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''ExecuteCommandRegistrationOptions
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+Applies a WorkspaceEdit
+
+The workspace/applyEdit request is sent from the server to the client to modify
+resource on the client side.
+
+Request:
+
+    method: 'workspace/applyEdit'
+    params: ApplyWorkspaceEditParams defined as follows:
+
+export interface ApplyWorkspaceEditParams {
+        /**
+         * The edits to apply.
+         */
+        edit: WorkspaceEdit;
+}
+
+Response:
+
+    result: ApplyWorkspaceEditResponse defined as follows:
+
+export interface ApplyWorkspaceEditResponse {
+        /**
+         * Indicates whether the edit was applied or not.
+         */
+        applied: boolean;
+}
+
+    error: code and message set in case an exception happens during the request.
+
+-}
+data ApplyWorkspaceEditParams =
+  ApplyWorkspaceEditParams
+    { _edit :: WorkspaceEdit
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''ApplyWorkspaceEditParams
+
+data ApplyWorkspaceEditResponseBody =
+  ApplyWorkspaceEditResponseBody
+    { _applied :: Bool
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''ApplyWorkspaceEditResponseBody
+
+-- | Sent from the server to the client
+type ApplyWorkspaceEditRequest  = RequestMessage ServerMethod ApplyWorkspaceEditParams ApplyWorkspaceEditResponseBody
+type ApplyWorkspaceEditResponse = ResponseMessage ApplyWorkspaceEditResponseBody
+
+-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-- ---------------------------------------------------------------------
+
+data TraceParams =
+  TraceParams {
+    _value :: Text
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TraceParams
+
+
+data TraceNotification =
+  TraceNotification {
+    _params :: TraceParams
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TraceNotification
+
diff --git a/src/Language/Haskell/LSP/Types/Diagnostic.hs b/src/Language/Haskell/LSP/Types/Diagnostic.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Diagnostic.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE TemplateHaskell            #-}
+
+module Language.Haskell.LSP.Types.Diagnostic where
+
+import qualified Data.Aeson                                 as A
+import           Data.Aeson.TH
+import           Data.Text
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Location
+
+-- ---------------------------------------------------------------------
+{-
+The protocol currently supports the following diagnostic severities:
+
+enum DiagnosticSeverity {
+    /**
+     * Reports an error.
+     */
+    Error = 1,
+    /**
+     * Reports a warning.
+     */
+    Warning = 2,
+    /**
+     * Reports an information.
+     */
+    Information = 3,
+    /**
+     * Reports a hint.
+     */
+    Hint = 4
+}
+-}
+data DiagnosticSeverity
+  = DsError   -- ^ Error = 1,
+  | DsWarning -- ^ Warning = 2,
+  | DsInfo    -- ^ Info = 3,
+  | DsHint    -- ^ Hint = 4
+  deriving (Eq,Ord,Show,Read)
+
+instance A.ToJSON DiagnosticSeverity where
+  toJSON DsError   = A.Number 1
+  toJSON DsWarning = A.Number 2
+  toJSON DsInfo    = A.Number 3
+  toJSON DsHint    = A.Number 4
+
+instance A.FromJSON DiagnosticSeverity where
+  parseJSON (A.Number 1) = pure DsError
+  parseJSON (A.Number 2) = pure DsWarning
+  parseJSON (A.Number 3) = pure DsInfo
+  parseJSON (A.Number 4) = pure DsHint
+  parseJSON _            = mempty
+
+-- ---------------------------------------------------------------------
+{-
+Represents a related message and source code location for a diagnostic. This should be
+used to point to code locations that cause or related to a diagnostics, e.g when duplicating
+a symbol in a scope.
+
+export interface DiagnosticRelatedInformation {
+  /**
+   * The location of this related diagnostic information.
+   */
+  location: Location;
+
+  /**
+   * The message of this related diagnostic information.
+   */
+  message: string;
+}
+-}
+
+data DiagnosticRelatedInformation =
+  DiagnosticRelatedInformation
+    { _location :: Location
+    , _message  :: Text
+    } deriving (Show, Read, Eq, Ord)
+
+deriveJSON lspOptions ''DiagnosticRelatedInformation
+
+-- ---------------------------------------------------------------------
+{-
+Diagnostic
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#diagnostic
+
+Represents a diagnostic, such as a compiler error or warning. Diagnostic objects
+are only valid in the scope of a resource.
+
+interface Diagnostic {
+    /**
+     * The range at which the message applies.
+     */
+    range: Range;
+
+    /**
+     * The diagnostic's severity. Can be omitted. If omitted it is up to the
+     * client to interpret diagnostics as error, warning, info or hint.
+     */
+    severity?: number;
+
+    /**
+     * The diagnostic's code. Can be omitted.
+     */
+    code?: number | string;
+
+    /**
+     * A human-readable string describing the source of this
+     * diagnostic, e.g. 'typescript' or 'super lint'.
+     */
+    source?: string;
+
+    /**
+     * The diagnostic's message.
+     */
+    message: string;
+
+    /**
+     * An array of related diagnostic information, e.g. when symbol-names within
+     * a scope collide all definitions can be marked via this property.
+     */
+    relatedInformation?: DiagnosticRelatedInformation[];
+}
+-}
+
+type DiagnosticSource = Text
+data Diagnostic =
+  Diagnostic
+    { _range              :: Range
+    , _severity           :: Maybe DiagnosticSeverity
+    , _code               :: Maybe Text -- Note: Protocol allows Int too.
+    , _source             :: Maybe DiagnosticSource
+    , _message            :: Text
+    , _relatedInformation :: Maybe (List DiagnosticRelatedInformation)
+    } deriving (Show, Read, Eq, Ord)
+
+deriveJSON lspOptions ''Diagnostic
diff --git a/src/Language/Haskell/LSP/Types/DocumentFilter.hs b/src/Language/Haskell/LSP/Types/DocumentFilter.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/DocumentFilter.hs
@@ -0,0 +1,55 @@
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.DocumentFilter where
+
+import           Data.Aeson.TH
+import           Data.Text                      ( Text )
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.List
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+DocumentFilter
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#new-documentfilter
+
+A document filter denotes a document through properties like language, schema or
+pattern. Examples are a filter that applies to TypeScript files on disk or a
+filter the applies to JSON files with name package.json:
+
+    { language: 'typescript', scheme: 'file' }
+    { language: 'json', pattern: '**/package.json' }
+
+export interface DocumentFilter {
+        /**
+         * A language id, like `typescript`.
+         */
+        language?: string;
+
+        /**
+         * A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
+         */
+        scheme?: string;
+
+        /**
+         * A glob pattern, like `*.{ts,js}`.
+         */
+        pattern?: string;
+}
+-}
+data DocumentFilter =
+  DocumentFilter
+    { _language :: Maybe Text
+    , _scheme   :: Maybe Text
+    , _pattern  :: Maybe Text
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''DocumentFilter
+
+{-
+A document selector is the combination of one or many document filters.
+
+export type DocumentSelector = DocumentFilter[];
+-}
+type DocumentSelector = List DocumentFilter
diff --git a/src/Language/Haskell/LSP/Types/FoldingRange.hs b/src/Language/Haskell/LSP/Types/FoldingRange.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/FoldingRange.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.FoldingRange where
+
+import qualified Data.Aeson                    as A
+import           Data.Aeson.TH
+import           Data.Text                    (Text)
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.Message
+
+data FoldingRangeParams =
+  FoldingRangeParams
+  { _textDocument :: TextDocumentIdentifier -- ^ The text document.
+  }
+  deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''FoldingRangeParams
+
+-- | Enum of known range kinds
+data FoldingRangeKind = FoldingRangeComment
+                        -- ^ Folding range for a comment
+                      | FoldingRangeImports
+                        -- ^ Folding range for a imports or includes
+                      | FoldingRangeRegion
+                        -- ^ Folding range for a region (e.g. #region)
+                      | FoldingRangeUnknown Text
+                        -- ^ Folding range that haskell-lsp-types does
+                        -- not yet support
+  deriving (Read, Show, Eq)
+
+instance A.ToJSON FoldingRangeKind where
+  toJSON FoldingRangeComment     = A.String "comment"
+  toJSON FoldingRangeImports     = A.String "imports"
+  toJSON FoldingRangeRegion      = A.String "region"
+  toJSON (FoldingRangeUnknown x) = A.String x
+
+instance A.FromJSON FoldingRangeKind where
+  parseJSON (A.String "comment") = pure FoldingRangeComment
+  parseJSON (A.String "imports") = pure FoldingRangeImports
+  parseJSON (A.String "region")  = pure FoldingRangeRegion
+  parseJSON (A.String x)         = pure (FoldingRangeUnknown x)
+  parseJSON _                    = mempty
+
+-- | Represents a folding range.
+data FoldingRange =
+  FoldingRange
+  { -- | The zero-based line number from where the folded range starts.
+    _startLine      :: Int
+    -- | The zero-based character offset from where the folded range
+    -- starts. If not defined, defaults to the length of the start line.
+  , _startCharacter :: Maybe Int
+    -- | The zero-based line number where the folded range ends.
+  , _endLine        :: Int
+    -- | The zero-based character offset before the folded range ends.
+    -- If not defined, defaults to the length of the end line.
+  , _endCharacter   :: Maybe Int
+    -- | Describes the kind of the folding range such as 'comment' or
+    -- 'region'. The kind is used to categorize folding ranges and used
+    -- by commands like 'Fold all comments'. See 'FoldingRangeKind' for
+    -- an enumeration of standardized kinds.
+  , _kind           :: Maybe FoldingRangeKind
+  }
+  deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''FoldingRange
+
+type FoldingRangeRequest = RequestMessage ClientMethod FoldingRangeParams (List FoldingRange)
+type FoldingRangeResponse = ResponseMessage (List FoldingRange)
diff --git a/src/Language/Haskell/LSP/Types/Lens.hs b/src/Language/Haskell/LSP/Types/Lens.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Lens.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE TemplateHaskell        #-}
+{-# LANGUAGE FlexibleInstances      #-}
+{-# LANGUAGE MultiParamTypeClasses  #-}
+{-# LANGUAGE FunctionalDependencies #-}
+
+module Language.Haskell.LSP.Types.Lens where
+
+import           Language.Haskell.LSP.Types.ClientCapabilities
+import           Language.Haskell.LSP.Types.CodeAction
+import           Language.Haskell.LSP.Types.Color
+import           Language.Haskell.LSP.Types.Command
+import           Language.Haskell.LSP.Types.Completion
+import           Language.Haskell.LSP.Types.DataTypesJSON
+import           Language.Haskell.LSP.Types.Diagnostic
+import           Language.Haskell.LSP.Types.DocumentFilter
+import           Language.Haskell.LSP.Types.FoldingRange
+import           Language.Haskell.LSP.Types.Message
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.Symbol
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.WorkspaceEdit
+import           Language.Haskell.LSP.Types.WorkspaceFolders
+import           Control.Lens.TH
+
+-- client capabilities
+makeFieldsNoPrefix ''WorkspaceEditClientCapabilities
+makeFieldsNoPrefix ''DidChangeConfigurationClientCapabilities
+makeFieldsNoPrefix ''DidChangeWatchedFilesClientCapabilities
+makeFieldsNoPrefix ''SymbolKindClientCapabilities
+makeFieldsNoPrefix ''SymbolClientCapabilities
+makeFieldsNoPrefix ''ExecuteClientCapabilities
+makeFieldsNoPrefix ''WorkspaceClientCapabilities
+makeFieldsNoPrefix ''SynchronizationTextDocumentClientCapabilities
+makeFieldsNoPrefix ''CompletionItemClientCapabilities
+makeFieldsNoPrefix ''CompletionItemKindClientCapabilities
+makeFieldsNoPrefix ''CompletionClientCapabilities
+makeFieldsNoPrefix ''HoverClientCapabilities
+makeFieldsNoPrefix ''SignatureInformationClientCapabilities
+makeFieldsNoPrefix ''SignatureHelpClientCapabilities
+makeFieldsNoPrefix ''ReferencesClientCapabilities
+makeFieldsNoPrefix ''DocumentHighlightClientCapabilities
+makeFieldsNoPrefix ''DocumentSymbolKindClientCapabilities
+makeFieldsNoPrefix ''DocumentSymbolClientCapabilities
+makeFieldsNoPrefix ''FormattingClientCapabilities
+makeFieldsNoPrefix ''RangeFormattingClientCapabilities
+makeFieldsNoPrefix ''OnTypeFormattingClientCapabilities
+makeFieldsNoPrefix ''DefinitionClientCapabilities
+makeFieldsNoPrefix ''TypeDefinitionClientCapabilities
+makeFieldsNoPrefix ''ImplementationClientCapabilities
+makeFieldsNoPrefix ''CodeActionKindClientCapabilities
+makeFieldsNoPrefix ''CodeActionLiteralSupport
+makeFieldsNoPrefix ''CodeActionClientCapabilities
+makeFieldsNoPrefix ''CodeLensClientCapabilities
+makeFieldsNoPrefix ''DocumentLinkClientCapabilities
+makeFieldsNoPrefix ''ColorProviderClientCapabilities
+makeFieldsNoPrefix ''RenameClientCapabilities
+makeFieldsNoPrefix ''PublishDiagnosticsClientCapabilities
+makeFieldsNoPrefix ''TextDocumentClientCapabilities
+makeFieldsNoPrefix ''ClientCapabilities
+
+-- ---------------------------------------------------------------------
+
+makeFieldsNoPrefix ''InitializeParams
+makeFieldsNoPrefix ''InitializeError
+makeFieldsNoPrefix ''CompletionOptions
+makeFieldsNoPrefix ''SignatureHelpOptions
+makeFieldsNoPrefix ''CodeLensOptions
+makeFieldsNoPrefix ''DocumentOnTypeFormattingOptions
+makeFieldsNoPrefix ''DocumentLinkOptions
+makeFieldsNoPrefix ''ExecuteCommandOptions
+makeFieldsNoPrefix ''SaveOptions
+makeFieldsNoPrefix ''TextDocumentSyncOptions
+makeFieldsNoPrefix ''WorkspaceFolderOptions
+makeFieldsNoPrefix ''WorkspaceOptions
+makeFieldsNoPrefix ''InitializeResponseCapabilitiesInner
+makeFieldsNoPrefix ''InitializeResponseCapabilities
+makeFieldsNoPrefix ''ShowMessageParams
+makeFieldsNoPrefix ''MessageActionItem
+makeFieldsNoPrefix ''ShowMessageRequestParams
+makeFieldsNoPrefix ''LogMessageParams
+makeFieldsNoPrefix ''Registration
+makeFieldsNoPrefix ''RegistrationParams
+makeFieldsNoPrefix ''TextDocumentRegistrationOptions
+makeFieldsNoPrefix ''Unregistration
+makeFieldsNoPrefix ''UnregistrationParams
+makeFieldsNoPrefix ''DidChangeConfigurationParams
+makeFieldsNoPrefix ''ConfigurationItem
+makeFieldsNoPrefix ''ConfigurationParams
+makeFieldsNoPrefix ''DidOpenTextDocumentParams
+makeFieldsNoPrefix ''TextDocumentContentChangeEvent
+makeFieldsNoPrefix ''DidChangeTextDocumentParams
+makeFieldsNoPrefix ''TextDocumentChangeRegistrationOptions
+makeFieldsNoPrefix ''WillSaveTextDocumentParams
+makeFieldsNoPrefix ''DidSaveTextDocumentParams
+makeFieldsNoPrefix ''DidCloseTextDocumentParams
+makeFieldsNoPrefix ''FileEvent
+makeFieldsNoPrefix ''DidChangeWatchedFilesParams
+makeFieldsNoPrefix ''PublishDiagnosticsParams
+makeFieldsNoPrefix ''LanguageString
+makeFieldsNoPrefix ''Hover
+makeFieldsNoPrefix ''ParameterInformation
+makeFieldsNoPrefix ''SignatureInformation
+makeFieldsNoPrefix ''SignatureHelp
+makeFieldsNoPrefix ''SignatureHelpRegistrationOptions
+makeFieldsNoPrefix ''ReferenceContext
+makeFieldsNoPrefix ''ReferenceParams
+makeFieldsNoPrefix ''DocumentHighlight
+makeFieldsNoPrefix ''WorkspaceSymbolParams
+makeFieldsNoPrefix ''CodeLensParams
+makeFieldsNoPrefix ''CodeLens
+makeFieldsNoPrefix ''CodeLensRegistrationOptions
+makeFieldsNoPrefix ''DocumentLinkParams
+makeFieldsNoPrefix ''DocumentLink
+makeFieldsNoPrefix ''FormattingOptions
+makeFieldsNoPrefix ''DocumentFormattingParams
+makeFieldsNoPrefix ''DocumentRangeFormattingParams
+makeFieldsNoPrefix ''DocumentOnTypeFormattingParams
+makeFieldsNoPrefix ''RenameParams
+makeFieldsNoPrefix ''ExecuteCommandParams
+makeFieldsNoPrefix ''ExecuteCommandRegistrationOptions
+makeFieldsNoPrefix ''ApplyWorkspaceEditParams
+makeFieldsNoPrefix ''ApplyWorkspaceEditResponseBody
+makeFieldsNoPrefix ''TraceParams
+makeFieldsNoPrefix ''TraceNotification
+
+-- ---------------------------------------------------------------------
+
+-- Location
+makeFieldsNoPrefix ''Position
+makeFieldsNoPrefix ''Range
+makeFieldsNoPrefix ''Location
+
+-- Completion
+makeFieldsNoPrefix ''CompletionItem
+makeFieldsNoPrefix ''CompletionContext
+makeFieldsNoPrefix ''CompletionListType
+makeFieldsNoPrefix ''CompletionParams
+makeFieldsNoPrefix ''CompletionRegistrationOptions
+
+-- CodeActions
+makeFieldsNoPrefix ''CodeActionContext
+makeFieldsNoPrefix ''CodeActionParams
+makeFieldsNoPrefix ''CodeAction
+
+-- DocumentFilter
+makeFieldsNoPrefix ''DocumentFilter
+
+-- WorkspaceEdit
+makeFieldsNoPrefix ''TextEdit
+makeFieldsNoPrefix ''VersionedTextDocumentIdentifier
+makeFieldsNoPrefix ''TextDocumentEdit
+makeFieldsNoPrefix ''WorkspaceEdit
+
+-- Workspace Folders
+makeFieldsNoPrefix ''WorkspaceFolder
+makeFieldsNoPrefix ''WorkspaceFoldersChangeEvent
+makeFieldsNoPrefix ''DidChangeWorkspaceFoldersParams
+
+-- Message
+makeFieldsNoPrefix ''RequestMessage
+makeFieldsNoPrefix ''ResponseError
+makeFieldsNoPrefix ''ResponseMessage
+makeFieldsNoPrefix ''NotificationMessage
+makeFieldsNoPrefix ''CancelParams
+
+-- TextDocument
+makeFieldsNoPrefix ''TextDocumentItem
+makeFieldsNoPrefix ''TextDocumentIdentifier
+makeFieldsNoPrefix ''TextDocumentPositionParams
+
+-- Command
+makeFieldsNoPrefix ''Command
+
+-- Diagnostic
+makeFieldsNoPrefix ''Diagnostic
+makeFieldsNoPrefix ''DiagnosticRelatedInformation
+
+-- Symbol
+makeFieldsNoPrefix ''DocumentSymbolParams
+makeFieldsNoPrefix ''DocumentSymbol
+makeFieldsNoPrefix ''SymbolInformation
+
+-- Color
+makeFieldsNoPrefix ''Color
+makeFieldsNoPrefix ''ColorInformation
+makeFieldsNoPrefix ''DocumentColorParams
+makeFieldsNoPrefix ''ColorPresentationParams
+makeFieldsNoPrefix ''ColorPresentation
+
+-- Folding Range
+makeFieldsNoPrefix ''FoldingRange
+makeFieldsNoPrefix ''FoldingRangeParams
diff --git a/src/Language/Haskell/LSP/Types/List.hs b/src/Language/Haskell/LSP/Types/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/List.hs
@@ -0,0 +1,26 @@
+-- Need to split these types out into a separate module since
+-- ClientCapabilities also depends on them
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE DeriveTraversable          #-}
+module Language.Haskell.LSP.Types.List where
+
+import qualified Data.Aeson                                 as A
+import           Data.Aeson.Types
+
+-- | This data type is used to host a FromJSON instance for the encoding used by
+-- elisp, where an empty list shows up as "null"
+newtype List a = List [a]
+                deriving (Show,Read,Eq,Ord,Monoid,Functor,Foldable,Traversable)
+
+instance (A.ToJSON a) => A.ToJSON (List a) where
+  toJSON (List ls) = toJSON ls
+
+instance (A.FromJSON a) => A.FromJSON (List a) where
+  parseJSON A.Null = return (List [])
+  parseJSON v      = List <$> parseJSON v
+
+#if __GLASGOW_HASKELL__ >= 804
+instance Semigroup (List a) where
+  (<>) = mappend
+#endif
diff --git a/src/Language/Haskell/LSP/Types/Location.hs b/src/Language/Haskell/LSP/Types/Location.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Location.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.Location where
+
+import           Data.Aeson.TH
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.Uri
+
+-- ---------------------------------------------------------------------
+
+{-
+The current protocol is talored for textual documents which content can be
+represented as a string. There is currently no support for binary documents.
+Positions inside a document (see Position definition below) are expressed as a
+zero-based line and character offset. To ensure that both client and server
+split the string into the same line representation the protocol specs the
+following end of line sequences: '\n', '\r\n' and '\r'.
+
+export const EOL: string[] = ['\n', '\r\n', '\r'];
+-}
+{-
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#position
+
+Position in a text document expressed as zero-based line and character offset. A
+position is between two characters like an 'insert' cursor in a editor.
+
+interface Position {
+    /**
+     * Line position in a document (zero-based).
+     */
+    line: number;
+
+    /**
+     * Character offset on a line in a document (zero-based).
+     */
+    character: number;
+}
+-}
+data Position =
+  Position
+    { _line      :: Int
+    , _character :: Int
+    } deriving (Show, Read, Eq, Ord)
+
+deriveJSON lspOptions ''Position
+
+-- ---------------------------------------------------------------------
+{-
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#range
+
+A range in a text document expressed as (zero-based) start and end positions. A
+range is comparable to a selection in an editor. Therefore the end position is
+exclusive.
+
+interface Range {
+    /**
+     * The range's start position.
+     */
+    start: Position;
+
+    /**
+     * The range's end position.
+     */
+    end: Position;
+}
+-}
+
+data Range =
+  Range
+    { _start :: Position
+    , _end   :: Position
+    } deriving (Show, Read, Eq, Ord)
+
+deriveJSON lspOptions ''Range
+
+-- ---------------------------------------------------------------------
+{-
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#location
+
+Represents a location inside a resource, such as a line inside a text file.
+
+interface Location {
+    uri: string;
+    range: Range;
+}
+-}
+
+data Location =
+  Location
+    { _uri   :: Uri
+    , _range :: Range
+    } deriving (Show, Read, Eq, Ord)
+
+deriveJSON lspOptions ''Location
diff --git a/src/Language/Haskell/LSP/Types/MarkupContent.hs b/src/Language/Haskell/LSP/Types/MarkupContent.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/MarkupContent.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE TemplateHaskell            #-}
+
+-- | A MarkupContent literal represents a string value which content can
+-- be represented in different formats.
+-- Currently plaintext and markdown are supported formats.
+-- A MarkupContent is usually used in documentation properties of result
+-- literals like CompletionItem or SignatureInformation.
+module Language.Haskell.LSP.Types.MarkupContent where
+
+import           Data.Aeson
+import           Data.Aeson.TH
+import           Data.Text                                      (Text)
+import           Language.Haskell.LSP.Types.Constants
+
+{-
+/**
+ * Describes the content type that a client supports in various
+ * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
+ *
+ * Please note that `MarkupKinds` must not start with a `$`. This kinds
+ * are reserved for internal usage.
+ */
+export namespace MarkupKind {
+	/**
+	 * Plain text is supported as a content format
+	 */
+	export const PlainText: 'plaintext' = 'plaintext';
+
+	/**
+	 * Markdown is supported as a content format
+	 */
+	export const Markdown: 'markdown' = 'markdown';
+}
+export type MarkupKind = 'plaintext' | 'markdown';
+-}
+
+-- |  Describes the content type that a client supports in various
+-- result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
+data MarkupKind = MkPlainText -- ^ Plain text is supported as a content format
+                | MkMarkdown -- ^ Markdown is supported as a content format
+  deriving (Read, Show, Eq)
+
+instance ToJSON MarkupKind where
+  toJSON MkPlainText = String "plaintext"
+  toJSON MkMarkdown  = String "markdown"
+
+instance FromJSON MarkupKind where
+  parseJSON (String "plaintext") = pure MkPlainText
+  parseJSON (String "markdown")  = pure MkMarkdown
+  parseJSON _                    = mempty
+
+
+{-
+/**
+ * A `MarkupContent` literal represents a string value which content is interpreted base on its
+ * kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
+ *
+ * If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
+ * See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+ *
+ * Here is an example how such a string can be constructed using JavaScript / TypeScript:
+ * ```ts
+ * let markdown: MarkdownContent = {
+ *  kind: MarkupKind.Markdown,
+ *	value: [
+ *		'# Header',
+ *		'Some text',
+ *		'```typescript',
+ *		'someCode();',
+ *		'```'
+ *	].join('\n')
+ * };
+ * ```
+ *
+ * *Please Note* that clients might sanitize the return markdown. A client could decide to
+ * remove HTML from the markdown to avoid script execution.
+ */
+export interface MarkupContent {
+	/**
+	 * The type of the Markup
+	 */
+	kind: MarkupKind;
+
+	/**
+	 * The content itself
+	 */
+	value: string;
+}
+-}
+
+-- | A `MarkupContent` literal represents a string value which content is interpreted base on its
+-- | kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
+-- |
+-- | If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
+-- | See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
+-- |
+-- | Here is an example how such a string can be constructed using JavaScript / TypeScript:
+-- | ```ts
+-- | let markdown: MarkdownContent = {
+-- |  kind: MarkupKind.Markdown,
+-- |	value: [
+-- |		'# Header',
+-- |		'Some text',
+-- |		'```typescript',
+-- |		'someCode();',
+-- |		'```'
+-- |	].join('\n')
+-- | };
+-- | ```
+-- |
+-- | *Please Note* that clients might sanitize the return markdown. A client could decide to
+-- | remove HTML from the markdown to avoid script execution.
+data MarkupContent =
+  MarkupContent
+    { _kind  :: MarkupKind -- ^ The type of the Markup
+    , _value :: Text -- ^ The content itself
+    }
+  deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''MarkupContent
diff --git a/src/Language/Haskell/LSP/Types/Message.hs b/src/Language/Haskell/LSP/Types/Message.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Message.hs
@@ -0,0 +1,441 @@
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.Message where
+
+import qualified Data.Aeson                                 as A
+import           Data.Aeson.TH
+import           Data.Aeson.Types
+import           Data.Hashable
+-- For <= 8.2.2
+import           Data.Monoid                                ((<>))
+import           Data.Text                                  (Text)
+import qualified Data.Text                                  as T
+import           Language.Haskell.LSP.Types.Constants
+
+
+-- | Id used for a request, Can be either a String or an Int
+data LspId = IdInt Int | IdString Text
+            deriving (Show,Read,Eq,Ord)
+
+instance A.ToJSON LspId where
+  toJSON (IdInt i)    = toJSON i
+  toJSON (IdString s) = toJSON s
+
+instance A.FromJSON LspId where
+  parseJSON v@(A.Number _) = IdInt <$> parseJSON v
+  parseJSON  (A.String  s) = return (IdString s)
+  parseJSON _              = mempty
+
+instance Hashable LspId where
+  hashWithSalt salt (IdInt i) = hashWithSalt salt i
+  hashWithSalt salt (IdString s) = hashWithSalt salt s
+
+-- ---------------------------------------------------------------------
+
+-- | Id used for a response, Can be either a String or an Int, or Null. If a
+-- request doesn't provide a result value the receiver of a request still needs
+-- to return a response message to conform to the JSON RPC specification. The
+-- result property of the ResponseMessage should be set to null in this case to
+-- signal a successful request.
+data LspIdRsp = IdRspInt Int | IdRspString Text | IdRspNull
+            deriving (Show,Read,Eq)
+
+instance A.ToJSON LspIdRsp where
+  toJSON (IdRspInt i)    = toJSON i
+  toJSON (IdRspString s) = toJSON s
+  toJSON IdRspNull       = A.Null
+
+instance A.FromJSON LspIdRsp where
+  parseJSON v@(A.Number _) = IdRspInt <$> parseJSON v
+  parseJSON  (A.String  s) = return $ IdRspString s
+  parseJSON  A.Null        = return IdRspNull
+  parseJSON _              = mempty
+
+instance Hashable LspIdRsp where
+  hashWithSalt salt (IdRspInt i) = hashWithSalt salt i
+  hashWithSalt salt (IdRspString s) = hashWithSalt salt s
+  hashWithSalt _ IdRspNull = 0
+
+-- | Converts an LspId to its LspIdRsp counterpart.
+responseId :: LspId -> LspIdRsp
+responseId (IdInt    i) = IdRspInt i
+responseId (IdString s) = IdRspString s
+
+-- | Converts an LspIdRsp to its LspId counterpart.
+requestId :: LspIdRsp -> LspId
+requestId (IdRspInt    i) = IdInt i
+requestId (IdRspString s) = IdString s
+requestId IdRspNull       = error "Null response id"
+
+-- ---------------------------------------------------------------------
+
+-- Client Methods
+data ClientMethod =
+ -- General
+   Initialize
+ | Initialized
+ | Shutdown
+ | Exit
+ | CancelRequest
+ -- Workspace
+ | WorkspaceDidChangeWorkspaceFolders
+ | WorkspaceDidChangeConfiguration
+ | WorkspaceDidChangeWatchedFiles
+ | WorkspaceSymbol
+ | WorkspaceExecuteCommand
+ -- Document
+ | TextDocumentDidOpen
+ | TextDocumentDidChange
+ | TextDocumentWillSave
+ | TextDocumentWillSaveWaitUntil
+ | TextDocumentDidSave
+ | TextDocumentDidClose
+ | TextDocumentCompletion
+ | CompletionItemResolve
+ | TextDocumentHover
+ | TextDocumentSignatureHelp
+ | TextDocumentDefinition
+ | TextDocumentTypeDefinition
+ | TextDocumentImplementation
+ | TextDocumentReferences
+ | TextDocumentDocumentHighlight
+ | TextDocumentDocumentSymbol
+ | TextDocumentCodeAction
+ | TextDocumentCodeLens
+ | CodeLensResolve
+ | TextDocumentDocumentLink
+ | DocumentLinkResolve
+ | TextDocumentDocumentColor
+ | TextDocumentColorPresentation
+ | TextDocumentFormatting
+ | TextDocumentRangeFormatting
+ | TextDocumentOnTypeFormatting
+ | TextDocumentRename
+ | TextDocumentFoldingRanges
+ -- Messages of the form $/message
+ -- Implementation Dependent, can be ignored
+ | Misc Text
+   deriving (Eq,Ord,Read,Show)
+
+instance A.FromJSON ClientMethod where
+  -- General
+  parseJSON (A.String "initialize")                       = return Initialize
+  parseJSON (A.String "initialized")                      = return Initialized
+  parseJSON (A.String "shutdown")                         = return Shutdown
+  parseJSON (A.String "exit")                             = return Exit
+  parseJSON (A.String "$/cancelRequest")                  = return CancelRequest
+ -- Workspace
+  parseJSON (A.String "workspace/didChangeWorkspaceFolders") = return WorkspaceDidChangeWorkspaceFolders
+  parseJSON (A.String "workspace/didChangeConfiguration") = return WorkspaceDidChangeConfiguration
+  parseJSON (A.String "workspace/didChangeWatchedFiles")  = return WorkspaceDidChangeWatchedFiles
+  parseJSON (A.String "workspace/symbol")                 = return WorkspaceSymbol
+  parseJSON (A.String "workspace/executeCommand")         = return WorkspaceExecuteCommand
+ -- Document
+  parseJSON (A.String "textDocument/didOpen")             = return TextDocumentDidOpen
+  parseJSON (A.String "textDocument/didChange")           = return TextDocumentDidChange
+  parseJSON (A.String "textDocument/willSave")            = return TextDocumentWillSave
+  parseJSON (A.String "textDocument/willSaveWaitUntil")   = return TextDocumentWillSaveWaitUntil
+  parseJSON (A.String "textDocument/didSave")             = return TextDocumentDidSave
+  parseJSON (A.String "textDocument/didClose")            = return TextDocumentDidClose
+  parseJSON (A.String "textDocument/completion")          = return TextDocumentCompletion
+  parseJSON (A.String "completionItem/resolve")           = return CompletionItemResolve
+  parseJSON (A.String "textDocument/hover")               = return TextDocumentHover
+  parseJSON (A.String "textDocument/signatureHelp")       = return TextDocumentSignatureHelp
+  parseJSON (A.String "textDocument/definition")          = return TextDocumentDefinition
+  parseJSON (A.String "textDocument/typeDefinition")      = return TextDocumentTypeDefinition
+  parseJSON (A.String "textDocument/implementation")      = return TextDocumentImplementation
+  parseJSON (A.String "textDocument/references")          = return TextDocumentReferences
+  parseJSON (A.String "textDocument/documentHighlight")   = return TextDocumentDocumentHighlight
+  parseJSON (A.String "textDocument/documentSymbol")      = return TextDocumentDocumentSymbol
+  parseJSON (A.String "textDocument/codeAction")          = return TextDocumentCodeAction
+  parseJSON (A.String "textDocument/codeLens")            = return TextDocumentCodeLens
+  parseJSON (A.String "codeLens/resolve")                 = return CodeLensResolve
+  parseJSON (A.String "textDocument/documentLink")        = return TextDocumentDocumentLink
+  parseJSON (A.String "documentLink/resolve")             = return DocumentLinkResolve
+  parseJSON (A.String "textDocument/documentColor")       = return TextDocumentDocumentColor
+  parseJSON (A.String "textDocument/colorPresentation")   = return TextDocumentColorPresentation
+  parseJSON (A.String "textDocument/formatting")          = return TextDocumentFormatting
+  parseJSON (A.String "textDocument/rangeFormatting")     = return TextDocumentRangeFormatting
+  parseJSON (A.String "textDocument/onTypeFormatting")    = return TextDocumentOnTypeFormatting
+  parseJSON (A.String "textDocument/rename")              = return TextDocumentRename
+  parseJSON (A.String "textDocument/foldingRanges")       = return TextDocumentFoldingRanges
+  parseJSON (A.String x)                                  = if T.isPrefixOf "$/" x
+                                                               then return $ Misc (T.drop 2 x)
+                                                            else mempty
+  parseJSON _                                             = mempty
+
+instance A.ToJSON ClientMethod where
+  -- General
+  toJSON Initialize                      = A.String "initialize"
+  toJSON Initialized                     = A.String "initialized"
+  toJSON Shutdown                        = A.String "shutdown"
+  toJSON Exit                            = A.String "exit"
+  toJSON CancelRequest                   = A.String "$/cancelRequest"
+  -- Workspace
+  toJSON WorkspaceDidChangeWorkspaceFolders = A.String "workspace/didChangeWorkspaceFolders"
+  toJSON WorkspaceDidChangeConfiguration = A.String "workspace/didChangeConfiguration"
+  toJSON WorkspaceDidChangeWatchedFiles  = A.String "workspace/didChangeWatchedFiles"
+  toJSON WorkspaceSymbol                 = A.String "workspace/symbol"
+  toJSON WorkspaceExecuteCommand         = A.String "workspace/executeCommand"
+  -- Document
+  toJSON TextDocumentDidOpen             = A.String "textDocument/didOpen"
+  toJSON TextDocumentDidChange           = A.String "textDocument/didChange"
+  toJSON TextDocumentWillSave            = A.String "textDocument/willSave"
+  toJSON TextDocumentWillSaveWaitUntil   = A.String "textDocument/willSaveWaitUntil"
+  toJSON TextDocumentDidSave             = A.String "textDocument/didSave"
+  toJSON TextDocumentDidClose            = A.String "textDocument/didClose"
+  toJSON TextDocumentCompletion          = A.String "textDocument/completion"
+  toJSON CompletionItemResolve           = A.String "completionItem/resolve"
+  toJSON TextDocumentHover               = A.String "textDocument/hover"
+  toJSON TextDocumentSignatureHelp       = A.String "textDocument/signatureHelp"
+  toJSON TextDocumentReferences          = A.String "textDocument/references"
+  toJSON TextDocumentDocumentHighlight   = A.String "textDocument/documentHighlight"
+  toJSON TextDocumentDocumentSymbol      = A.String "textDocument/documentSymbol"
+  toJSON TextDocumentDefinition          = A.String "textDocument/definition"
+  toJSON TextDocumentTypeDefinition      = A.String "textDocument/typeDefinition"
+  toJSON TextDocumentImplementation      = A.String "textDocument/implementation"
+  toJSON TextDocumentCodeAction          = A.String "textDocument/codeAction"
+  toJSON TextDocumentCodeLens            = A.String "textDocument/codeLens"
+  toJSON CodeLensResolve                 = A.String "codeLens/resolve"
+  toJSON TextDocumentDocumentColor       = A.String "textDocument/documentColor"
+  toJSON TextDocumentColorPresentation   = A.String "textDocument/colorPresentation"
+  toJSON TextDocumentFormatting          = A.String "textDocument/formatting"
+  toJSON TextDocumentRangeFormatting     = A.String "textDocument/rangeFormatting"
+  toJSON TextDocumentOnTypeFormatting    = A.String "textDocument/onTypeFormatting"
+  toJSON TextDocumentRename              = A.String "textDocument/rename"
+  toJSON TextDocumentFoldingRanges       = A.String "textDocument/foldingRanges"
+  toJSON TextDocumentDocumentLink        = A.String "textDocument/documentLink"
+  toJSON DocumentLinkResolve             = A.String "documentLink/resolve"
+  toJSON (Misc xs)                       = A.String $ "$/" <> xs
+
+data ServerMethod =
+  -- Window
+    WindowShowMessage
+  | WindowShowMessageRequest
+  | WindowLogMessage
+  | TelemetryEvent
+  -- Client
+  | ClientRegisterCapability
+  | ClientUnregisterCapability
+  -- Workspace
+  | WorkspaceWorkspaceFolders
+  | WorkspaceConfiguration
+  | WorkspaceApplyEdit
+  -- Document
+  | TextDocumentPublishDiagnostics
+  -- Cancelling
+  | CancelRequestServer
+   deriving (Eq,Ord,Read,Show)
+
+instance A.FromJSON ServerMethod where
+  -- Window
+  parseJSON (A.String "window/showMessage")              = return WindowShowMessage
+  parseJSON (A.String "window/showMessageRequest")       = return WindowShowMessageRequest
+  parseJSON (A.String "window/logMessage")               = return WindowLogMessage
+  parseJSON (A.String "telemetry/event")                 = return TelemetryEvent
+  -- Client
+  parseJSON (A.String "client/registerCapability")       = return ClientRegisterCapability
+  parseJSON (A.String "client/unregisterCapability")     = return ClientUnregisterCapability
+  -- Workspace
+  parseJSON (A.String "workspace/workspaceFolders")      = return WorkspaceWorkspaceFolders
+  parseJSON (A.String "workspace/configuration")         = return WorkspaceConfiguration
+  parseJSON (A.String "workspace/applyEdit")             = return WorkspaceApplyEdit
+  -- Document
+  parseJSON (A.String "textDocument/publishDiagnostics") = return TextDocumentPublishDiagnostics
+  -- Cancelling
+  parseJSON (A.String "$/cancelRequest")                 = return CancelRequestServer
+  parseJSON _                                            = mempty
+
+instance A.ToJSON ServerMethod where
+  -- Window
+  toJSON WindowShowMessage = A.String "window/showMessage"
+  toJSON WindowShowMessageRequest = A.String "window/showMessageRequest"
+  toJSON WindowLogMessage = A.String "window/logMessage"
+  toJSON TelemetryEvent = A.String "telemetry/event"
+  -- Client
+  toJSON ClientRegisterCapability = A.String "client/registerCapability"
+  toJSON ClientUnregisterCapability = A.String "client/unregisterCapability"
+  -- Workspace
+  toJSON WorkspaceWorkspaceFolders = A.String "workspace/workspaceFolders"
+  toJSON WorkspaceConfiguration = A.String "workspace/configuration"
+  toJSON WorkspaceApplyEdit = A.String "workspace/applyEdit"
+  -- Document
+  toJSON TextDocumentPublishDiagnostics = A.String "textDocument/publishDiagnostics"
+  -- Cancelling
+  toJSON CancelRequestServer = A.String "$/cancelRequest"
+
+data RequestMessage m req resp =
+  RequestMessage
+    { _jsonrpc :: Text
+    , _id      :: LspId
+    , _method  :: m
+    , _params  :: req
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''RequestMessage
+
+-- ---------------------------------------------------------------------
+{-
+interface ResponseError<D> {
+    /**
+     * A number indicating the error type that occurred.
+     */
+    code: number;
+
+    /**
+     * A string providing a short description of the error.
+     */
+    message: string;
+
+    /**
+     * A Primitive or Structured value that contains additional
+     * information about the error. Can be omitted.
+     */
+    data?: D;
+}
+
+export namespace ErrorCodes {
+        // Defined by JSON RPC
+        export const ParseError: number = -32700;
+        export const InvalidRequest: number = -32600;
+        export const MethodNotFound: number = -32601;
+        export const InvalidParams: number = -32602;
+        export const InternalError: number = -32603;
+        export const serverErrorStart: number = -32099;
+        export const serverErrorEnd: number = -32000;
+        export const ServerNotInitialized: number = -32002;
+        export const UnknownErrorCode: number = -32001;
+
+        // Defined by the protocol.
+        export const RequestCancelled: number = -32800;
+}
+-}
+
+data ErrorCode = ParseError
+               | InvalidRequest
+               | MethodNotFound
+               | InvalidParams
+               | InternalError
+               | ServerErrorStart
+               | ServerErrorEnd
+               | ServerNotInitialized
+               | UnknownErrorCode
+               | RequestCancelled
+               -- ^ Note: server error codes are reserved from -32099 to -32000
+               deriving (Read,Show,Eq)
+
+instance A.ToJSON ErrorCode where
+  toJSON ParseError           = A.Number (-32700)
+  toJSON InvalidRequest       = A.Number (-32600)
+  toJSON MethodNotFound       = A.Number (-32601)
+  toJSON InvalidParams        = A.Number (-32602)
+  toJSON InternalError        = A.Number (-32603)
+  toJSON ServerErrorStart     = A.Number (-32099)
+  toJSON ServerErrorEnd       = A.Number (-32000)
+  toJSON ServerNotInitialized = A.Number (-32002)
+  toJSON UnknownErrorCode     = A.Number (-32001)
+  toJSON RequestCancelled     = A.Number (-32800)
+
+instance A.FromJSON ErrorCode where
+  parseJSON (A.Number (-32700)) = pure ParseError
+  parseJSON (A.Number (-32600)) = pure InvalidRequest
+  parseJSON (A.Number (-32601)) = pure MethodNotFound
+  parseJSON (A.Number (-32602)) = pure InvalidParams
+  parseJSON (A.Number (-32603)) = pure InternalError
+  parseJSON (A.Number (-32099)) = pure ServerErrorStart
+  parseJSON (A.Number (-32000)) = pure ServerErrorEnd
+  parseJSON (A.Number (-32002)) = pure ServerNotInitialized
+  parseJSON (A.Number (-32001)) = pure UnknownErrorCode
+  parseJSON (A.Number (-32800)) = pure RequestCancelled
+  parseJSON _                   = mempty
+
+-- -------------------------------------
+
+data ResponseError =
+  ResponseError
+    { _code    :: ErrorCode
+    , _message :: Text
+    , _xdata   :: Maybe A.Value
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ResponseError
+
+-- ---------------------------------------------------------------------
+
+data ResponseMessage a =
+  ResponseMessage
+    { _jsonrpc :: Text
+    , _id      :: LspIdRsp
+    , _result  :: Maybe a
+    , _error   :: Maybe ResponseError
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''ResponseMessage
+
+type ErrorResponse = ResponseMessage ()
+
+-- ---------------------------------------------------------------------
+
+type BareResponseMessage = ResponseMessage A.Value
+
+-- ---------------------------------------------------------------------
+{-
+$ Notifications and Requests
+
+Notification and requests ids starting with '$/' are messages which are protocol
+implementation dependent and might not be implementable in all clients or
+servers. For example if the server implementation uses a single threaded
+synchronous programming language then there is little a server can do to react
+to a '$/cancelRequest'. If a server or client receives notifications or requests
+starting with '$/' it is free to ignore them if they are unknown.
+-}
+
+data NotificationMessage m a =
+  NotificationMessage
+    { _jsonrpc :: Text
+    , _method  :: m
+    , _params  :: a
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''NotificationMessage
+
+-- ---------------------------------------------------------------------
+{-
+Cancellation Support
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#cancellation-support
+
+    New: The base protocol now offers support for request cancellation. To
+    cancel a request, a notification message with the following properties is
+    sent:
+
+Notification:
+
+    method: '$/cancelRequest'
+    params: CancelParams defined as follows:
+
+interface CancelParams {
+    /**
+     * The request id to cancel.
+     */
+    id: number | string;
+}
+
+A request that got canceled still needs to return from the server and send a
+response back. It can not be left open / hanging. This is in line with the JSON
+RPC protocol that requires that every request sends a response back. In addition
+it allows for returning partial results on cancel.
+-}
+
+data CancelParams =
+  CancelParams
+    { _id :: LspId
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''CancelParams
+
+type CancelNotification = NotificationMessage ClientMethod CancelParams
+type CancelNotificationServer = NotificationMessage ServerMethod CancelParams
+
+-- ---------------------------------------------------------------------
diff --git a/src/Language/Haskell/LSP/Types/MessageFuncs.hs b/src/Language/Haskell/LSP/Types/MessageFuncs.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/MessageFuncs.hs
@@ -0,0 +1,310 @@
+{-# LANGUAGE GADTs               #-}
+{-# LANGUAGE MultiWayIf          #-}
+{-# LANGUAGE BinaryLiterals      #-}
+{-# LANGUAGE OverloadedStrings   #-}
+{-# LANGUAGE RankNTypes          #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Language.Haskell.LSP.Types.MessageFuncs (
+  -- * General
+    fmClientInitializeRequest
+  , fmClientInitializedNotification
+  , fmClientShutdownRequest
+  , fmClientExitNotification
+  , fmClientCancelNotification
+
+  -- * Window
+  , fmServerShowMessageNotification
+  , fmServerShowMessageRequest
+  , fmServerLogMessageNotification
+  , fmServerTelemetryNotification
+
+  -- * Client
+  , fmServerRegisterCapabilityRequest
+  , fmServerUnregisterCapabilityRequest
+
+  -- * Workspace
+  , fmClientDidChangeConfigurationNotification
+  , fmClientDidChangeWatchedFilesNotification
+  , fmClientWorkspaceSymbolRequest
+  , fmClientExecuteCommandRequest
+  , fmServerApplyWorkspaceEditRequest
+
+  -- * Document
+  , fmServerPublishDiagnosticsNotification
+  , fmClientDidOpenTextDocumentNotification
+  , fmClientDidChangeTextDocumentNotification
+  , fmClientWillSaveTextDocumentNotification
+  , fmClientWillSaveWaitUntilRequest
+  , fmClientDidSaveTextDocumentNotification
+  , fmClientDidCloseTextDocumentNotification
+  , fmClientCompletionRequest
+  , fmClientCompletionItemResolveRequest
+  , fmClientHoverRequest
+  , fmClientSignatureHelpRequest
+  , fmClientReferencesRequest
+  , fmClientDocumentHighlightRequest
+  , fmClientDocumentSymbolRequest
+  , fmClientDocumentFormattingRequest
+  , fmClientDocumentRangeFormattingRequest
+  , fmClientDocumentOnTypeFormattingRequest
+  , fmClientDefinitionRequest
+  , fmClientCodeActionRequest
+  , fmClientCodeLensRequest
+  , fmClientCodeLensResolveRequest
+  , fmClientDocumentLinkRequest
+  , fmClientDocumentLinkResolveRequest
+  , fmClientRenameRequest
+  ) where
+
+import qualified Data.Aeson as J
+import           Data.Text ( Text )
+import qualified Language.Haskell.LSP.Types      as J
+
+-- ---------------------------------------------------------------------
+{-# ANN module ("HLint: ignore Eta reduce"         :: String) #-}
+{-# ANN module ("HLint: ignore Redundant do"       :: String) #-}
+{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
+-- ---------------------------------------------------------------------
+
+-- ----------------------------------------------------------------------
+-- General
+-- ----------------------------------------------------------------------
+
+-- * :leftwards_arrow_with_hook: [initialize](#initialize)
+
+fmClientInitializeRequest :: J.LspId -> J.InitializeParams -> J.InitializeRequest
+fmClientInitializeRequest rid params
+  = J.RequestMessage  "2.0" rid J.Initialize params
+
+-- ----------------------------------------------------------------------
+-- * **New** :arrow_right: [initialized](#initialized)
+
+-- | From 3.0
+fmClientInitializedNotification :: J.InitializedNotification
+fmClientInitializedNotification = J.NotificationMessage "2.0" J.Initialized Nothing
+
+-- ----------------------------------------------------------------------
+-- * :leftwards_arrow_with_hook: [shutdown](#shutdown)
+
+fmClientShutdownRequest :: J.LspId -> Maybe J.Value -> J.ShutdownRequest
+fmClientShutdownRequest rid params
+  = J.RequestMessage  "2.0" rid J.Shutdown params
+
+-- ----------------------------------------------------------------------
+-- * :arrow_right: [exit](#exit)
+
+fmClientExitNotification :: J.ExitNotification
+fmClientExitNotification = J.NotificationMessage "2.0" J.Exit Nothing
+
+-- ----------------------------------------------------------------------
+-- * :arrow_right: [$/cancelRequest](#cancelRequest)
+
+fmClientCancelNotification :: J.LspId -> J.CancelNotification
+fmClientCancelNotification idToCancel
+  = J.NotificationMessage "2.0" J.CancelRequest  (J.CancelParams idToCancel)
+
+-- ----------------------------------------------------------------------
+-- Window
+-- ----------------------------------------------------------------------
+
+-- * :arrow_left: [window/showMessage](#window_showMessage)
+
+fmServerShowMessageNotification :: J.MessageType -> Text -> J.ShowMessageNotification
+fmServerShowMessageNotification mt msg
+  = J.NotificationMessage "2.0" J.WindowShowMessage (J.ShowMessageParams mt msg)
+
+-- ----------------------------------------------------------------------
+-- * :arrow_right_hook: [window/showMessageRequest](#window_showMessageRequest)
+
+fmServerShowMessageRequest :: J.LspId -> J.ShowMessageRequestParams -> J.ShowMessageRequest
+fmServerShowMessageRequest rid params
+  = J.RequestMessage  "2.0" rid J.WindowShowMessageRequest params
+
+-- ----------------------------------------------------------------------
+-- * :arrow_left: [window/logMessage](#window_logMessage)
+
+fmServerLogMessageNotification :: J.MessageType -> Text -> J.LogMessageNotification
+fmServerLogMessageNotification mt msg
+  = J.NotificationMessage "2.0" J.WindowLogMessage (J.LogMessageParams mt msg)
+
+-- ----------------------------------------------------------------------
+-- * :arrow_left: [telemetry/event](#telemetry_event)
+
+fmServerTelemetryNotification :: J.Value  -> J.TelemetryNotification
+fmServerTelemetryNotification params
+  = J.NotificationMessage "2.0" J.TelemetryEvent params
+
+-- ----------------------------------------------------------------------
+--  Client
+-- ----------------------------------------------------------------------
+
+-- * :arrow_right_hook: [client/registerCapability](#client_registerCapability)
+-- | from 3.0
+fmServerRegisterCapabilityRequest :: J.LspId -> J.RegistrationParams -> J.RegisterCapabilityRequest
+fmServerRegisterCapabilityRequest rid params
+  = J.RequestMessage  "2.0" rid J.ClientRegisterCapability params
+
+-- * :arrow_right_hook: [client/unregisterCapability](#client_unregisterCapability)
+-- | from 3.0
+fmServerUnregisterCapabilityRequest :: J.LspId -> J.UnregistrationParams -> J.UnregisterCapabilityRequest
+fmServerUnregisterCapabilityRequest rid params
+  = J.RequestMessage  "2.0" rid J.ClientUnregisterCapability params
+
+-- ----------------------------------------------------------------------
+-- Workspace
+-- ----------------------------------------------------------------------
+
+-- * :arrow_right: [workspace/didChangeConfiguration](#workspace_didChangeConfiguration)
+fmClientDidChangeConfigurationNotification :: J.DidChangeConfigurationParams -> J.DidChangeConfigurationNotification
+fmClientDidChangeConfigurationNotification params
+  = J.NotificationMessage "2.0" J.WorkspaceDidChangeConfiguration params
+
+-- * :arrow_right: [workspace/didChangeWatchedFiles](#workspace_didChangeWatchedFiles)
+fmClientDidChangeWatchedFilesNotification :: J.DidChangeWatchedFilesParams -> J.DidChangeWatchedFilesNotification
+fmClientDidChangeWatchedFilesNotification params
+  = J.NotificationMessage "2.0" J.WorkspaceDidChangeWatchedFiles params
+
+-- * :leftwards_arrow_with_hook: [workspace/symbol](#workspace_symbol)
+fmClientWorkspaceSymbolRequest :: J.LspId -> J.WorkspaceSymbolParams -> J.WorkspaceSymbolRequest
+fmClientWorkspaceSymbolRequest rid params
+  = J.RequestMessage  "2.0" rid J.WorkspaceSymbol params
+
+-- * **New** :leftwards_arrow_with_hook: [workspace/executeCommand](#workspace_executeCommand)
+-- | From 3.0
+fmClientExecuteCommandRequest :: J.LspId -> J.ExecuteCommandParams -> J.ExecuteCommandRequest
+fmClientExecuteCommandRequest rid params
+  = J.RequestMessage  "2.0" rid J.WorkspaceExecuteCommand params
+
+-- * **New** :arrow_right_hook: [workspace/applyEdit](#workspace_applyEdit)
+-- | From 3.0
+fmServerApplyWorkspaceEditRequest :: J.LspId -> J.ApplyWorkspaceEditParams -> J.ApplyWorkspaceEditRequest
+fmServerApplyWorkspaceEditRequest rid params
+  = J.RequestMessage  "2.0" rid J.WorkspaceApplyEdit params
+
+-- ----------------------------------------------------------------------
+ -- Document
+-- ----------------------------------------------------------------------
+
+-- * :arrow_left: [textDocument/publishDiagnostics](#textDocument_publishDiagnostics)
+fmServerPublishDiagnosticsNotification :: J.PublishDiagnosticsParams -> J.PublishDiagnosticsNotification
+fmServerPublishDiagnosticsNotification params
+  = J.NotificationMessage "2.0" J.TextDocumentPublishDiagnostics params
+
+-- * :arrow_right: [textDocument/didOpen](#textDocument_didOpen)
+fmClientDidOpenTextDocumentNotification :: J.DidOpenTextDocumentParams -> J.DidOpenTextDocumentNotification
+fmClientDidOpenTextDocumentNotification params
+  = J.NotificationMessage "2.0" J.TextDocumentDidOpen params
+
+-- * :arrow_right: [textDocument/didChange](#textDocument_didChange)
+fmClientDidChangeTextDocumentNotification :: J.DidChangeTextDocumentParams -> J.DidChangeTextDocumentNotification
+fmClientDidChangeTextDocumentNotification params
+  = J.NotificationMessage "2.0" J.TextDocumentDidChange params
+
+-- * :arrow_right: [textDocument/willSave](#textDocument_willSave)
+fmClientWillSaveTextDocumentNotification :: J.WillSaveTextDocumentParams -> J.WillSaveTextDocumentNotification
+fmClientWillSaveTextDocumentNotification params
+  = J.NotificationMessage "2.0" J.TextDocumentWillSave params
+
+-- * **New** :leftwards_arrow_with_hook: [textDocument/willSaveWaitUntil](#textDocument_willSaveWaitUntil)
+-- | From 3.0
+fmClientWillSaveWaitUntilRequest :: J.LspId -> J.WillSaveTextDocumentParams -> J.WillSaveWaitUntilTextDocumentRequest
+fmClientWillSaveWaitUntilRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentWillSaveWaitUntil params
+
+-- * **New** :arrow_right: [textDocument/didSave](#textDocument_didSave)
+-- | 3.0
+fmClientDidSaveTextDocumentNotification :: J.DidSaveTextDocumentParams -> J.DidSaveTextDocumentNotification
+fmClientDidSaveTextDocumentNotification params
+  = J.NotificationMessage "2.0" J.TextDocumentDidSave params
+
+-- * :arrow_right: [textDocument/didClose](#textDocument_didClose)
+fmClientDidCloseTextDocumentNotification :: J.DidCloseTextDocumentParams -> J.DidCloseTextDocumentNotification
+fmClientDidCloseTextDocumentNotification params
+  = J.NotificationMessage "2.0" J.TextDocumentDidClose params
+
+-- * :leftwards_arrow_with_hook: [textDocument/completion](#textDocument_completion)
+fmClientCompletionRequest :: J.LspId -> J.CompletionParams -> J.CompletionRequest
+fmClientCompletionRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentCompletion params
+
+-- * :leftwards_arrow_with_hook: [completionItem/resolve](#completionItem_resolve)
+fmClientCompletionItemResolveRequest :: J.LspId -> J.CompletionItem -> J.CompletionItemResolveRequest
+fmClientCompletionItemResolveRequest rid params
+  = J.RequestMessage "2.0" rid J.CompletionItemResolve params
+
+-- * :leftwards_arrow_with_hook: [textDocument/hover](#textDocument_hover)
+fmClientHoverRequest :: J.LspId -> J.TextDocumentPositionParams -> J.HoverRequest
+fmClientHoverRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentHover params
+
+-- * :leftwards_arrow_with_hook: [textDocument/signatureHelp](#textDocument_signatureHelp)
+fmClientSignatureHelpRequest :: J.LspId -> J.TextDocumentPositionParams -> J.SignatureHelpRequest
+fmClientSignatureHelpRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentSignatureHelp params
+
+-- * :leftwards_arrow_with_hook: [textDocument/references](#textDocument_references)
+fmClientReferencesRequest :: J.LspId -> J.ReferenceParams -> J.ReferencesRequest
+fmClientReferencesRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentReferences params
+
+-- * :leftwards_arrow_with_hook: [textDocument/documentHighlight](#textDocument_documentHighlight)
+fmClientDocumentHighlightRequest :: J.LspId -> J.TextDocumentPositionParams -> J.DocumentHighlightRequest
+fmClientDocumentHighlightRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentDocumentHighlight params
+
+-- * :leftwards_arrow_with_hook: [textDocument/documentSymbol](#textDocument_documentSymbol)
+fmClientDocumentSymbolRequest :: J.LspId -> J.DocumentSymbolParams -> J.DocumentSymbolRequest
+fmClientDocumentSymbolRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentDocumentSymbol params
+
+-- * :leftwards_arrow_with_hook: [textDocument/formatting](#textDocument_formatting)
+fmClientDocumentFormattingRequest :: J.LspId -> J.DocumentFormattingParams -> J.DocumentFormattingRequest
+fmClientDocumentFormattingRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentFormatting params
+
+-- * :leftwards_arrow_with_hook: [textDocument/rangeFormatting](#textDocument_rangeFormatting)
+fmClientDocumentRangeFormattingRequest :: J.LspId -> J.DocumentRangeFormattingParams -> J.DocumentRangeFormattingRequest
+fmClientDocumentRangeFormattingRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentRangeFormatting params
+
+-- * :leftwards_arrow_with_hook: [textDocument/onTypeFormatting](#textDocument_onTypeFormatting)
+fmClientDocumentOnTypeFormattingRequest :: J.LspId -> J.DocumentOnTypeFormattingParams -> J.DocumentOnTypeFormattingRequest
+fmClientDocumentOnTypeFormattingRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentOnTypeFormatting params
+
+-- * :leftwards_arrow_with_hook: [textDocument/definition](#textDocument_definition)
+fmClientDefinitionRequest :: J.LspId -> J.TextDocumentPositionParams -> J.DefinitionRequest
+fmClientDefinitionRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentDefinition params
+
+-- * :leftwards_arrow_with_hook: [textDocument/codeAction](#textDocument_codeAction)
+fmClientCodeActionRequest :: J.LspId -> J.CodeActionParams -> J.CodeActionRequest
+fmClientCodeActionRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentCodeAction params
+
+-- * :leftwards_arrow_with_hook: [textDocument/codeLens](#textDocument_codeLens)
+fmClientCodeLensRequest :: J.LspId -> J.CodeLensParams -> J.CodeLensRequest
+fmClientCodeLensRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentCodeLens params
+
+-- * :leftwards_arrow_with_hook: [codeLens/resolve](#codeLens_resolve)
+fmClientCodeLensResolveRequest :: J.LspId -> J.CodeLens -> J.CodeLensResolveRequest
+fmClientCodeLensResolveRequest rid params
+  = J.RequestMessage "2.0" rid J.CodeLensResolve params
+
+-- * :leftwards_arrow_with_hook: [textDocument/documentLink](#textDocument_documentLink)
+fmClientDocumentLinkRequest :: J.LspId -> J.DocumentLinkParams -> J.DocumentLinkRequest
+fmClientDocumentLinkRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentDocumentLink params
+
+-- * :leftwards_arrow_with_hook: [documentLink/resolve](#documentLink_resolve)
+fmClientDocumentLinkResolveRequest :: J.LspId -> J.DocumentLink -> J.DocumentLinkResolveRequest
+fmClientDocumentLinkResolveRequest rid params
+  = J.RequestMessage "2.0" rid J.DocumentLinkResolve params
+
+-- * :leftwards_arrow_with_hook: [textDocument/rename](#textDocument_rename)
+fmClientRenameRequest :: J.LspId -> J.RenameParams -> J.RenameRequest
+fmClientRenameRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentRename params
+
diff --git a/src/Language/Haskell/LSP/Types/Symbol.hs b/src/Language/Haskell/LSP/Types/Symbol.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Symbol.hs
@@ -0,0 +1,271 @@
+{-# LANGUAGE TemplateHaskell            #-}
+{-# LANGUAGE DuplicateRecordFields      #-}
+module Language.Haskell.LSP.Types.Symbol where
+
+import           Control.Applicative
+import           Data.Aeson
+import           Data.Aeson.TH
+import           Data.Scientific
+import           Data.Text                                      (Text)
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.TextDocument
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.Message
+
+-- ---------------------------------------------------------------------
+{-
+Document Symbols Request
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-symbols-request
+
+The document symbol request is sent from the client to the server to list all
+symbols found in a given text document.
+
+    Changed: In 2.0 the request uses DocumentSymbolParams instead of a single
+             uri.
+
+Request
+
+    method: 'textDocument/documentSymbol'
+    params: DocumentSymbolParams defined as follows:
+
+interface DocumentSymbolParams {
+    /**
+     * The text document.
+     */
+    textDocument: TextDocumentIdentifier;
+}
+
+Response
+
+    result: SymbolInformation[] defined as follows:
+
+/**
+ * Represents information about programming constructs like variables, classes,
+ * interfaces etc.
+ */
+interface SymbolInformation {
+    /**
+     * The name of this symbol.
+     */
+    name: string;
+
+    /**
+     * The kind of this symbol.
+     */
+    kind: number;
+
+    /**
+     * The location of this symbol.
+     */
+    location: Location;
+
+    /**
+     * The name of the symbol containing this symbol.
+     */
+    containerName?: string;
+}
+
+Where the kind is defined like this:
+
+/**
+ * A symbol kind.
+ */
+export enum SymbolKind {
+    File = 1,
+    Module = 2,
+    Namespace = 3,
+    Package = 4,
+    Class = 5,
+    Method = 6,
+    Property = 7,
+    Field = 8,
+    Constructor = 9,
+    Enum = 10,
+    Interface = 11,
+    Function = 12,
+    Variable = 13,
+    Constant = 14,
+    Text = 15,
+    Number = 16,
+    Boolean = 17,
+    Array = 18,
+}
+
+    error: code and message set in case an exception happens during the document
+           symbol request.
+
+Registration Options: TextDocumentRegistrationOptions
+-}
+
+data DocumentSymbolParams =
+  DocumentSymbolParams
+    { _textDocument :: TextDocumentIdentifier
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DocumentSymbolParams
+
+-- -------------------------------------
+
+data SymbolKind
+    = SkFile
+    | SkModule
+    | SkNamespace
+    | SkPackage
+    | SkClass
+    | SkMethod
+    | SkProperty
+    | SkField
+    | SkConstructor
+    | SkEnum
+    | SkInterface
+    | SkFunction
+    | SkVariable
+    | SkConstant
+    | SkString
+    | SkNumber
+    | SkBoolean
+    | SkArray
+    | SkObject
+    | SkKey
+    | SkNull
+    | SkEnumMember
+    | SkStruct
+    | SkEvent
+    | SkOperator
+    | SkTypeParameter
+    | SkUnknown Scientific
+    deriving (Read,Show,Eq)
+
+instance ToJSON SymbolKind where
+  toJSON SkFile          = Number 1
+  toJSON SkModule        = Number 2
+  toJSON SkNamespace     = Number 3
+  toJSON SkPackage       = Number 4
+  toJSON SkClass         = Number 5
+  toJSON SkMethod        = Number 6
+  toJSON SkProperty      = Number 7
+  toJSON SkField         = Number 8
+  toJSON SkConstructor   = Number 9
+  toJSON SkEnum          = Number 10
+  toJSON SkInterface     = Number 11
+  toJSON SkFunction      = Number 12
+  toJSON SkVariable      = Number 13
+  toJSON SkConstant      = Number 14
+  toJSON SkString        = Number 15
+  toJSON SkNumber        = Number 16
+  toJSON SkBoolean       = Number 17
+  toJSON SkArray         = Number 18
+  toJSON SkObject        = Number 19
+  toJSON SkKey           = Number 20
+  toJSON SkNull          = Number 21
+  toJSON SkEnumMember    = Number 22
+  toJSON SkStruct        = Number 23
+  toJSON SkEvent         = Number 24
+  toJSON SkOperator      = Number 25
+  toJSON SkTypeParameter = Number 26
+  toJSON (SkUnknown x)   = Number x
+
+instance FromJSON SymbolKind where
+  parseJSON (Number  1) = pure SkFile
+  parseJSON (Number  2) = pure SkModule
+  parseJSON (Number  3) = pure SkNamespace
+  parseJSON (Number  4) = pure SkPackage
+  parseJSON (Number  5) = pure SkClass
+  parseJSON (Number  6) = pure SkMethod
+  parseJSON (Number  7) = pure SkProperty
+  parseJSON (Number  8) = pure SkField
+  parseJSON (Number  9) = pure SkConstructor
+  parseJSON (Number 10) = pure SkEnum
+  parseJSON (Number 11) = pure SkInterface
+  parseJSON (Number 12) = pure SkFunction
+  parseJSON (Number 13) = pure SkVariable
+  parseJSON (Number 14) = pure SkConstant
+  parseJSON (Number 15) = pure SkString
+  parseJSON (Number 16) = pure SkNumber
+  parseJSON (Number 17) = pure SkBoolean
+  parseJSON (Number 18) = pure SkArray
+  parseJSON (Number 19) = pure SkObject
+  parseJSON (Number 20) = pure SkKey
+  parseJSON (Number 21) = pure SkNull
+  parseJSON (Number 22) = pure SkEnumMember
+  parseJSON (Number 23) = pure SkStruct
+  parseJSON (Number 24) = pure SkEvent
+  parseJSON (Number 25) = pure SkOperator
+  parseJSON (Number 26) = pure SkTypeParameter
+  parseJSON (Number x)  = pure (SkUnknown x)
+  parseJSON _           = mempty
+
+-- ---------------------------------------------------------------------
+
+-- | Represents programming constructs like variables, classes, interfaces etc.
+-- that appear in a document. Document symbols can be hierarchical and they
+-- have two ranges: one that encloses its definition and one that points to its
+-- most interesting range, e.g. the range of an identifier.
+data DocumentSymbol =
+  DocumentSymbol
+    { _name           :: Text -- ^ The name of this symbol.
+    -- | More detail for this symbol, e.g the signature of a function. If not
+    -- provided the name is used.
+    , _detail         :: Maybe Text
+    , _kind           :: SymbolKind -- ^ The kind of this symbol.
+    , _deprecated     :: Maybe Bool -- ^ Indicates if this symbol is deprecated.
+    -- | The range enclosing this symbol not including leading/trailing
+    -- whitespace but everything else like comments. This information is
+    -- typically used to determine if the the clients cursor is inside the symbol
+    -- to reveal in the symbol in the UI.
+    , _range          :: Range
+    -- | The range that should be selected and revealed when this symbol is being
+    -- picked, e.g the name of a function. Must be contained by the the '_range'.
+    , _selectionRange :: Range
+    -- | Children of this symbol, e.g. properties of a class.
+    , _children       :: Maybe (List DocumentSymbol)
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''DocumentSymbol
+
+-- ---------------------------------------------------------------------
+
+-- | Represents information about programming constructs like variables, classes,
+-- interfaces etc.
+data SymbolInformation =
+  SymbolInformation
+    { _name          :: Text -- ^ The name of this symbol.
+    , _kind          :: SymbolKind -- ^ The kind of this symbol.
+    , _deprecated    :: Maybe Bool -- ^ Indicates if this symbol is deprecated.
+    -- | The location of this symbol. The location's range is used by a tool
+    -- to reveal the location in the editor. If the symbol is selected in the
+    -- tool the range's start information is used to position the cursor. So
+    -- the range usually spans more then the actual symbol's name and does
+    -- normally include things like visibility modifiers.
+    --
+    -- The range doesn't have to denote a node range in the sense of a abstract
+    -- syntax tree. It can therefore not be used to re-construct a hierarchy of
+    -- the symbols.
+    , _location      :: Location
+    -- | The name of the symbol containing this symbol. This information is for
+    -- user interface purposes (e.g. to render a qualifier in the user interface
+    -- if necessary). It can't be used to re-infer a hierarchy for the document
+    -- symbols.
+    , _containerName :: Maybe Text
+    } deriving (Read,Show,Eq)
+
+deriveJSON lspOptions ''SymbolInformation
+
+-- -------------------------------------
+
+data DSResult = DSDocumentSymbols (List DocumentSymbol)
+              | DSSymbolInformation (List SymbolInformation)
+  deriving (Read,Show,Eq)
+
+instance FromJSON DSResult where
+  parseJSON x = DSDocumentSymbols <$> parseJSON x <|> DSSymbolInformation <$> parseJSON x
+
+instance ToJSON DSResult where
+  toJSON (DSDocumentSymbols x) = toJSON x
+  toJSON (DSSymbolInformation x) = toJSON x
+
+
+type DocumentSymbolRequest = RequestMessage ClientMethod DocumentSymbolParams DSResult
+type DocumentSymbolsResponse = ResponseMessage DSResult
diff --git a/src/Language/Haskell/LSP/Types/TextDocument.hs b/src/Language/Haskell/LSP/Types/TextDocument.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/TextDocument.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.TextDocument where
+
+import           Data.Aeson.TH
+import           Data.Text                      ( Text )
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.Uri
+
+-- ---------------------------------------------------------------------
+{-
+TextDocumentIdentifier
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentidentifier
+
+Text documents are identified using a URI. On the protocol level, URIs are
+passed as strings. The corresponding JSON structure looks like this:
+
+interface TextDocumentIdentifier {
+    /**
+     * The text document's URI.
+     */
+    uri: string;
+}
+-}
+data TextDocumentIdentifier =
+  TextDocumentIdentifier
+    { _uri :: Uri
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TextDocumentIdentifier
+
+{-
+TextDocumentItem
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentitem
+
+    New: An item to transfer a text document from the client to the server.
+
+interface TextDocumentItem {
+    /**
+     * The text document's URI.
+     */
+    uri: string;
+
+    /**
+     * The text document's language identifier.
+     */
+    languageId: string;
+
+    /**
+     * The version number of this document (it will strictly increase after each
+     * change, including undo/redo).
+     */
+    version: number;
+
+    /**
+     * The content of the opened text document.
+     */
+    text: string;
+}
+-}
+
+data TextDocumentItem =
+  TextDocumentItem {
+    _uri        :: Uri
+  , _languageId :: Text
+  , _version    :: Int
+  , _text       :: Text
+  } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TextDocumentItem
+
+-- ---------------------------------------------------------------------
+{-
+TextDocumentPositionParams
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentpositionparams
+
+    Changed: Was TextDocumentPosition in 1.0 with inlined parameters
+
+
+interface TextDocumentPositionParams {
+    /**
+     * The text document.
+     */
+    textDocument: TextDocumentIdentifier;
+
+    /**
+     * The position inside the text document.
+     */
+    position: Position;
+}
+
+-}
+data TextDocumentPositionParams =
+  TextDocumentPositionParams
+    { _textDocument :: TextDocumentIdentifier
+    , _position     :: Position
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TextDocumentPositionParams
diff --git a/src/Language/Haskell/LSP/Types/Uri.hs b/src/Language/Haskell/LSP/Types/Uri.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Uri.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Language.Haskell.LSP.Types.Uri where
+
+import qualified Data.Aeson                                 as A
+import           Data.Hashable
+import           Data.Text                                  (Text)
+import qualified Data.Text                                  as T
+import           Network.URI
+import qualified System.FilePath.Posix                      as FPP
+import qualified System.FilePath.Windows                    as FPW
+import qualified System.Info
+
+newtype Uri = Uri { getUri :: Text }
+  deriving (Eq,Ord,Read,Show,A.FromJSON,A.ToJSON,Hashable,A.ToJSONKey,A.FromJSONKey)
+
+fileScheme :: String
+fileScheme = "file:"
+
+windowsOS :: String
+windowsOS = "mingw32"
+
+type SystemOS = String
+
+uriToFilePath :: Uri -> Maybe FilePath
+uriToFilePath = platformAwareUriToFilePath System.Info.os
+
+platformAwareUriToFilePath :: String -> Uri -> Maybe FilePath
+platformAwareUriToFilePath systemOS (Uri uri) = do
+  parsedUri <- parseURI $ T.unpack uri
+  if uriScheme parsedUri == fileScheme
+    then return $ (platformAdjustFromUriPath systemOS . unEscapeString . uriPath) parsedUri
+    else Nothing
+
+platformAdjustFromUriPath :: SystemOS -> String -> FilePath
+platformAdjustFromUriPath systemOS srcPath =
+  if systemOS /= windowsOS || null srcPath then srcPath
+    else let
+      firstSegment:rest = (FPP.splitDirectories . tail) srcPath  -- Drop leading '/' for absolute Windows paths
+      drive = if FPW.isDrive firstSegment then FPW.addTrailingPathSeparator firstSegment else firstSegment
+      in FPW.joinDrive drive $ FPW.joinPath rest
+
+filePathToUri :: FilePath -> Uri
+filePathToUri = platformAwareFilePathToUri System.Info.os
+
+platformAwareFilePathToUri :: SystemOS -> FilePath -> Uri
+platformAwareFilePathToUri systemOS fp = Uri . T.pack . show $ URI
+  { uriScheme = fileScheme
+  , uriAuthority = Just $ URIAuth "" "" ""
+  , uriPath = platformAdjustToUriPath systemOS fp
+  , uriQuery = ""
+  , uriFragment = ""
+  }
+
+platformAdjustToUriPath :: SystemOS -> FilePath -> String
+platformAdjustToUriPath systemOS srcPath =
+  if systemOS /= windowsOS then srcPath
+    else let
+      drive:rest = FPW.splitDirectories srcPath
+      leaveCharUnescaped = (/= ':')
+      removePathSeparator = filter (not . FPW.isPathSeparator)
+      escapedDrive = removePathSeparator $ escapeURIString leaveCharUnescaped drive
+      in '/' : FPP.joinPath (escapedDrive : rest)
diff --git a/src/Language/Haskell/LSP/Types/Utils.hs b/src/Language/Haskell/LSP/Types/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/Utils.hs
@@ -0,0 +1,6 @@
+module Language.Haskell.LSP.Types.Utils where
+
+-- ---------------------------------------------------------------------
+
+rdrop :: Int -> [a] -> [a]
+rdrop cnt = reverse . drop cnt . reverse
diff --git a/src/Language/Haskell/LSP/Types/WorkspaceEdit.hs b/src/Language/Haskell/LSP/Types/WorkspaceEdit.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/WorkspaceEdit.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE CPP                        #-}
+{-# LANGUAGE DuplicateRecordFields      #-}
+{-# LANGUAGE TemplateHaskell            #-}
+module Language.Haskell.LSP.Types.WorkspaceEdit where
+
+import           Data.Aeson.TH
+import qualified Data.HashMap.Strict                        as H
+-- For <= 8.2.2
+import           Data.Monoid                                ((<>))
+import           Data.Text                                  (Text)
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Location
+import           Language.Haskell.LSP.Types.Uri
+
+-- ---------------------------------------------------------------------
+{-
+TextEdit
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textedit
+
+A textual edit applicable to a text document.
+
+interface TextEdit {
+    /**
+     * The range of the text document to be manipulated. To insert
+     * text into a document create a range where start === end.
+     */
+    range: Range;
+
+    /**
+     * The string to be inserted. For delete operations use an
+     * empty string.
+     */
+    newText: string;
+}
+
+
+-}
+
+data TextEdit =
+  TextEdit
+    { _range   :: Range
+    , _newText :: Text
+    } deriving (Show,Read,Eq)
+
+deriveJSON lspOptions ''TextEdit
+
+-- ---------------------------------------------------------------------
+{-
+VersionedTextDocumentIdentifier
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#versionedtextdocumentidentifier
+
+    New: An identifier to denote a specific version of a text document.
+
+interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {
+    /**
+	 * The version number of this document. If a versioned text document identifier
+	 * is sent from the server to the client and the file is not open in the editor
+	 * (the server has not received an open notification before) the server can send
+	 * `null` to indicate that the version is known and the content on disk is the
+	 * truth (as speced with document content ownership)
+	 */
+	version: number | null;
+-}
+
+type TextDocumentVersion = Maybe Int
+
+data VersionedTextDocumentIdentifier =
+  VersionedTextDocumentIdentifier
+    { _uri     :: Uri
+    , _version :: TextDocumentVersion
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''VersionedTextDocumentIdentifier
+
+-- ---------------------------------------------------------------------
+{-
+New in 3.0
+----------
+
+TextDocumentEdit
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#new-textdocumentedit
+
+If multiple TextEdits are applied to a text document, all text edits describe
+changes made to the initial document version. Execution wise text edits should
+applied from the bottom to the top of the text document. Overlapping text edits
+are not supported.
+
+export interface TextDocumentEdit {
+        /**
+         * The text document to change.
+         */
+        textDocument: VersionedTextDocumentIdentifier;
+
+        /**
+         * The edits to be applied.
+         */
+        edits: TextEdit[];
+}
+
+-}
+
+data TextDocumentEdit =
+  TextDocumentEdit
+    { _textDocument :: VersionedTextDocumentIdentifier
+    , _edits        :: List TextEdit
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions ''TextDocumentEdit
+
+-- ---------------------------------------------------------------------
+{-
+Changed in 3.0
+--------------
+
+WorkspaceEdit
+
+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#workspaceedit
+
+
+Changed A workspace edit represents changes to many resources managed in the
+workspace. The edit should either provide changes or documentChanges. If
+documentChanges are present they are preferred over changes if the client can
+handle versioned document edits.
+
+export interface WorkspaceEdit {
+        /**
+         * Holds changes to existing resources.
+         */
+        changes?: { [uri: string]: TextEdit[]; };
+
+        /**
+         * An array of `TextDocumentEdit`s to express changes to specific a specific
+         * version of a text document. Whether a client supports versioned document
+         * edits is expressed via `WorkspaceClientCapabilities.versionedWorkspaceEdit`.
+         */
+        documentChanges?: TextDocumentEdit[];
+}
+-}
+
+type WorkspaceEditMap = H.HashMap Uri (List TextEdit)
+
+data WorkspaceEdit =
+  WorkspaceEdit
+    { _changes         :: Maybe WorkspaceEditMap
+    , _documentChanges :: Maybe (List TextDocumentEdit)
+    } deriving (Show, Read, Eq)
+
+instance Monoid WorkspaceEdit where
+  mempty = WorkspaceEdit Nothing Nothing
+  mappend (WorkspaceEdit a b) (WorkspaceEdit c d) = WorkspaceEdit (a <> c) (b <> d)
+
+deriveJSON lspOptions ''WorkspaceEdit
+
+#if __GLASGOW_HASKELL__ >= 804
+instance Semigroup WorkspaceEdit where
+  (<>) = mappend
+#endif
diff --git a/src/Language/Haskell/LSP/Types/WorkspaceFolders.hs b/src/Language/Haskell/LSP/Types/WorkspaceFolders.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/LSP/Types/WorkspaceFolders.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TemplateHaskell       #-}
+module Language.Haskell.LSP.Types.WorkspaceFolders where
+
+import           Data.Aeson.TH
+import           Data.Text                      ( Text )
+import           Language.Haskell.LSP.Types.Constants
+import           Language.Haskell.LSP.Types.List
+import           Language.Haskell.LSP.Types.Message
+
+{-
+Workspace folders request (:arrow_right_hook:)
+Since version 3.6.0
+
+Many tools support more than one root folder per workspace. Examples for this
+are VS Code’s multi-root support, Atom’s project folder support or Sublime’s
+project support. If a client workspace consists of multiple roots then a server
+typically needs to know about this. The protocol up to now assumes one root
+folder which is announce to the server by the rootUri property of the
+InitializeParams. If the client supports workspace folders and announces them
+via the corrsponding workspaceFolders client capability the InitializeParams
+contain an additional property workspaceFolders with the configured workspace
+folders when the server starts.
+
+The workspace/workspaceFolders request is sent from the server to the client to
+fetch the current open list of workspace folders. Returns null in the response
+if only a single file is open in the tool. Returns an empty array if a workspace
+is open but no folders are configured.
+
+Request:
+
+method: ‘workspace/workspaceFolders’
+params: none
+Response:
+
+result: WorkspaceFolder[] | null defines as follows:
+export interface WorkspaceFolder {
+	/**
+	 * The associated URI for this workspace folder.
+	 */
+	uri: string;
+
+	/**
+	 * The name of the workspace folder. Defaults to the
+	 * uri's basename.
+	 */
+	name: string;
+}
+error: code and message set in case an exception happens during the ‘workspace/workspaceFolders’ request
+-}
+
+data WorkspaceFolder =
+  WorkspaceFolder
+    { -- | The name of the workspace folder. Defaults to the uri's basename.
+      _uri  :: Text
+    -- | The name of the workspace folder. Defaults to the uri's basename.
+    , _name :: Text
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''WorkspaceFolder
+
+type WorkspaceFoldersRequest = RequestMessage ServerMethod () (Maybe (List WorkspaceFolder))
+type WorkspaceFoldersResponse = ResponseMessage (Maybe (List WorkspaceFolder))
+
+{-
+DidChangeWorkspaceFolders Notification (:arrow_right:)
+Since version 3.6.0
+
+The workspace/didChangeWorkspaceFolders notification is sent from the client to
+the server to inform the server about workspace folder configuration changes.
+The notification is sent by default if both
+ServerCapabilities/workspace/workspaceFolders and
+ClientCapabilities/workspace/workspaceFolders are true; or if the server has
+registered to receive this notification it first. To register for the
+workspace/didChangeWorkspaceFolders send a client/registerCapability request
+from the client to the server. The registration parameter must have a
+registrations item of the following form, where id is a unique id used to
+unregister the capability (the example uses a UUID):
+
+{
+	id: "28c6150c-bd7b-11e7-abc4-cec278b6b50a",
+	method: "workspace/didChangeWorkspaceFolders"
+}
+Notification:
+
+method: ‘workspace/didChangeWorkspaceFolders’
+params: DidChangeWorkspaceFoldersParams defined as follows:
+export interface DidChangeWorkspaceFoldersParams {
+	/**
+	 * The actual workspace folder change event.
+	 */
+	event: WorkspaceFoldersChangeEvent;
+}
+
+/**
+ * The workspace folder change event.
+ */
+export interface WorkspaceFoldersChangeEvent {
+	/**
+	 * The array of added workspace folders
+	 */
+	added: WorkspaceFolder[];
+
+	/**
+	 * The array of the removed workspace folders
+	 */
+	removed: WorkspaceFolder[];
+}
+-}
+
+-- | The workspace folder change event.
+data WorkspaceFoldersChangeEvent =
+  WorkspaceFoldersChangeEvent
+    { _added :: List WorkspaceFolder -- ^ The array of added workspace folders
+    , _removed :: List WorkspaceFolder -- ^ The array of the removed workspace folders
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''WorkspaceFoldersChangeEvent
+
+data DidChangeWorkspaceFoldersParams = 
+  DidChangeWorkspaceFoldersParams
+    { _event :: WorkspaceFoldersChangeEvent
+      -- ^ The actual workspace folder change event.
+    } deriving (Read, Show, Eq)
+
+deriveJSON lspOptions ''DidChangeWorkspaceFoldersParams
+
+type DidChangeWorkspaceFoldersNotification =
+  NotificationMessage ClientMethod DidChangeWorkspaceFoldersParams
