diff --git a/crates/matrix-sdk/src/account.rs b/crates/matrix-sdk/src/account.rs
new file mode 100644
index 000000000..785bc8bdf
--- /dev/null
+++ b/crates/matrix-sdk/src/account.rs
@@ -0,0 +1,181 @@
+use std::io::Read;
+
+use matrix_sdk_base::media::{MediaFormat, MediaRequest, MediaType};
+use mime::Mime;
+use ruma::{
+ api::client::r0::profile::{
+ get_avatar_url, get_display_name, set_avatar_url, set_display_name,
+ },
+ MxcUri,
+};
+
+use crate::{config::RequestConfig, Client, Error, Result};
+
+/// A high-level API to manage the client owner's account.
+///
+/// All the methods on this struct send a request to the homeserver.
+#[derive(Debug, Clone)]
+pub struct Account {
+ /// The underlying HTTP client.
+ client: Client,
+}
+
+impl Account {
+ pub(crate) fn new(client: Client) -> Self {
+ Self { client }
+ }
+
+ /// Get the display name of the account.
+ ///
+ /// # Example
+ /// ```no_run
+ /// # use futures::executor::block_on;
+ /// # use matrix_sdk::Client;
+ /// # use url::Url;
+ /// # let homeserver = Url::parse("http://example.com").unwrap();
+ /// # block_on(async {
+ /// let user = "example";
+ /// let client = Client::new(homeserver).await.unwrap();
+ /// client.login(user, "password", None, None).await.unwrap();
+ ///
+ /// if let Some(name) = client.account().get_display_name().await.unwrap() {
+ /// println!("Logged in as user '{}' with display name '{}'", user, name);
+ /// }
+ /// # })
+ /// ```
+ pub async fn get_display_name(&self) -> Result