Rename `Message` to `PolledMessage` and `AppendableMessage` respectively
diff --git a/bench/src/producer.rs b/bench/src/producer.rs
index 13f808d..e5b1e14 100644
--- a/bench/src/producer.rs
+++ b/bench/src/producer.rs
@@ -4,7 +4,7 @@
 use iggy::clients::client::{IggyClient, IggyClientConfig};
 use iggy::error::IggyError;
 use iggy::identifier::Identifier;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use integration::test_server::{login_root, ClientFactory};
 use std::str::FromStr;
 use std::sync::Arc;
@@ -54,11 +54,11 @@
         let payload = Self::create_payload(self.message_size);
         let mut messages = Vec::with_capacity(self.messages_per_batch as usize);
         for _ in 0..self.messages_per_batch {
-            let message = Message::from_str(&payload).unwrap();
+            let message = AppendableMessage::from_str(&payload).unwrap();
             messages.push(message);
         }
 
-        let mut send_messages = SendMessages {
+        let mut send_messages = AppendMessages {
             stream_id: Identifier::numeric(self.stream_id)?,
             topic_id: Identifier::numeric(topic_id)?,
             partitioning: Partitioning::partition_id(partition_id),
diff --git a/examples/src/basic/consumer/main.rs b/examples/src/basic/consumer/main.rs
index cc0540a..e993fbf 100644
--- a/examples/src/basic/consumer/main.rs
+++ b/examples/src/basic/consumer/main.rs
@@ -1,7 +1,7 @@
 use clap::Parser;
 use iggy::client_provider;
 use iggy::client_provider::ClientProviderConfig;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy_examples::shared::args::Args;
 use iggy_examples::shared::system;
 use std::error::Error;
@@ -24,7 +24,7 @@
     system::consume_messages(&args, client, &handle_message).await
 }
 
-fn handle_message(message: &Message) -> Result<(), Box<dyn Error>> {
+fn handle_message(message: &PolledMessage) -> Result<(), Box<dyn Error>> {
     // The payload can be of any type as it is a raw byte array. In this case it's a simple string.
     let payload = std::str::from_utf8(&message.payload)?;
     info!(
diff --git a/examples/src/basic/producer/main.rs b/examples/src/basic/producer/main.rs
index 47f9766..40cd658 100644
--- a/examples/src/basic/producer/main.rs
+++ b/examples/src/basic/producer/main.rs
@@ -3,7 +3,7 @@
 use iggy::client_provider;
 use iggy::client_provider::ClientProviderConfig;
 use iggy::identifier::Identifier;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy_examples::shared::args::Args;
 use iggy_examples::shared::system;
 use std::error::Error;
@@ -46,12 +46,12 @@
         for _ in 0..args.messages_per_batch {
             current_id += 1;
             let payload = format!("message-{current_id}");
-            let message = Message::from_str(&payload)?;
+            let message = AppendableMessage::from_str(&payload)?;
             messages.push(message);
             sent_messages.push(payload);
         }
         client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: Identifier::numeric(args.stream_id)?,
                 topic_id: Identifier::numeric(args.topic_id)?,
                 partitioning: Partitioning::partition_id(args.partition_id),
diff --git a/examples/src/getting-started/consumer/main.rs b/examples/src/getting-started/consumer/main.rs
index a65fa65..84883ab 100644
--- a/examples/src/getting-started/consumer/main.rs
+++ b/examples/src/getting-started/consumer/main.rs
@@ -3,7 +3,7 @@
 use iggy::consumer::Consumer;
 use iggy::identifier::Identifier;
 use iggy::messages::poll_messages::{PollMessages, PollingStrategy};
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy::tcp::client::TcpClient;
 use iggy::tcp::config::TcpClientConfig;
 use iggy::users::defaults::*;
@@ -90,7 +90,7 @@
     }
 }
 
-fn handle_message(message: &Message) -> Result<(), Box<dyn Error>> {
+fn handle_message(message: &PolledMessage) -> Result<(), Box<dyn Error>> {
     // The payload can be of any type as it is a raw byte array. In this case it's a simple string.
     let payload = std::str::from_utf8(&message.payload)?;
     info!(
diff --git a/examples/src/getting-started/producer/main.rs b/examples/src/getting-started/producer/main.rs
index 64204b4..457a707 100644
--- a/examples/src/getting-started/producer/main.rs
+++ b/examples/src/getting-started/producer/main.rs
@@ -1,7 +1,7 @@
 use iggy::client::{Client, StreamClient, TopicClient, UserClient};
 use iggy::clients::client::{IggyClient, IggyClientConfig};
 use iggy::identifier::Identifier;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::streams::create_stream::CreateStream;
 use iggy::tcp::client::TcpClient;
 use iggy::tcp::config::TcpClientConfig;
@@ -99,11 +99,11 @@
         for _ in 0..messages_per_batch {
             current_id += 1;
             let payload = format!("message-{current_id}");
-            let message = Message::from_str(&payload)?;
+            let message = AppendableMessage::from_str(&payload)?;
             messages.push(message);
         }
         client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: Identifier::numeric(STREAM_ID)?,
                 topic_id: Identifier::numeric(TOPIC_ID)?,
                 partitioning: Partitioning::partition_id(PARTITION_ID),
diff --git a/examples/src/message-envelope/consumer/main.rs b/examples/src/message-envelope/consumer/main.rs
index c573339..1c725d5 100644
--- a/examples/src/message-envelope/consumer/main.rs
+++ b/examples/src/message-envelope/consumer/main.rs
@@ -3,7 +3,7 @@
 use iggy::client_provider;
 use iggy::client_provider::ClientProviderConfig;
 use iggy::clients::client::{IggyClient, IggyClientConfig, PollMessagesConfig, StoreOffsetKind};
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy_examples::shared::args::Args;
 use iggy_examples::shared::messages::*;
 use iggy_examples::shared::system;
@@ -35,7 +35,7 @@
     system::consume_messages(&args, &client, &handle_message).await
 }
 
-fn handle_message(message: &Message) -> Result<(), Box<dyn Error>> {
+fn handle_message(message: &PolledMessage) -> Result<(), Box<dyn Error>> {
     // The payload can be of any type as it is a raw byte array. In this case it's a JSON string.
     let json = std::str::from_utf8(&message.payload)?;
     // The message envelope can be used to send the different types of messages to the same topic.
diff --git a/examples/src/message-envelope/producer/main.rs b/examples/src/message-envelope/producer/main.rs
index fdc857a..2a398de 100644
--- a/examples/src/message-envelope/producer/main.rs
+++ b/examples/src/message-envelope/producer/main.rs
@@ -5,7 +5,7 @@
 use iggy::client_provider::ClientProviderConfig;
 use iggy::clients::client::IggyClient;
 use iggy::identifier::Identifier;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy_examples::shared::args::Args;
 use iggy_examples::shared::messages_generator::MessagesGenerator;
 use iggy_examples::shared::system;
@@ -50,13 +50,13 @@
             let serializable_message = message_generator.generate();
             // You can send the different message types to the same partition, or stick to the single type.
             let json_envelope = serializable_message.to_json_envelope();
-            let message = Message::from_str(&json_envelope)?;
+            let message = AppendableMessage::from_str(&json_envelope)?;
             messages.push(message);
             // This is used for the logging purposes only.
             serializable_messages.push(serializable_message);
         }
         client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: Identifier::numeric(args.stream_id)?,
                 topic_id: Identifier::numeric(args.topic_id)?,
                 partitioning: Partitioning::partition_id(args.partition_id),
diff --git a/examples/src/message-headers/consumer/main.rs b/examples/src/message-headers/consumer/main.rs
index 951f195..cf066f3 100644
--- a/examples/src/message-headers/consumer/main.rs
+++ b/examples/src/message-headers/consumer/main.rs
@@ -4,7 +4,7 @@
 use iggy::client_provider::ClientProviderConfig;
 use iggy::clients::client::{IggyClient, IggyClientConfig, PollMessagesConfig, StoreOffsetKind};
 use iggy::models::header::HeaderKey;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy_examples::shared::args::Args;
 use iggy_examples::shared::messages::*;
 use iggy_examples::shared::system;
@@ -36,7 +36,7 @@
     system::consume_messages(&args, &client, &handle_message).await
 }
 
-fn handle_message(message: &Message) -> Result<(), Box<dyn Error>> {
+fn handle_message(message: &PolledMessage) -> Result<(), Box<dyn Error>> {
     // The payload can be of any type as it is a raw byte array. In this case it's a JSON string.
     let payload = std::str::from_utf8(&message.payload)?;
     // The message type is stored in the custom message header.
diff --git a/examples/src/message-headers/producer/main.rs b/examples/src/message-headers/producer/main.rs
index a5d881a..0e2da92 100644
--- a/examples/src/message-headers/producer/main.rs
+++ b/examples/src/message-headers/producer/main.rs
@@ -6,7 +6,7 @@
 use iggy::client_provider::ClientProviderConfig;
 use iggy::clients::client::IggyClient;
 use iggy::identifier::Identifier;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::models::header::{HeaderKey, HeaderValue};
 use iggy_examples::shared::args::Args;
 use iggy_examples::shared::messages_generator::MessagesGenerator;
@@ -62,13 +62,13 @@
                 HeaderValue::from_str(message_type).unwrap(),
             );
 
-            let message = Message::new(None, Bytes::from(json), Some(headers));
+            let message = AppendableMessage::new(None, Bytes::from(json), Some(headers));
             messages.push(message);
             // This is used for the logging purposes only.
             serializable_messages.push(serializable_message);
         }
         client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: Identifier::numeric(args.stream_id)?,
                 topic_id: Identifier::numeric(args.topic_id)?,
                 partitioning: Partitioning::partition_id(args.partition_id),
diff --git a/examples/src/shared/system.rs b/examples/src/shared/system.rs
index c4e711d..4b92e62 100644
--- a/examples/src/shared/system.rs
+++ b/examples/src/shared/system.rs
@@ -4,7 +4,7 @@
 use iggy::error::IggyError;
 use iggy::identifier::Identifier;
 use iggy::messages::poll_messages::{PollMessages, PollingStrategy};
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy::streams::create_stream::CreateStream;
 use iggy::streams::get_stream::GetStream;
 use iggy::topics::create_topic::CreateTopic;
@@ -12,7 +12,7 @@
 use iggy::users::defaults::*;
 use iggy::users::login_user::LoginUser;
 use tracing::info;
-type MessageHandler = dyn Fn(&Message) -> Result<(), Box<dyn std::error::Error>>;
+type MessageHandler = dyn Fn(&PolledMessage) -> Result<(), Box<dyn std::error::Error>>;
 
 pub async fn login_root(client: &dyn Client) {
     client
diff --git a/integration/tests/cli/message/test_message_poll_command.rs b/integration/tests/cli/message/test_message_poll_command.rs
index 2953d1a..b17eab2 100644
--- a/integration/tests/cli/message/test_message_poll_command.rs
+++ b/integration/tests/cli/message/test_message_poll_command.rs
@@ -4,8 +4,8 @@
 };
 use assert_cmd::assert::Assert;
 use async_trait::async_trait;
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::messages::poll_messages::{PollingKind, PollingStrategy};
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
 use iggy::streams::create_stream::CreateStream;
 use iggy::streams::delete_stream::DeleteStream;
 use iggy::topics::create_topic::CreateTopic;
@@ -121,11 +121,11 @@
         let messages = self
             .messages
             .iter()
-            .filter_map(|s| Message::from_str(s).ok())
+            .filter_map(|s| AppendableMessage::from_str(s).ok())
             .collect::<Vec<_>>();
 
         let send_status = client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: Identifier::numeric(self.stream_id).unwrap(),
                 topic_id: Identifier::numeric(self.topic_id).unwrap(),
                 partitioning: Partitioning::partition_id(self.partition_id),
diff --git a/integration/tests/cli/stream/test_stream_purge_command.rs b/integration/tests/cli/stream/test_stream_purge_command.rs
index 41e6f41..97bdd5c 100644
--- a/integration/tests/cli/stream/test_stream_purge_command.rs
+++ b/integration/tests/cli/stream/test_stream_purge_command.rs
@@ -6,7 +6,7 @@
 use async_trait::async_trait;
 use iggy::client::Client;
 use iggy::identifier::Identifier;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::streams::create_stream::CreateStream;
 use iggy::streams::delete_stream::DeleteStream;
 use iggy::streams::get_stream::GetStream;
@@ -68,11 +68,11 @@
 
         let messages = (1..100)
             .map(|n| format!("message {}", n))
-            .filter_map(|s| Message::from_str(s.as_str()).ok())
+            .filter_map(|s| AppendableMessage::from_str(s.as_str()).ok())
             .collect::<Vec<_>>();
 
         let send_status = client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: Identifier::numeric(self.stream_id).unwrap(),
                 topic_id: Identifier::numeric(self.topic_id).unwrap(),
                 partitioning: Partitioning::default(),
diff --git a/integration/tests/cli/topic/test_topic_purge_command.rs b/integration/tests/cli/topic/test_topic_purge_command.rs
index 19f534c..52ed0b8 100644
--- a/integration/tests/cli/topic/test_topic_purge_command.rs
+++ b/integration/tests/cli/topic/test_topic_purge_command.rs
@@ -4,7 +4,7 @@
 };
 use assert_cmd::assert::Assert;
 use async_trait::async_trait;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::streams::create_stream::CreateStream;
 use iggy::streams::delete_stream::DeleteStream;
 use iggy::topics::create_topic::CreateTopic;
@@ -84,11 +84,11 @@
 
         let messages = (1..100)
             .map(|n| format!("message {}", n))
-            .filter_map(|s| Message::from_str(s.as_str()).ok())
+            .filter_map(|s| AppendableMessage::from_str(s.as_str()).ok())
             .collect::<Vec<_>>();
 
         let send_status = client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: Identifier::numeric(self.stream_id).unwrap(),
                 topic_id: Identifier::numeric(self.topic_id).unwrap(),
                 partitioning: Partitioning::default(),
diff --git a/integration/tests/server/scenarios/consumer_group_with_multiple_clients_polling_messages_scenario.rs b/integration/tests/server/scenarios/consumer_group_with_multiple_clients_polling_messages_scenario.rs
index e1f90fe..571850e 100644
--- a/integration/tests/server/scenarios/consumer_group_with_multiple_clients_polling_messages_scenario.rs
+++ b/integration/tests/server/scenarios/consumer_group_with_multiple_clients_polling_messages_scenario.rs
@@ -5,8 +5,8 @@
 use iggy::consumer_groups::get_consumer_group::GetConsumerGroup;
 use iggy::consumer_groups::join_consumer_group::JoinConsumerGroup;
 use iggy::identifier::Identifier;
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::messages::poll_messages::{PollMessages, PollingStrategy};
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
 use iggy::models::consumer_group::ConsumerGroupDetails;
 use iggy::streams::create_stream::CreateStream;
 use iggy::streams::delete_stream::DeleteStream;
@@ -133,9 +133,9 @@
 ) {
     // 1. Send messages to the calculated partition ID on the server side by using entity ID as a key
     for entity_id in 1..=MESSAGES_COUNT {
-        let message = Message::from_str(&get_message_payload(entity_id)).unwrap();
+        let message = AppendableMessage::from_str(&get_message_payload(entity_id)).unwrap();
         let messages = vec![message];
-        let mut send_messages = SendMessages {
+        let mut send_messages = AppendMessages {
             stream_id: Identifier::numeric(STREAM_ID).unwrap(),
             topic_id: Identifier::numeric(TOPIC_ID).unwrap(),
             partitioning: Partitioning::messages_key_u32(entity_id),
@@ -194,9 +194,10 @@
         }
 
         let message =
-            Message::from_str(&get_extended_message_payload(partition_id, entity_id)).unwrap();
+            AppendableMessage::from_str(&get_extended_message_payload(partition_id, entity_id))
+                .unwrap();
         let messages = vec![message];
-        let mut send_messages = SendMessages {
+        let mut send_messages = AppendMessages {
             stream_id: Identifier::numeric(STREAM_ID).unwrap(),
             topic_id: Identifier::numeric(TOPIC_ID).unwrap(),
             partitioning: Partitioning::balanced(),
diff --git a/integration/tests/server/scenarios/consumer_group_with_single_client_polling_messages_scenario.rs b/integration/tests/server/scenarios/consumer_group_with_single_client_polling_messages_scenario.rs
index 247bf30..2423fab 100644
--- a/integration/tests/server/scenarios/consumer_group_with_single_client_polling_messages_scenario.rs
+++ b/integration/tests/server/scenarios/consumer_group_with_single_client_polling_messages_scenario.rs
@@ -5,8 +5,8 @@
 use iggy::consumer_groups::get_consumer_group::GetConsumerGroup;
 use iggy::consumer_groups::join_consumer_group::JoinConsumerGroup;
 use iggy::identifier::Identifier;
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::messages::poll_messages::{PollMessages, PollingStrategy};
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
 use iggy::streams::create_stream::CreateStream;
 use iggy::streams::delete_stream::DeleteStream;
 use iggy::system::get_me::GetMe;
@@ -104,9 +104,9 @@
 async fn execute_using_messages_key_key(client: &IggyClient) {
     // 1. Send messages to the calculated partition ID on the server side by using entity ID as a key
     for entity_id in 1..=MESSAGES_COUNT {
-        let message = Message::from_str(&get_message_payload(entity_id)).unwrap();
+        let message = AppendableMessage::from_str(&get_message_payload(entity_id)).unwrap();
         let messages = vec![message];
-        let mut send_messages = SendMessages {
+        let mut send_messages = AppendMessages {
             stream_id: Identifier::numeric(STREAM_ID).unwrap(),
             topic_id: Identifier::numeric(TOPIC_ID).unwrap(),
             partitioning: Partitioning::messages_key_u32(entity_id),
@@ -148,9 +148,10 @@
         }
 
         let message =
-            Message::from_str(&get_extended_message_payload(partition_id, entity_id)).unwrap();
+            AppendableMessage::from_str(&get_extended_message_payload(partition_id, entity_id))
+                .unwrap();
         let messages = vec![message];
-        let mut send_messages = SendMessages {
+        let mut send_messages = AppendMessages {
             stream_id: Identifier::numeric(STREAM_ID).unwrap(),
             topic_id: Identifier::numeric(TOPIC_ID).unwrap(),
             partitioning: Partitioning::balanced(),
diff --git a/integration/tests/server/scenarios/message_headers_scenario.rs b/integration/tests/server/scenarios/message_headers_scenario.rs
index 306ef1c..213e5e4 100644
--- a/integration/tests/server/scenarios/message_headers_scenario.rs
+++ b/integration/tests/server/scenarios/message_headers_scenario.rs
@@ -3,8 +3,8 @@
 use iggy::clients::client::{IggyClient, IggyClientConfig};
 use iggy::consumer::Consumer;
 use iggy::identifier::Identifier;
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::messages::poll_messages::{PollMessages, PollingStrategy};
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
 use iggy::models::header::{HeaderKey, HeaderValue};
 use iggy::streams::create_stream::CreateStream;
 use iggy::streams::delete_stream::DeleteStream;
@@ -34,7 +34,7 @@
         let id = (offset + 1) as u128;
         let payload = get_message_payload(offset as u64);
         let headers = get_message_headers();
-        messages.push(Message {
+        messages.push(AppendableMessage {
             id,
             length: payload.len() as u32,
             payload,
@@ -42,7 +42,7 @@
         });
     }
 
-    let mut send_messages = SendMessages {
+    let mut send_messages = AppendMessages {
         stream_id: Identifier::numeric(STREAM_ID).unwrap(),
         topic_id: Identifier::numeric(TOPIC_ID).unwrap(),
         partitioning: Partitioning::partition_id(PARTITION_ID),
diff --git a/integration/tests/server/scenarios/system_scenario.rs b/integration/tests/server/scenarios/system_scenario.rs
index 82f1cc2..87e76ab 100644
--- a/integration/tests/server/scenarios/system_scenario.rs
+++ b/integration/tests/server/scenarios/system_scenario.rs
@@ -15,8 +15,8 @@
 use iggy::consumer_offsets::store_consumer_offset::StoreConsumerOffset;
 use iggy::error::IggyError;
 use iggy::identifier::Identifier;
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::messages::poll_messages::{PollMessages, PollingStrategy};
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
 use iggy::partitions::create_partitions::CreatePartitions;
 use iggy::partitions::delete_partitions::DeletePartitions;
 use iggy::streams::create_stream::CreateStream;
@@ -222,7 +222,7 @@
 
     // 17. Send messages to the specific topic and partition
     let messages = create_messages();
-    let mut send_messages = SendMessages {
+    let mut send_messages = AppendMessages {
         stream_id: Identifier::numeric(STREAM_ID).unwrap(),
         topic_id: Identifier::numeric(TOPIC_ID).unwrap(),
         partitioning: Partitioning::partition_id(PARTITION_ID),
@@ -649,7 +649,7 @@
 
     // 39. Purge the existing stream and ensure it has no messages
     let messages = create_messages();
-    let mut send_messages = SendMessages {
+    let mut send_messages = AppendMessages {
         stream_id: Identifier::numeric(STREAM_ID).unwrap(),
         topic_id: Identifier::numeric(TOPIC_ID).unwrap(),
         partitioning: Partitioning::partition_id(PARTITION_ID),
@@ -753,19 +753,19 @@
     assert_clean_system(&client).await;
 }
 
-fn assert_message(message: &iggy::models::messages::Message, offset: u64) {
+fn assert_message(message: &iggy::models::polled_messages::PolledMessage, offset: u64) {
     let expected_payload = get_message_payload(offset);
     assert!(message.timestamp > 0);
     assert_eq!(message.offset, offset);
     assert_eq!(message.payload, expected_payload);
 }
 
-fn create_messages() -> Vec<Message> {
+fn create_messages() -> Vec<AppendableMessage> {
     let mut messages = Vec::new();
     for offset in 0..MESSAGES_COUNT {
         let id = (offset + 1) as u128;
         let payload = get_message_payload(offset as u64);
-        messages.push(Message {
+        messages.push(AppendableMessage {
             id,
             length: payload.len() as u32,
             payload,
diff --git a/integration/tests/streaming/messages.rs b/integration/tests/streaming/messages.rs
index 81ac74e..7fcf740 100644
--- a/integration/tests/streaming/messages.rs
+++ b/integration/tests/streaming/messages.rs
@@ -1,7 +1,7 @@
 use crate::streaming::common::test_setup::TestSetup;
 use bytes::Bytes;
 use iggy::models::header::{HeaderKey, HeaderValue};
-use iggy::models::messages::{Message, MessageState};
+use iggy::models::polled_messages::{MessageState, PolledMessage};
 use iggy::utils::{checksum, timestamp::IggyTimestamp};
 use server::configs::system::{PartitionConfig, SystemConfig};
 use server::streaming::partitions::partition::Partition;
@@ -56,7 +56,7 @@
             HeaderKey::new("key-3").unwrap(),
             HeaderValue::from_uint64(123456).unwrap(),
         );
-        let appended_message = Message::create(
+        let appended_message = PolledMessage::create(
             offset,
             state,
             timestamp,
@@ -65,7 +65,7 @@
             checksum,
             Some(headers.clone()),
         );
-        let message = Message::create(
+        let message = PolledMessage::create(
             offset,
             state,
             timestamp,
diff --git a/integration/tests/streaming/mod.rs b/integration/tests/streaming/mod.rs
index b52769a..1b096ce 100644
--- a/integration/tests/streaming/mod.rs
+++ b/integration/tests/streaming/mod.rs
@@ -1,5 +1,5 @@
 use bytes::Bytes;
-use iggy::models::messages::{Message, MessageState};
+use iggy::models::polled_messages::{MessageState, PolledMessage};
 use iggy::utils::checksum;
 
 mod common;
@@ -15,7 +15,7 @@
 mod topic_messages;
 mod user;
 
-fn create_messages() -> Vec<Message> {
+fn create_messages() -> Vec<PolledMessage> {
     vec![
         create_message(0, 1, "message 1"),
         create_message(1, 2, "message 2"),
@@ -26,10 +26,10 @@
     ]
 }
 
-fn create_message(offset: u64, id: u128, payload: &str) -> Message {
+fn create_message(offset: u64, id: u128, payload: &str) -> PolledMessage {
     let payload = Bytes::from(payload.to_string());
     let checksum = checksum::calculate(payload.as_ref());
-    Message::create(
+    PolledMessage::create(
         offset,
         MessageState::Available,
         1,
diff --git a/integration/tests/streaming/segment.rs b/integration/tests/streaming/segment.rs
index fb9c503..3eef9f2 100644
--- a/integration/tests/streaming/segment.rs
+++ b/integration/tests/streaming/segment.rs
@@ -1,6 +1,6 @@
 use crate::streaming::common::test_setup::TestSetup;
 use bytes::Bytes;
-use iggy::models::messages::{Message, MessageState};
+use iggy::models::polled_messages::{MessageState, PolledMessage};
 use iggy::utils::{checksum, timestamp::IggyTimestamp};
 use server::streaming::segments::segment;
 use server::streaming::segments::segment::{INDEX_EXTENSION, LOG_EXTENSION, TIME_INDEX_EXTENSION};
@@ -254,10 +254,10 @@
     assert!(fs::metadata(&time_index_path).await.is_ok());
 }
 
-fn create_message(offset: u64, payload: &str, timestamp: u64) -> Message {
+fn create_message(offset: u64, payload: &str, timestamp: u64) -> PolledMessage {
     let payload = Bytes::from(payload.to_string());
     let checksum = checksum::calculate(payload.as_ref());
-    Message::create(
+    PolledMessage::create(
         offset,
         MessageState::Available,
         timestamp,
diff --git a/integration/tests/streaming/stream.rs b/integration/tests/streaming/stream.rs
index e69cbe9..91c283d 100644
--- a/integration/tests/streaming/stream.rs
+++ b/integration/tests/streaming/stream.rs
@@ -1,8 +1,8 @@
 use crate::streaming::common::test_setup::TestSetup;
 use crate::streaming::create_messages;
 use iggy::identifier::Identifier;
+use iggy::messages::append_messages::Partitioning;
 use iggy::messages::poll_messages::PollingStrategy;
-use iggy::messages::send_messages::Partitioning;
 use server::streaming::polling_consumer::PollingConsumer;
 use server::streaming::streams::stream::Stream;
 use tokio::fs;
diff --git a/integration/tests/streaming/topic.rs b/integration/tests/streaming/topic.rs
index 46aaaca..d480a3d 100644
--- a/integration/tests/streaming/topic.rs
+++ b/integration/tests/streaming/topic.rs
@@ -1,7 +1,7 @@
 use crate::streaming::common::test_setup::TestSetup;
 use crate::streaming::create_messages;
+use iggy::messages::append_messages::Partitioning;
 use iggy::messages::poll_messages::PollingStrategy;
-use iggy::messages::send_messages::Partitioning;
 use server::streaming::polling_consumer::PollingConsumer;
 use server::streaming::topics::topic::Topic;
 use tokio::fs;
diff --git a/integration/tests/streaming/topic_messages.rs b/integration/tests/streaming/topic_messages.rs
index 37b5813..d6cdbe1 100644
--- a/integration/tests/streaming/topic_messages.rs
+++ b/integration/tests/streaming/topic_messages.rs
@@ -1,8 +1,8 @@
 use crate::streaming::common::test_setup::TestSetup;
+use iggy::messages::append_messages;
+use iggy::messages::append_messages::Partitioning;
 use iggy::messages::poll_messages::PollingStrategy;
-use iggy::messages::send_messages;
-use iggy::messages::send_messages::Partitioning;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy::utils::byte_size::IggyByteSize;
 use server::configs::resource_quota::MemoryResourceQuota;
 use server::configs::system::{CacheConfig, SystemConfig};
@@ -212,8 +212,8 @@
     topic
 }
 
-fn get_message(payload: &str) -> Message {
-    Message::from_message(&send_messages::Message::from_str(payload).unwrap())
+fn get_message(payload: &str) -> PolledMessage {
+    PolledMessage::from_message(&append_messages::AppendableMessage::from_str(payload).unwrap())
 }
 
 fn create_payload(size: u32) -> String {
diff --git a/sdk/src/binary/mapper.rs b/sdk/src/binary/mapper.rs
index d0d1ab7..a9d6079 100644
--- a/sdk/src/binary/mapper.rs
+++ b/sdk/src/binary/mapper.rs
@@ -4,10 +4,10 @@
 use crate::models::consumer_group::{ConsumerGroup, ConsumerGroupDetails, ConsumerGroupMember};
 use crate::models::consumer_offset_info::ConsumerOffsetInfo;
 use crate::models::identity_info::IdentityInfo;
-use crate::models::messages::{Message, MessageState, PolledMessages};
 use crate::models::partition::Partition;
 use crate::models::permissions::Permissions;
 use crate::models::personal_access_token::{PersonalAccessTokenInfo, RawPersonalAccessToken};
+use crate::models::polled_messages::{MessageState, PolledMessage, PolledMessages};
 use crate::models::stats::Stats;
 use crate::models::stream::{Stream, StreamDetails};
 use crate::models::topic::{Topic, TopicDetails};
@@ -18,7 +18,7 @@
 use std::collections::HashMap;
 use std::str::from_utf8;
 
-const EMPTY_MESSAGES: Vec<Message> = vec![];
+const EMPTY_MESSAGES: Vec<PolledMessage> = vec![];
 const EMPTY_TOPICS: Vec<Topic> = vec![];
 const EMPTY_STREAMS: Vec<Stream> = vec![];
 const EMPTY_CLIENTS: Vec<ClientInfo> = vec![];
@@ -264,7 +264,7 @@
         let payload = payload[payload_range].to_vec();
         let total_size = 45 + message_length as usize;
         position += total_size;
-        messages.push(Message {
+        messages.push(PolledMessage {
             offset,
             timestamp,
             state,
diff --git a/sdk/src/binary/messages.rs b/sdk/src/binary/messages.rs
index 0f95ad7..b22e843 100644
--- a/sdk/src/binary/messages.rs
+++ b/sdk/src/binary/messages.rs
@@ -4,9 +4,9 @@
 use crate::client::MessageClient;
 use crate::command::{POLL_MESSAGES_CODE, SEND_MESSAGES_CODE};
 use crate::error::IggyError;
+use crate::messages::append_messages::AppendMessages;
 use crate::messages::poll_messages::PollMessages;
-use crate::messages::send_messages::SendMessages;
-use crate::models::messages::PolledMessages;
+use crate::models::polled_messages::PolledMessages;
 
 #[async_trait::async_trait]
 impl<B: BinaryClient> MessageClient for B {
@@ -18,7 +18,7 @@
         mapper::map_polled_messages(&response)
     }
 
-    async fn send_messages(&self, command: &mut SendMessages) -> Result<(), IggyError> {
+    async fn send_messages(&self, command: &mut AppendMessages) -> Result<(), IggyError> {
         fail_if_not_authenticated(self).await?;
         self.send_with_response(SEND_MESSAGES_CODE, &command.as_bytes())
             .await?;
diff --git a/sdk/src/cli/message/send_messages.rs b/sdk/src/cli/message/send_messages.rs
index 4e3b94c..a8155dc 100644
--- a/sdk/src/cli/message/send_messages.rs
+++ b/sdk/src/cli/message/send_messages.rs
@@ -1,7 +1,7 @@
 use crate::cli_command::{CliCommand, PRINT_TARGET};
 use crate::client::Client;
 use crate::identifier::Identifier;
-use crate::messages::send_messages::{Message, Partitioning, SendMessages};
+use crate::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use anyhow::Context;
 use async_trait::async_trait;
 use std::io::{self, Read};
@@ -65,20 +65,20 @@
         let messages = match &self.messages {
             Some(messages) => messages
                 .iter()
-                .map(|s| Message::new(None, s.clone().into(), None))
+                .map(|s| AppendableMessage::new(None, s.clone().into(), None))
                 .collect::<Vec<_>>(),
             None => {
                 let input = self.read_message_from_stdin()?;
 
                 input
                     .lines()
-                    .map(|m| Message::new(None, String::from(m).into(), None))
+                    .map(|m| AppendableMessage::new(None, String::from(m).into(), None))
                     .collect()
             }
         };
 
         client
-            .send_messages(&mut SendMessages {
+            .send_messages(&mut AppendMessages {
                 stream_id: self.stream_id.clone(),
                 topic_id: self.topic_id.clone(),
                 partitioning: self.partitioning.clone(),
diff --git a/sdk/src/client.rs b/sdk/src/client.rs
index 737ef5d..9e512f7 100644
--- a/sdk/src/client.rs
+++ b/sdk/src/client.rs
@@ -7,14 +7,14 @@
 use crate::consumer_offsets::get_consumer_offset::GetConsumerOffset;
 use crate::consumer_offsets::store_consumer_offset::StoreConsumerOffset;
 use crate::error::IggyError;
+use crate::messages::append_messages::AppendMessages;
 use crate::messages::poll_messages::PollMessages;
-use crate::messages::send_messages::SendMessages;
 use crate::models::client_info::{ClientInfo, ClientInfoDetails};
 use crate::models::consumer_group::{ConsumerGroup, ConsumerGroupDetails};
 use crate::models::consumer_offset_info::ConsumerOffsetInfo;
 use crate::models::identity_info::IdentityInfo;
-use crate::models::messages::PolledMessages;
 use crate::models::personal_access_token::{PersonalAccessTokenInfo, RawPersonalAccessToken};
+use crate::models::polled_messages::PolledMessages;
 use crate::models::stats::Stats;
 use crate::models::stream::{Stream, StreamDetails};
 use crate::models::topic::{Topic, TopicDetails};
@@ -250,7 +250,7 @@
     /// Send messages using specified partitioning strategy to the given stream and topic by unique IDs or names.
     ///
     /// Authentication is required, and the permission to send the messages.
-    async fn send_messages(&self, command: &mut SendMessages) -> Result<(), IggyError>;
+    async fn send_messages(&self, command: &mut AppendMessages) -> Result<(), IggyError>;
 }
 
 /// This trait defines the methods to interact with the consumer offset module.
diff --git a/sdk/src/clients/client.rs b/sdk/src/clients/client.rs
index a0df6c7..35f2b70 100644
--- a/sdk/src/clients/client.rs
+++ b/sdk/src/clients/client.rs
@@ -14,14 +14,14 @@
 use crate::error::IggyError;
 use crate::identifier::Identifier;
 use crate::message_handler::MessageHandler;
+use crate::messages::append_messages::{AppendMessages, Partitioning, PartitioningKind};
 use crate::messages::poll_messages::{PollMessages, PollingKind};
-use crate::messages::send_messages::{Partitioning, PartitioningKind, SendMessages};
 use crate::models::client_info::{ClientInfo, ClientInfoDetails};
 use crate::models::consumer_group::{ConsumerGroup, ConsumerGroupDetails};
 use crate::models::consumer_offset_info::ConsumerOffsetInfo;
 use crate::models::identity_info::IdentityInfo;
-use crate::models::messages::{Message, PolledMessages};
 use crate::models::personal_access_token::{PersonalAccessTokenInfo, RawPersonalAccessToken};
+use crate::models::polled_messages::{PolledMessage, PolledMessages};
 use crate::models::stats::Stats;
 use crate::models::stream::{Stream, StreamDetails};
 use crate::models::topic::{Topic, TopicDetails};
@@ -84,7 +84,7 @@
     partitioner: Option<Box<dyn Partitioner>>,
     encryptor: Option<Box<dyn Encryptor>>,
     message_handler: Option<Arc<Box<dyn MessageHandler>>>,
-    message_channel_sender: Option<Arc<Sender<Message>>>,
+    message_channel_sender: Option<Arc<Sender<PolledMessage>>>,
 }
 
 /// The builder for the `IggyClient` instance, which allows to configure and provide custom implementations for the partitioner, encryptor or message handler.
@@ -134,7 +134,7 @@
 
 #[derive(Debug)]
 struct SendMessagesBatch {
-    pub commands: VecDeque<SendMessages>,
+    pub commands: VecDeque<AppendMessages>,
 }
 
 /// The optional configuration for the `IggyClient` instance, consisting of the optional configuration for sending and polling the messages in the background.
@@ -265,7 +265,7 @@
     }
 
     /// Returns the channel receiver for the messages which are polled in the background. This will only work if the `start_polling_messages` method is called.
-    pub fn subscribe_to_polled_messages(&mut self) -> Receiver<Message> {
+    pub fn subscribe_to_polled_messages(&mut self) -> Receiver<PolledMessage> {
         let (sender, receiver) = flume::unbounded();
         self.message_channel_sender = Some(Arc::new(sender));
         receiver
@@ -279,7 +279,7 @@
         config_override: Option<PollMessagesConfig>,
     ) -> JoinHandle<()>
     where
-        F: Fn(Message) + Send + Sync + 'static,
+        F: Fn(PolledMessage) + Send + Sync + 'static,
     {
         let client = self.client.clone();
         let mut interval = Duration::from_millis(100);
@@ -363,7 +363,7 @@
     /// Sends the provided messages in the background using the custom partitioner implementation.
     pub async fn send_messages_using_partitioner(
         &self,
-        command: &mut SendMessages,
+        command: &mut AppendMessages,
         partitioner: &dyn Partitioner,
     ) -> Result<(), IggyError> {
         let partition_id = partitioner.calculate_partition_id(
@@ -462,7 +462,7 @@
                 }
 
                 while let Some(messages) = batches.pop_front() {
-                    let mut send_messages = SendMessages {
+                    let mut send_messages = AppendMessages {
                         stream_id: Identifier::from_identifier(&stream_id),
                         topic_id: Identifier::from_identifier(&topic_id),
                         partitioning: Partitioning {
@@ -690,7 +690,7 @@
         Ok(polled_messages)
     }
 
-    async fn send_messages(&self, command: &mut SendMessages) -> Result<(), IggyError> {
+    async fn send_messages(&self, command: &mut AppendMessages) -> Result<(), IggyError> {
         if command.messages.is_empty() {
             return Ok(());
         }
@@ -724,7 +724,7 @@
 
         let mut messages = Vec::with_capacity(command.messages.len());
         for message in &command.messages {
-            let message = crate::messages::send_messages::Message {
+            let message = crate::messages::append_messages::AppendableMessage {
                 id: message.id,
                 length: message.length,
                 payload: message.payload.clone(),
@@ -732,7 +732,7 @@
             };
             messages.push(message);
         }
-        let send_messages = SendMessages {
+        let send_messages = AppendMessages {
             stream_id: Identifier::from_identifier(&command.stream_id),
             topic_id: Identifier::from_identifier(&command.topic_id),
             partitioning: Partitioning::from_partitioning(&command.partitioning),
diff --git a/sdk/src/command.rs b/sdk/src/command.rs
index 6c85c49..29963ed 100644
--- a/sdk/src/command.rs
+++ b/sdk/src/command.rs
@@ -8,8 +8,8 @@
 use crate::consumer_offsets::get_consumer_offset::GetConsumerOffset;
 use crate::consumer_offsets::store_consumer_offset::StoreConsumerOffset;
 use crate::error::IggyError;
+use crate::messages::append_messages::AppendMessages;
 use crate::messages::poll_messages::PollMessages;
-use crate::messages::send_messages::SendMessages;
 use crate::partitions::create_partitions::CreatePartitions;
 use crate::partitions::delete_partitions::DeletePartitions;
 use crate::personal_access_tokens::create_personal_access_token::CreatePersonalAccessToken;
@@ -150,7 +150,7 @@
     CreatePersonalAccessToken(CreatePersonalAccessToken),
     DeletePersonalAccessToken(DeletePersonalAccessToken),
     LoginWithPersonalAccessToken(LoginWithPersonalAccessToken),
-    SendMessages(SendMessages),
+    SendMessages(AppendMessages),
     PollMessages(PollMessages),
     GetConsumerOffset(GetConsumerOffset),
     StoreConsumerOffset(StoreConsumerOffset),
@@ -291,7 +291,7 @@
             LOGIN_WITH_PERSONAL_ACCESS_TOKEN_CODE => Ok(Command::LoginWithPersonalAccessToken(
                 LoginWithPersonalAccessToken::from_bytes(payload)?,
             )),
-            SEND_MESSAGES_CODE => Ok(Command::SendMessages(SendMessages::from_bytes(payload)?)),
+            SEND_MESSAGES_CODE => Ok(Command::SendMessages(AppendMessages::from_bytes(payload)?)),
             POLL_MESSAGES_CODE => Ok(Command::PollMessages(PollMessages::from_bytes(payload)?)),
             STORE_CONSUMER_OFFSET_CODE => Ok(Command::StoreConsumerOffset(
                 StoreConsumerOffset::from_bytes(payload)?,
@@ -525,9 +525,9 @@
             &LoginWithPersonalAccessToken::default(),
         );
         assert_serialized_as_bytes_and_deserialized_from_bytes(
-            &Command::SendMessages(SendMessages::default()),
+            &Command::SendMessages(AppendMessages::default()),
             SEND_MESSAGES_CODE,
-            &SendMessages::default(),
+            &AppendMessages::default(),
         );
         assert_serialized_as_bytes_and_deserialized_from_bytes(
             &Command::PollMessages(PollMessages::default()),
diff --git a/sdk/src/http/messages.rs b/sdk/src/http/messages.rs
index ee4a5ab..65e2130 100644
--- a/sdk/src/http/messages.rs
+++ b/sdk/src/http/messages.rs
@@ -1,9 +1,9 @@
 use crate::client::MessageClient;
 use crate::error::IggyError;
 use crate::http::client::HttpClient;
+use crate::messages::append_messages::AppendMessages;
 use crate::messages::poll_messages::PollMessages;
-use crate::messages::send_messages::SendMessages;
-use crate::models::messages::PolledMessages;
+use crate::models::polled_messages::PolledMessages;
 use async_trait::async_trait;
 
 #[async_trait]
@@ -22,7 +22,7 @@
         Ok(messages)
     }
 
-    async fn send_messages(&self, command: &mut SendMessages) -> Result<(), IggyError> {
+    async fn send_messages(&self, command: &mut AppendMessages) -> Result<(), IggyError> {
         self.post(
             &get_path(
                 &command.stream_id.as_string(),
diff --git a/sdk/src/message_handler.rs b/sdk/src/message_handler.rs
index 3b5295d..84e54ac 100644
--- a/sdk/src/message_handler.rs
+++ b/sdk/src/message_handler.rs
@@ -1,7 +1,7 @@
-use crate::models::messages::Message;
+use crate::models::polled_messages::PolledMessage;
 use std::fmt::Debug;
 
 /// The trait represent the logic responsible for handling the message and is used by the `IggyClient`.
 pub trait MessageHandler: Send + Sync + Debug {
-    fn handle(&self, message: Message);
+    fn handle(&self, message: PolledMessage);
 }
diff --git a/sdk/src/messages/send_messages.rs b/sdk/src/messages/append_messages.rs
similarity index 92%
rename from sdk/src/messages/send_messages.rs
rename to sdk/src/messages/append_messages.rs
index 3349411..96d0698 100644
--- a/sdk/src/messages/send_messages.rs
+++ b/sdk/src/messages/append_messages.rs
@@ -23,7 +23,7 @@
 /// - `partitioning` - to which partition the messages should be sent - either provided by the client or calculated by the server.
 /// - `messages` - collection of messages to be sent.
 #[derive(Debug, Serialize, Deserialize, PartialEq)]
-pub struct SendMessages {
+pub struct AppendMessages {
     /// Unique stream ID (numeric or name).
     #[serde(skip)]
     pub stream_id: Identifier,
@@ -33,7 +33,7 @@
     /// To which partition the messages should be sent - either provided by the client or calculated by the server.
     pub partitioning: Partitioning,
     /// Collection of messages to be sent.
-    pub messages: Vec<Message>,
+    pub messages: Vec<AppendableMessage>,
 }
 
 /// `Partitioning` is used to specify to which partition the messages should be sent.
@@ -54,14 +54,14 @@
     pub value: Vec<u8>,
 }
 
-/// The single message to be sent. It has the following payload:
+/// The single message to be sent (appended). It has the following payload:
 /// - `id` - unique message ID, if not specified by the client (has value = 0), it will be generated by the server.
 /// - `length` - length of the payload.
 /// - `payload` - binary message payload.
 /// - `headers` - optional collection of headers.
 #[serde_as]
 #[derive(Debug, Serialize, Deserialize, PartialEq)]
-pub struct Message {
+pub struct AppendableMessage {
     /// Unique message ID, if not specified by the client (has value = 0), it will be generated by the server.
     #[serde(default = "default_message_id")]
     pub id: u128,
@@ -92,13 +92,13 @@
     0
 }
 
-impl Default for SendMessages {
+impl Default for AppendMessages {
     fn default() -> Self {
-        SendMessages {
+        AppendMessages {
             stream_id: Identifier::default(),
             topic_id: Identifier::default(),
             partitioning: Partitioning::default(),
-            messages: vec![Message::default()],
+            messages: vec![AppendableMessage::default()],
         }
     }
 }
@@ -190,9 +190,9 @@
     }
 }
 
-impl CommandPayload for SendMessages {}
+impl CommandPayload for AppendMessages {}
 
-impl Validatable<IggyError> for SendMessages {
+impl Validatable<IggyError> for AppendMessages {
     fn validate(&self) -> Result<(), IggyError> {
         if self.messages.is_empty() {
             return Err(IggyError::InvalidMessagesCount);
@@ -251,14 +251,14 @@
     }
 }
 
-impl Message {
+impl AppendableMessage {
     /// Create a new message with the optional ID, payload and headers.
     pub fn new(
         id: Option<u128>,
         payload: Bytes,
         headers: Option<HashMap<HeaderKey, HeaderValue>>,
     ) -> Self {
-        Message {
+        AppendableMessage {
             id: id.unwrap_or(0),
             #[allow(clippy::cast_possible_truncation)]
             length: payload.len() as u32,
@@ -274,10 +274,10 @@
     }
 }
 
-impl Default for Message {
+impl Default for AppendableMessage {
     fn default() -> Self {
         let payload = Bytes::from("hello world");
-        Message {
+        AppendableMessage {
             id: 0,
             length: payload.len() as u32,
             payload,
@@ -286,7 +286,7 @@
     }
 }
 
-impl Display for Message {
+impl Display for AppendableMessage {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(f, "{}|{}", self.id, String::from_utf8_lossy(&self.payload))
     }
@@ -324,7 +324,7 @@
     }
 }
 
-impl BytesSerializable for Message {
+impl BytesSerializable for AppendableMessage {
     fn as_bytes(&self) -> Vec<u8> {
         let mut bytes = Vec::with_capacity(self.get_size_bytes() as usize);
         bytes.put_u128_le(self.id);
@@ -371,7 +371,7 @@
             return Err(IggyError::InvalidMessagePayloadLength);
         }
 
-        Ok(Message {
+        Ok(AppendableMessage {
             id,
             length: payload_length,
             payload,
@@ -380,7 +380,7 @@
     }
 }
 
-impl FromStr for Message {
+impl FromStr for AppendableMessage {
     type Err = IggyError;
     fn from_str(input: &str) -> Result<Self, Self::Err> {
         let id = default_message_id();
@@ -390,7 +390,7 @@
             return Err(IggyError::EmptyMessagePayload);
         }
 
-        Ok(Message {
+        Ok(AppendableMessage {
             id,
             length,
             payload,
@@ -399,12 +399,12 @@
     }
 }
 
-impl BytesSerializable for SendMessages {
+impl BytesSerializable for AppendMessages {
     fn as_bytes(&self) -> Vec<u8> {
         let messages_size = self
             .messages
             .iter()
-            .map(Message::get_size_bytes)
+            .map(AppendableMessage::get_size_bytes)
             .sum::<u32>();
 
         let key_bytes = self.partitioning.as_bytes();
@@ -423,7 +423,7 @@
         bytes
     }
 
-    fn from_bytes(bytes: &[u8]) -> Result<SendMessages, IggyError> {
+    fn from_bytes(bytes: &[u8]) -> Result<AppendMessages, IggyError> {
         if bytes.len() < 11 {
             return Err(IggyError::InvalidCommand);
         }
@@ -439,12 +439,12 @@
         position = 0;
         let mut messages = Vec::new();
         while position < messages_payloads.len() {
-            let message = Message::from_bytes(&messages_payloads[position..])?;
+            let message = AppendableMessage::from_bytes(&messages_payloads[position..])?;
             position += message.get_size_bytes() as usize;
             messages.push(message);
         }
 
-        let command = SendMessages {
+        let command = AppendMessages {
             stream_id,
             topic_id,
             partitioning: key,
@@ -455,7 +455,7 @@
     }
 }
 
-impl Display for SendMessages {
+impl Display for AppendMessages {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         write!(
             f,
@@ -505,11 +505,11 @@
 
     #[test]
     fn should_be_serialized_as_bytes() {
-        let message_1 = Message::from_str("hello 1").unwrap();
-        let message_2 = Message::new(Some(2), "hello 2".into(), None);
-        let message_3 = Message::new(Some(3), "hello 3".into(), None);
+        let message_1 = AppendableMessage::from_str("hello 1").unwrap();
+        let message_2 = AppendableMessage::new(Some(2), "hello 2".into(), None);
+        let message_3 = AppendableMessage::new(Some(3), "hello 3".into(), None);
         let messages = vec![message_1, message_2, message_3];
-        let command = SendMessages {
+        let command = AppendMessages {
             stream_id: Identifier::numeric(1).unwrap(),
             topic_id: Identifier::numeric(2).unwrap(),
             partitioning: Partitioning::partition_id(4),
@@ -546,9 +546,9 @@
         let topic_id = Identifier::numeric(2).unwrap();
         let key = Partitioning::partition_id(4);
 
-        let message_1 = Message::from_str("hello 1").unwrap();
-        let message_2 = Message::new(Some(2), "hello 2".into(), None);
-        let message_3 = Message::new(Some(3), "hello 3".into(), None);
+        let message_1 = AppendableMessage::from_str("hello 1").unwrap();
+        let message_2 = AppendableMessage::new(Some(2), "hello 2".into(), None);
+        let message_3 = AppendableMessage::new(Some(3), "hello 3".into(), None);
         let messages = [
             message_1.as_bytes(),
             message_2.as_bytes(),
@@ -566,14 +566,14 @@
         bytes.extend(key_bytes);
         bytes.extend(messages);
 
-        let command = SendMessages::from_bytes(&bytes);
+        let command = AppendMessages::from_bytes(&bytes);
         assert!(command.is_ok());
 
         let messages_payloads = &bytes[current_position..];
         let mut position = 0;
         let mut messages = Vec::new();
         while position < messages_payloads.len() {
-            let message = Message::from_bytes(&messages_payloads[position..]).unwrap();
+            let message = AppendableMessage::from_bytes(&messages_payloads[position..]).unwrap();
             position += message.get_size_bytes() as usize;
             messages.push(message);
         }
diff --git a/sdk/src/messages/mod.rs b/sdk/src/messages/mod.rs
index d559e03..d9f8486 100644
--- a/sdk/src/messages/mod.rs
+++ b/sdk/src/messages/mod.rs
@@ -1,5 +1,5 @@
+pub mod append_messages;
 pub mod poll_messages;
-pub mod send_messages;
 
 const MAX_HEADERS_SIZE: u32 = 100 * 1000;
 pub const MAX_PAYLOAD_SIZE: u32 = 10 * 1000 * 1000;
diff --git a/sdk/src/models/mod.rs b/sdk/src/models/mod.rs
index c147ac5..7e1a44d 100644
--- a/sdk/src/models/mod.rs
+++ b/sdk/src/models/mod.rs
@@ -3,10 +3,10 @@
 pub mod consumer_offset_info;
 pub mod header;
 pub mod identity_info;
-pub mod messages;
 pub mod partition;
 pub mod permissions;
 pub mod personal_access_token;
+pub mod polled_messages;
 pub mod stats;
 pub mod stream;
 pub mod topic;
diff --git a/sdk/src/models/messages.rs b/sdk/src/models/polled_messages.rs
similarity index 94%
rename from sdk/src/models/messages.rs
rename to sdk/src/models/polled_messages.rs
index a512b94..91c6a56 100644
--- a/sdk/src/models/messages.rs
+++ b/sdk/src/models/polled_messages.rs
@@ -1,6 +1,6 @@
 use crate::bytes_serializable::BytesSerializable;
 use crate::error::IggyError;
-use crate::messages::send_messages;
+use crate::messages::append_messages;
 use crate::models::header;
 use crate::models::header::{HeaderKey, HeaderValue};
 use crate::sizeable::Sizeable;
@@ -26,7 +26,7 @@
     /// The current offset of the partition.
     pub current_offset: u64,
     /// The collection of messages.
-    pub messages: Vec<Message>,
+    pub messages: Vec<PolledMessage>,
 }
 
 /// The single message that is polled from the partition.
@@ -41,7 +41,7 @@
 /// - `payload`: the binary payload of the message.
 #[serde_as]
 #[derive(Debug, Serialize, Deserialize)]
-pub struct Message {
+pub struct PolledMessage {
     /// The offset of the message.
     pub offset: u64,
     /// The state of the message.
@@ -123,15 +123,15 @@
     }
 }
 
-impl Sizeable for Arc<Message> {
+impl Sizeable for Arc<PolledMessage> {
     fn get_size_bytes(&self) -> u32 {
         self.as_ref().get_size_bytes()
     }
 }
 
-impl Message {
+impl PolledMessage {
     /// Creates a new message from the `Message` struct being part of `SendMessages` command.
-    pub fn from_message(message: &send_messages::Message) -> Self {
+    pub fn from_message(message: &append_messages::AppendableMessage) -> Self {
         let timestamp = IggyTimestamp::now().to_micros();
         let checksum = checksum::calculate(&message.payload);
         let headers = message.headers.as_ref().cloned();
@@ -155,7 +155,7 @@
         checksum: u32,
         headers: Option<HashMap<HeaderKey, HeaderValue>>,
     ) -> Self {
-        Message::create(0, state, timestamp, id, payload, checksum, headers)
+        PolledMessage::create(0, state, timestamp, id, payload, checksum, headers)
     }
 
     /// Creates a new message with a specified offset.
@@ -168,7 +168,7 @@
         checksum: u32,
         headers: Option<HashMap<HeaderKey, HeaderValue>>,
     ) -> Self {
-        Message {
+        PolledMessage {
             offset,
             state,
             timestamp,
diff --git a/sdk/src/partitioner.rs b/sdk/src/partitioner.rs
index eac0dbb..a29b154 100644
--- a/sdk/src/partitioner.rs
+++ b/sdk/src/partitioner.rs
@@ -1,6 +1,6 @@
 use crate::error::IggyError;
 use crate::identifier::Identifier;
-use crate::messages::send_messages::{Message, Partitioning};
+use crate::messages::append_messages::{AppendableMessage, Partitioning};
 use std::fmt::Debug;
 
 /// The trait represent the logic responsible for calculating the partition ID and is used by the `IggyClient`.
@@ -11,6 +11,6 @@
         stream_id: &Identifier,
         topic_id: &Identifier,
         partitioning: &Partitioning,
-        messages: &[Message],
+        messages: &[AppendableMessage],
     ) -> Result<u32, IggyError>;
 }
diff --git a/server/src/binary/handlers/messages/send_messages_handler.rs b/server/src/binary/handlers/messages/send_messages_handler.rs
index 2ec1420..8aff95e 100644
--- a/server/src/binary/handlers/messages/send_messages_handler.rs
+++ b/server/src/binary/handlers/messages/send_messages_handler.rs
@@ -3,11 +3,11 @@
 use crate::streaming::systems::system::SharedSystem;
 use anyhow::Result;
 use iggy::error::IggyError;
-use iggy::messages::send_messages::SendMessages;
+use iggy::messages::append_messages::AppendMessages;
 use tracing::debug;
 
 pub async fn handle(
-    command: &SendMessages,
+    command: &AppendMessages,
     sender: &mut dyn Sender,
     session: &Session,
     system: &SharedSystem,
diff --git a/server/src/http/messages.rs b/server/src/http/messages.rs
index 5c8b288..937dec3 100644
--- a/server/src/http/messages.rs
+++ b/server/src/http/messages.rs
@@ -10,8 +10,8 @@
 use axum::routing::get;
 use axum::{Extension, Json, Router};
 use iggy::identifier::Identifier;
+use iggy::messages::append_messages::AppendMessages;
 use iggy::messages::poll_messages::PollMessages;
-use iggy::messages::send_messages::SendMessages;
 use iggy::validatable::Validatable;
 use std::sync::Arc;
 
@@ -54,7 +54,7 @@
     State(state): State<Arc<AppState>>,
     Extension(identity): Extension<Identity>,
     Path((stream_id, topic_id)): Path<(String, String)>,
-    Json(mut command): Json<SendMessages>,
+    Json(mut command): Json<AppendMessages>,
 ) -> Result<StatusCode, CustomError> {
     command.stream_id = Identifier::from_str_value(&stream_id)?;
     command.topic_id = Identifier::from_str_value(&topic_id)?;
diff --git a/server/src/streaming/models/messages.rs b/server/src/streaming/models/messages.rs
index 848b5d3..0fdffee 100644
--- a/server/src/streaming/models/messages.rs
+++ b/server/src/streaming/models/messages.rs
@@ -1,4 +1,4 @@
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use serde::{Deserialize, Serialize};
 use std::sync::Arc;
 
@@ -7,5 +7,5 @@
 pub struct PolledMessages {
     pub partition_id: u32,
     pub current_offset: u64,
-    pub messages: Vec<Arc<Message>>,
+    pub messages: Vec<Arc<PolledMessage>>,
 }
diff --git a/server/src/streaming/partitions/messages.rs b/server/src/streaming/partitions/messages.rs
index 8489996..4b7d1f2 100644
--- a/server/src/streaming/partitions/messages.rs
+++ b/server/src/streaming/partitions/messages.rs
@@ -3,11 +3,11 @@
 use crate::streaming::segments::segment::Segment;
 use crate::streaming::utils::random_id;
 use iggy::error::IggyError;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use std::sync::Arc;
 use tracing::{trace, warn};
 
-const EMPTY_MESSAGES: Vec<Arc<Message>> = vec![];
+const EMPTY_MESSAGES: Vec<Arc<PolledMessage>> = vec![];
 
 impl Partition {
     pub fn get_messages_count(&self) -> u64 {
@@ -29,7 +29,7 @@
         &self,
         timestamp: u64,
         count: u32,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         trace!(
             "Getting messages by timestamp: {} for partition: {}...",
             timestamp,
@@ -86,7 +86,7 @@
         &self,
         start_offset: u64,
         count: u32,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         trace!(
             "Getting messages for start offset: {} for partition: {}...",
             start_offset,
@@ -114,11 +114,17 @@
         }
     }
 
-    pub async fn get_first_messages(&self, count: u32) -> Result<Vec<Arc<Message>>, IggyError> {
+    pub async fn get_first_messages(
+        &self,
+        count: u32,
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         self.get_messages_by_offset(0, count).await
     }
 
-    pub async fn get_last_messages(&self, count: u32) -> Result<Vec<Arc<Message>>, IggyError> {
+    pub async fn get_last_messages(
+        &self,
+        count: u32,
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         let mut count = count as u64;
         if count > self.current_offset + 1 {
             count = self.current_offset + 1
@@ -133,7 +139,7 @@
         &self,
         consumer: PollingConsumer,
         count: u32,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         let (consumer_offsets, consumer_id) = match consumer {
             PollingConsumer::Consumer(consumer_id, _) => (&self.consumer_offsets, consumer_id),
             PollingConsumer::ConsumerGroup(consumer_group_id, _) => {
@@ -199,7 +205,7 @@
         segments: Vec<&Segment>,
         offset: u64,
         count: u32,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         let mut messages = Vec::with_capacity(segments.len());
         for segment in segments {
             let segment_messages = segment.get_messages(offset, count).await?;
@@ -215,7 +221,7 @@
         &self,
         start_offset: u64,
         end_offset: u64,
-    ) -> Option<Vec<Arc<Message>>> {
+    ) -> Option<Vec<Arc<PolledMessage>>> {
         let cache = self.cache.as_ref()?;
         if cache.is_empty() || start_offset > end_offset || end_offset > self.current_offset {
             return None;
@@ -238,7 +244,7 @@
     pub async fn get_newest_messages_by_size(
         &self,
         size_bytes: u32,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         trace!(
             "Getting messages for size: {} bytes for partition: {}...",
             size_bytes,
@@ -272,7 +278,11 @@
         Ok(messages)
     }
 
-    fn load_messages_from_cache(&self, start_offset: u64, end_offset: u64) -> Vec<Arc<Message>> {
+    fn load_messages_from_cache(
+        &self,
+        start_offset: u64,
+        end_offset: u64,
+    ) -> Vec<Arc<PolledMessage>> {
         trace!(
             "Loading messages from cache, start offset: {}, end offset: {}...",
             start_offset,
@@ -317,7 +327,7 @@
         messages
     }
 
-    pub async fn append_messages(&mut self, messages: Vec<Message>) -> Result<(), IggyError> {
+    pub async fn append_messages(&mut self, messages: Vec<PolledMessage>) -> Result<(), IggyError> {
         {
             let last_segment = self.segments.last_mut().ok_or(IggyError::SegmentNotFound)?;
             if last_segment.is_closed {
diff --git a/server/src/streaming/partitions/mod.rs b/server/src/streaming/partitions/mod.rs
index b83c034..72d1f4a 100644
--- a/server/src/streaming/partitions/mod.rs
+++ b/server/src/streaming/partitions/mod.rs
@@ -1,5 +1,5 @@
 use bytes::Bytes;
-use iggy::models::messages::{Message, MessageState};
+use iggy::models::polled_messages::{MessageState, PolledMessage};
 use iggy::utils::checksum;
 
 pub mod consumer_offsets;
@@ -10,7 +10,7 @@
 pub mod storage;
 
 #[allow(dead_code)]
-fn create_messages() -> Vec<Message> {
+fn create_messages() -> Vec<PolledMessage> {
     vec![
         create_message(0, 1, "message 1"),
         create_message(1, 2, "message 2"),
@@ -21,10 +21,10 @@
     ]
 }
 
-fn create_message(offset: u64, id: u128, payload: &str) -> Message {
+fn create_message(offset: u64, id: u128, payload: &str) -> PolledMessage {
     let payload = Bytes::from(payload.to_string());
     let checksum = checksum::calculate(payload.as_ref());
-    Message::create(
+    PolledMessage::create(
         offset,
         MessageState::Available,
         1,
diff --git a/server/src/streaming/partitions/partition.rs b/server/src/streaming/partitions/partition.rs
index 9451395..d9c6ed6 100644
--- a/server/src/streaming/partitions/partition.rs
+++ b/server/src/streaming/partitions/partition.rs
@@ -6,7 +6,7 @@
 use crate::streaming::storage::SystemStorage;
 use dashmap::DashMap;
 use iggy::consumer::ConsumerKind;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy::utils::timestamp::IggyTimestamp;
 use std::sync::Arc;
 
@@ -17,7 +17,7 @@
     pub partition_id: u32,
     pub path: String,
     pub current_offset: u64,
-    pub cache: Option<SmartCache<Arc<Message>>>,
+    pub cache: Option<SmartCache<Arc<PolledMessage>>>,
     pub cached_memory_tracker: Option<Arc<CacheMemoryTracker>>,
     pub message_deduplicator: Option<MessageDeduplicator>,
     pub unsaved_messages_count: u32,
diff --git a/server/src/streaming/segments/messages.rs b/server/src/streaming/segments/messages.rs
index 4122e4a..fe8746f 100644
--- a/server/src/streaming/segments/messages.rs
+++ b/server/src/streaming/segments/messages.rs
@@ -2,11 +2,11 @@
 use crate::streaming::segments::segment::Segment;
 use crate::streaming::segments::time_index::TimeIndex;
 use iggy::error::IggyError;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use std::sync::Arc;
 use tracing::trace;
 
-const EMPTY_MESSAGES: Vec<Arc<Message>> = vec![];
+const EMPTY_MESSAGES: Vec<Arc<PolledMessage>> = vec![];
 
 impl Segment {
     pub fn get_messages_count(&self) -> u64 {
@@ -21,7 +21,7 @@
         &self,
         mut offset: u64,
         count: u32,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         if count == 0 {
             return Ok(EMPTY_MESSAGES);
         }
@@ -62,7 +62,7 @@
         Ok(messages)
     }
 
-    pub async fn get_all_messages(&self) -> Result<Vec<Arc<Message>>, IggyError> {
+    pub async fn get_all_messages(&self) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         self.get_messages(self.start_offset, self.get_messages_count() as u32)
             .await
     }
@@ -70,7 +70,7 @@
     pub async fn get_newest_messages_by_size(
         &self,
         size_bytes: u64,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         let messages = self
             .storage
             .segment
@@ -80,21 +80,25 @@
         Ok(messages)
     }
 
-    fn load_messages_from_unsaved_buffer(&self, offset: u64, end_offset: u64) -> Vec<Arc<Message>> {
+    fn load_messages_from_unsaved_buffer(
+        &self,
+        offset: u64,
+        end_offset: u64,
+    ) -> Vec<Arc<PolledMessage>> {
         self.unsaved_messages
             .as_ref()
             .unwrap()
             .iter()
             .filter(|message| message.offset >= offset && message.offset <= end_offset)
             .cloned()
-            .collect::<Vec<Arc<Message>>>()
+            .collect::<Vec<Arc<PolledMessage>>>()
     }
 
     async fn load_messages_from_disk(
         &self,
         start_offset: u64,
         end_offset: u64,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         trace!(
             "Loading messages from disk, segment start offset: {}, end offset: {}, current offset: {}...",
             start_offset,
@@ -160,7 +164,7 @@
     async fn load_messages_from_segment_file(
         &self,
         index_range: &IndexRange,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         let messages = self
             .storage
             .segment
@@ -176,7 +180,10 @@
         Ok(messages)
     }
 
-    pub async fn append_messages(&mut self, messages: &[Arc<Message>]) -> Result<(), IggyError> {
+    pub async fn append_messages(
+        &mut self,
+        messages: &[Arc<PolledMessage>],
+    ) -> Result<(), IggyError> {
         if self.is_closed {
             return Err(IggyError::SegmentClosed(
                 self.start_offset,
diff --git a/server/src/streaming/segments/segment.rs b/server/src/streaming/segments/segment.rs
index 618cdf5..b3cd20f 100644
--- a/server/src/streaming/segments/segment.rs
+++ b/server/src/streaming/segments/segment.rs
@@ -2,7 +2,7 @@
 use crate::streaming::segments::index::Index;
 use crate::streaming::segments::time_index::TimeIndex;
 use crate::streaming::storage::SystemStorage;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy::utils::timestamp::IggyTimestamp;
 use std::sync::Arc;
 
@@ -25,7 +25,7 @@
     pub current_size_bytes: u32,
     pub is_closed: bool,
     pub(crate) message_expiry: Option<u32>,
-    pub(crate) unsaved_messages: Option<Vec<Arc<Message>>>,
+    pub(crate) unsaved_messages: Option<Vec<Arc<PolledMessage>>>,
     pub(crate) config: Arc<SystemConfig>,
     pub(crate) indexes: Option<Vec<Index>>,
     pub(crate) time_indexes: Option<Vec<TimeIndex>>,
diff --git a/server/src/streaming/segments/storage.rs b/server/src/streaming/segments/storage.rs
index 7e48fa5..e88e74a 100644
--- a/server/src/streaming/segments/storage.rs
+++ b/server/src/streaming/segments/storage.rs
@@ -9,7 +9,7 @@
 use bytes::{BufMut, Bytes};
 use iggy::bytes_serializable::BytesSerializable;
 use iggy::error::IggyError;
-use iggy::models::messages::{Message, MessageState};
+use iggy::models::polled_messages::{MessageState, PolledMessage};
 use iggy::utils::checksum;
 use std::collections::HashMap;
 use std::io::SeekFrom;
@@ -171,11 +171,11 @@
         &self,
         segment: &Segment,
         index_range: &IndexRange,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         let mut messages = Vec::with_capacity(
             1 + (index_range.end.relative_offset - index_range.start.relative_offset) as usize,
         );
-        load_messages_by_range(segment, index_range, |message: Message| {
+        load_messages_by_range(segment, index_range, |message: PolledMessage| {
             messages.push(Arc::new(message));
             Ok(())
         })
@@ -188,10 +188,10 @@
         &self,
         segment: &Segment,
         size_bytes: u64,
-    ) -> Result<Vec<Arc<Message>>, IggyError> {
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
         let mut messages = Vec::new();
         let mut total_size_bytes = 0;
-        load_messages_by_size(segment, size_bytes, |message: Message| {
+        load_messages_by_size(segment, size_bytes, |message: PolledMessage| {
             total_size_bytes += message.get_size_bytes() as u64;
             messages.push(Arc::new(message));
             Ok(())
@@ -208,7 +208,7 @@
     async fn save_messages(
         &self,
         segment: &Segment,
-        messages: &[Arc<Message>],
+        messages: &[Arc<PolledMessage>],
     ) -> Result<u32, IggyError> {
         let messages_size = messages
             .iter()
@@ -234,33 +234,41 @@
 
     async fn load_message_ids(&self, segment: &Segment) -> Result<Vec<u128>, IggyError> {
         let mut message_ids = Vec::new();
-        load_messages_by_range(segment, &IndexRange::max_range(), |message: Message| {
-            message_ids.push(message.id);
-            Ok(())
-        })
+        load_messages_by_range(
+            segment,
+            &IndexRange::max_range(),
+            |message: PolledMessage| {
+                message_ids.push(message.id);
+                Ok(())
+            },
+        )
         .await?;
         trace!("Loaded {} message IDs from disk.", message_ids.len());
         Ok(message_ids)
     }
 
     async fn load_checksums(&self, segment: &Segment) -> Result<(), IggyError> {
-        load_messages_by_range(segment, &IndexRange::max_range(), |message: Message| {
-            let calculated_checksum = checksum::calculate(&message.payload);
-            trace!(
-                "Loaded message for offset: {}, checksum: {}, expected: {}",
-                message.offset,
-                calculated_checksum,
-                message.checksum
-            );
-            if calculated_checksum != message.checksum {
-                return Err(IggyError::InvalidMessageChecksum(
-                    calculated_checksum,
-                    message.checksum,
+        load_messages_by_range(
+            segment,
+            &IndexRange::max_range(),
+            |message: PolledMessage| {
+                let calculated_checksum = checksum::calculate(&message.payload);
+                trace!(
+                    "Loaded message for offset: {}, checksum: {}, expected: {}",
                     message.offset,
-                ));
-            }
-            Ok(())
-        })
+                    calculated_checksum,
+                    message.checksum
+                );
+                if calculated_checksum != message.checksum {
+                    return Err(IggyError::InvalidMessageChecksum(
+                        calculated_checksum,
+                        message.checksum,
+                        message.offset,
+                    ));
+                }
+                Ok(())
+            },
+        )
         .await?;
         Ok(())
     }
@@ -399,7 +407,7 @@
         &self,
         segment: &Segment,
         mut current_position: u32,
-        messages: &[Arc<Message>],
+        messages: &[Arc<PolledMessage>],
     ) -> Result<(), IggyError> {
         let mut bytes = Vec::with_capacity(messages.len() * 4);
         for message in messages {
@@ -492,7 +500,7 @@
     async fn save_time_index(
         &self,
         segment: &Segment,
-        messages: &[Arc<Message>],
+        messages: &[Arc<PolledMessage>],
     ) -> Result<(), IggyError> {
         let mut bytes = Vec::with_capacity(messages.len() * 8);
         for message in messages {
@@ -520,7 +528,7 @@
 async fn load_messages_by_range(
     segment: &Segment,
     index_range: &IndexRange,
-    mut on_message: impl FnMut(Message) -> Result<(), IggyError>,
+    mut on_message: impl FnMut(PolledMessage) -> Result<(), IggyError>,
 ) -> Result<(), IggyError> {
     let file = file::open(&segment.log_path).await?;
     let file_size = file.metadata().await?.len();
@@ -602,7 +610,7 @@
         let id = id.unwrap();
         let checksum = checksum.unwrap();
 
-        let message = Message::create(
+        let message = PolledMessage::create(
             offset,
             state,
             timestamp,
@@ -620,7 +628,7 @@
 async fn load_messages_by_size(
     segment: &Segment,
     size_bytes: u64,
-    mut on_message: impl FnMut(Message) -> Result<(), IggyError>,
+    mut on_message: impl FnMut(PolledMessage) -> Result<(), IggyError>,
 ) -> Result<(), IggyError> {
     let file = file::open(&segment.log_path).await?;
     let file_size = file.metadata().await?.len();
@@ -693,7 +701,7 @@
         let id = id.unwrap();
         let checksum = checksum.unwrap();
 
-        let message = Message::create(
+        let message = PolledMessage::create(
             offset,
             state,
             timestamp,
diff --git a/server/src/streaming/storage.rs b/server/src/streaming/storage.rs
index d868128..4f58fe4 100644
--- a/server/src/streaming/storage.rs
+++ b/server/src/streaming/storage.rs
@@ -19,7 +19,7 @@
 use async_trait::async_trait;
 use iggy::consumer::ConsumerKind;
 use iggy::error::IggyError;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use iggy::models::user_info::UserId;
 use sled::Db;
 use std::fmt::{Debug, Formatter};
@@ -98,16 +98,16 @@
         &self,
         segment: &Segment,
         index_range: &IndexRange,
-    ) -> Result<Vec<Arc<Message>>, IggyError>;
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError>;
     async fn load_newest_messages_by_size(
         &self,
         segment: &Segment,
         size_bytes: u64,
-    ) -> Result<Vec<Arc<Message>>, IggyError>;
+    ) -> Result<Vec<Arc<PolledMessage>>, IggyError>;
     async fn save_messages(
         &self,
         segment: &Segment,
-        messages: &[Arc<Message>],
+        messages: &[Arc<PolledMessage>],
     ) -> Result<u32, IggyError>;
     async fn load_message_ids(&self, segment: &Segment) -> Result<Vec<u128>, IggyError>;
     async fn load_checksums(&self, segment: &Segment) -> Result<(), IggyError>;
@@ -123,7 +123,7 @@
         &self,
         segment: &Segment,
         current_position: u32,
-        messages: &[Arc<Message>],
+        messages: &[Arc<PolledMessage>],
     ) -> Result<(), IggyError>;
     async fn load_all_time_indexes(&self, segment: &Segment) -> Result<Vec<TimeIndex>, IggyError>;
     async fn load_last_time_index(&self, segment: &Segment)
@@ -131,7 +131,7 @@
     async fn save_time_index(
         &self,
         segment: &Segment,
-        messages: &[Arc<Message>],
+        messages: &[Arc<PolledMessage>],
     ) -> Result<(), IggyError>;
 }
 
@@ -212,7 +212,7 @@
     use crate::streaming::streams::stream::Stream;
     use crate::streaming::topics::topic::Topic;
     use async_trait::async_trait;
-    use iggy::models::messages::Message;
+    use iggy::models::polled_messages::PolledMessage;
     use std::sync::Arc;
 
     struct TestSystemInfoStorage {}
@@ -446,7 +446,7 @@
             &self,
             _segment: &Segment,
             _index_range: &IndexRange,
-        ) -> Result<Vec<Arc<Message>>, IggyError> {
+        ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
             Ok(vec![])
         }
 
@@ -454,14 +454,14 @@
             &self,
             _segment: &Segment,
             _size: u64,
-        ) -> Result<Vec<Arc<Message>>, IggyError> {
+        ) -> Result<Vec<Arc<PolledMessage>>, IggyError> {
             Ok(vec![])
         }
 
         async fn save_messages(
             &self,
             _segment: &Segment,
-            _messages: &[Arc<Message>],
+            _messages: &[Arc<PolledMessage>],
         ) -> Result<u32, IggyError> {
             Ok(0)
         }
@@ -492,7 +492,7 @@
             &self,
             _segment: &Segment,
             _current_position: u32,
-            _messages: &[Arc<Message>],
+            _messages: &[Arc<PolledMessage>],
         ) -> Result<(), IggyError> {
             Ok(())
         }
@@ -514,7 +514,7 @@
         async fn save_time_index(
             &self,
             _segment: &Segment,
-            _messages: &[Arc<Message>],
+            _messages: &[Arc<PolledMessage>],
         ) -> Result<(), IggyError> {
             Ok(())
         }
diff --git a/server/src/streaming/systems/messages.rs b/server/src/streaming/systems/messages.rs
index bc0d253..9aebc7a 100644
--- a/server/src/streaming/systems/messages.rs
+++ b/server/src/streaming/systems/messages.rs
@@ -6,10 +6,10 @@
 use bytes::Bytes;
 use iggy::error::IggyError;
 use iggy::identifier::Identifier;
+use iggy::messages::append_messages;
+use iggy::messages::append_messages::Partitioning;
 use iggy::messages::poll_messages::PollingStrategy;
-use iggy::messages::send_messages;
-use iggy::messages::send_messages::Partitioning;
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use std::sync::Arc;
 use tracing::{error, trace};
 
@@ -71,7 +71,7 @@
             let payload = encryptor.decrypt(&message.payload);
             match payload {
                 Ok(payload) => {
-                    decrypted_messages.push(Arc::new(Message {
+                    decrypted_messages.push(Arc::new(PolledMessage {
                         id: message.id,
                         state: message.state,
                         offset: message.offset,
@@ -100,7 +100,7 @@
         stream_id: &Identifier,
         topic_id: &Identifier,
         partitioning: &Partitioning,
-        messages: &Vec<send_messages::Message>,
+        messages: &Vec<append_messages::AppendableMessage>,
     ) -> Result<(), IggyError> {
         self.ensure_authenticated(session)?;
         let stream = self.get_stream(stream_id)?;
@@ -120,7 +120,7 @@
             let message = match self.encryptor {
                 Some(ref encryptor) => {
                     let payload = encryptor.encrypt(message.payload.as_ref())?;
-                    encrypted_message = send_messages::Message {
+                    encrypted_message = append_messages::AppendableMessage {
                         id: message.id,
                         length: payload.len() as u32,
                         payload: Bytes::from(payload),
@@ -131,7 +131,7 @@
                 None => message,
             };
             batch_size_bytes += message.get_size_bytes() as u64;
-            received_messages.push(Message::from_message(message));
+            received_messages.push(PolledMessage::from_message(message));
         }
 
         // If there's enough space in cache, do nothing.
diff --git a/server/src/streaming/topics/messages.rs b/server/src/streaming/topics/messages.rs
index e0ee6d0..ffc56f4 100644
--- a/server/src/streaming/topics/messages.rs
+++ b/server/src/streaming/topics/messages.rs
@@ -4,9 +4,9 @@
 use crate::streaming::utils::file::folder_size;
 use crate::streaming::utils::hash;
 use iggy::error::IggyError;
+use iggy::messages::append_messages::{Partitioning, PartitioningKind};
 use iggy::messages::poll_messages::{PollingKind, PollingStrategy};
-use iggy::messages::send_messages::{Partitioning, PartitioningKind};
-use iggy::models::messages::Message;
+use iggy::models::polled_messages::PolledMessage;
 use std::collections::HashMap;
 use std::sync::atomic::Ordering;
 use std::sync::Arc;
@@ -63,7 +63,7 @@
     pub async fn append_messages(
         &self,
         partitioning: &Partitioning,
-        messages: Vec<Message>,
+        messages: Vec<PolledMessage>,
     ) -> Result<(), IggyError> {
         if !self.has_partitions() {
             return Err(IggyError::NoPartitions(self.topic_id, self.stream_id));
@@ -90,7 +90,7 @@
     async fn append_messages_to_partition(
         &self,
         partition_id: u32,
-        messages: Vec<Message>,
+        messages: Vec<PolledMessage>,
     ) -> Result<(), IggyError> {
         let partition = self.partitions.get(&partition_id);
         if partition.is_none() {
@@ -205,7 +205,7 @@
         Ok(())
     }
 
-    fn cache_integrity_check(cache: &[Arc<Message>]) -> bool {
+    fn cache_integrity_check(cache: &[Arc<PolledMessage>]) -> bool {
         if cache.is_empty() {
             warn!("Cache is empty!");
             return false;
@@ -261,7 +261,7 @@
     use crate::configs::system::SystemConfig;
     use crate::streaming::storage::tests::get_test_system_storage;
     use bytes::Bytes;
-    use iggy::models::messages::MessageState;
+    use iggy::models::polled_messages::MessageState;
     use std::sync::Arc;
 
     #[tokio::test]
@@ -274,7 +274,7 @@
 
         for entity_id in 1..=messages_count {
             let payload = Bytes::from("test");
-            let messages = vec![Message::empty(
+            let messages = vec![PolledMessage::empty(
                 1,
                 MessageState::Available,
                 entity_id as u128,
@@ -310,7 +310,7 @@
         for entity_id in 1..=messages_count {
             let partitioning = Partitioning::messages_key_u32(entity_id);
             let payload = Bytes::from("test");
-            let messages = vec![Message::empty(
+            let messages = vec![PolledMessage::empty(
                 1,
                 MessageState::Available,
                 entity_id as u128,
diff --git a/tools/src/data-seeder/seeder.rs b/tools/src/data-seeder/seeder.rs
index 2b5d7c9..26de429 100644
--- a/tools/src/data-seeder/seeder.rs
+++ b/tools/src/data-seeder/seeder.rs
@@ -2,7 +2,7 @@
 use iggy::clients::client::IggyClient;
 use iggy::error::IggyError;
 use iggy::identifier::Identifier;
-use iggy::messages::send_messages::{Message, Partitioning, SendMessages};
+use iggy::messages::append_messages::{AppendMessages, AppendableMessage, Partitioning};
 use iggy::models::header::{HeaderKey, HeaderValue};
 use iggy::streams::create_stream::CreateStream;
 use iggy::topics::create_topic::CreateTopic;
@@ -142,13 +142,13 @@
                             Some(headers)
                         }
                     };
-                    let mut message = Message::from_str(&payload)?;
+                    let mut message = AppendableMessage::from_str(&payload)?;
                     message.headers = headers;
                     messages.push(message);
                     message_id += 1;
                 }
                 client
-                    .send_messages(&mut SendMessages {
+                    .send_messages(&mut AppendMessages {
                         stream_id: Identifier::numeric(stream_id)?,
                         topic_id: Identifier::numeric(topic.id)?,
                         partitioning: Partitioning::balanced(),