diff --git a/Cargo.lock b/Cargo.lock
index 97483abf..d3c80deb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2160,6 +2160,7 @@ dependencies = [
  "sha-1 0.10.0",
  "sha2",
  "slug",
+ "surrealdb-derive",
  "thiserror",
  "tikv-client",
  "tokio",
@@ -2169,6 +2170,16 @@ dependencies = [
  "uuid",
 ]
 
+[[package]]
+name = "surrealdb-derive"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "360979ea6e0588e857878b2578f0b0844d57a732cb7824a6964cb7ea3206cb3f"
+dependencies = [
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "syn"
 version = "1.0.86"
diff --git a/lib/Cargo.toml b/lib/Cargo.toml
index 5503f3b8..6d4f5e37 100644
--- a/lib/Cargo.toml
+++ b/lib/Cargo.toml
@@ -19,6 +19,7 @@ async-recursion = "1.0.0"
 byteorder = "1.4.3"
 chrono = { version = "0.4.19", features = ["serde"] }
 dec = { version = "1.21.0", package = "rust_decimal", features = ["maths", "serde-float"] }
+derive = { version = "0.1.0", package = "surrealdb-derive" }
 dmp = "0.1.1"
 echodb = { version = "0.2.0", optional = true }
 futures = "0.3.21"
diff --git a/lib/src/doc/document.rs b/lib/src/doc/document.rs
index cdc16014..956e449a 100644
--- a/lib/src/doc/document.rs
+++ b/lib/src/doc/document.rs
@@ -9,6 +9,12 @@ pub struct Document<'a> {
 	pub(super) initial: Cow<'a, Value>,
 }
 
+impl<'a> Into<Vec<u8>> for &Document<'a> {
+	fn into(self) -> Vec<u8> {
+		msgpack::to_vec(&self.current).unwrap()
+	}
+}
+
 impl<'a> Document<'a> {
 	pub fn new(id: Option<Thing>, val: &'a Value) -> Self {
 		Document {
diff --git a/lib/src/sql/statements/begin.rs b/lib/src/sql/statements/begin.rs
index b2f13d22..008b5aa2 100644
--- a/lib/src/sql/statements/begin.rs
+++ b/lib/src/sql/statements/begin.rs
@@ -1,5 +1,6 @@
 use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
@@ -7,7 +8,7 @@ use nom::sequence::tuple;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct BeginStatement;
 
 impl fmt::Display for BeginStatement {
diff --git a/lib/src/sql/statements/cancel.rs b/lib/src/sql/statements/cancel.rs
index 14375e3b..55202986 100644
--- a/lib/src/sql/statements/cancel.rs
+++ b/lib/src/sql/statements/cancel.rs
@@ -1,5 +1,6 @@
 use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
@@ -7,7 +8,7 @@ use nom::sequence::tuple;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct CancelStatement;
 
 impl fmt::Display for CancelStatement {
diff --git a/lib/src/sql/statements/commit.rs b/lib/src/sql/statements/commit.rs
index 279737de..e5ac9c0c 100644
--- a/lib/src/sql/statements/commit.rs
+++ b/lib/src/sql/statements/commit.rs
@@ -1,5 +1,6 @@
 use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
@@ -7,7 +8,7 @@ use nom::sequence::tuple;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct CommitStatement;
 
 impl fmt::Display for CommitStatement {
diff --git a/lib/src/sql/statements/create.rs b/lib/src/sql/statements/create.rs
index 8aeab6a0..d014951f 100644
--- a/lib/src/sql/statements/create.rs
+++ b/lib/src/sql/statements/create.rs
@@ -10,13 +10,14 @@ use crate::sql::error::IResult;
 use crate::sql::output::{output, Output};
 use crate::sql::timeout::{timeout, Timeout};
 use crate::sql::value::{whats, Value, Values};
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
 use nom::sequence::preceded;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct CreateStatement {
 	pub what: Values,
 	pub data: Option<Data>,
diff --git a/lib/src/sql/statements/define.rs b/lib/src/sql/statements/define.rs
index 8932a1d0..7b12bd94 100644
--- a/lib/src/sql/statements/define.rs
+++ b/lib/src/sql/statements/define.rs
@@ -17,6 +17,7 @@ use crate::sql::permission::{permissions, Permissions};
 use crate::sql::strand::strand_raw;
 use crate::sql::value::{value, values, Value, Values};
 use crate::sql::view::{view, View};
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::{map, opt};
@@ -25,7 +26,7 @@ use nom::sequence::tuple;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub enum DefineStatement {
 	Namespace(DefineNamespaceStatement),
 	Database(DefineDatabaseStatement),
@@ -94,7 +95,7 @@ pub fn define(i: &str) -> IResult<&str, DefineStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineNamespaceStatement {
 	pub name: String,
 }
@@ -138,7 +139,7 @@ fn namespace(i: &str) -> IResult<&str, DefineNamespaceStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineDatabaseStatement {
 	pub name: String,
 }
@@ -182,7 +183,7 @@ fn database(i: &str) -> IResult<&str, DefineDatabaseStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineLoginStatement {
 	pub name: String,
 	pub base: Base,
@@ -280,7 +281,7 @@ fn login_hash(i: &str) -> IResult<&str, DefineLoginOption> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineTokenStatement {
 	pub name: String,
 	pub base: Base,
@@ -350,7 +351,7 @@ fn token(i: &str) -> IResult<&str, DefineTokenStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineScopeStatement {
 	pub name: String,
 	pub session: Option<Duration>,
@@ -472,7 +473,7 @@ fn scope_connect(i: &str) -> IResult<&str, DefineScopeOption> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineTableStatement {
 	pub name: String,
 	pub drop: bool,
@@ -604,7 +605,7 @@ fn table_permissions(i: &str) -> IResult<&str, DefineTableOption> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineEventStatement {
 	pub name: String,
 	pub what: String,
@@ -671,7 +672,7 @@ fn event(i: &str) -> IResult<&str, DefineEventStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineFieldStatement {
 	pub name: Idiom,
 	pub what: String,
@@ -813,7 +814,7 @@ fn field_permissions(i: &str) -> IResult<&str, DefineFieldOption> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DefineIndexStatement {
 	pub name: String,
 	pub what: String,
diff --git a/lib/src/sql/statements/delete.rs b/lib/src/sql/statements/delete.rs
index 686ca14d..09cf05cd 100644
--- a/lib/src/sql/statements/delete.rs
+++ b/lib/src/sql/statements/delete.rs
@@ -10,6 +10,7 @@ use crate::sql::error::IResult;
 use crate::sql::output::{output, Output};
 use crate::sql::timeout::{timeout, Timeout};
 use crate::sql::value::{whats, Value, Values};
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
 use nom::sequence::preceded;
@@ -17,7 +18,7 @@ use nom::sequence::tuple;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct DeleteStatement {
 	pub what: Values,
 	pub cond: Option<Cond>,
diff --git a/lib/src/sql/statements/ifelse.rs b/lib/src/sql/statements/ifelse.rs
index cb6445e0..f16a8fc4 100644
--- a/lib/src/sql/statements/ifelse.rs
+++ b/lib/src/sql/statements/ifelse.rs
@@ -5,13 +5,14 @@ use crate::err::Error;
 use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::value::{value, Value};
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
 use nom::multi::separated_list0;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct IfelseStatement {
 	pub exprs: Vec<(Value, Value)>,
 	pub close: Option<Value>,
diff --git a/lib/src/sql/statements/info.rs b/lib/src/sql/statements/info.rs
index 2068312a..75b19f01 100644
--- a/lib/src/sql/statements/info.rs
+++ b/lib/src/sql/statements/info.rs
@@ -7,12 +7,13 @@ use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::ident::ident_raw;
 use crate::sql::value::Value;
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub enum InfoStatement {
 	Namespace,
 	Database,
diff --git a/lib/src/sql/statements/insert.rs b/lib/src/sql/statements/insert.rs
index 90e146d1..5d9560ef 100644
--- a/lib/src/sql/statements/insert.rs
+++ b/lib/src/sql/statements/insert.rs
@@ -11,6 +11,7 @@ use crate::sql::output::{output, Output};
 use crate::sql::table::{table, Table};
 use crate::sql::timeout::{timeout, Timeout};
 use crate::sql::value::Value;
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
@@ -18,7 +19,7 @@ use nom::sequence::preceded;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct InsertStatement {
 	pub into: Table,
 	pub data: Data,
diff --git a/lib/src/sql/statements/kill.rs b/lib/src/sql/statements/kill.rs
index 1eeabc44..f0fdfaff 100644
--- a/lib/src/sql/statements/kill.rs
+++ b/lib/src/sql/statements/kill.rs
@@ -6,11 +6,12 @@ use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::ident::{ident, Ident};
 use crate::sql::value::Value;
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct KillStatement {
 	pub id: Ident,
 }
diff --git a/lib/src/sql/statements/live.rs b/lib/src/sql/statements/live.rs
index 0149e9ef..7cf16e61 100644
--- a/lib/src/sql/statements/live.rs
+++ b/lib/src/sql/statements/live.rs
@@ -9,13 +9,14 @@ use crate::sql::fetch::{fetch, Fetchs};
 use crate::sql::field::{fields, Fields};
 use crate::sql::value::Value;
 use crate::sql::value::{whats, Values};
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
 use nom::sequence::preceded;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct LiveStatement {
 	pub expr: Fields,
 	pub what: Values,
diff --git a/lib/src/sql/statements/option.rs b/lib/src/sql/statements/option.rs
index fb532f35..37a82979 100644
--- a/lib/src/sql/statements/option.rs
+++ b/lib/src/sql/statements/option.rs
@@ -2,6 +2,7 @@ use crate::sql::comment::mightbespace;
 use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::ident::{ident, Ident};
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag;
 use nom::bytes::complete::tag_no_case;
@@ -10,7 +11,7 @@ use nom::sequence::tuple;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct OptionStatement {
 	pub name: Ident,
 	pub what: bool,
diff --git a/lib/src/sql/statements/output.rs b/lib/src/sql/statements/output.rs
index d2b9acf4..5ecd48d5 100644
--- a/lib/src/sql/statements/output.rs
+++ b/lib/src/sql/statements/output.rs
@@ -5,11 +5,12 @@ use crate::err::Error;
 use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::value::{value, Value};
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct OutputStatement {
 	pub what: Value,
 }
diff --git a/lib/src/sql/statements/relate.rs b/lib/src/sql/statements/relate.rs
index fae1ae00..239ae555 100644
--- a/lib/src/sql/statements/relate.rs
+++ b/lib/src/sql/statements/relate.rs
@@ -12,6 +12,7 @@ use crate::sql::output::{output, Output};
 use crate::sql::table::{table, Table};
 use crate::sql::timeout::{timeout, Timeout};
 use crate::sql::value::{whats, Value, Values};
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag;
 use nom::bytes::complete::tag_no_case;
@@ -20,7 +21,7 @@ use nom::sequence::preceded;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RelateStatement {
 	pub kind: Table,
 	pub from: Values,
diff --git a/lib/src/sql/statements/remove.rs b/lib/src/sql/statements/remove.rs
index 7011e0d8..e2716702 100644
--- a/lib/src/sql/statements/remove.rs
+++ b/lib/src/sql/statements/remove.rs
@@ -8,6 +8,7 @@ use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::ident::ident_raw;
 use crate::sql::value::Value;
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::{map, opt};
@@ -15,7 +16,7 @@ use nom::sequence::tuple;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub enum RemoveStatement {
 	Namespace(RemoveNamespaceStatement),
 	Database(RemoveDatabaseStatement),
@@ -84,7 +85,7 @@ pub fn remove(i: &str) -> IResult<&str, RemoveStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveNamespaceStatement {
 	pub name: String,
 }
@@ -128,7 +129,7 @@ fn namespace(i: &str) -> IResult<&str, RemoveNamespaceStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveDatabaseStatement {
 	pub name: String,
 }
@@ -172,7 +173,7 @@ fn database(i: &str) -> IResult<&str, RemoveDatabaseStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveLoginStatement {
 	pub name: String,
 	pub base: Base,
@@ -226,7 +227,7 @@ fn login(i: &str) -> IResult<&str, RemoveLoginStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveTokenStatement {
 	pub name: String,
 	pub base: Base,
@@ -280,7 +281,7 @@ fn token(i: &str) -> IResult<&str, RemoveTokenStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveScopeStatement {
 	pub name: String,
 }
@@ -324,7 +325,7 @@ fn scope(i: &str) -> IResult<&str, RemoveScopeStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveTableStatement {
 	pub name: String,
 }
@@ -368,7 +369,7 @@ fn table(i: &str) -> IResult<&str, RemoveTableStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveEventStatement {
 	pub name: String,
 	pub what: String,
@@ -419,7 +420,7 @@ fn event(i: &str) -> IResult<&str, RemoveEventStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveFieldStatement {
 	pub name: String,
 	pub what: String,
@@ -470,7 +471,7 @@ fn field(i: &str) -> IResult<&str, RemoveFieldStatement> {
 // --------------------------------------------------
 // --------------------------------------------------
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct RemoveIndexStatement {
 	pub name: String,
 	pub what: String,
diff --git a/lib/src/sql/statements/select.rs b/lib/src/sql/statements/select.rs
index f3535620..f7580363 100644
--- a/lib/src/sql/statements/select.rs
+++ b/lib/src/sql/statements/select.rs
@@ -17,13 +17,14 @@ use crate::sql::start::{start, Start};
 use crate::sql::timeout::{timeout, Timeout};
 use crate::sql::value::{selects, Value, Values};
 use crate::sql::version::{version, Version};
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
 use nom::sequence::preceded;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct SelectStatement {
 	pub expr: Fields,
 	pub what: Values,
diff --git a/lib/src/sql/statements/set.rs b/lib/src/sql/statements/set.rs
index 661f09a3..dd51141f 100644
--- a/lib/src/sql/statements/set.rs
+++ b/lib/src/sql/statements/set.rs
@@ -7,13 +7,14 @@ use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::ident::ident_raw;
 use crate::sql::value::{value, Value};
+use derive::Store;
 use nom::bytes::complete::tag;
 use nom::bytes::complete::tag_no_case;
 use nom::sequence::preceded;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct SetStatement {
 	pub name: String,
 	pub what: Value,
diff --git a/lib/src/sql/statements/update.rs b/lib/src/sql/statements/update.rs
index ce2af8fd..4840cde9 100644
--- a/lib/src/sql/statements/update.rs
+++ b/lib/src/sql/statements/update.rs
@@ -11,13 +11,14 @@ use crate::sql::error::IResult;
 use crate::sql::output::{output, Output};
 use crate::sql::timeout::{timeout, Timeout};
 use crate::sql::value::{whats, Value, Values};
+use derive::Store;
 use nom::bytes::complete::tag_no_case;
 use nom::combinator::opt;
 use nom::sequence::preceded;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct UpdateStatement {
 	pub what: Values,
 	pub data: Option<Data>,
diff --git a/lib/src/sql/statements/yuse.rs b/lib/src/sql/statements/yuse.rs
index bfdff273..1a4b9f9e 100644
--- a/lib/src/sql/statements/yuse.rs
+++ b/lib/src/sql/statements/yuse.rs
@@ -1,12 +1,13 @@
 use crate::sql::comment::shouldbespace;
 use crate::sql::error::IResult;
 use crate::sql::ident::ident_raw;
+use derive::Store;
 use nom::branch::alt;
 use nom::bytes::complete::tag_no_case;
 use serde::{Deserialize, Serialize};
 use std::fmt;
 
-#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
+#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize, Store)]
 pub struct UseStatement {
 	pub ns: Option<String>,
 	pub db: Option<String>,
diff --git a/lib/src/sql/value/value.rs b/lib/src/sql/value/value.rs
index 0c4c8c79..7b70d4d9 100644
--- a/lib/src/sql/value/value.rs
+++ b/lib/src/sql/value/value.rs
@@ -25,6 +25,7 @@ use crate::sql::thing::{thing, Thing};
 use async_recursion::async_recursion;
 use chrono::{DateTime, Utc};
 use dec::Decimal;
+use derive::Store;
 use fuzzy_matcher::skim::SkimMatcherV2;
 use fuzzy_matcher::FuzzyMatcher;
 use geo::Point;
@@ -74,7 +75,7 @@ pub fn whats(i: &str) -> IResult<&str, Values> {
 	Ok((i, Values(v)))
 }
 
-#[derive(Clone, Debug, PartialEq, PartialOrd, Deserialize)]
+#[derive(Clone, Debug, PartialEq, PartialOrd, Deserialize, Store)]
 pub enum Value {
 	None,
 	Void,
@@ -386,18 +387,6 @@ impl From<Option<String>> for Value {
 	}
 }
 
-impl Into<Vec<u8>> for Value {
-	fn into(self) -> Vec<u8> {
-		msgpack::to_vec(&self).unwrap()
-	}
-}
-
-impl From<Vec<u8>> for Value {
-	fn from(v: Vec<u8>) -> Self {
-		msgpack::from_slice::<Value>(&v).unwrap()
-	}
-}
-
 impl Value {
 	// -----------------------------------
 	// Initial record value