Index: tools/langserver/src/json.hpp
===================================================================
--- tools/langserver/src/json.hpp	(revision b52abe09e566fb9c0f5bb6ff0da4ce67bdd511bb)
+++ tools/langserver/src/json.hpp	(revision 27273f99d1999079a576a73c4f6c18b5cbf02170)
@@ -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 27273f99d1999079a576a73c4f6c18b5cbf02170)
@@ -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 27273f99d1999079a576a73c4f6c18b5cbf02170)
+++ tools/langserver/src/server.cpp	(revision 27273f99d1999079a576a73c4f6c18b5cbf02170)
@@ -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 27273f99d1999079a576a73c4f6c18b5cbf02170)
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "json.hpp"
+
+namespace server {
+	json::obj init(const json::obj & );
+};
