diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ActionName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ActionName.java
new file mode 100644
index 0000000..f188c3f
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ActionName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for an action.
+ */
+public class ActionName extends Name implements Serializable {
+    private static final long serialVersionUID = -8113271547363610328L;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public ActionName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from a given name object.
+     *
+     * @param source name object
+     */
+    public ActionName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConditionParameterName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConditionParameterName.java
new file mode 100644
index 0000000..ebcb370
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConditionParameterName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a parameter of condition.
+ */
+public class ConditionParameterName extends Name implements Serializable {
+    private static final long serialVersionUID = -7024856711436959445L;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public ConditionParameterName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from a given name object.
+     *
+     * @param source name object
+     */
+    public ConditionParameterName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConditionSegmentId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConditionSegmentId.java
new file mode 100644
index 0000000..114f7d4
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConditionSegmentId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for a segment of the condition in an operation.
+ */
+public class ConditionSegmentId extends UniqueId implements Serializable {
+    private static final long serialVersionUID = 729651151678557840L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public ConditionSegmentId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from unique id object
+     *
+     * @param source unique id object
+     */
+    public ConditionSegmentId(UniqueId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionId.java
new file mode 100644
index 0000000..9eb3c60
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for a connection.
+ */
+public class ConnectionId extends ObjectId implements Serializable {
+    private static final long serialVersionUID = -3422573026026783750L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public ConnectionId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from object id.
+     *
+     * @param source object id
+     */
+    public ConnectionId(ObjectId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionName.java
new file mode 100644
index 0000000..6f5aaba
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionName.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a connection instance.
+ */
+public class ConnectionName extends ObjectName
+        implements Serializable {
+    private static final long serialVersionUID = 7484493113230980623L;
+
+    /**
+     * Creates a new instance from a value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public ConnectionName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from object id.
+     *
+     * @param source object name
+     */
+    public ConnectionName(ObjectName source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionType.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionType.java
new file mode 100644
index 0000000..b9e5c36
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConnectionType.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * The type for a connection.
+ */
+public class ConnectionType extends Name implements Serializable {
+    private static final long serialVersionUID = -1633568961291764490L;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public ConnectionType(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from a given name object.
+     *
+     * @param source name object
+     */
+    public ConnectionType(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConstraintParameterName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConstraintParameterName.java
new file mode 100644
index 0000000..7ee271f
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConstraintParameterName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a parameter of constraint.
+ */
+public class ConstraintParameterName extends Name implements Serializable {
+    private static final long serialVersionUID = -3411701192703793928L;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public ConstraintParameterName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from a given name object.
+     *
+     * @param source name object
+     */
+    public ConstraintParameterName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConstraintSegmentId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConstraintSegmentId.java
new file mode 100644
index 0000000..d200d45
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ConstraintSegmentId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for a segment of the constraint in an operation.
+ */
+public class ConstraintSegmentId extends UniqueId implements Serializable {
+    private static final long serialVersionUID = 4718770940490631506L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public ConstraintSegmentId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from unique id.
+     *
+     * @param source unique id
+     */
+    public ConstraintSegmentId(UniqueId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/Description.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/Description.java
new file mode 100644
index 0000000..af8e4e6
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/Description.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * A human-readable description for an object.
+ */
+public class Description implements Serializable {
+    private static final long serialVersionUID = -9180190277220190973L;
+
+    // package-private for unit test access
+    static final int MIN_LENGTH = 1;
+    static final int MAX_LENGTH = 4096;
+
+    static String E_BAD_LENGTH = "Invalid length: %d, expected: [[" +
+            MIN_LENGTH + "‥" + MAX_LENGTH + "]].";
+
+    private final String value;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public Description(String value) {
+        checkNotNull(value, "Supplied value may not be null");
+        checkvalueLength(value);
+        this.value = value;
+    }
+
+    /**
+     * Creates a copy of the given description.
+     *
+     * @param source description to copy
+     */
+    public Description(Description source) {
+        this.value = source.value;
+    }
+
+    /**
+     * Returns the value of this instance.
+     *
+     * @return value the value of this instance
+     */
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Description other = (Description) obj;
+        return Objects.equals(value, other.value);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).add("value", value).toString();
+    }
+
+    private static void checkvalueLength(String value) {
+        int length = value.length();
+        if (length < MIN_LENGTH || length > MAX_LENGTH) {
+            throw new IllegalArgumentException(String.format(E_BAD_LENGTH, length));
+        }
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowId.java
new file mode 100644
index 0000000..e00ee2e
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for a flow.
+ */
+public class FlowId extends ObjectId implements Serializable {
+    private static final long serialVersionUID = 6318718481188171943L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public FlowId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from object id.
+     *
+     * @param source object id
+     */
+    public FlowId(ObjectId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowName.java
new file mode 100644
index 0000000..cf4f4ba
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a flow instance.
+ */
+public class FlowName extends ObjectName implements Serializable {
+    private static final long serialVersionUID = 8567250024305751275L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public FlowName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from object name.
+     *
+     * @param source object name
+     */
+    public FlowName(ObjectName source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowType.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowType.java
new file mode 100644
index 0000000..b891f93
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/FlowType.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * The type for a flow.
+ */
+public class FlowType extends Name implements Serializable {
+    private static final long serialVersionUID = -7883133472864967183L;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public FlowType(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public FlowType(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/IntentId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/IntentId.java
new file mode 100644
index 0000000..27de433
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/IntentId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for an intent.
+ */
+public class IntentId extends UniqueId implements Serializable {
+    private static final long serialVersionUID = -2583336103863621041L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public IntentId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from unique id.
+     *
+     * @param source unique id
+     */
+    public IntentId(UniqueId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/MatchItemName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/MatchItemName.java
new file mode 100644
index 0000000..4848908
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/MatchItemName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a match item.
+ */
+public class MatchItemName extends Name implements Serializable {
+    private static final long serialVersionUID = -1751105424030929383L;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public MatchItemName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public MatchItemName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/Name.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/Name.java
new file mode 100644
index 0000000..4727a82
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/Name.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * A generic string name type. Names must start with a letter.
+ */
+public class Name implements Serializable {
+    private static final long serialVersionUID = -1664832583906649664L;
+
+    // package-private for unit test access
+    static final int MIN_LENGTH = 1;
+    static final int MAX_LENGTH = 256;
+
+    static final String E_NULL_VALUE = "Supplied value may not be null";
+    static final String E_BAD_FORMAT =
+            "Supplied value \"%s\" does not match required pattern \"%s\"";
+    static String E_BAD_LENGTH = "Invalid length: %d, expected: [[" +
+            MIN_LENGTH + "‥" + MAX_LENGTH + "]].";
+
+    static final String NAME_PATTERN = "^[a-zA-Z]([a-zA-Z0-9\\-_.])*$";
+
+    private static final Pattern RE_NAME = Pattern.compile(NAME_PATTERN);
+
+    private final String value;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public Name(String value) {
+        checkNotNull(value, E_NULL_VALUE);
+        checkValueLength(value);
+        checkArgument(RE_NAME.matcher(value).matches(),
+                E_BAD_FORMAT, value, NAME_PATTERN);
+        this.value = value;
+    }
+
+    /**
+     * Creates a copy from the given name object.
+     *
+     * @param source name object
+     */
+    public Name(Name source) {
+        this.value = source.value;
+    }
+
+    /**
+     * Returns the value of this instance.
+     *
+     * @return the value
+     */
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Name other = (Name) obj;
+        return Objects.equals(value, other.value);
+    }
+
+    private static void checkValueLength(String value) {
+        int length = value.length();
+        if (length < MIN_LENGTH || length > MAX_LENGTH) {
+            throw new IllegalArgumentException(String.format(E_BAD_LENGTH, length));
+        }
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeId.java
new file mode 100644
index 0000000..b3cc279
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for a node.
+ */
+public class NodeId extends ObjectId implements Serializable {
+    private static final long serialVersionUID = 1905618053033346106L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public NodeId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from object id.
+     *
+     * @param source object id
+     */
+    public NodeId(ObjectId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeName.java
new file mode 100644
index 0000000..a6963e7
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a node instance.
+ */
+public class NodeName extends ObjectName implements Serializable {
+    private static final long serialVersionUID = -6179698948999651772L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public NodeName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from object name.
+     *
+     * @param source object name
+     */
+    public NodeName(ObjectName source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeType.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeType.java
new file mode 100644
index 0000000..2eaef57
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/NodeType.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * The type for a node.
+ */
+public class NodeType extends Name implements Serializable {
+    private static final long serialVersionUID = -4834692648659489687L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public NodeType(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public NodeType(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ObjectId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ObjectId.java
new file mode 100644
index 0000000..664fdd9
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ObjectId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for a parameterized object.
+ */
+public class ObjectId extends UniqueId implements Serializable {
+    private static final long serialVersionUID = -3348451476910517417L;
+
+    /**
+     * Creates a new instance from a given VALUE.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public ObjectId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from a given unique id.
+     *
+     * @param source given unique id
+     */
+    public ObjectId(UniqueId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ObjectName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ObjectName.java
new file mode 100644
index 0000000..f252c27
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ObjectName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a parameterized object
+ */
+public class ObjectName extends Name implements Serializable {
+    private static final long serialVersionUID = 1155594167838375452L;
+
+    /**
+     * Creates a new instance from a given name.
+     *
+     * @param value name
+     */
+    @ConstructorProperties("value")
+    public ObjectName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public ObjectName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/OperationId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/OperationId.java
new file mode 100644
index 0000000..9005b25
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/OperationId.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+
+/**
+ * A unique ID for an operation.
+ */
+public class OperationId extends UniqueId implements Serializable {
+    private static final long serialVersionUID = -8706161668186525977L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public OperationId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from unique id.
+     *
+     * @param source unique id
+     */
+    public OperationId(UniqueId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/OperationName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/OperationName.java
new file mode 100644
index 0000000..9587c48
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/OperationName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for an operation.
+ */
+public class OperationName extends Name implements Serializable {
+    private static final long serialVersionUID = 749648415346390830L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public OperationName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public OperationName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/ParameterName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ParameterName.java
new file mode 100644
index 0000000..0ec1212
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/ParameterName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a parameter.
+ */
+public class ParameterName extends Name implements Serializable {
+    private static final long serialVersionUID = -787280682246659993L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public ParameterName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public ParameterName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/PropertyName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/PropertyName.java
new file mode 100644
index 0000000..dbb3b13
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/PropertyName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a property.
+ */
+public class PropertyName extends Name implements Serializable {
+    private static final long serialVersionUID = 1540323919833101464L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public PropertyName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public PropertyName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/UniqueId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UniqueId.java
new file mode 100644
index 0000000..47c3226
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UniqueId.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A globally unique identifier.
+ */
+public class UniqueId extends Uuid implements Serializable {
+    private static final long serialVersionUID = 8559147438073776914L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public UniqueId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from unique id.
+     *
+     * @param source unique id
+     */
+    public UniqueId(Uuid source) {
+        super(source);
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserId.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserId.java
new file mode 100644
index 0000000..bb0594b
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserId.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A unique ID for a user.
+ */
+public class UserId extends UniqueId implements Serializable {
+    private static final long serialVersionUID = -7751516509943191510L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public UserId(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from unique id.
+     *
+     * @param source unique id
+     */
+    public UserId(UniqueId source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserName.java
new file mode 100644
index 0000000..8066ee8
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A name for a user.
+ */
+public class UserName extends Name implements Serializable {
+    private static final long serialVersionUID = -147651729946234978L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public UserName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public UserName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserPassword.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserPassword.java
new file mode 100644
index 0000000..0022cf3
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserPassword.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A password for a user.
+ */
+public class UserPassword extends Name implements Serializable {
+    private static final long serialVersionUID = 3000688972514429473L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public UserPassword(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public UserPassword(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserRoleDescription.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserRoleDescription.java
new file mode 100644
index 0000000..b44c689
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserRoleDescription.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * Description of the role characteristic and responsibility range.
+ */
+public class UserRoleDescription extends Description implements Serializable {
+    private static final long serialVersionUID = -2660734679397346998L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public UserRoleDescription(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a copy from the given description object.
+     *
+     * @param source description object
+     */
+    public UserRoleDescription(Description source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserRoleName.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserRoleName.java
new file mode 100644
index 0000000..39348d7
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/UserRoleName.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+
+/**
+ * A role name for a user.
+ */
+public class UserRoleName extends Name implements Serializable {
+    private static final long serialVersionUID = 9218242620936394800L;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value the value
+     */
+    @ConstructorProperties("value")
+    public UserRoleName(String value) {
+        super(value);
+    }
+
+    /**
+     * Creates a new instance from name object.
+     *
+     * @param source name object
+     */
+    public UserRoleName(Name source) {
+        super(source);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/Uuid.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/Uuid.java
new file mode 100644
index 0000000..69df13f
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/Uuid.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import java.beans.ConstructorProperties;
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * A universally unique identifier (UUID).
+ * The string representation is as defined in RFC 4122.
+ * The canonical representation uses lower case characters.
+ * <p>
+ * The following is an example UUID:
+ * <pre>
+ *     f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ * </pre>
+ */
+public class Uuid implements Serializable {
+    private static final long serialVersionUID = -6700962668564346825L;
+
+    // package private for unit test access
+    static final String E_BAD_FORMAT =
+            "Supplied value \"%s\" does not match required pattern \"%s\"";
+    static final String UUID_PATTERN = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-" +
+            "[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
+
+    private static final Pattern RE_UUID = Pattern.compile(UUID_PATTERN);
+
+
+    private final String value;
+
+    /**
+     * Creates a new instance from a given value.
+     *
+     * @param value value
+     */
+    @ConstructorProperties("value")
+    public Uuid(String value) {
+        checkNotNull(value, "Supplied value may not be null");
+        checkArgument(RE_UUID.matcher(value).matches(),
+                E_BAD_FORMAT, value, UUID_PATTERN);
+        this.value = value;
+    }
+
+    /**
+     * Creates a copy from the given universally unique identifier.
+     *
+     * @param source universally unique id
+     */
+    public Uuid(Uuid source) {
+        this.value = source.value;
+    }
+
+    /**
+     * Returns the value of this instance.
+     *
+     * @return the value
+     */
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return value.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Uuid other = (Uuid) obj;
+        return Objects.equals(value, other.value);
+    }
+}
+
diff --git a/nemoengine/src/main/java/org/onosproject/nemo/model/common/package-info.java b/nemoengine/src/main/java/org/onosproject/nemo/model/common/package-info.java
new file mode 100644
index 0000000..bade066
--- /dev/null
+++ b/nemoengine/src/main/java/org/onosproject/nemo/model/common/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Common classes for NEMO model.
+ */
+package org.onosproject.nemo.model.common;
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/AbstractCommonTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/AbstractCommonTest.java
new file mode 100644
index 0000000..780c4cc
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/AbstractCommonTest.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+/**
+ * Base class for unit tests.
+ */
+abstract class AbstractCommonTest {
+
+    static final String E_NOEX = "no exception thrown";
+    static final String E_UNEX = "unexpected exception thrown";
+    static final String E_WREX = "wrong exception message";
+    static final String COLON = " : ";
+
+}
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ActionNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ActionNameTest.java
new file mode 100644
index 0000000..1d09efa
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ActionNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ActionName}.
+ */
+public class ActionNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private ActionName name;
+    private ActionName copy;
+    private ActionName diff;
+
+    @Test
+    public void fromString() {
+        name = new ActionName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new ActionName(NAME);
+        copy = new ActionName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new ActionName(NAME);
+        copy = new ActionName(NAME);
+        diff = new ActionName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConditionParameterNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConditionParameterNameTest.java
new file mode 100644
index 0000000..2df9c5d
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConditionParameterNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ConditionParameterName}.
+ */
+public class ConditionParameterNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private ConditionParameterName name;
+    private ConditionParameterName copy;
+    private ConditionParameterName diff;
+
+    @Test
+    public void fromString() {
+    	name = new ConditionParameterName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new ConditionParameterName(NAME);
+        copy = new ConditionParameterName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new ConditionParameterName(NAME);
+        copy = new ConditionParameterName(NAME);
+        diff = new ConditionParameterName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConditionSegmentIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConditionSegmentIdTest.java
new file mode 100644
index 0000000..b134f3a
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConditionSegmentIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ConditionSegmentId}.
+ */
+public class ConditionSegmentIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private ConditionSegmentId id;
+    private ConditionSegmentId copy;
+    private ConditionSegmentId diff;
+
+    @Test
+    public void fromString() {
+        id = new ConditionSegmentId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new ConditionSegmentId(ID);
+        copy = new ConditionSegmentId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new ConditionSegmentId(ID);
+        copy = new ConditionSegmentId(ID);
+        diff = new ConditionSegmentId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionIdTest.java
new file mode 100644
index 0000000..bc56fb7
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ConnectionId}.
+ */
+public class ConnectionIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private ConnectionId id;
+    private ConnectionId copy;
+    private ConnectionId diff;
+
+    @Test
+    public void fromString() {
+        id = new ConnectionId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new ConnectionId(ID);
+        copy = new ConnectionId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new ConnectionId(ID);
+        copy = new ConnectionId(ID);
+        diff = new ConnectionId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionNameTest.java
new file mode 100644
index 0000000..18c8f06
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ConnectionName}.
+ */
+public class ConnectionNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private ConnectionName name;
+    private ConnectionName copy;
+    private ConnectionName diff;
+
+    @Test
+    public void fromString() {
+        name = new ConnectionName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new ConnectionName(NAME);
+        copy = new ConnectionName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new ConnectionName(NAME);
+        copy = new ConnectionName(NAME);
+        diff = new ConnectionName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionTypeTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionTypeTest.java
new file mode 100644
index 0000000..7e4e0ee
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConnectionTypeTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ConnectionType}.
+ */
+public class ConnectionTypeTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private ConnectionType name;
+    private ConnectionType copy;
+    private ConnectionType diff;
+
+    @Test
+    public void fromString() {
+        name = new ConnectionType(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new ConnectionType(NAME);
+        copy = new ConnectionType(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new ConnectionType(NAME);
+        copy = new ConnectionType(NAME);
+        diff = new ConnectionType(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConstraintParameterNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConstraintParameterNameTest.java
new file mode 100644
index 0000000..9fae39f
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConstraintParameterNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ConstraintParameterName}.
+ */
+public class ConstraintParameterNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private ConstraintParameterName name;
+    private ConstraintParameterName copy;
+    private ConstraintParameterName diff;
+
+    @Test
+    public void fromString() {
+        name = new ConstraintParameterName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new ConstraintParameterName(NAME);
+        copy = new ConstraintParameterName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new ConstraintParameterName(NAME);
+        copy = new ConstraintParameterName(NAME);
+        diff = new ConstraintParameterName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConstraintSegmentIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConstraintSegmentIdTest.java
new file mode 100644
index 0000000..d8ecf2c
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ConstraintSegmentIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ConstraintSegmentId}.
+ */
+public class ConstraintSegmentIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private ConstraintSegmentId id;
+    private ConstraintSegmentId copy;
+    private ConstraintSegmentId diff;
+
+    @Test
+    public void fromString() {
+        id = new ConstraintSegmentId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new ConstraintSegmentId(ID);
+        copy = new ConstraintSegmentId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new ConstraintSegmentId(ID);
+        copy = new ConstraintSegmentId(ID);
+        diff = new ConstraintSegmentId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/DescriptionTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/DescriptionTest.java
new file mode 100644
index 0000000..50518cf
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/DescriptionTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.onosproject.nemo.model.common.Description.E_BAD_LENGTH;
+import static org.onosproject.nemo.model.common.Description.MAX_LENGTH;
+import static org.onosproject.nemo.model.common.Description.MIN_LENGTH;
+
+/**
+ * Unit tests for {@link Description}.
+ */
+public class DescriptionTest extends AbstractCommonTest {
+
+    private static final String DESC = "SomeDescription";
+    private static final String OTHER = "OtherDescription";
+
+    private static final int TOO_FEW = MIN_LENGTH - 1;
+    private static final int TOO_MANY = MAX_LENGTH + 1;
+
+    private static final String EXP_TOO_SMALL = String.format(E_BAD_LENGTH, TOO_FEW);
+    private static final String EXP_TOO_LONG = String.format(E_BAD_LENGTH, TOO_MANY);
+
+    private Description desc;
+    private Description copy;
+    private Description diff;
+
+    @Test(expected = NullPointerException.class)
+    public void constructWithNullString() {
+        new Description((String) null);
+    }
+
+    @Test
+    public void fromString() {
+        desc = new Description(DESC);
+        assertEquals("description not set", DESC, desc.getValue());
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void copyConstructWithNull() {
+        new Description((Description) null);
+    }
+
+    @Test
+    public void copyConstructor() {
+        desc = new Description(DESC);
+        copy = new Description(desc);
+        new EqualsTester()
+                .addEqualityGroup(desc, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void nameTooSmall() {
+        try {
+            desc = new Description("");
+            fail(E_NOEX);
+        } catch (IllegalArgumentException e) {
+            assertEquals(E_WREX, EXP_TOO_SMALL, e.getMessage());
+        }
+    }
+
+    @Test
+    public void nameTooLong() {
+        try {
+            StringBuilder temp = new StringBuilder();
+            for (int i = 0; i < TOO_MANY; i++) {
+                temp.append("a");
+            }
+            desc = new Description(temp.toString());
+            fail(E_NOEX);
+        } catch (IllegalArgumentException e) {
+            assertEquals(E_WREX, EXP_TOO_LONG, e.getMessage());
+        }
+    }
+
+    @Test
+    public void equality() {
+        desc = new Description(DESC);
+        copy = new Description(DESC);
+        diff = new Description(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(desc, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowIdTest.java
new file mode 100644
index 0000000..a430ab9
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowIdTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link FlowId}.
+ */
+public class FlowIdTest {
+
+    private static final String ID = "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID = "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private FlowId id;
+    private FlowId copy;
+    private FlowId diff;
+
+    @Test
+    public void fromString() {
+        id = new FlowId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new FlowId(ID);
+        copy = new FlowId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new FlowId(ID);
+        copy = new FlowId(ID);
+        diff = new FlowId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowNameTest.java
new file mode 100644
index 0000000..6eff50c
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link FlowName}.
+ */
+public class FlowNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private FlowName name;
+    private FlowName copy;
+    private FlowName diff;
+
+    @Test
+    public void fromString() {
+        name = new FlowName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new FlowName(NAME);
+        copy = new FlowName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new FlowName(NAME);
+        copy = new FlowName(NAME);
+        diff = new FlowName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowTypeTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowTypeTest.java
new file mode 100644
index 0000000..9100942
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/FlowTypeTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link FlowType}.
+ */
+public class FlowTypeTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private FlowType name;
+    private FlowType copy;
+    private FlowType diff;
+
+    @Test
+    public void fromString() {
+        name = new FlowType(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new FlowType(NAME);
+        copy = new FlowType(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new FlowType(NAME);
+        copy = new FlowType(NAME);
+        diff = new FlowType(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/IntentIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/IntentIdTest.java
new file mode 100644
index 0000000..d08e8f6
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/IntentIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link IntentId}.
+ */
+public class IntentIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private IntentId id;
+    private IntentId copy;
+    private IntentId diff;
+
+    @Test
+    public void fromString() {
+        id = new IntentId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new IntentId(ID);
+        copy = new IntentId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new IntentId(ID);
+        copy = new IntentId(ID);
+        diff = new IntentId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/MatchItemNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/MatchItemNameTest.java
new file mode 100644
index 0000000..cf9824c
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/MatchItemNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link MatchItemName}.
+ */
+public class MatchItemNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private MatchItemName name;
+    private MatchItemName copy;
+    private MatchItemName diff;
+
+    @Test
+    public void fromString() {
+        name = new MatchItemName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new MatchItemName(NAME);
+        copy = new MatchItemName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new MatchItemName(NAME);
+        copy = new MatchItemName(NAME);
+        diff = new MatchItemName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/NameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NameTest.java
new file mode 100644
index 0000000..f4f0b72
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NameTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.onosproject.nemo.model.common.Name.E_BAD_FORMAT;
+import static org.onosproject.nemo.model.common.Name.E_BAD_LENGTH;
+import static org.onosproject.nemo.model.common.Name.MAX_LENGTH;
+import static org.onosproject.nemo.model.common.Name.MIN_LENGTH;
+import static org.onosproject.nemo.model.common.Name.NAME_PATTERN;
+
+/**
+ * Unit tests for {@link Name}.
+ */
+public class NameTest extends AbstractCommonTest {
+
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private static final String[] BAD_STRINGS = {
+            "%..",
+            "123"
+    };
+    private static final String[] GOOD_STRINGS = {
+            "test",
+            "test1",
+            "test123"
+    };
+
+    private static final int TOO_FEW = MIN_LENGTH - 1;
+    private static final int TOO_MANY = MAX_LENGTH + 1;
+
+    private static final String EXP_TOO_SMALL = String.format(E_BAD_LENGTH, TOO_FEW);
+    private static final String EXP_TOO_LONG = String.format(E_BAD_LENGTH, TOO_MANY);
+
+    private Name name;
+    private Name copy;
+    private Name diff;
+
+    @Test
+    public void fromString() {
+        name = new Name(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new Name(NAME);
+        copy = new Name(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void constructWithNullString() {
+        new Name((String) null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void copyConstructWithNull() {
+        new Name((Name) null);
+    }
+
+    @Test
+    public void nameTooSmall() {
+        try {
+            name = new Name("");
+            fail(E_NOEX);
+        } catch (IllegalArgumentException e) {
+            assertEquals(E_WREX, EXP_TOO_SMALL, e.getMessage());
+        }
+    }
+
+    @Test
+    public void nameTooLong() {
+        try {
+            StringBuilder temp = new StringBuilder();
+            for (int i = 0; i < (MAX_LENGTH + 1); i++) {
+                temp.append("a");
+            }
+            name = new Name(temp.toString());
+            fail(E_NOEX);
+        } catch (IllegalArgumentException e) {
+            assertEquals(E_WREX, EXP_TOO_LONG, e.getMessage());
+        }
+    }
+
+    @Test
+    public void nameNotMatch() {
+        for (String s : BAD_STRINGS) {
+            try {
+                new Name(s);
+                fail(E_NOEX + COLON + s);
+            } catch (IllegalArgumentException e) {
+                assertEquals(E_WREX, String.format(E_BAD_FORMAT, s,
+                        NAME_PATTERN), e.getMessage());
+            }
+        }
+    }
+
+    @Test
+    public void nameMatch() {
+        for (String s : GOOD_STRINGS) {
+            try {
+                new Name(s);
+            } catch (IllegalArgumentException e) {
+                fail(E_UNEX + COLON + s);
+            }
+        }
+    }
+
+    @Test
+    public void equality() {
+        name = new Name(NAME);
+        copy = new Name(NAME);
+        diff = new Name(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeIdTest.java
new file mode 100644
index 0000000..8eaf2d9
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link NodeId}.
+ */
+public class NodeIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private NodeId id;
+    private NodeId copy;
+    private NodeId diff;
+
+    @Test
+    public void fromString() {
+        id = new NodeId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new NodeId(ID);
+        copy = new NodeId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new NodeId(ID);
+        copy = new NodeId(ID);
+        diff = new NodeId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeNameTest.java
new file mode 100644
index 0000000..a19b911
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link NodeName}.
+ */
+public class NodeNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private NodeName name;
+    private NodeName copy;
+    private NodeName diff;
+
+    @Test
+    public void fromString() {
+        name = new NodeName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new NodeName(NAME);
+        copy = new NodeName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new NodeName(NAME);
+        copy = new NodeName(NAME);
+        diff = new NodeName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeTypeTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeTypeTest.java
new file mode 100644
index 0000000..383260b
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/NodeTypeTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link NodeType}.
+ */
+public class NodeTypeTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private NodeType name;
+    private NodeType copy;
+    private NodeType diff;
+
+    @Test
+    public void fromString() {
+        name = new NodeType(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new NodeType(NAME);
+        copy = new NodeType(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new NodeType(NAME);
+        copy = new NodeType(NAME);
+        diff = new NodeType(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ObjectIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ObjectIdTest.java
new file mode 100644
index 0000000..935d57a
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ObjectIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ObjectId}.
+ */
+public class ObjectIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHERID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private ObjectId id;
+    private ObjectId copy;
+    private ObjectId diff;
+
+    @Test
+    public void fromString() {
+        id = new ObjectId(ID);
+        assertEquals("name not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new ObjectId(ID);
+        copy = new ObjectId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new ObjectId(ID);
+        copy = new ObjectId(ID);
+        diff = new ObjectId(OTHERID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ObjectNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ObjectNameTest.java
new file mode 100644
index 0000000..3873586
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ObjectNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ObjectName}.
+ */
+public class ObjectNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private ObjectName name;
+    private ObjectName copy;
+    private ObjectName diff;
+
+    @Test
+    public void fromString() {
+        name = new ObjectName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new ObjectName(NAME);
+        copy = new ObjectName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new ObjectName(NAME);
+        copy = new ObjectName(NAME);
+        diff = new ObjectName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/OperationIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/OperationIdTest.java
new file mode 100644
index 0000000..3382a84
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/OperationIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link OperationId}.
+ */
+public class OperationIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private OperationId id;
+    private OperationId copy;
+    private OperationId diff;
+
+    @Test
+    public void fromString() {
+        id = new OperationId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new OperationId(ID);
+        copy = new OperationId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new OperationId(ID);
+        copy = new OperationId(ID);
+        diff = new OperationId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/OperationNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/OperationNameTest.java
new file mode 100644
index 0000000..0364a9e
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/OperationNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link OperationName}.
+ */
+public class OperationNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private OperationName name;
+    private OperationName copy;
+    private OperationName diff;
+
+    @Test
+    public void fromString() {
+        name = new OperationName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new OperationName(NAME);
+        copy = new OperationName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new OperationName(NAME);
+        copy = new OperationName(NAME);
+        diff = new OperationName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/ParameterNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ParameterNameTest.java
new file mode 100644
index 0000000..e24ff32
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/ParameterNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link ParameterName}.
+ */
+public class ParameterNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private ParameterName name;
+    private ParameterName copy;
+    private ParameterName diff;
+
+    @Test
+    public void fromString() {
+        name = new ParameterName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new ParameterName(NAME);
+        copy = new ParameterName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new ParameterName(NAME);
+        copy = new ParameterName(NAME);
+        diff = new ParameterName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/PropertyNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/PropertyNameTest.java
new file mode 100644
index 0000000..56a3321
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/PropertyNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link PropertyName}.
+ */
+public class PropertyNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private PropertyName name;
+    private PropertyName copy;
+    private PropertyName diff;
+
+    @Test
+    public void fromString() {
+        name = new PropertyName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new PropertyName(NAME);
+        copy = new PropertyName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new PropertyName(NAME);
+        copy = new PropertyName(NAME);
+        diff = new PropertyName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/UniqueIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UniqueIdTest.java
new file mode 100644
index 0000000..df04489
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UniqueIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link UniqueId}.
+ */
+public class UniqueIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private UniqueId id;
+    private UniqueId copy;
+    private UniqueId diff;
+
+    @Test
+    public void fromString() {
+        id = new UniqueId(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new UniqueId(ID);
+        copy = new UniqueId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new UniqueId(ID);
+        copy = new UniqueId(ID);
+        diff = new UniqueId(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserIdTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserIdTest.java
new file mode 100644
index 0000000..31ba234
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserIdTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link UserId}.
+ */
+public class UserIdTest {
+
+    private static final String ID =
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHERID =
+            "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private UserId id;
+    private UserId copy;
+    private UserId diff;
+
+    @Test
+    public void fromString() {
+        id = new UserId(ID);
+        assertEquals("name not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new UserId(ID);
+        copy = new UserId(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        id = new UserId(ID);
+        copy = new UserId(ID);
+        diff = new UserId(OTHERID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserNameTest.java
new file mode 100644
index 0000000..3815553
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link UserName}.
+ */
+public class UserNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private UserName name;
+    private UserName copy;
+    private UserName diff;
+
+    @Test
+    public void fromString() {
+        name = new UserName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new UserName(NAME);
+        copy = new UserName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new UserName(NAME);
+        copy = new UserName(NAME);
+        diff = new UserName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserPasswordTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserPasswordTest.java
new file mode 100644
index 0000000..990633d
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserPasswordTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link UserPassword}.
+ */
+public class UserPasswordTest {
+
+    private static final String PASS = "SomePass";
+    private static final String OTHER = "OtherPass";
+
+    private UserPassword password;
+    private UserPassword copy;
+    private UserPassword diff;
+
+    @Test
+    public void fromString() {
+        password = new UserPassword(PASS);
+        assertEquals("name not set", PASS,
+                password.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        password = new UserPassword(PASS);
+        copy = new UserPassword(password);
+        new EqualsTester()
+                .addEqualityGroup(password, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        password = new UserPassword(PASS);
+        copy = new UserPassword(PASS);
+        diff = new UserPassword(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(password, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserRoleDescriptionTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserRoleDescriptionTest.java
new file mode 100644
index 0000000..2045440
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserRoleDescriptionTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link UserRoleDescription}.
+ */
+public class UserRoleDescriptionTest {
+
+    private static final String Description =
+            "SomeDescription";
+    private static final String OTHER =
+            "OtherDescription";
+
+    private UserRoleDescription description;
+    private UserRoleDescription copy;
+    private UserRoleDescription diff;
+
+    @Test
+    public void fromString() {
+        description = new UserRoleDescription(Description);
+        assertEquals("description not set", Description,
+                description.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        description = new UserRoleDescription(Description);
+        copy = new UserRoleDescription(description);
+        new EqualsTester()
+                .addEqualityGroup(description, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        description = new UserRoleDescription(Description);
+        copy = new UserRoleDescription(Description);
+        diff = new UserRoleDescription(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(description, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserRoleNameTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserRoleNameTest.java
new file mode 100644
index 0000000..f01a7d1
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UserRoleNameTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit tests for {@link UserRoleName}.
+ */
+public class UserRoleNameTest {
+
+    private static final String NAME = "SomeName";
+    private static final String OTHER = "OtherName";
+
+    private UserRoleName name;
+    private UserRoleName copy;
+    private UserRoleName diff;
+
+    @Test
+    public void fromString() {
+        name = new UserRoleName(NAME);
+        assertEquals("name not set", NAME, name.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        name = new UserRoleName(NAME);
+        copy = new UserRoleName(name);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .testEquals();
+    }
+
+    @Test
+    public void equality() {
+        name = new UserRoleName(NAME);
+        copy = new UserRoleName(NAME);
+        diff = new UserRoleName(OTHER);
+        new EqualsTester()
+                .addEqualityGroup(name, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
diff --git a/nemoengine/src/test/java/org/onosproject/nemo/model/common/UuidTest.java b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UuidTest.java
new file mode 100644
index 0000000..434f235
--- /dev/null
+++ b/nemoengine/src/test/java/org/onosproject/nemo/model/common/UuidTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.nemo.model.common;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.onosproject.nemo.model.common.Uuid.E_BAD_FORMAT;
+import static org.onosproject.nemo.model.common.Uuid.UUID_PATTERN;
+
+/**
+ * Unit tests for {@link Uuid}.
+ */
+public class UuidTest extends AbstractCommonTest {
+
+    private static final String ID = "14ce424a-3e50-4a2a-ad5c-b29845158c8b";
+    private static final String OTHER_ID = "a4ce424a-3e50-4a2a-ad5c-b29845158c8b";
+
+    private static final String[] BAD_STRINGS = {
+            "%..",
+            "123",
+            "s4ce424a-3e50-4a2a-ad5c-b29845158c8b",
+            "s4ce424a-3e50-4a2a-ad5c-b29845158c8basdf----"
+    };
+    private static final String[] GOOD_STRINGS = {
+            "14ce424a-3e50-4a2a-ad5c-b29845158c8b",
+            "a4ce424a-3e50-4a2a-bd5c-b29845158c8c",
+            "F3AC116A-4E82-4A2A-AD5C-B29845158C8B"
+    };
+
+    private static final Pattern RE_UUID = Pattern.compile(UUID_PATTERN);
+
+    private Uuid id;
+    private Uuid copy;
+    private Uuid diff;
+
+    @Test
+    public void fromString() {
+        id = new Uuid(ID);
+        assertEquals("id not set", ID, id.getValue());
+    }
+
+    @Test
+    public void copyConstructor() {
+        id = new Uuid(ID);
+        copy = new Uuid(id);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .testEquals();
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void constructWithNullString() {
+        new Uuid((String) null);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void copyConstructWithNull() {
+        new Uuid((Uuid) null);
+    }
+
+    @Test
+    public void idNotMatch() {
+        for (String s : BAD_STRINGS) {
+            try {
+                new Uuid(s);
+                fail(E_NOEX + COLON + s);
+            } catch (IllegalArgumentException e) {
+                assertEquals(E_WREX, String.format(E_BAD_FORMAT, s, UUID_PATTERN),
+                        e.getMessage());
+            }
+        }
+    }
+
+    @Test
+    public void idMatch() {
+        for (String s : GOOD_STRINGS) {
+            try {
+                new Uuid(s);
+            } catch (IllegalArgumentException e) {
+                fail(E_UNEX + COLON + s);
+            }
+        }
+    }
+
+    @Test
+    public void equality() {
+        id = new Uuid(ID);
+        copy = new Uuid(ID);
+        diff = new Uuid(OTHER_ID);
+        new EqualsTester()
+                .addEqualityGroup(id, copy)
+                .addEqualityGroup(diff)
+                .testEquals();
+    }
+}
\ No newline at end of file
