diff --git a/v2.0-spec.md b/v2.0-spec.md
new file mode 100644
index 0000000..cdf38c6
--- /dev/null
+++ b/v2.0-spec.md
@@ -0,0 +1,477 @@
+# 2.0 spec plan (Draft level)
+
+- custom element (e.g. ``)
+ - custom element enable validation result scope that did **inherit** from user data scope. vue-validator do not operate user data via validation result scope
+ - `id` attribute: keep the validation result data in custom element (e.g. vm.$validators.validator1)
+ - `name` attribute: change the validator result scope namespace (e.g. default: `validity`)
+ - available multiple validator (e.g. vm.$validators.validator1, vm.$validators.validator2, ...)
+- set custom directive (`v-validate`) to target element
+ - specify **field name**: keep the validation result
+ - validation result format: object property base structure (e.g. `validity.field.constraint`)
+ - accessable validation result with property keypath base (e.g. `validity.username.xxx`)
+- support for each field, the following validation property
+ - `valid` (e.g. `validity.field.valid`)
+ - `invalid` (reverse of `valid`, e.g. `validity.field.invalid`)
+ - `touched` (input tag was focused, e.g. `validity.field.touched`)
+ - `untouched`
+ - `modified` (from **initial** field value, e.g. `validity.field.modified`)
+ - `dirty` (angluar-like, attached even **once**, e.g. `validity.field.dirty`)
+ - `pristine` (angluar-like, **not** attached even once, e.g. `validity.field.pristine`)
+ - `error` (error message from #51, e.g. `validity.field.error`)
+- support the following top level property that keep the validation result of all fields
+ - `valid` (when **all** property is valid, return `true`)
+ - `invalid` (if exist even **one** invalid property, return `true`)
+ - `touched` (if exist even **one** touched property, return `true`)
+ - `untouched`
+ - `modified` (if exist even **one** modified property, return `true`)
+ - `dirty` (if exist even **one** dirty property, return `true`)
+ - `pristine` (if exist even **one** pristine property, return `true`)
+ - `submitted`
+- build-in validators
+ - required
+ - pattern
+ - min
+ - max
+ - minLength
+ - maxLength
+- improve delay validator initialization feature
+ - custom element base (not for each custom directive)
+- validator use HTML5 Form attributes base. (e.g. `min`, `max` ...)
+ - support custom validator: use attribute (e.g. `myValidator1` -> ``)
+ - support reactivity & function or inline expression like `v-on`: `{{ mustache }}` expressions (e.g. ``)
+ - support async validator
+- validator assets feature
+ - aseets management: like vue.js
+ - register/retrieve custom validator or build-in validtors
+
+## example
+
+```html
+
+
user registration
+
+
+
+
+```
+
+```javascript
+var Vue = require('vue')
+var VueValidator = require('vue-validator')
+
+//
+// register custom validators with validator assets
+//
+
+// url validator, sync validation
+VueValidator.asset('url', function (val) {
+ return /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/.test(val)
+})
+
+// exist validator, async validaiton
+Vuevalidator.asset('exist', function (val) {
+ return function (resolve, reject) {
+ // server-side validation with ajax (e.g. using `fetch` case)
+ fetch('/validators/exist', {
+ method: 'post',
+ headers: {
+ 'content-type': 'application/json',
+ 'x-token': 'xxxxxxxx'
+ },
+ body: JSON.stringify({ username: val })
+ }).then(function (res) {
+ if (res.status === 200) {
+ resolve(true)
+ } else if (res.status === 400) {
+ resolve(false)
+ }
+ }).catch(function (err) {
+ // something todo ...
+ reject(new Error('exist validator fail'))
+ })
+ }
+})
+
+// email validator, async validation
+VueValidator.asset('email', function (val) {
+ return function (resolve, reject) {
+ // something todo ...
+ }
+})
+
+// install vue-validator
+Vue.use(VueValidator)
+
+// create Vue instance
+new Vue({
+ data: {
+ constraints: {
+ age: {
+ min: 18,
+ }
+ },
+ name: '',
+ age: 18,
+ address: '',
+ password: ''
+ },
+ computed: {
+ constraintAgeMax: function () {
+ return this.constraints.age.min * 5
+ }
+ }
+}).$mount('#app')
+```
+
+
+
+
+## Basic
+- custom element (e.g. ``)
+ - custom element enable validation result scope. this means validation results scope are isolated from user data scope.
+ - specify `id` attribute that keep the validation result data in custom element (e.g. vm.$validators.validator1)
+- set custom directive (`v-validate`) to target element
+ - specify **field name** that keep the validation result
+ - validation result format: object property base structure (e.g. `validity.field.constraint`)
+ - accessable validation result with property keypath base. (e.g. `validity.username.xxx`)
+- validation constraints use HTML5 Form attributes base. (e.g. `min`, `max` ...)
+ - validation constraint of custome validator: use attribute (e.g. `myValidator1` -> ``)
+ - support reactivity: spcify `{{ mustache }}` expressions to attribute. (e.g. ``)
+- support each field the following property
+ - `valid` (e.g. `validity.field.valid`)
+ - `invalid` (e.g. `validity.field.invalid`)
+ - `modified` (e.g. `validity.field.modified`)
+ - `dirty` (angluar-like, e.g. `validity.field.dirty`)
+ - `pristine` (angluar-like, e.g. `validity.field.pristine`)
+- support the following top level property that keep the result of all fields
+ - `valid`
+ - `invalid`
+ - `modified`
+ - `dirty`
+ - `pristine`
+- set `constraints` to `option.validator` field.
+ - support async loading
+- spcify `constraints` to constraint attribute with `{{ mustache }}` expressions.
+
+
+Example:
+
+```html
+