diff --git a/Cargo.toml b/Cargo.toml
index 94be4d36..a4ece2c9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -95,7 +95,6 @@ tower-http = { version = "0.2.5", features = ["trace"], optional = true }
 [dev-dependencies]
 rand = "0.8.3"
 pretty_env_logger = "0.4.0"
-once_cell = "1.9.0"
 serde = "1"
 serde_json = "1"
 tokio = { version = "1.8", features = ["fs", "rt-multi-thread", "macros"] }
diff --git a/examples/shared_state.rs b/examples/shared_state.rs
index 33f5d4b6..c09fab93 100644
--- a/examples/shared_state.rs
+++ b/examples/shared_state.rs
@@ -1,27 +1,34 @@
 // This bot answers how many messages it received in total on every message.
 
-use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{
+    atomic::{AtomicU64, Ordering},
+    Arc,
+};
 
-use once_cell::sync::Lazy;
 use teloxide::prelude::*;
 
-static MESSAGES_TOTAL: Lazy<AtomicU64> = Lazy::new(AtomicU64::default);
-
 #[tokio::main]
 async fn main() {
     pretty_env_logger::init();
     log::info!("Starting shared state bot...");
 
     let bot = Bot::from_env().auto_send();
+    let messages_total = Arc::new(AtomicU64::new(0));
 
-    let handler = Update::filter_message().branch(dptree::endpoint(
-        |msg: Message, bot: AutoSend<Bot>| async move {
-            let previous = MESSAGES_TOTAL.fetch_add(1, Ordering::Relaxed);
+    let handler = Update::filter_message().endpoint(
+        |msg: Message, bot: AutoSend<Bot>, messages_total: Arc<AtomicU64>| async move {
+            let previous = messages_total.fetch_add(1, Ordering::Relaxed);
             bot.send_message(msg.chat.id, format!("I received {previous} messages in total."))
                 .await?;
             respond(())
         },
-    ));
+    );
 
-    Dispatcher::builder(bot, handler).build().setup_ctrlc_handler().dispatch().await;
+    Dispatcher::builder(bot, handler)
+        // Pass the shared state to the handler as a dependency.
+        .dependencies(dptree::deps![messages_total])
+        .build()
+        .setup_ctrlc_handler()
+        .dispatch()
+        .await;
 }
diff --git a/src/dispatching.rs b/src/dispatching.rs
index 902c601a..6b05d88c 100644
--- a/src/dispatching.rs
+++ b/src/dispatching.rs
@@ -29,31 +29,7 @@
 //! ([Full](https://github.com/teloxide/teloxide/blob/master/examples/shared_state.rs))
 //!
 //! ```no_run
-//! use std::sync::atomic::{AtomicU64, Ordering};
-//!
-//! use once_cell::sync::Lazy;
-//! use teloxide::prelude::*;
-//!
-//! static MESSAGES_TOTAL: Lazy<AtomicU64> = Lazy::new(AtomicU64::default);
-//!
-//! # #[tokio::main]
-//! # async fn main() {
-//! pretty_env_logger::init();
-//! log::info!("Starting shared state bot...");
-//!
-//! let bot = Bot::from_env().auto_send();
-//!
-//! let handler = Update::filter_message().branch(dptree::endpoint(
-//!     |msg: Message, bot: AutoSend<Bot>| async move {
-//!         let previous = MESSAGES_TOTAL.fetch_add(1, Ordering::Relaxed);
-//!         bot.send_message(msg.chat.id, format!("I received {} messages in total.", previous))
-//!             .await?;
-//!         respond(())
-//!     },
-//! ));
-//!
-//! Dispatcher::builder(bot, handler).build().setup_ctrlc_handler().dispatch().await;
-//! # }
+//! // TODO: examples/purchase.rs
 //! ```
 //!
 //!  1. First, we create the bot: `let bot = Bot::from_env().auto_send()`.
@@ -61,8 +37,8 @@
 //! kinds of [`crate::types::Update`], here we are only interested in
 //! [`crate::types::Message`]: [`UpdateFilterExt::filter_message`] create a
 //! handler object which filters all messages out of a generic update.
-//!  3. By doing `.branch(dptree::endpoint(...))`, we set up a custom handling
-//! closure that receives `msg: Message` and `bot: AutoSend<Bot>`. There are
+//!  3. By doing `.endpoint(...)` we set up a custom handling closure that
+//! receives `msg: Message` and `bot: AutoSend<Bot>`. There are
 //! called dependencies: `msg` is supplied by
 //! [`UpdateFilterExt::filter_message`], while `bot` is supplied by
 //! [`Dispatcher`].