diff --git a/core/api/src/main/java/org/onosproject/cfg/ConfigProperty.java b/core/api/src/main/java/org/onosproject/cfg/ConfigProperty.java
new file mode 100644
index 0000000..36cd22b
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/cfg/ConfigProperty.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2015 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.cfg;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
+/**
+ * Component configuration property.
+ */
+public final class ConfigProperty {
+
+    private final String name;
+    private final Type type;
+    private final String value;
+    private final String defaultValue;
+    private final String description;
+    private final boolean isSet;
+
+    /**
+     * Representation of the type of property value.
+     */
+    public enum Type {
+        /**
+         * Indicates the value is a string.
+         */
+        STRING,
+
+        /**
+         * Indicates the value is an integer.
+         */
+        INTEGER,
+
+        /**
+         * Indicates the value is a long.
+         */
+        LONG,
+
+        /**
+         * Indicates the value is a float.
+         */
+        FLOAT,
+
+        /**
+         * Indicates the value is a double.
+         */
+        DOUBLE,
+
+        /**
+         * Indicates the value is a boolean.
+         */
+        BOOLEAN
+    }
+
+    /**
+     * Creates a new configuration property with its default value.
+     *
+     * @param name         property name
+     * @param type         value type
+     * @param defaultValue default value as a string
+     * @param description  property description
+     * @return newly defined property
+     */
+    public static ConfigProperty defineProperty(String name, Type type,
+                                                String defaultValue,
+                                                String description) {
+        return new ConfigProperty(name, type, description, defaultValue, defaultValue, false);
+    }
+
+    /**
+     * Creates a new configuration property as a copy of an existing one, but
+     * with a new value.
+     *
+     * @param property property to be changed
+     * @param newValue new value as a string
+     * @return newly updated property
+     */
+    public static ConfigProperty setProperty(ConfigProperty property, String newValue) {
+        return new ConfigProperty(property.name, property.type, property.description,
+                                  property.defaultValue, newValue, true);
+    }
+
+    /**
+     * Creates a new configuration property as a copy of an existing one, but
+     * without a specific value, thus making it take its default value.
+     *
+     * @param property property to be reset
+     * @return newly reset property
+     */
+    public static ConfigProperty resetProperty(ConfigProperty property) {
+        return new ConfigProperty(property.name, property.type, property.description,
+                                  property.defaultValue, property.defaultValue, false);
+    }
+
+    /**
+     * Creates a new configuration property with its default value.
+     *
+     * @param name         property name
+     * @param type         value type
+     * @param defaultValue default value as a string
+     * @param description  property description
+     * @param value        property value
+     * @param isSet        indicates whether the property is set or not
+     */
+    private ConfigProperty(String name, Type type, String description,
+                           String defaultValue, String value, boolean isSet) {
+        this.name = checkNotNull(name, "Property name cannot be null");
+        this.type = checkNotNull(type, "Property type cannot be null");
+        this.description = checkNotNull(description, "Property description cannot be null");
+        this.defaultValue = defaultValue;
+        this.value = value;
+        this.isSet = isSet;
+    }
+
+    /**
+     * Returns the property name.
+     *
+     * @return property name
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Returns the property type.
+     *
+     * @return property type
+     */
+    public Type type() {
+        return type;
+    }
+
+    /**
+     * Returns the property description.
+     *
+     * @return string value
+     */
+    public String description() {
+        return description;
+    }
+
+    /**
+     * Returns the property default value as a string.
+     *
+     * @return string default value
+     */
+    public String defaultValue() {
+        return defaultValue;
+    }
+
+    /**
+     * Returns the property value as a string.
+     *
+     * @return string value
+     */
+    public String value() {
+        return value;
+    }
+
+    /**
+     * Indicates whether the property is set or whether it assumes its
+     * default value.
+     *
+     * @return true if the property is set
+     */
+    public boolean isSet() {
+        return isSet;
+    }
+
+    /**
+     * Returns the property value as a string.
+     *
+     * @return string value
+     */
+    public String asString() {
+        return value;
+    }
+
+    /**
+     * Returns the property value as an integer.
+     *
+     * @return integer value
+     */
+    public int asInteger() {
+        checkState(type == Type.INTEGER, "Value is not an integer");
+        return Integer.parseInt(value);
+    }
+
+    /**
+     * Returns the property value as a long.
+     *
+     * @return long value
+     */
+    public long asLong() {
+        checkState(type == Type.INTEGER || type == Type.LONG, "Value is not a long or integer");
+        return Long.parseLong(value);
+    }
+
+    /**
+     * Returns the property value as a float.
+     *
+     * @return float value
+     */
+    public float asFloat() {
+        checkState(type == Type.FLOAT, "Value is not a float");
+        return Float.parseFloat(value);
+    }
+
+    /**
+     * Returns the property value as a double.
+     *
+     * @return double value
+     */
+    public double asDouble() {
+        checkState(type == Type.FLOAT || type == Type.DOUBLE, "Value is not a float or double");
+        return Double.parseDouble(value);
+    }
+
+    /**
+     * Returns the property value as a boolean.
+     *
+     * @return string value
+     */
+    public boolean asBoolean() {
+        checkState(type == Type.BOOLEAN, "Value is not a boolean");
+        return Boolean.parseBoolean(value);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * Equality is considered only on the basis of property name.
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ConfigProperty) {
+            final ConfigProperty other = (ConfigProperty) obj;
+            return Objects.equals(this.name, other.name);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("name", name)
+                .add("type", type)
+                .add("value", value)
+                .add("defaultValue", defaultValue)
+                .add("description", description)
+                .add("isSet", isSet)
+                .toString();
+    }
+}
