diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index 5546597bf634841761e4c87be51ff43365941880..2f1d53347677cb7cac84a928a8124d3d39259ec9 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -1128,8 +1128,13 @@ Function::~Function()
 {
 }
 
-void Function::addArgument(const Value *argument)
+void Function::addArgument(const Value *argument, const QString &name)
 {
+    if (!name.isEmpty()) {
+        while (_argumentNames.size() < _arguments.size())
+            _argumentNames.push_back(QString());
+        _argumentNames.push_back(name);
+    }
     _arguments.push_back(argument);
 }
 
@@ -1153,9 +1158,19 @@ const Value *Function::argument(int index) const
     return _arguments.at(index);
 }
 
-const Value *Function::invoke(const Activation *activation) const
+QString Function::argumentName(int index) const
+{
+    if (index < _argumentNames.size()) {
+        const QString name = _argumentNames.at(index);
+        if (!name.isEmpty())
+            return _argumentNames.at(index);
+    }
+    return FunctionValue::argumentName(index);
+}
+
+const Value *Function::invoke(const Activation *) const
 {
-    return activation->thisObject(); // ### FIXME it should return undefined
+    return _returnValue;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h
index e34f306227d7abefa1ace48b0eedd89aa792883b..ab9a53b665245bdef6052ac34911714518931440 100644
--- a/src/libs/qmljs/qmljsinterpreter.h
+++ b/src/libs/qmljs/qmljsinterpreter.h
@@ -522,17 +522,19 @@ public:
     Function(ValueOwner *valueOwner);
     virtual ~Function();
 
-    void addArgument(const Value *argument);
+    void addArgument(const Value *argument, const QString &name = QString());
     void setReturnValue(const Value *returnValue);
 
     // FunctionValue interface
     virtual const Value *returnValue() const;
     virtual int argumentCount() const;
     virtual const Value *argument(int index) const;
+    virtual QString argumentName(int index) const;
     virtual const Value *invoke(const Activation *activation) const;
 
 private:
     ValueList _arguments;
+    QStringList _argumentNames;
     const Value *_returnValue;
 };
 
diff --git a/src/libs/qmljs/qmljsvalueowner.cpp b/src/libs/qmljs/qmljsvalueowner.cpp
index 68c84bec1dda7b6acee382bcd10a5e29d336ad67..8a5b5ced37c3b7aeaa712073a4f523f9c05d34c4 100644
--- a/src/libs/qmljs/qmljsvalueowner.cpp
+++ b/src/libs/qmljs/qmljsvalueowner.cpp
@@ -481,21 +481,23 @@ QString ValueOwner::typeId(const Value *value)
     return _typeId(value);
 }
 
-void ValueOwner::addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount)
+Function *ValueOwner::addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount)
 {
     Function *function = newFunction();
     function->setReturnValue(result);
     for (int i = 0; i < argumentCount; ++i)
         function->addArgument(undefinedValue()); // ### introduce unknownValue
     object->setMember(name, function);
+    return function;
 }
 
-void ValueOwner::addFunction(ObjectValue *object, const QString &name, int argumentCount)
+Function *ValueOwner::addFunction(ObjectValue *object, const QString &name, int argumentCount)
 {
     Function *function = newFunction();
     for (int i = 0; i < argumentCount; ++i)
         function->addArgument(undefinedValue()); // ### introduce unknownValue
     object->setMember(name, function);
+    return function;
 }
 
 void ValueOwner::initializePrototypes()
@@ -750,6 +752,70 @@ void ValueOwner::initializePrototypes()
     _globalObject->setMember("Date", dateCtor());
     _globalObject->setMember("RegExp", regexpCtor());
 
+    Function *f = 0;
+
+    // XMLHttpRequest
+    ObjectValue *xmlHttpRequest = newObject();
+    xmlHttpRequest->setMember("onreadystatechange", functionPrototype());
+    xmlHttpRequest->setMember("UNSENT", numberValue());
+    xmlHttpRequest->setMember("OPENED", numberValue());
+    xmlHttpRequest->setMember("HEADERS_RECEIVED", numberValue());
+    xmlHttpRequest->setMember("LOADING", numberValue());
+    xmlHttpRequest->setMember("DONE", numberValue());
+    xmlHttpRequest->setMember("readyState", numberValue());
+    f = addFunction(xmlHttpRequest, "open");
+    f->addArgument(stringValue(), "method");
+    f->addArgument(stringValue(), "url");
+    f->addArgument(booleanValue(), "async");
+    f->addArgument(stringValue(), "user");
+    f->addArgument(stringValue(), "password");
+    f = addFunction(xmlHttpRequest, "setRequestHeader");
+    f->addArgument(stringValue(), "header");
+    f->addArgument(stringValue(), "value");
+    f = addFunction(xmlHttpRequest, "send");
+    f->addArgument(undefinedValue(), "data");
+    f = addFunction(xmlHttpRequest, "abort");
+    xmlHttpRequest->setMember("status", numberValue());
+    xmlHttpRequest->setMember("statusText", stringValue());
+    f = addFunction(xmlHttpRequest, "getResponseHeader");
+    f->addArgument(stringValue(), "header");
+    f = addFunction(xmlHttpRequest, "getAllResponseHeaders");
+    xmlHttpRequest->setMember("responseText", stringValue());
+    xmlHttpRequest->setMember("responseXML", undefinedValue());
+
+    f = addFunction(_globalObject, "XMLHttpRequest", xmlHttpRequest);
+    f->setMember("prototype", xmlHttpRequest);
+    xmlHttpRequest->setMember("constructor", f);
+
+    // Database API
+    ObjectValue *db = newObject();
+    f = addFunction(db, "transaction");
+    f->addArgument(functionPrototype(), "callback");
+    f = addFunction(db, "readTransaction");
+    f->addArgument(functionPrototype(), "callback");
+    f->setMember("version", stringValue());
+    f = addFunction(db, "changeVersion");
+    f->addArgument(stringValue(), "oldVersion");
+    f->addArgument(stringValue(), "newVersion");
+    f->addArgument(functionPrototype(), "callback");
+
+    f = addFunction(_globalObject, "openDatabaseSync", db);
+    f->addArgument(stringValue(), "name");
+    f->addArgument(stringValue(), "version");
+    f->addArgument(stringValue(), "displayName");
+    f->addArgument(numberValue(), "estimatedSize");
+    f->addArgument(functionPrototype(), "callback");
+
+    // JSON
+    ObjectValue *json = newObject();
+    f = addFunction(json, "parse", objectPrototype());
+    f->addArgument(stringValue(), "text");
+    f->addArgument(functionPrototype(), "reviver");
+    f = addFunction(json, "stringify", stringValue());
+    f->addArgument(undefinedValue(), "value");
+    f->addArgument(undefinedValue(), "replacer");
+    f->addArgument(undefinedValue(), "space");
+    _globalObject->setMember("JSON", json);
 
     // global Qt object, in alphabetic order
     _qtObject = newObject(/*prototype */ 0);
diff --git a/src/libs/qmljs/qmljsvalueowner.h b/src/libs/qmljs/qmljsvalueowner.h
index 13c71c3936464df2d7b9a8091e56b90a7bb5844b..148e4347b1d13b3de31859905cc58febf001e18f 100644
--- a/src/libs/qmljs/qmljsvalueowner.h
+++ b/src/libs/qmljs/qmljsvalueowner.h
@@ -139,8 +139,8 @@ public:
 private:
     void initializePrototypes();
 
-    void addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount);
-    void addFunction(ObjectValue *object, const QString &name, int argumentCount);
+    Function *addFunction(ObjectValue *object, const QString &name, const Value *result, int argumentCount = 0);
+    Function *addFunction(ObjectValue *object, const QString &name, int argumentCount = 0);
 
 private:
     ObjectValue *_objectPrototype;