diff --git a/core/kg/model/user.go b/core/kg/model/user.go
index 6feb948..156f4fa 100644
--- a/core/kg/model/user.go
+++ b/core/kg/model/user.go
@@ -46,6 +46,11 @@
 	return nil
 }
 
+func (u *User) Clone() *User {
+	user := *u
+	return &user
+}
+
 func isValidID(value string) bool {
 	if len(value) != 26 {
 		return false
diff --git a/core/kg/store/memory/store.go b/core/kg/store/memory/store.go
new file mode 100644
index 0000000..d15dfbf
--- /dev/null
+++ b/core/kg/store/memory/store.go
@@ -0,0 +1,24 @@
+package memory
+
+import "github.com/giolekva/pcloud/core/kg/store"
+
+type MemoryStore struct {
+	stores memoryStoreStores
+}
+
+var _ store.Store = &MemoryStore{}
+
+type memoryStoreStores struct {
+	user store.UserStore
+}
+
+func New() *MemoryStore {
+	store := &MemoryStore{}
+	store.stores.user = newMemoryUserStore(store)
+
+	return store
+}
+
+func (ms *MemoryStore) User() store.UserStore {
+	return ms.stores.user
+}
diff --git a/core/kg/store/memory/user_store.go b/core/kg/store/memory/user_store.go
new file mode 100644
index 0000000..97bab6d
--- /dev/null
+++ b/core/kg/store/memory/user_store.go
@@ -0,0 +1,65 @@
+package memory
+
+import (
+	"errors"
+	"strconv"
+	"sync"
+	"time"
+
+	"github.com/giolekva/pcloud/core/kg/model"
+	"github.com/giolekva/pcloud/core/kg/store"
+)
+
+type memoryUserStore struct {
+	*MemoryStore
+
+	users map[string]*model.User
+	maxID int
+	mutex sync.RWMutex
+}
+
+var _ store.UserStore = &memoryUserStore{}
+
+func newMemoryUserStore(mStore *MemoryStore) store.UserStore {
+	us := &memoryUserStore{
+		MemoryStore: mStore,
+		users:       map[string]*model.User{},
+		maxID:       1,
+	}
+	return us
+}
+
+func (us *memoryUserStore) Save(user *model.User) (*model.User, error) {
+	us.mutex.Lock()
+	us.mutex.Unlock()
+	if user.ID == "" {
+		user.ID = strconv.Itoa(us.maxID)
+		us.maxID++
+		user.CreateAt = time.Now().Unix()
+		user.DeleteAt = 0
+	} else {
+		user.UpdateAt = time.Now().Unix()
+	}
+	us.users[user.ID] = user
+	return user, nil
+}
+
+func (us *memoryUserStore) Get(id string) (*model.User, error) {
+	us.mutex.RLock()
+	us.mutex.RUnlock()
+	user, ok := us.users[id]
+	if !ok {
+		return nil, errors.New("User not found")
+	}
+	return user.Clone(), nil
+}
+
+func (us *memoryUserStore) GetAll() ([]*model.User, error) {
+	us.mutex.RLock()
+	us.mutex.RUnlock()
+	users := make([]*model.User, 0, len(us.users))
+	for _, user := range us.users {
+		users = append(users, user.Clone())
+	}
+	return users, nil
+}
