diff --git a/src/tarantool.rs b/src/tarantool.rs
index c5a2228135e5f51a16e2c26b5b00d34ce4719709..a16377451b01e75959cb59ce11e220ce7489a5e6 100644
--- a/src/tarantool.rs
+++ b/src/tarantool.rs
@@ -26,7 +26,7 @@ macro_rules! stringify_cfunc {
         use ::tarantool::tuple::FunctionCtx;
         use libc::c_int;
 
-        let _: unsafe extern "C" fn(FunctionCtx, FunctionArgs) -> c_int = $($func_name)+;
+        const _: unsafe extern "C" fn(FunctionCtx, FunctionArgs) -> c_int = $($func_name)+;
         concat!(".", $crate::stringify_last_token!($($func_name)+))
     }};
 }
diff --git a/src/traft/mod.rs b/src/traft/mod.rs
index 87f2d8e4e4285dde9ca96b897dcbd8fb0e9f2f87..00713a0f4b62250361d6e60439becd5380bc86ae 100644
--- a/src/traft/mod.rs
+++ b/src/traft/mod.rs
@@ -7,6 +7,7 @@ mod network;
 pub mod node;
 pub mod notify;
 mod raft_storage;
+pub mod rpc;
 pub mod storage;
 pub mod topology;
 
diff --git a/src/traft/rpc.rs b/src/traft/rpc.rs
new file mode 100644
index 0000000000000000000000000000000000000000..daff7294854cb198255eb0c38c44b3187799c28a
--- /dev/null
+++ b/src/traft/rpc.rs
@@ -0,0 +1,33 @@
+use ::tarantool::tuple::{DecodeOwned, Encode};
+
+use std::fmt::Debug;
+
+/// Types implementing this trait represent an RPC's (remote procedure call)
+/// arguments. This trait contains information about the request.
+pub trait Request: Encode + DecodeOwned {
+    /// Remote procedure name.
+    const PROC_NAME: &'static str;
+
+    /// Describes data returned from a successful RPC request.
+    type Response: Encode + DecodeOwned + Debug + 'static;
+}
+
+impl Request for super::JoinRequest {
+    const PROC_NAME: &'static str = crate::stringify_cfunc!(super::node::raft_join);
+    type Response = super::JoinResponse;
+}
+
+impl Request for super::UpdatePeerRequest {
+    const PROC_NAME: &'static str = crate::stringify_cfunc!(super::failover::raft_update_peer);
+    type Response = super::UpdatePeerResponse;
+}
+
+impl Request for super::ExpelRequest {
+    const PROC_NAME: &'static str = crate::stringify_cfunc!(super::node::raft_expel);
+    type Response = super::ExpelResponse;
+}
+
+impl Request for super::SyncRaftRequest {
+    const PROC_NAME: &'static str = crate::stringify_cfunc!(super::node::raft_sync_raft);
+    type Response = ();
+}