diff --git a/configure.ac b/configure.ac
index dc39b07..d169b61 100644
--- a/configure.ac
+++ b/configure.ac
@@ -316,6 +316,28 @@ if test "$enable_facebook" != "no"; then
   AC_DEFINE(GOA_FACEBOOK_ENABLED, 1, [Enable Facebook data provider])
 fi
 
+# VKontakte
+AC_DEFINE(GOA_VK_NAME, ["vk"], [ProviderType and extension point name])
+AC_ARG_ENABLE([vk], [AS_HELP_STRING([--enable-vk],
+                                          [Enable VK provider])],
+                                          [],
+                                          [enable_vk=yes])
+AC_ARG_WITH(vk-client-id,
+            [AS_HELP_STRING([--with-vk-client-id],
+                            [VKontakte OAuth 2.0 client id])],
+                            [],
+                            [])
+
+if test "$with_vk_client_id" = ""; then
+  with_vk_client_id=3821026
+fi
+AC_DEFINE_UNQUOTED(GOA_VK_CLIENT_ID,
+                   ["$with_vk_client_id"],
+                   [VKontakte OAuth 2.0 client id])
+if test "$enable_vk" != "no"; then
+  AC_DEFINE(GOA_VK_ENABLED, 1, [Enable VKontakte data provider])
+fi
+
 # Windows Live
 AC_DEFINE(GOA_WINDOWS_LIVE_NAME, ["windows_live"], [ProviderType and extension point name])
 AC_ARG_ENABLE([windows-live], [AS_HELP_STRING([--enable-windows-live],
@@ -561,6 +583,7 @@ echo "
 	Kerberos provider:              ${enable_kerberos}
 	Yahoo provider:                 ${enable_yahoo} (OAuth 1.0, key:${with_yahoo_consumer_key} secret:${with_yahoo_consumer_secret})
 	Facebook provider:              ${enable_facebook} (OAuth 2.0, id:${with_facebook_client_id})
+	VKontakte provider:             ${enable_vk} (OAuth 2.0, id:${with_vk_client_id})
 	Windows Live provider:          ${enable_windows_live} (OAuth 2.0, id:${with_windows_live_client_id})
         Telepathy provider:             ${enable_telepathy}
         Pocket provider:                ${enable_pocket} (id:${with_pocket_client_id})
diff --git a/data/icons/16x16/Makefile.am b/data/icons/16x16/Makefile.am
index 889664f..68366b3 100644
--- a/data/icons/16x16/Makefile.am
+++ b/data/icons/16x16/Makefile.am
@@ -9,6 +9,7 @@ icon_DATA =				\
 	goa-account-owncloud.png	\
 	goa-account-pocket.png		\
 	goa-account-foursquare.png	\
+	goa-account-vk.png	\
 	goa-account-yahoo.png		\
 	$(NULL)
 
diff --git a/data/icons/16x16/goa-account-vk.png b/data/icons/16x16/goa-account-vk.png
new file mode 100644
index 0000000..8a0c28c
Binary files /dev/null and b/data/icons/16x16/goa-account-vk.png differ
diff --git a/data/icons/22x22/Makefile.am b/data/icons/22x22/Makefile.am
index 710f3cc..ace6a42 100644
--- a/data/icons/22x22/Makefile.am
+++ b/data/icons/22x22/Makefile.am
@@ -9,6 +9,7 @@ icon_DATA = 				\
 	goa-account-owncloud.png	\
 	goa-account-pocket.png		\
 	goa-account-foursquare.png	\
+	goa-account-vk.png	\
 	goa-account-yahoo.png		\
 	$(NULL)
 
diff --git a/data/icons/22x22/goa-account-vk.png b/data/icons/22x22/goa-account-vk.png
new file mode 100644
index 0000000..20f399f
Binary files /dev/null and b/data/icons/22x22/goa-account-vk.png differ
diff --git a/data/icons/24x24/Makefile.am b/data/icons/24x24/Makefile.am
index 9863d8c..accd733 100644
--- a/data/icons/24x24/Makefile.am
+++ b/data/icons/24x24/Makefile.am
@@ -9,6 +9,7 @@ icon_DATA = 				\
 	goa-account-pocket.png		\
 	goa-account-foursquare.png	\
 	goa-account-flickr.png		\
+	goa-account-vk.png	\
 	goa-account-yahoo.png		\
 	$(NULL)
 
diff --git a/data/icons/24x24/goa-account-vk.png b/data/icons/24x24/goa-account-vk.png
new file mode 100644
index 0000000..9d4c1fb
Binary files /dev/null and b/data/icons/24x24/goa-account-vk.png differ
diff --git a/data/icons/32x32/Makefile.am b/data/icons/32x32/Makefile.am
index 9bf6ce9..9227b96 100644
--- a/data/icons/32x32/Makefile.am
+++ b/data/icons/32x32/Makefile.am
@@ -9,6 +9,7 @@ icon_DATA = 				\
 	goa-account-owncloud.png	\
 	goa-account-pocket.png		\
 	goa-account-foursquare.png	\
+	goa-account-vk.png	\
 	goa-account-yahoo.png		\
 	$(NULL)
 
diff --git a/data/icons/32x32/goa-account-vk.png b/data/icons/32x32/goa-account-vk.png
new file mode 100644
index 0000000..a674b32
Binary files /dev/null and b/data/icons/32x32/goa-account-vk.png differ
diff --git a/data/icons/48x48/Makefile.am b/data/icons/48x48/Makefile.am
index 1f794a4..610693e 100644
--- a/data/icons/48x48/Makefile.am
+++ b/data/icons/48x48/Makefile.am
@@ -9,6 +9,7 @@ icon_DATA = 				\
 	goa-account-pocket.png		\
 	goa-account-flickr.png		\
 	goa-account-foursquare.png	\
+	goa-account-vk.png	\
 	goa-account-yahoo.png		\
 	$(NULL)
 
diff --git a/data/icons/48x48/goa-account-vk.png b/data/icons/48x48/goa-account-vk.png
new file mode 100644
index 0000000..4d5368e
Binary files /dev/null and b/data/icons/48x48/goa-account-vk.png differ
diff --git a/po/POTFILES.in b/po/POTFILES.in
index a7d2546..05797ae 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -22,6 +22,7 @@ src/goabackend/goaprovider.c
 src/goabackend/goasmtpauth.c
 src/goabackend/goatelepathyprovider.c
 src/goabackend/goautils.c
+src/goabackend/goavkprovider.c
 src/goabackend/goawebview.c
 src/goabackend/goawindowsliveprovider.c
 src/goabackend/goayahooprovider.c
diff --git a/src/goabackend/Makefile.am b/src/goabackend/Makefile.am
index 59ed25a..b2b3083 100644
--- a/src/goabackend/Makefile.am
+++ b/src/goabackend/Makefile.am
@@ -83,6 +83,7 @@ libgoa_backend_1_0_la_SOURCES =						\
 	goaoauth2provider.h		goaoauth2provider.c		\
 	goagoogleprovider.h		goagoogleprovider.c		\
 	goafacebookprovider.h		goafacebookprovider.c		\
+	goavkprovider.h		goavkprovider.c		\
 	goaimapsmtpprovider.h		goaimapsmtpprovider.c		\
 	goamediaserverprovider.h	goamediaserverprovider.c	\
 	goaowncloudprovider.h		goaowncloudprovider.c		\
diff --git a/src/goabackend/goaprovider.c b/src/goabackend/goaprovider.c
index 9d99296..de01751 100644
--- a/src/goabackend/goaprovider.c
+++ b/src/goabackend/goaprovider.c
@@ -26,6 +26,7 @@
 #include "goaexchangeprovider.h"
 #include "goagoogleprovider.h"
 #include "goafacebookprovider.h"
+#include "goavkprovider.h"
 #include "goaimapsmtpprovider.h"
 #include "goaowncloudprovider.h"
 #include "goayahooprovider.h"
@@ -773,6 +774,9 @@ static struct
 #ifdef GOA_FACEBOOK_ENABLED
   { GOA_FACEBOOK_NAME, goa_facebook_provider_get_type },
 #endif
+#ifdef GOA_VK_ENABLED
+  { GOA_VK_NAME, goa_vk_provider_get_type },
+#endif
 #ifdef GOA_FLICKR_ENABLED
   { GOA_FLICKR_NAME, goa_flickr_provider_get_type },
 #endif
diff --git a/src/goabackend/goavkprovider.c b/src/goabackend/goavkprovider.c
new file mode 100644
index 0000000..e3cdd5c
--- /dev/null
+++ b/src/goabackend/goavkprovider.c
@@ -0,0 +1,553 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+#include <glib/gi18n-lib.h>
+
+#include <rest/rest-proxy.h>
+#include <json-glib/json-glib.h>
+
+#include "goaprovider.h"
+#include "goaprovider-priv.h"
+#include "goaoauth2provider.h"
+#include "goavkprovider.h"
+
+#define VK_API_VERSION "5.28"
+
+/**
+ * GoaVkProvider:
+ *
+ * The #GoaVkProvider structure contains only private data and should
+ * only be accessed using the provided API.
+ */
+struct _GoaVKProvider
+{
+  /*< private >*/
+  GoaOAuth2Provider parent_instance;
+};
+
+typedef struct _GoaVKProviderClass GoaVKProviderClass;
+
+struct _GoaVKProviderClass
+{
+  GoaOAuth2ProviderClass parent_class;
+};
+
+/**
+ * SECTION:goavkprovider
+ * @title: GoaVKProvider
+ * @short_description: A provider for VKontakte
+ *
+ * #GoaVKProvider is used for handling VKontakte accounts.
+ */
+
+G_DEFINE_TYPE_WITH_CODE (GoaVKProvider, goa_vk_provider, GOA_TYPE_OAUTH2_PROVIDER,
+                         goa_provider_ensure_extension_points_registered ();
+                         g_io_extension_point_implement (GOA_PROVIDER_EXTENSION_POINT_NAME,
+							 g_define_type_id,
+							 GOA_VK_NAME,
+							 0));
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static const gchar *
+get_provider_type (GoaProvider *_provider)
+{
+  return GOA_VK_NAME;
+}
+
+static gchar *
+get_provider_name (GoaProvider *_provider,
+                   GoaObject   *object)
+{
+  return g_strdup (_("VK"));
+}
+
+static GoaProviderGroup
+get_provider_group (GoaProvider *_provider)
+{
+  return GOA_PROVIDER_GROUP_BRANDED;
+}
+
+static GoaProviderFeatures
+get_provider_features (GoaProvider *_provider)
+{
+  return GOA_PROVIDER_FEATURE_BRANDED |
+       /*GOA_PROVIDER_FEATURE_MUSIC |*/
+         GOA_PROVIDER_FEATURE_CHAT;
+}
+
+//https://oauth.vk.com/oauth/authorize?response_type=token&display=popup&redirect_uri=http://oauth.vk.com/blank.html&client_id=%s&scope=messages,friends,audio,offline
+static gchar *
+build_authorization_uri (GoaOAuth2Provider  *provider,
+                         const gchar        *authorization_uri,
+                         const gchar        *escaped_redirect_uri,
+                         const gchar        *escaped_client_id,
+                         const gchar        *escaped_scope)
+{
+  gchar *uri;
+
+  uri = g_strdup_printf ("%s"
+                          "?response_type=token"
+                          "&display=popup"
+                          "&v=" VK_API_VERSION
+                          "&redirect_uri=%s"
+                          "&client_id=%s"
+                          "&scope=%s",
+                          authorization_uri,
+                          escaped_redirect_uri,
+                          escaped_client_id,
+                          escaped_scope);
+  return uri;
+}
+
+static const gchar *
+get_authorization_uri (GoaOAuth2Provider *provider)
+{
+  return "https://oauth.vk.com/oauth/authorize";
+}
+
+static const gchar *
+get_redirect_uri (GoaOAuth2Provider *provider)
+{
+  return "https://oauth.vk.com/blank.html";
+}
+
+static const gchar *
+get_scope (GoaOAuth2Provider *provider)
+{
+  return
+    "messages," //to access to messages API
+    "friends,"  //to see the list of friends
+    "audio,"    //to access to music playing API
+    "offline";  //to be able to use API even when user is not logged into the website
+}
+
+static const gchar *
+get_client_id (GoaOAuth2Provider *provider)
+{
+  return GOA_VK_CLIENT_ID;
+}
+
+static const gchar *
+get_client_secret (GoaOAuth2Provider *provider)
+{
+  return NULL;
+}
+
+static const gchar *
+get_authentication_cookie (GoaOAuth2Provider *provider)
+{
+  return NULL;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static gchar *
+get_identity_sync (GoaOAuth2Provider  *provider,
+                   const gchar        *access_token,
+                   gchar             **out_presentation_identity,
+                   GCancellable       *cancellable,
+                   GError            **error)
+{
+  GError *identity_error;
+  RestProxy *proxy;
+  RestProxyCall *call;
+  JsonParser *parser;
+  JsonObject *json_object;
+  gchar *ret;
+  gchar *id;
+  gchar *presentation_identity;
+
+  ret = NULL;
+
+  identity_error = NULL;
+  proxy = NULL;
+  call = NULL;
+  parser = NULL;
+  id = NULL;
+  presentation_identity = NULL;
+
+  /* TODO: cancellable */
+
+  proxy = rest_proxy_new ("https://api.vk.com/method/users.get", FALSE);
+  call = rest_proxy_new_call (proxy);
+  rest_proxy_call_set_method (call, "GET");
+  rest_proxy_call_add_param (call, "v", VK_API_VERSION);
+  rest_proxy_call_add_param (call, "access_token", access_token);
+
+  if (!rest_proxy_call_sync (call, error))
+    goto out;
+  if (rest_proxy_call_get_status_code (call) != 200)
+    {
+      g_set_error (error,
+                   GOA_ERROR,
+                   GOA_ERROR_FAILED,
+                   _("Expected status 200 when requesting your identity, instead got status %d (%s)"),
+                   rest_proxy_call_get_status_code (call),
+                   rest_proxy_call_get_status_message (call));
+      goto out;
+    }
+
+  parser = json_parser_new ();
+  if (!json_parser_load_from_data (parser,
+                                   rest_proxy_call_get_payload (call),
+                                   rest_proxy_call_get_payload_length (call),
+                                   &identity_error))
+    {
+      g_warning ("json_parser_load_from_data() failed: %s (%s, %d)",
+                   identity_error->message,
+                   g_quark_to_string (identity_error->domain),
+                   identity_error->code);
+      g_set_error (error,
+                   GOA_ERROR,
+                   GOA_ERROR_FAILED,
+                   _("Could not parse response"));
+      goto out;
+    }
+
+  json_object = json_node_get_object (json_parser_get_root (parser));
+
+  if (!json_object_has_member(json_object,"response"))
+    {
+      if (json_object_has_member(json_object,"error"))
+        {
+          json_object = json_object_get_object_member(json_object,"error");
+          g_set_error (error,
+                       GOA_ERROR,
+                       GOA_ERROR_FAILED,
+                       _("The request was unsuccessfull: error_code %d (%s)"),
+                       json_object_get_int_member(json_object,"error_code"),
+                       json_object_get_string_member(json_object,"error_msg"));
+          goto out;
+        }
+      else //no responce and no error. weird...
+        {
+          g_warning ("Did not find nor response nor error.");
+          g_set_error (error,
+                       GOA_ERROR,
+                       GOA_ERROR_FAILED,
+                       _("Could not parse response"));
+          goto out;
+        }
+    }
+
+        //{"response":[{"id":1234567,"first_name":"Foo","last_name":"Bar"}]}
+  json_object = json_array_get_object_element(json_object_get_array_member(json_object,"response"),0);
+
+  id = g_strdup_printf ("%" G_GINT64_FORMAT, json_object_get_int_member (json_object, "id"));
+  if (id == NULL)
+    {
+      g_warning ("Did not find id in JSON data");
+      g_set_error (error,
+                   GOA_ERROR,
+                   GOA_ERROR_FAILED,
+                   _("Could not parse response"));
+      goto out;
+    }
+  presentation_identity = g_strdup_printf ("%s %s",
+                                             json_object_get_string_member (json_object, "first_name"),
+                                             json_object_get_string_member (json_object, "last_name"));
+  if (presentation_identity == NULL)
+    {
+      g_warning ("Did not find name in JSON data");
+      g_set_error (error,
+                   GOA_ERROR,
+                   GOA_ERROR_FAILED,
+                   _("Could not parse response"));
+      goto out;
+    }
+
+  ret = id;
+  id = NULL;
+  if (out_presentation_identity != NULL)
+    {
+      *out_presentation_identity = presentation_identity;
+      presentation_identity = NULL;
+    }
+
+ out:
+  g_clear_error (&identity_error);
+  g_free (id);
+  g_free (presentation_identity);
+  if (parser != NULL)
+    g_object_unref (parser);
+  if (call != NULL)
+    g_object_unref (call);
+  if (proxy != NULL)
+    g_object_unref (proxy);
+  return ret;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static gboolean
+is_deny_node (GoaOAuth2Provider *provider, WebKitDOMNode *node)
+{
+  WebKitDOMHTMLElement *html_element;
+  gboolean ret;
+  gchar *id;
+
+  id = NULL;
+  ret = FALSE;
+
+  if (!WEBKIT_DOM_IS_HTML_ELEMENT (node))
+    goto out;
+
+  html_element = WEBKIT_DOM_HTML_ELEMENT (node);
+  id = webkit_dom_html_element_get_id (html_element);
+  if (g_strcmp0 (id, "install_cancel") != 0)
+    goto out;
+
+  ret = TRUE;
+
+ out:
+  g_free (id);
+  return ret;
+}
+
+static gboolean
+is_identity_node (GoaOAuth2Provider *provider, WebKitDOMHTMLInputElement *element)
+{
+  gboolean ret;
+  gchar *element_type;
+  gchar *name;
+
+  element_type = NULL;
+  name = NULL;
+
+  ret = FALSE;
+
+  g_object_get (element, "type", &element_type, NULL);
+  if (g_strcmp0 (element_type, "text") != 0)
+    goto out;
+
+  name = webkit_dom_html_input_element_get_name (element);
+  if (g_strcmp0 (name, "email") != 0)
+    goto out;
+
+  ret = TRUE;
+
+ out:
+  g_free (element_type);
+  g_free (name);
+  return ret;
+}
+
+static gboolean
+is_password_node (GoaOAuth2Provider *provider, WebKitDOMHTMLInputElement *element)
+{
+  gboolean ret;
+  gchar *element_type;
+  gchar *name;
+
+  element_type = NULL;
+  name = NULL;
+
+  ret = FALSE;
+
+  g_object_get (element, "type", &element_type, NULL);
+  if (g_strcmp0 (element_type, "password") != 0)
+    goto out;
+
+  name = webkit_dom_html_input_element_get_name (element);
+  if (g_strcmp0 (name, "pass") != 0)
+    goto out;
+
+  ret = TRUE;
+
+ out:
+  g_free (element_type);
+  g_free (name);
+  return ret;
+}
+/* ---------------------------------------------------------------------------------------------------- */
+
+static gboolean
+build_object (GoaProvider         *provider,
+              GoaObjectSkeleton   *object,
+              GKeyFile            *key_file,
+              const gchar         *group,
+              GDBusConnection     *connection,
+              gboolean             just_added,
+              GError             **error)
+{
+  GoaAccount *account;
+  GoaChat *chat = NULL;
+  gboolean chat_enabled;
+  /*
+  GoaMusic *music = NULL;
+  gboolean music_enabled;
+  */
+  gboolean ret = FALSE;
+
+  account = NULL;
+
+  /* Chain up */
+  if (!GOA_PROVIDER_CLASS (goa_vk_provider_parent_class)->build_object (provider,
+                                                                              object,
+                                                                              key_file,
+                                                                              group,
+                                                                              connection,
+                                                                              just_added,
+                                                                              error))
+    goto out;
+
+  account = goa_object_get_account (GOA_OBJECT (object));
+
+  /* Chat */
+  chat = goa_object_get_chat (GOA_OBJECT (object));
+  chat_enabled = g_key_file_get_boolean (key_file, group, "ChatEnabled", NULL);
+  if (chat_enabled)
+    {
+      if (chat == NULL)
+        {
+          chat = goa_chat_skeleton_new ();
+          goa_object_skeleton_set_chat (object, chat);
+        }
+    }
+  else
+    {
+      if (chat != NULL)
+        goa_object_skeleton_set_chat (object, NULL);
+    }
+
+  /* Music */
+  /*
+  music = goa_object_get_music (GOA_OBJECT (object));
+  music_enabled = g_key_file_get_boolean (key_file, group, "MusicEnabled", NULL);
+  if (music_enabled)
+    {
+      if (music == NULL)
+        {
+          music = goa_music_skeleton_new ();
+          goa_object_skeleton_set_music (object, music);
+        }
+    }
+  else
+    {
+      if (music != NULL)
+        goa_object_skeleton_set_music (object, NULL);
+    }
+  */
+
+  if (just_added)
+    {
+      goa_account_set_chat_disabled (account, !chat_enabled);
+      g_signal_connect (account,
+                        "notify::chat-disabled",
+                        G_CALLBACK (goa_util_account_notify_property_cb),
+                        "ChatEnabled");
+
+      /*
+      goa_account_set_music_disabled (account, !music_enabled);
+      g_signal_connect (account,
+                        "notify::music-disabled",
+                        G_CALLBACK (goa_util_account_notify_property_cb),
+                        "MusicEnabled");
+      */
+    }
+
+  ret = TRUE;
+
+ out:
+  if (chat != NULL)
+    g_object_unref (chat);
+  /*
+  if (music != NULL)
+    g_object_unref (music);
+  */
+  if (account != NULL)
+    g_object_unref (account);
+  return ret;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+show_account (GoaProvider         *provider,
+              GoaClient           *client,
+              GoaObject           *object,
+              GtkBox              *vbox,
+              GtkGrid             *grid,
+              G_GNUC_UNUSED GtkGrid *dummy)
+{
+  gint row;
+
+  row = 0;
+
+  goa_util_add_account_info (grid, row++, object);
+
+  goa_util_add_row_switch_from_keyfile_with_blurb (grid, row++, object,
+                                                   _("Use for"),
+                                                   "chat-disabled",
+                                                   _("C_hat"));
+  /*
+  goa_util_add_row_switch_from_keyfile_with_blurb (grid, row++, object,
+                                                   _("Use for"),
+                                                   "music-disabled",
+                                                   _("M_usic"));
+  */
+}
+
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+add_account_key_values (GoaOAuth2Provider *provider,
+                        GVariantBuilder   *builder)
+{
+  g_variant_builder_add (builder, "{ss}", "ChatEnabled", "true");
+  /*g_variant_builder_add (builder, "{ss}", "MusicEnabled", "true");*/
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+goa_vk_provider_init (GoaVKProvider *client)
+{
+}
+
+static void
+goa_vk_provider_class_init (GoaVKProviderClass *klass)
+{
+  GoaProviderClass *provider_class;
+  GoaOAuth2ProviderClass *oauth2_class;
+
+  provider_class = GOA_PROVIDER_CLASS (klass);
+  provider_class->get_provider_type          = get_provider_type;
+  provider_class->get_provider_name          = get_provider_name;
+  provider_class->get_provider_group         = get_provider_group;
+  provider_class->get_provider_features      = get_provider_features;
+  provider_class->build_object               = build_object;
+  provider_class->show_account               = show_account;
+
+  oauth2_class = GOA_OAUTH2_PROVIDER_CLASS (klass);
+  oauth2_class->get_authorization_uri    = get_authorization_uri;
+  oauth2_class->build_authorization_uri  = build_authorization_uri;
+  oauth2_class->get_redirect_uri         = get_redirect_uri;
+  oauth2_class->get_scope                = get_scope;
+  oauth2_class->get_client_id            = get_client_id;
+  oauth2_class->get_client_secret        = get_client_secret;
+  oauth2_class->get_authentication_cookie = get_authentication_cookie;
+  oauth2_class->get_identity_sync        = get_identity_sync;
+  oauth2_class->is_deny_node             = is_deny_node;
+  oauth2_class->is_identity_node         = is_identity_node;
+  oauth2_class->is_password_node         = is_password_node;
+  oauth2_class->add_account_key_values   = add_account_key_values;
+}
diff --git a/src/goabackend/goavkprovider.h b/src/goabackend/goavkprovider.h
new file mode 100644
index 0000000..6aa3636
--- /dev/null
+++ b/src/goabackend/goavkprovider.h
@@ -0,0 +1,41 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#if !defined (__GOA_BACKEND_INSIDE_GOA_BACKEND_H__) && !defined (GOA_BACKEND_COMPILATION)
+#error "Only <goabackend/goabackend.h> can be included directly."
+#endif
+
+#ifndef __GOA_VK_PROVIDER_H__
+#define __GOA_VK_PROVIDER_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GOA_TYPE_VK_PROVIDER   (goa_vk_provider_get_type ())
+#define GOA_VK_PROVIDER(o)     (G_TYPE_CHECK_INSTANCE_CAST ((o), GOA_TYPE_VK_PROVIDER, GoaVKProvider))
+#define GOA_IS_VK_PROVIDER(o)  (G_TYPE_CHECK_INSTANCE_TYPE ((o), GOA_TYPE_VK_PROVIDER))
+
+typedef struct _GoaVKProvider GoaVKProvider;
+
+GType goa_vk_provider_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GOA_VK_PROVIDER_H__ */
+