Index: tools/langserver/src/json.hpp
===================================================================
--- tools/langserver/src/json.hpp	(revision b52abe09e566fb9c0f5bb6ff0da4ce67bdd511bb)
+++ tools/langserver/src/json.hpp	(revision ebe0f0dad3c064785fa32ab5d51467010ee4f640)
@@ -4,5 +4,5 @@
 
 namespace json {
-      auto parse(const std::vector<char> & buff) {
+      static inline auto parse(const std::vector<char> & buff) {
             return nlohmann::json::parse(buff.begin(), buff.end());
       }
Index: tools/langserver/src/main.cpp
===================================================================
--- tools/langserver/src/main.cpp	(revision b52abe09e566fb9c0f5bb6ff0da4ce67bdd511bb)
+++ tools/langserver/src/main.cpp	(revision ebe0f0dad3c064785fa32ab5d51467010ee4f640)
@@ -1,25 +1,24 @@
+#include <cstdio>
+
 #include <iostream>
 #include <string>
 #include <vector>
 
+#include <unistd.h>
+
 #include "json.hpp"
 #include "log.hpp"
+#include "server.hpp"
 
 static void request(std::vector<char> & buf);
+static void reply(const json::obj & );
 
-namespace server {
-	json::obj init(const json::obj & ) {
-		return {
-			{ "capabilities", json::obj::array() },
-			{ "serverInfo", {
-				{ "name", "Cforall Language Server" },
-				{ "version", "0.1" }
-			}}
-		};
-	}
+json::obj noop( const json::obj & ) {
+	return {};
 }
 
 std::unordered_map<std::string, json::obj (*)( const json::obj & )> actions {
-	{ "initialize", server::init }
+	{ "initialize", server::init },
+	{ "initialized", noop }
 };
 
@@ -32,4 +31,17 @@
 		log() << "\t- " << argv[i] << std::endl;
 	}
+
+	// std::cout.setf(std::ios::unitbuf);
+
+	// char buff[1000];
+	// int r = 0;
+	// while(0 != (r = read(STDIN_FILENO, buff, 1000))) {
+	// 	for(int i = 0; i < r; i++) {
+	// 		log() << buff[i];
+	// 	}
+	// }
+	// log() << std::endl;
+
+	// return 0;
 
 	std::vector<char> buffer;
@@ -53,6 +65,6 @@
 				response["error"] = error;
 			}
-			log() << "Responding with : " << response.dump(4) << std::endl;
-			std::cout << response.dump() << std::endl;
+
+			reply(response);
 		}
 		else {
@@ -86,4 +98,23 @@
 	buffer.resize( len + 2 );
 	std::cin.read(buffer.data(), buffer.size());
+
+	for(char c : buffer) {
+		log() << c;
+	}
+	log() << std::endl;
 	return;
 }
+
+static void reply( const json::obj & response) {
+	if(response["result"].is_null()) {
+		log() << "No response needed" << std::endl;
+		return;
+	}
+
+	log() << "Responding with : " << response.dump(4) << std::endl;
+	const std::string & r = response.dump();
+	std::cout << "Content-Length: " << r.length() << "\r\n\r\n";
+	std::cout.flush();
+	std::cout  << r << "\r\n";
+	std::cout.flush();
+}
Index: tools/langserver/src/server.cpp
===================================================================
--- tools/langserver/src/server.cpp	(revision ebe0f0dad3c064785fa32ab5d51467010ee4f640)
+++ tools/langserver/src/server.cpp	(revision ebe0f0dad3c064785fa32ab5d51467010ee4f640)
@@ -0,0 +1,47 @@
+#include "server.hpp"
+#include "log.hpp"
+
+namespace server {
+      class server {
+      public:
+            void check_ready() {
+                  if(!ready) {
+                        throw json::obj({
+                              { "code", -32002 },
+                              { "message", "Server not initialized" }
+                        });
+                  }
+            }
+
+            void init() { ready = true; };
+      private:
+            bool ready = false;
+
+      };
+
+      static server g_server;
+
+      json::obj init( const json::obj & ) {
+            g_server.init();
+		return {
+			{ "capabilities", {
+                        {"textDocumentSync", {
+                              {"openClose", true},
+                              {"change", 1}
+                        }},
+                        {"documentHighlightProvider", {
+                              {"workDoneProgress", false}
+                        }},
+                        {"completionProvider", {
+                              {"triggerCharacters", json::obj::array()},
+                              {"allCommitCharacters", json::obj::array()},
+                              {"resolveProvider", true}
+                        }}
+                  } },
+			{ "serverInfo", {
+				{ "name", "Cforall Language Server" },
+				{ "version", "0.1" }
+			}}
+		};
+	}
+}
Index: tools/langserver/src/server.hpp
===================================================================
--- tools/langserver/src/server.hpp	(revision b52abe09e566fb9c0f5bb6ff0da4ce67bdd511bb)
+++ tools/langserver/src/server.hpp	(revision ebe0f0dad3c064785fa32ab5d51467010ee4f640)
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "json.hpp"
+
+namespace server {
+	json::obj init(const json::obj & );
+};
Index: tools/vscode/uwaterloo.cforall-0.1.0/client/main.js
===================================================================
--- tools/vscode/uwaterloo.cforall-0.1.0/client/main.js	(revision b52abe09e566fb9c0f5bb6ff0da4ce67bdd511bb)
+++ tools/vscode/uwaterloo.cforall-0.1.0/client/main.js	(revision ebe0f0dad3c064785fa32ab5d51467010ee4f640)
@@ -23,8 +23,8 @@
 	// Otherwise the run options are used
 	let serverOptions = {
-		run: { command: 'cfa-ls', transport: vscode_lc.TransportKind.ipc },
+		run: { command: 'cfa-ls', transport: vscode_lc.TransportKind.stdio },
 		debug: {
 			command: 'cfa-ls',
-			transport: vscode_lc.TransportKind.ipc,
+			transport: vscode_lc.TransportKind.stdio,
 			options: debugOptions
 		}
@@ -32,12 +32,13 @@
 
 	// Options to control the language client
+	let selector = [{ scheme: 'file', language: 'cforall' }];
 	let clientOptions = {
-		// Register the server for plain text documents
-		documentSelector: [{ scheme: 'file', language: 'cforall' }]
+		// Register the server for cforall documents
+		documentSelector: selector
 	};
 
 	// Create the language client and start the client.
 	client = new vscode_lc.LanguageClient(
-		'CforallServer',
+		'cforall',
 		'Cforall Language Server',
 		serverOptions,
Index: tools/vscode/uwaterloo.cforall-0.1.0/package.json
===================================================================
--- tools/vscode/uwaterloo.cforall-0.1.0/package.json	(revision b52abe09e566fb9c0f5bb6ff0da4ce67bdd511bb)
+++ tools/vscode/uwaterloo.cforall-0.1.0/package.json	(revision ebe0f0dad3c064785fa32ab5d51467010ee4f640)
@@ -43,15 +43,26 @@
 				"path": "./syntaxes/cfa.tmLanguage.json"
 			}
-		]
-	},
-	"configuration": {
-		"type": "object",
-		"title": "Example configuration",
-		"properties": {
-			"languageServerExample.maxNumberOfProblems": {
-				"scope": "resource",
-				"type": "number",
-				"default": 100,
-				"description": "Controls the maximum number of problems produced by the server."
+		],
+		"configuration": {
+			"type": "object",
+			"title": "Example configuration",
+			"properties": {
+				"cforall.maxNumberOfProblems": {
+					"scope": "resource",
+					"type": "number",
+					"default": 100,
+					"description": "Controls the maximum number of problems produced by the server."
+				},
+				"cforall.trace.server": {
+					"scope": "window",
+					"type": "string",
+					"enum": [
+						"off",
+						"messages",
+						"verbose"
+					],
+					"default": "off",
+					"description": "Traces the communication between VS Code and the language server."
+				}
 			}
 		}
