diff --git a/src/calls-account-provider.c b/src/calls-account-provider.c
new file mode 100644
index 0000000..1ff474f
--- /dev/null
+++ b/src/calls-account-provider.c
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2021 Purism SPC
+ *
+ * This file is part of Calls.
+ *
+ * Calls is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Calls 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Calls. If not, see .
+ *
+ * Author: Evangelos Ribeiro Tzaras
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#include "calls-account-provider.h"
+
+/**
+ * SECTION:account-provider
+ * @short_description: An interface for CallsProvider to use online accounts
+ * @Title: CallsOnlineAccount
+ *
+ * #CallsAccountProvider is an interface that should be implemented by a
+ * #CallsProvider when it provides accounts. See #CallsAccount and
+ * #CallsCredentials.
+ */
+
+G_DEFINE_INTERFACE (CallsAccountProvider, calls_account_provider, CALLS_TYPE_PROVIDER)
+
+
+static void
+calls_account_provider_default_init (CallsAccountProviderInterface *iface)
+{
+}
+
+/**
+ * calls_account_provider_add_account:
+ * @self: A #CallsAccountProvider
+ * @credentials: A #CallsCredentials
+ *
+ * Add an account.
+ *
+ * Returns: %TRUE if successfully added, %FALSE otherwise
+ */
+gboolean
+calls_account_provider_add_account (CallsAccountProvider *self,
+ CallsCredentials *credentials)
+{
+ CallsAccountProviderInterface *iface;
+
+ g_return_val_if_fail (CALLS_IS_ACCOUNT_PROVIDER (self), FALSE);
+
+ iface = CALLS_ACCOUNT_PROVIDER_GET_IFACE (self);
+ g_return_val_if_fail (iface->add_account != NULL, FALSE);
+
+ return iface->add_account (self, credentials);
+}
+
+/**
+ * calls_account_provider_remove_account:
+ * @self: A #CallsAccountProvider
+ * @credentials: A #CallsCredentials
+ *
+ * Removes an account.
+ *
+ * Returns: %TRUE if successfully removed, %FALSE otherwise
+ */
+gboolean
+calls_account_provider_remove_account (CallsAccountProvider *self,
+ CallsCredentials *credentials)
+{
+ CallsAccountProviderInterface *iface;
+
+ g_return_val_if_fail (CALLS_IS_ACCOUNT_PROVIDER (self), FALSE);
+
+ iface = CALLS_ACCOUNT_PROVIDER_GET_IFACE (self);
+ g_return_val_if_fail (iface->remove_account != NULL, FALSE);
+
+ return iface->remove_account (self, credentials);
+}
+
+/**
+ * calls_account_provider_get_account:
+ * @self: A #CallsAccountProvider
+ * @credentials: A #CallsCredentials
+ *
+ * Get the account which is using #CallsCredentials
+ */
+CallsAccount *
+calls_account_provider_get_account (CallsAccountProvider *self,
+ CallsCredentials *credentials)
+{
+ CallsAccountProviderInterface *iface;
+
+ g_return_val_if_fail (CALLS_IS_ACCOUNT_PROVIDER (self), NULL);
+
+ iface = CALLS_ACCOUNT_PROVIDER_GET_IFACE (self);
+ g_return_val_if_fail (iface->get_account != NULL, NULL);
+
+ return iface->get_account (self, credentials);
+}
diff --git a/src/calls-account-provider.h b/src/calls-account-provider.h
new file mode 100644
index 0000000..7bd8bbf
--- /dev/null
+++ b/src/calls-account-provider.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 Purism SPC
+ *
+ * This file is part of Calls.
+ *
+ * Calls is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Calls 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Calls. If not, see .
+ *
+ * Author: Evangelos Ribeiro Tzaras
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ */
+
+#pragma once
+
+#include "calls-account.h"
+#include "calls-credentials.h"
+#include "calls-provider.h"
+
+#include
+
+G_BEGIN_DECLS
+
+#define CALLS_TYPE_ACCOUNT_PROVIDER (calls_account_provider_get_type ())
+
+G_DECLARE_INTERFACE (CallsAccountProvider, calls_account_provider, CALLS, ACCOUNT_PROVIDER, CallsProvider);
+
+struct _CallsAccountProviderInterface
+{
+ GTypeInterface parent_iface;
+
+ gboolean (*add_account) (CallsAccountProvider *self,
+ CallsCredentials *credentials);
+ gboolean (*remove_account) (CallsAccountProvider *self,
+ CallsCredentials *credentials);
+ CallsAccount *(*get_account) (CallsAccountProvider *self,
+ CallsCredentials *credentials);
+};
+
+gboolean calls_account_provider_add_account (CallsAccountProvider *self,
+ CallsCredentials *credentials);
+gboolean calls_account_provider_remove_account (CallsAccountProvider *self,
+ CallsCredentials *credentials);
+CallsAccount *calls_account_provider_get_account (CallsAccountProvider *self,
+ CallsCredentials *credentials);
+
+G_END_DECLS
diff --git a/src/meson.build b/src/meson.build
index eaadef9..257c368 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -112,6 +112,7 @@ calls_sources = files(['calls-message-source.c', 'calls-message-source.h',
'calls-contacts-row.c', 'calls-contacts-row.h',
'calls-credentials.c', 'calls-credentials.h',
'calls-account.c', 'calls-account.h',
+ 'calls-account-provider.c', 'calls-account-provider.h',
]) + wayland_sources + calls_generated_sources
calls_config_data = config_data