diff --git a/src/json/httpclientimpl.cpp b/src/json/httpclientimpl.cpp
index 5b89e77..9ae366c 100644
--- a/src/json/httpclientimpl.cpp
+++ b/src/json/httpclientimpl.cpp
@@ -124,7 +124,7 @@ void HttpClientImpl::cancel()
 void HttpClientImpl::prepareRequest(const String& name, IDecomposer** argv, unsigned argc)
 {
     _request.clear();
-    _request.setHeader("Content-Type", "application/jsonrequest");
+    _request.setHeader("Content-Type", "application/json");
     _request.method("POST");
 
     TextOStream ts(_request.body(), new Utf8Codec());
diff --git a/src/json/httpresponder.cpp b/src/json/httpresponder.cpp
index f2ba590..bd741a1 100644
--- a/src/json/httpresponder.cpp
+++ b/src/json/httpresponder.cpp
@@ -73,7 +73,7 @@ std::size_t HttpResponder::readBody(std::istream& is)
 
 void HttpResponder::reply(std::ostream& os, http::Request& request, http::Reply& reply)
 {
-    reply.setHeader("Content-Type", "application/jsonrpc");
+    reply.setHeader("Content-Type", "application/json");
     _responder.finalize(os);
 }
 
diff --git a/src/json/httpservice.cpp b/src/json/httpservice.cpp
index 7df5b92..0c0f328 100644
--- a/src/json/httpservice.cpp
+++ b/src/json/httpservice.cpp
@@ -50,10 +50,12 @@ http::Responder* HttpService::createResponder(const http::Request& request)
     const char* contentType = request.header().getHeader("Content-Type");
     if (contentType != 0)
     {
-        if (::strncasecmp(contentType, "application/json", 16) == 0)
+        if (::strncasecmp(contentType, "application/json", 16) == 0 
+             || ::strncasecmp(contentType, "application/x-www-form-urlencoded", 33) == 0) {
             return new HttpResponder(*this);
-        else
+        } else {
             log_warn("invalid content type " << contentType);
+        }
     }
     else
         log_warn("missing content type");
diff --git a/src/json/responder.cpp b/src/json/responder.cpp
index 91c8cf2..28c3ab8 100644
--- a/src/json/responder.cpp
+++ b/src/json/responder.cpp
@@ -69,6 +69,7 @@ void Responder::finalize(std::ostream& out)
     formatter.begin(ts);
 
     formatter.beginObject(std::string(), std::string());
+    formatter.addValueString("jsonrpc","string",L"2.0");
 
     try
     {
@@ -83,7 +84,13 @@ void Responder::finalize(std::ostream& out)
         IComposer** args = proc->beginCall();
 
         // process args
-        const SerializationInfo& params = _deserializer.si()->getMember("params");
+        const SerializationInfo* paramsPtr = _deserializer.si()->findMember("params");
+
+        // params may be ommited in request
+        SerializationInfo emptyParams;
+
+        const SerializationInfo& params = paramsPtr ? *paramsPtr : emptyParams;
+
         SerializationInfo::ConstIterator it = params.begin();
         if (args)
         {
@@ -104,8 +111,6 @@ void Responder::finalize(std::ostream& out)
         IDecomposer* result;
         result = proc->endCall();
 
-        formatter.addNull("error", std::string());
-
         formatter.beginValue("result");
         result->format(formatter);
         formatter.finishValue();
@@ -118,7 +123,6 @@ void Responder::finalize(std::ostream& out)
 
         formatter.addValueInt("code", "int", static_cast<Formatter::int_type>(e.rc()));
         formatter.addValueStdString("message", std::string(), e.what());
-        formatter.addNull("result", std::string());
 
         formatter.finishObject();
     }
diff --git a/src/threadimpl.cpp b/src/threadimpl.cpp
index c7b160a..ac7e357 100644
--- a/src/threadimpl.cpp
+++ b/src/threadimpl.cpp
@@ -30,7 +30,6 @@
 #include "cxxtools/timespan.h"
 #include <errno.h>
 #include <signal.h>
-#include <unistd.h>
 #include <iostream>
 
 extern "C"
