diff --git a/goblin/abc.py b/goblin/abc.py
index a094b0923ad88015d695d78a2fe69dc2864d7d48..652c14ef71b91a048f730b3ede54001847392777 100644
--- a/goblin/abc.py
+++ b/goblin/abc.py
@@ -60,10 +60,13 @@ class DataType(abc.ABC):
                 val = list(val)
             else:
                 val = [val]
+            vertex_props = []
+            for v in val:
+                vp = vertex_prop(data_type, card=card)
+                vp.value = self.validate(v)
+                vertex_props.append(vp)
             val = manager.ListVertexPropertyManager(
-                data_type, vertex_prop, card,
-                [vertex_prop(data_type, val=self.validate(v), card=card)
-                 for v in val])
+                data_type, vertex_prop, card, vertex_props)
         elif card == cardinality.Cardinality.set:
             if isinstance(val, set):
                 val = val
@@ -71,12 +74,17 @@ class DataType(abc.ABC):
                 val = set(val)
             else:
                 val = set([val])
+            vertex_props = set([])
+            for v in val:
+                vp = vertex_prop(data_type, card=card)
+                vp.value = self.validate(v)
+                vertex_props.add(vp)
             val = manager.SetVertexPropertyManager(
-                data_type, vertex_prop, card,
-                {vertex_prop(data_type, val=self.validate(v), card=card)
-                 for v in val})
+                data_type, vertex_prop, card, vertex_props)
         else:
-            val = vertex_prop(data_type, val=self.validate(val))
+            vp = vertex_prop(data_type)
+            vp.value = self.validate(val)
+            val = vp
         return val
 
 
diff --git a/goblin/element.py b/goblin/element.py
index 71bc5c6631ff6551455ff8946481b3db65facab5..263d223bd04d6d8a17929f2b1e394f8ade3d4e47 100644
--- a/goblin/element.py
+++ b/goblin/element.py
@@ -154,12 +154,11 @@ class VertexProperty(Vertex, abc.BaseProperty):
 
     __descriptor__ = VertexPropertyDescriptor
 
-    def __init__(self, data_type, *, val=None, default=None, db_name=None,
+    def __init__(self, data_type, *, default=None, db_name=None,
                  card=None):
         if isinstance(data_type, type):
             data_type = data_type()
         self._data_type = data_type
-        self._val = val
         self._default = default
         self._db_name = db_name
         if card is None:
@@ -174,10 +173,14 @@ class VertexProperty(Vertex, abc.BaseProperty):
     def data_type(self):
         return self._data_type
 
-    @property
-    def value(self):
+    def getvalue(self):
         return self._val
 
+    def setvalue(self, val):
+        self._val = val
+
+    value = property(getvalue, setvalue)
+
     @property
     def db_name(self):
         return self._db_name
diff --git a/goblin/manager.py b/goblin/manager.py
index 67989e02afec72407329ae85ba86fb4221c19fd2..3bcf06947fe684fe80bccc84049ae725548305cc 100644
--- a/goblin/manager.py
+++ b/goblin/manager.py
@@ -49,9 +49,9 @@ class ListVertexPropertyManager(list, VertexPropertyManager):
         list.__init__(self, obj)
 
     def append(self, val):
-        val = self._data_type.validate(val)
-        val = self._vertex_prop(self._data_type, val=val, card=self._card)
-        super().append(val)
+        vp = self._vertex_prop(self._data_type, card=self._card)
+        vp.value = self._data_type.validate(val)
+        super().append(vp)
 
 
 class SetVertexPropertyManager(set, VertexPropertyManager):
@@ -61,6 +61,6 @@ class SetVertexPropertyManager(set, VertexPropertyManager):
         set.__init__(self, obj)
 
     def add(self, val):
-        val = self._data_type.validate(val)
-        val = self._vertex_prop(self._data_type, val=val, card=self._card)
-        super().add(val)
+        vp = self._vertex_prop(self._data_type, card=self._card)
+        vp.value = self._data_type.validate(val)
+        super().add(vp)