diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/DefaultWorkletDescription.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/DefaultWorkletDescription.java
new file mode 100644
index 0000000..82bb3f8
--- /dev/null
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/DefaultWorkletDescription.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.workflow.api;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.base.MoreObjects;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Class for default worklet description.
+ */
+public final class DefaultWorkletDescription implements WorkletDescription {
+
+    protected static final Logger log = getLogger(DefaultWorkletDescription.class);
+
+    /**
+     * worklet Name.
+     */
+    private String tag;
+
+    /**
+     * worklet data model.
+     */
+    private JsonDataModelTree data;
+
+    /**
+     * Constructor of worklet description.
+     *
+     * @param builder worklet description builder
+     */
+    public DefaultWorkletDescription(DefaultWorkletDescription.Builder builder) {
+        this.tag = builder.tag;
+        this.data = builder.data;
+    }
+
+    public DefaultWorkletDescription(String tag) {
+        this.tag = tag;
+    }
+
+    @Override
+    public String tag() {
+        return this.tag;
+    }
+
+    @Override
+    public JsonDataModelTree data() {
+        return this.data;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("tag", tag())
+                .add("data", data())
+                .toString();
+    }
+
+    /**
+     * Gets builder instance.
+     *
+     * @return builder instance
+     */
+    public static DefaultWorkletDescription.Builder builder() {
+        return new DefaultWorkletDescription.Builder();
+    }
+
+    /**
+     * Builder for worklet description.
+     */
+    public static class Builder {
+
+        /**
+         * worklet name.
+         */
+        private String tag;
+
+        /**
+         * static data model tree.
+         */
+        JsonDataModelTree data = new JsonDataModelTree();
+
+        /**
+         * Sets worklet name.
+         *
+         * @param tag worklet name
+         * @return builder
+         */
+        public DefaultWorkletDescription.Builder name(String tag) {
+            this.tag = tag;
+            return this;
+        }
+
+
+        public DefaultWorkletDescription.Builder staticDataModel(String path, String value) throws WorkflowException {
+
+            data.setAt(path, value);
+
+            return this;
+        }
+
+        public DefaultWorkletDescription.Builder staticDataModel(String path, Integer value) throws WorkflowException {
+
+            data.setAt(path, value);
+
+            return this;
+        }
+
+        public DefaultWorkletDescription.Builder staticDataModel(String path, Boolean value) throws WorkflowException {
+
+            data.setAt(path, value);
+
+            return this;
+        }
+
+        public DefaultWorkletDescription.Builder staticDataModel(String path, JsonNode value) throws WorkflowException {
+
+            data.setAt(path, value);
+
+            return this;
+        }
+
+        public DefaultWorkletDescription.Builder staticDataModel(String path, ArrayNode value)
+                throws WorkflowException {
+
+            data.setAt(path, value);
+
+            return this;
+        }
+
+        public DefaultWorkletDescription.Builder staticDataModel(String path, ObjectNode value)
+                throws WorkflowException {
+
+            data.setAt(path, value);
+
+            return this;
+        }
+
+
+        /**
+         * Builds worklet description from builder.
+         *
+         * @return instance of worklet description
+         * @throws WorkflowException workflow exception
+         */
+        public DefaultWorkletDescription build() {
+
+            return new DefaultWorkletDescription(this);
+        }
+
+
+    }
+}
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java
index 3e54c94..f4d9470 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/ImmutableListWorkflow.java
@@ -27,6 +27,7 @@
 import java.net.URI;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 
 import static org.onosproject.workflow.api.CheckCondition.check;
@@ -42,9 +43,9 @@
     private String initWorkletType;
 
     /**
-     * List of worklet.
+     * List of worklet  description.
      */
-    private List<String> workletTypeList;
+    private List<WorkletDescription> workletDescList;
 
     /**
      * Set of workflow attributes.
@@ -52,6 +53,7 @@
     private Set<WorkflowAttribute> attributes;
 
     private static JsonDataModelInjector dataModelInjector = new JsonDataModelInjector();
+    private static StaticDataModelInjector staticDataModelInjector = new StaticDataModelInjector();
 
     /**
      * Constructor of ImmutableListWorkflow.
@@ -61,7 +63,7 @@
     private ImmutableListWorkflow(Builder builder) {
         super(builder.id);
         this.initWorkletType = builder.initWorkletType;
-        workletTypeList = ImmutableList.copyOf(builder.workletTypeList);
+        workletDescList = ImmutableList.copyOf(builder.workletDescList);
         attributes = ImmutableSet.copyOf(builder.attributes);
     }
 
@@ -84,12 +86,11 @@
 
         ProgramCounter pc = current.clone();
 
-        for (int i = current.workletIndex(); i < workletTypeList.size(); pc = increased(pc), i++) {
+        for (int i = current.workletIndex(); i < workletDescList.size(); pc = increased(pc), i++) {
 
             if (cnt++ > Worklet.MAX_WORKS) {
                 throw new WorkflowException("Maximum worklet execution exceeded");
             }
-
             if (pc.isCompleted()) {
                 return pc;
             }
@@ -119,6 +120,12 @@
             } else {
                 // isNext is read only. It does not perform 'inhale'.
                 dataModelInjector.inject(worklet, context);
+                WorkletDescription workletDesc = getWorkletDesc(pc);
+                if (Objects.nonNull(workletDesc)) {
+                    if (!(workletDesc.tag().equals("INIT") || workletDesc.tag().equals("COMPLETED"))) {
+                        staticDataModelInjector.inject(worklet, workletDesc);
+                    }
+                }
                 if (worklet.isNext(context)) {
                     return pc;
                 }
@@ -132,18 +139,18 @@
     public ProgramCounter increased(ProgramCounter pc) throws WorkflowException {
 
         int increaedIndex = pc.workletIndex() + 1;
-        if (increaedIndex >= workletTypeList.size()) {
+        if (increaedIndex >= workletDescList.size()) {
             throw new WorkflowException("Out of bound in program counter(" + pc + ")");
         }
 
-        String workletType = workletTypeList.get(increaedIndex);
-        return ProgramCounter.valueOf(workletType, increaedIndex);
+        WorkletDescription workletDesc = workletDescList.get(increaedIndex);
+        return ProgramCounter.valueOf(workletDesc.tag(), increaedIndex);
     }
 
     @Override
     public Worklet getWorkletInstance(ProgramCounter pc) throws WorkflowException {
 
-        return getWorkletInstance(workletTypeList.get(pc.workletIndex()));
+        return getWorkletInstance(workletDescList.get(pc.workletIndex()).tag());
     }
 
     @Override
@@ -191,10 +198,21 @@
     }
 
     @Override
-    public List<String> getWorkletTypeList() {
-        return ImmutableList.copyOf(workletTypeList);
+    public List<WorkletDescription> getWorkletDescList() {
+        return ImmutableList.copyOf(workletDescList);
     }
 
+    @Override
+    public WorkletDescription getWorkletDesc(ProgramCounter pc) {
+        Optional<WorkletDescription> workletDescription = workletDescList.stream().filter(a -> Objects.equals(a.tag(),
+                workletDescList.get(pc.workletIndex()).tag())).findAny();
+        if (workletDescription.isPresent()) {
+            return workletDescription.get();
+        }
+        return null;
+    }
+
+
     /**
      * Gets index of class in worklet type list.
      *
@@ -202,8 +220,8 @@
      * @return index of class in worklet type list
      */
     private int getClassIndex(Class aClass) {
-        for (int i = 0; i < workletTypeList.size(); i++) {
-            if (Objects.equals(aClass.getName(), workletTypeList.get(i))) {
+        for (int i = 0; i < workletDescList.size(); i++) {
+            if (Objects.equals(aClass.getName(), workletDescList.get(i))) {
                 return i;
             }
         }
@@ -247,7 +265,7 @@
         }
         return Objects.equals(this.id(), ((ImmutableListWorkflow) obj).id())
                 && Objects.equals(this.initWorkletType, ((ImmutableListWorkflow) obj).initWorkletType)
-                && Objects.equals(this.workletTypeList, ((ImmutableListWorkflow) obj).workletTypeList)
+                && Objects.equals(this.workletDescList, ((ImmutableListWorkflow) obj).workletDescList)
                 && Objects.equals(this.attributes, ((ImmutableListWorkflow) obj).attributes);
     }
 
@@ -256,7 +274,7 @@
         return MoreObjects.toStringHelper(getClass())
                 .add("id", id())
                 .add("initWorklet", initWorkletType)
-                .add("workList", workletTypeList)
+                .add("workList", workletDescList)
                 .add("attributes", attributes)
                 .toString();
     }
@@ -277,7 +295,7 @@
 
         private URI id;
         private String initWorkletType;
-        private final List<String> workletTypeList = Lists.newArrayList();
+        private final List<WorkletDescription> workletDescList = Lists.newArrayList();
         private final Set<WorkflowAttribute> attributes = Sets.newHashSet();
 
         /**
@@ -288,7 +306,7 @@
          */
         public Builder id(URI uri) {
             this.id = uri;
-            workletTypeList.add(Worklet.Common.INIT.tag());
+            workletDescList.add(new DefaultWorkletDescription(Worklet.Common.INIT.tag()));
             return this;
         }
 
@@ -310,7 +328,7 @@
          * @return builder
          */
         public Builder chain(String workletClassName) {
-            workletTypeList.add(workletClassName);
+            workletDescList.add(new DefaultWorkletDescription(workletClassName));
             return this;
         }
 
@@ -331,8 +349,13 @@
          * @return instance of ImmutableListWorkflow
          */
         public ImmutableListWorkflow build() {
-            workletTypeList.add(Worklet.Common.COMPLETED.tag());
+            workletDescList.add(new DefaultWorkletDescription(Worklet.Common.COMPLETED.tag()));
             return new ImmutableListWorkflow(this);
         }
+
+        public Builder chain(DefaultWorkletDescription workletDesc) {
+            workletDescList.add(workletDesc);
+            return this;
+        }
     }
 }
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/JsonDataModelTree.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/JsonDataModelTree.java
index 7ee1be7..aec19ae 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/JsonDataModelTree.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/JsonDataModelTree.java
@@ -56,6 +56,7 @@
 
     /**
      * Constructor of JsonDataModelTree.
+     *
      * @param root root node of json data model tree
      */
     public JsonDataModelTree(JsonNode root) {
@@ -169,7 +170,8 @@
 
     /**
      * Allocates json data model tree on json pointer path with specific leaf type.
-     * @param ptr json pointer to allocate
+     *
+     * @param ptr      json pointer to allocate
      * @param leaftype type of leaf node
      * @return json data model tree
      * @throws WorkflowException workflow exception
@@ -194,6 +196,7 @@
 
     /**
      * Gets root json node.
+     *
      * @return root json node
      * @throws WorkflowException workflow exception
      */
@@ -203,6 +206,7 @@
 
     /**
      * Gets root json node as ObjectNode (MAP type).
+     *
      * @return root json node as ObjectNode
      * @throws WorkflowException workflow exception
      */
@@ -212,6 +216,7 @@
 
     /**
      * Gets root json node as ArrayNode (Array type).
+     *
      * @return root json node as ArrayNode
      * @throws WorkflowException workflow exception
      */
@@ -221,6 +226,7 @@
 
     /**
      * Gets json node on specific path.
+     *
      * @param path path of json node
      * @return json node on specific path
      * @throws WorkflowException workflow exception
@@ -232,6 +238,7 @@
 
     /**
      * Gets json node on specific json pointer.
+     *
      * @param ptr json pointer
      * @return json node on specific json pointer.
      * @throws WorkflowException workflow exception
@@ -246,6 +253,7 @@
 
     /**
      * Gets json node on specific path as ObjectNode.
+     *
      * @param path path of json node
      * @return ObjectNode type json node on specific path
      * @throws WorkflowException workflow exception
@@ -257,6 +265,7 @@
 
     /**
      * Gets json node on specific json pointer as ObjectNode.
+     *
      * @param ptr json pointer
      * @return ObjectNode type json node on specific json pointer.
      * @throws WorkflowException workflow exception
@@ -277,6 +286,7 @@
 
     /**
      * Gets json node on specific path as ArrayNode.
+     *
      * @param path path of json node
      * @return ArrayNode type json node on specific path
      * @throws WorkflowException workflow exception
@@ -288,6 +298,7 @@
 
     /**
      * Gets json node on specific json pointer as ArrayNode.
+     *
      * @param ptr json pointer
      * @return ArrayNode type json node on specific json pointer.
      * @throws WorkflowException workflow exception
@@ -308,6 +319,7 @@
 
     /**
      * Gets text node on specific path.
+     *
      * @param path path of json node
      * @return text on specific path
      * @throws WorkflowException workflow exception
@@ -319,6 +331,7 @@
 
     /**
      * Gets text on specific json pointer.
+     *
      * @param ptr json pointer
      * @return text on specific json pointer
      * @throws WorkflowException workflow exception
@@ -339,6 +352,7 @@
 
     /**
      * Gets integer node on specific path.
+     *
      * @param path path of json node
      * @return integer on specific path
      * @throws WorkflowException workflow exception
@@ -350,6 +364,7 @@
 
     /**
      * Gets integer on specific json pointer.
+     *
      * @param ptr json pointer
      * @return integer on specific json pointer
      * @throws WorkflowException workflow exception
@@ -370,6 +385,7 @@
 
     /**
      * Gets boolean on specific path.
+     *
      * @param path path of json node
      * @return boolean on specific path
      * @throws WorkflowException workflow exception
@@ -381,6 +397,7 @@
 
     /**
      * Gets boolean on specific json pointer.
+     *
      * @param ptr json pointer
      * @return boolean on specific json pointer
      * @throws WorkflowException workflow exception
@@ -401,6 +418,7 @@
 
     /**
      * Sets text on specific json path.
+     *
      * @param path json path
      * @param text text to set
      * @throws WorkflowException workflow exception
@@ -412,18 +430,21 @@
 
     /**
      * Sets text on the specific json pointer.
-     * @param ptr json pointer
+     *
+     * @param ptr  json pointer
      * @param text text to set
      * @throws WorkflowException workflow exception
      */
     public void setAt(JsonPointer ptr, String text) throws WorkflowException {
         TextNode textNode = TextNode.valueOf(text);
+
         attach(ptr, textNode);
     }
 
     /**
      * Sets boolean on specific json path.
-     * @param path json path
+     *
+     * @param path   json path
      * @param isTrue boolean to set
      * @throws WorkflowException workflow exception
      */
@@ -433,8 +454,83 @@
     }
 
     /**
+     * Sets text on the specific json pointer.
+     *
+     * @param ptr      json pointer
+     * @param jsonNode jsonNode to set
+     * @throws WorkflowException workflow exception
+     */
+    public void setAt(JsonPointer ptr, JsonNode jsonNode) throws WorkflowException {
+        JsonNode node = jsonNode;
+        attach(ptr, node);
+    }
+
+    /**
+     * Sets boolean on specific json path.
+     *
+     * @param path     json path
+     * @param jsonNode jsonNode to set
+     * @throws WorkflowException workflow exception
+     */
+    public void setAt(String path, JsonNode jsonNode) throws WorkflowException {
+        JsonPointer ptr = JsonPointer.compile(path);
+        setAt(ptr, jsonNode);
+    }
+
+
+    /**
+     * Sets text on the specific json pointer.
+     *
+     * @param ptr       json pointer
+     * @param arrayNode arrayNode to set
+     * @throws WorkflowException workflow exception
+     */
+    public void setAt(JsonPointer ptr, ArrayNode arrayNode) throws WorkflowException {
+        ArrayNode node = arrayNode;
+        attach(ptr, node);
+    }
+
+    /**
+     * Sets boolean on specific json path.
+     *
+     * @param path      json path
+     * @param arrayNode arrayNode to set
+     * @throws WorkflowException workflow exception
+     */
+    public void setAt(String path, ArrayNode arrayNode) throws WorkflowException {
+        JsonPointer ptr = JsonPointer.compile(path);
+        setAt(ptr, arrayNode);
+    }
+
+    /**
+     * Sets text on the specific json pointer.
+     *
+     * @param ptr        json pointer
+     * @param objectNode objectNode to set
+     * @throws WorkflowException workflow exception
+     */
+    public void setAt(JsonPointer ptr, ObjectNode objectNode) throws WorkflowException {
+        ObjectNode node = objectNode;
+        attach(ptr, node);
+    }
+
+    /**
+     * Sets boolean on specific json path.
+     *
+     * @param path       json path
+     * @param objectNode objectNode to set
+     * @throws WorkflowException workflow exception
+     */
+    public void setAt(String path, ObjectNode objectNode) throws WorkflowException {
+        JsonPointer ptr = JsonPointer.compile(path);
+        setAt(ptr, objectNode);
+    }
+
+
+    /**
      * Sets boolean on the specific json pointer.
-     * @param ptr json pointer
+     *
+     * @param ptr    json pointer
      * @param isTrue boolean to set
      * @throws WorkflowException workflow exception
      */
@@ -445,7 +541,8 @@
 
     /**
      * Sets integer on specific json path.
-     * @param path json path
+     *
+     * @param path   json path
      * @param number number to set
      * @throws WorkflowException workflow exception
      */
@@ -456,7 +553,8 @@
 
     /**
      * Sets integer on the specific json pointer.
-     * @param ptr json pointer
+     *
+     * @param ptr    json pointer
      * @param number number to set
      * @throws WorkflowException workflow exception
      */
@@ -467,8 +565,9 @@
 
     /**
      * Allocates json data model tree on json pointer path with specific leaf type.
-     * @param node current json node in the json tree path
-     * @param ptr json pointer
+     *
+     * @param node     current json node in the json tree path
+     * @param ptr      json pointer
      * @param leaftype leaf type to be allocated
      * @return allocated json node
      * @throws WorkflowException workflow exception
@@ -510,6 +609,7 @@
 
     /**
      * Creating empty json node.
+     *
      * @param type json node type to create
      * @return created json node
      * @throws WorkflowException workflow exception
@@ -528,6 +628,7 @@
 
     /**
      * Gets the pretty json formatted string of this json data model tree.
+     *
      * @return pretty json formatted string of this json data model tree
      */
     public String formattedRootString() {
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/StaticDataModel.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/StaticDataModel.java
new file mode 100644
index 0000000..91e8382
--- /dev/null
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/StaticDataModel.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.workflow.api;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+
+/**
+ * Annotation for injecting static data model on work-let execution context.
+ */
+public @interface StaticDataModel {
+
+    /**
+     * Path of data model.
+     *
+     * @return path of data model
+     */
+    String path() default "/";
+
+    /**
+     * Representing whether this data model is optional or not.
+     *
+     * @return optional or not
+     */
+    boolean optional() default false;
+}
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/StaticDataModelInjector.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/StaticDataModelInjector.java
new file mode 100644
index 0000000..92d3664
--- /dev/null
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/StaticDataModelInjector.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.workflow.api;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.List;
+import java.util.Objects;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class StaticDataModelInjector {
+
+    private static final Logger log = LoggerFactory.getLogger(StaticDataModelInjector.class);
+
+    /**
+     * Injects data model to work-let.
+     *
+     * @param worklet            work-let to be injected
+     * @param workletDescription worklet description
+     * @throws WorkflowException workflow exception
+     */
+    public void inject(Worklet worklet, WorkletDescription workletDescription) throws WorkflowException {
+
+        handle(worklet, workletDescription, this::injectModel);
+    }
+
+    private void handle(Worklet worklet, WorkletDescription workletDescription, DataModelFieldBehavior func)
+            throws WorkflowException {
+        Class cl = worklet.getClass();
+        List<Field> fields = getInheritedFields(cl);
+        if (Objects.isNull(fields)) {
+            log.error("Invalid fields on {}", cl);
+            return;
+        }
+
+        for (Field field : fields) {
+            Annotation[] annotations = field.getAnnotations();
+            if (Objects.isNull(annotations)) {
+                continue;
+            }
+            for (Annotation annotation : annotations) {
+                if (!(annotation instanceof StaticDataModel)) {
+                    continue;
+                }
+                StaticDataModel model = (StaticDataModel) annotation;
+                func.apply(worklet, workletDescription, field, model);
+            }
+        }
+    }
+
+    private static List<Field> getInheritedFields(Class<?> type) {
+        List<Field> fields = new ArrayList<Field>();
+
+        Class<?> cl = type;
+        while (cl != null && cl != Object.class) {
+            for (Field field : cl.getDeclaredFields()) {
+                if (!field.isSynthetic()) {
+                    fields.add(field);
+                }
+            }
+            cl = cl.getSuperclass();
+        }
+        return fields;
+    }
+
+    /**
+     * Functional interface for json data model annotated field behavior.
+     */
+    @FunctionalInterface
+    public interface DataModelFieldBehavior {
+        void apply(Worklet worklet, WorkletDescription workletDescription, Field field, StaticDataModel model)
+                throws WorkflowException;
+    }
+
+    private static Map<Class, DataModelFieldBehavior> injectTypeMap = new HashMap<>();
+
+    static {
+        injectTypeMap.put(String.class, StaticDataModelInjector::injectText);
+        injectTypeMap.put(Integer.class, StaticDataModelInjector::injectInteger);
+        injectTypeMap.put(Boolean.class, StaticDataModelInjector::injectBoolean);
+        injectTypeMap.put(JsonNode.class, StaticDataModelInjector::injectJsonNode);
+        injectTypeMap.put(ArrayNode.class, StaticDataModelInjector::injectArrayNode);
+        injectTypeMap.put(ObjectNode.class, StaticDataModelInjector::injectObjectNode);
+    }
+
+    /**
+     * Injects data model on the filed of work-let.
+     *
+     * @param worklet            work-let
+     * @param workletDescription worklet description
+     * @param field              the field of work-let
+     * @param model              data model for the field
+     * @throws WorkflowException workflow exception
+     */
+    private void injectModel(Worklet worklet, WorkletDescription workletDescription, Field field, StaticDataModel model)
+            throws WorkflowException {
+
+        DataModelFieldBehavior behavior = injectTypeMap.get(field.getType());
+        if (Objects.isNull(behavior)) {
+            throw new WorkflowException("Not supported type(" + field.getType() + ")");
+        }
+        behavior.apply(worklet, workletDescription, field, model);
+    }
+
+    /**
+     * Injects text data model on the filed of work-let.
+     *
+     * @param worklet            work-let
+     * @param workletDescription worklet description
+     * @param field              the field of work-let
+     * @param model              text data model for the field
+     * @throws WorkflowException workflow exception
+     */
+    private static void injectText(Worklet worklet, WorkletDescription workletDescription, Field field,
+                                   StaticDataModel model) throws WorkflowException {
+
+        String text = ((JsonDataModelTree) workletDescription.data()).textAt(model.path());
+        if (Objects.isNull(text)) {
+            if (model.optional()) {
+                return;
+            }
+            throw new WorkflowException("Invalid array node data model on (" + model.path() + ")");
+        }
+
+
+        if (!(Objects.equals(field.getType(), String.class))) {
+            throw new WorkflowException("Target field (" + field + ") is not String");
+        }
+
+        try {
+            field.setAccessible(true);
+            field.set(worklet, text);
+        } catch (IllegalAccessException e) {
+            throw new WorkflowException(e);
+        }
+    }
+
+    /**
+     * Injects integer data model on the filed of work-let.
+     *
+     * @param worklet            work-let
+     * @param workletDescription worklet description
+     * @param field              the field of work-let
+     * @param model              integer data model for the field
+     * @throws WorkflowException workflow exception
+     */
+    private static void injectInteger(Worklet worklet, WorkletDescription workletDescription, Field field,
+                                      StaticDataModel model) throws WorkflowException {
+
+        Integer number = ((JsonDataModelTree) workletDescription.data()).intAt(model.path());
+        if (Objects.isNull(number)) {
+            if (model.optional()) {
+                return;
+            }
+            throw new WorkflowException("Invalid array node data model on (" + model.path() + ")");
+        }
+        if (!(Objects.equals(field.getType(), Integer.class))) {
+            throw new WorkflowException("Target field (" + field + ") is not Integer");
+        }
+
+        try {
+            field.setAccessible(true);
+            field.set(worklet, number);
+        } catch (IllegalAccessException e) {
+            throw new WorkflowException(e);
+        }
+    }
+
+
+    /**
+     * Injects boolean data model on the filed of work-let.
+     *
+     * @param worklet            work-let
+     * @param workletDescription worklet description
+     * @param field              the field of work-let
+     * @param model              boolean data model for the field
+     * @throws WorkflowException workflow exception
+     */
+    private static void injectBoolean(Worklet worklet, WorkletDescription workletDescription, Field field,
+                                      StaticDataModel model) throws WorkflowException {
+
+        Boolean bool = ((JsonDataModelTree) workletDescription.data()).booleanAt(model.path());
+        if (Objects.isNull(bool)) {
+            if (model.optional()) {
+                return;
+            }
+            throw new WorkflowException("Invalid boolean data model on (" + model.path() + ")");
+        }
+
+        if (!(Objects.equals(field.getType(), Boolean.class))) {
+            throw new WorkflowException("Target field (" + field + ") is not Boolean");
+        }
+
+        try {
+            field.setAccessible(true);
+            field.set(worklet, bool);
+        } catch (IllegalAccessException e) {
+            throw new WorkflowException(e);
+        }
+    }
+
+    /**
+     * Injects json node data model on the filed of work-let.
+     *
+     * @param worklet            work-let
+     * @param workletDescription worklet description
+     * @param field              the field of work-let
+     * @param model              json node data model for the field
+     * @throws WorkflowException workflow exception
+     */
+    private static void injectJsonNode(Worklet worklet, WorkletDescription workletDescription, Field field,
+                                       StaticDataModel model) throws WorkflowException {
+
+        JsonNode jsonNode = ((JsonDataModelTree) workletDescription.data()).nodeAt(model.path());
+        if (Objects.isNull(jsonNode)) {
+            if (model.optional()) {
+                return;
+            }
+            throw new WorkflowException("Invalid json node data model on (" + model.path() + ")");
+        }
+
+        if (!(Objects.equals(field.getType(), JsonNode.class))) {
+            throw new WorkflowException("Target field (" + field + ") is not JsonNode");
+        }
+
+        try {
+            field.setAccessible(true);
+            field.set(worklet, jsonNode);
+        } catch (IllegalAccessException e) {
+            throw new WorkflowException(e);
+        }
+    }
+
+    /**
+     * Injects json array node data model on the filed of work-let.
+     *
+     * @param worklet            work-let
+     * @param workletDescription worklet description
+     * @param field              the field of work-let
+     * @param model              json array node data model for the field
+     * @throws WorkflowException workflow exception
+     */
+    private static void injectArrayNode(Worklet worklet, WorkletDescription workletDescription, Field field,
+                                        StaticDataModel model) throws WorkflowException {
+
+        ArrayNode arrayNode = ((JsonDataModelTree) workletDescription.data()).arrayAt(model.path());
+        if (Objects.isNull(arrayNode)) {
+            if (model.optional()) {
+                return;
+            }
+            throw new WorkflowException("Invalid array node data model on (" + model.path() + ")");
+        }
+
+        if (!(Objects.equals(field.getType(), ArrayNode.class))) {
+            throw new WorkflowException("Target field (" + field + ") is not ArrayNode");
+        }
+
+        try {
+            field.setAccessible(true);
+            field.set(worklet, arrayNode);
+        } catch (IllegalAccessException e) {
+            throw new WorkflowException(e);
+        }
+    }
+
+    /**
+     * Injects json object node data model on the filed of work-let.
+     *
+     * @param worklet            work-let
+     * @param workletDescription worklet description
+     * @param field              the field of work-let
+     * @param model              json object node data model for the field
+     * @throws WorkflowException workflow exception
+     */
+    private static void injectObjectNode(Worklet worklet, WorkletDescription workletDescription, Field field,
+                                         StaticDataModel model) throws WorkflowException {
+
+        ObjectNode objNode = ((JsonDataModelTree) workletDescription.data()).objectAt(model.path());
+        if (Objects.isNull(objNode)) {
+            if (model.optional()) {
+                return;
+            }
+            throw new WorkflowException("Invalid object node data model on (" + model.path() + ")");
+        }
+
+        if (!(Objects.equals(field.getType(), ObjectNode.class))) {
+            throw new WorkflowException("Target field (" + field + ") is not ObjectNode");
+        }
+
+        try {
+            field.setAccessible(true);
+            field.set(worklet, objNode);
+        } catch (IllegalAccessException e) {
+            throw new WorkflowException(e);
+        }
+    }
+}
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java
index 1404f9b..5073105 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/Workflow.java
@@ -26,12 +26,14 @@
 
     /**
      * Id of workflow.
+     *
      * @return id
      */
     URI id();
 
     /**
      * Returns init worklet.
+     *
      * @param context workflow context
      * @return init worklet
      * @throws WorkflowException workflow exception
@@ -40,6 +42,7 @@
 
     /**
      * Returns next program counter.
+     *
      * @param context workflow context
      * @return next program counter
      * @throws WorkflowException workflow exception
@@ -48,6 +51,7 @@
 
     /**
      * Gets increased program coounter.
+     *
      * @param pc program counter
      * @return increased program counter
      * @throws WorkflowException workflow exception
@@ -56,6 +60,7 @@
 
     /**
      * Returns instance of worklet.
+     *
      * @param pc program counter
      * @return instance of worklet
      * @throws WorkflowException workflow exception
@@ -64,6 +69,7 @@
 
     /**
      * Returns instance of worklet.
+     *
      * @param workletType class name of worklet
      * @return instance of worklet
      * @throws WorkflowException workflow exception
@@ -72,8 +78,9 @@
 
     /**
      * Builds workflow context.
+     *
      * @param workplace workplace of system workflow
-     * @param data data model of system workflow context
+     * @param data      data model of system workflow context
      * @return workflow context
      * @throws WorkflowException workflow exception
      */
@@ -81,8 +88,9 @@
 
     /**
      * Builds system workflow context.
+     *
      * @param workplace workplace of system workflow
-     * @param data data model of system workflow context
+     * @param data      data model of system workflow context
      * @return system workflow context
      * @throws WorkflowException workflow exception
      */
@@ -90,13 +98,23 @@
 
     /**
      * Returns workflow attributes.
+     *
      * @return attributes
      */
     Set<WorkflowAttribute> attributes();
 
     /**
-     * Returns worklet type list.
-     * @return worklet type
+     * Returns worklet desc list.
+     *
+     * @return worklet description list
      */
-    List<String> getWorkletTypeList();
+    List<WorkletDescription> getWorkletDescList();
+
+    /**
+     * Returns worklet description.
+     * @param pc program counter
+     * @return worklet description list
+     */
+    WorkletDescription getWorkletDesc(ProgramCounter pc);
+
 }
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowStore.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowStore.java
index ac0de4d..a4274935 100644
--- a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowStore.java
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkflowStore.java
@@ -25,18 +25,21 @@
 
     /**
      * Registers workflow.
+     *
      * @param workflow registering workflow
      */
     void register(Workflow workflow);
 
     /**
      * Unregisters workflow.
+     *
      * @param id id of workflow
      */
     void unregister(URI id);
 
     /**
      * Gets workflow.
+     *
      * @param id id of workflow
      * @return workflow
      */
@@ -44,27 +47,32 @@
 
     /**
      * Gets all workflow.
+     *
      * @return collection of workflow
      */
     Collection<Workflow> getAll();
 
     /**
      * Registers local class loader.
+     *
      * @param loader class loader
      */
     void registerLocal(ClassLoader loader);
 
     /**
      * Unregisters local class loader.
+     *
      * @param loader class loader
      */
     void unregisterLocal(ClassLoader loader);
 
     /**
      * Gets class from registered class loaders.
+     *
      * @param name name of class
      * @return class
      * @throws ClassNotFoundException class not found exception
      */
     Class getClass(String name) throws ClassNotFoundException;
+
 }
diff --git a/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkletDescription.java b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkletDescription.java
new file mode 100644
index 0000000..71ddbe5
--- /dev/null
+++ b/apps/workflow/api/src/main/java/org/onosproject/workflow/api/WorkletDescription.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.workflow.api;
+
+
+public interface WorkletDescription {
+
+    /**
+     * Gets worklet name.
+     *
+     * @return worklet name
+     */
+    String tag();
+
+    /**
+     * Gets worklet data model.
+     *
+     * @return worklet data model
+     */
+    JsonDataModelTree data();
+
+
+}
