diff --git a/core/api/src/main/java/org/onosproject/net/DefaultAnnotations.java b/core/api/src/main/java/org/onosproject/net/DefaultAnnotations.java
index 242b0e8..f86df5e 100644
--- a/core/api/src/main/java/org/onosproject/net/DefaultAnnotations.java
+++ b/core/api/src/main/java/org/onosproject/net/DefaultAnnotations.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.Maps;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Maps.transformValues;
 
 /**
  * Represents a set of simple annotations that can be used to add arbitrary
@@ -246,6 +247,18 @@
         }
 
         /**
+         * Adds all entries in specified map.
+         * Any previous entries with same key will be overwritten.
+         *
+         * @param entries annotation key and value entries
+         * @return self
+         */
+        public Builder putAll(Map<String, String> entries) {
+            builder.putAll(transformValues(entries, v -> (v == null) ? REMOVED : v));
+            return this;
+        }
+
+        /**
          * Adds the specified annotation. Any previous value associated with
          * the given annotation key will be overwritten.
          *
diff --git a/core/api/src/main/java/org/onosproject/net/config/Config.java b/core/api/src/main/java/org/onosproject/net/config/Config.java
index 9cea1b9..c7d821e 100644
--- a/core/api/src/main/java/org/onosproject/net/config/Config.java
+++ b/core/api/src/main/java/org/onosproject/net/config/Config.java
@@ -908,4 +908,9 @@
         }
     }
 
+    @Override
+    public String toString() {
+        return String.valueOf(node);
+    }
+
 }
diff --git a/core/api/src/main/java/org/onosproject/net/config/basics/PortAnnotationConfig.java b/core/api/src/main/java/org/onosproject/net/config/basics/PortAnnotationConfig.java
new file mode 100644
index 0000000..7c4b3be
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/config/basics/PortAnnotationConfig.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2017-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.net.config.basics;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.config.BaseConfig;
+import org.slf4j.Logger;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Configuration to add extra annotations to a port via netcfg subsystem.
+ */
+public class PortAnnotationConfig
+    extends BaseConfig<ConnectPoint> {
+
+    /**
+     * {@value #CONFIG_KEY} : a netcfg ConfigKey for {@link PortAnnotationConfig}.
+     */
+    public static final String CONFIG_KEY = "annotations";
+
+    /**
+     * JSON key for annotation entries.
+     * Value is a JSON object.
+     */
+    private static final String ENTRIES = "entries";
+
+    private final Logger log = getLogger(getClass());
+
+    @Override
+    public boolean isValid() {
+        return hasField(ENTRIES) && object.get(ENTRIES).isObject();
+    }
+
+    /**
+     * Returns annotations to add to a Port.
+     *
+     * @return annotations as a map. null value represent key removal request
+     */
+    public Map<String, String> annotations() {
+        Map<String, String> map = new HashMap<>();
+
+        JsonNode jsonNode = object.path(ENTRIES);
+        if (!jsonNode.isObject()) {
+            return map;
+        }
+
+        jsonNode.fields().forEachRemaining(entry -> {
+            String key = entry.getKey();
+            JsonNode value = entry.getValue();
+            if (value.isTextual()) {
+                map.put(key, value.asText());
+            } else if (value.isNull()) {
+                map.put(key, null);
+            } else {
+                try {
+                    map.put(key, mapper().writeValueAsString(value));
+                } catch (JsonProcessingException e) {
+                    log.warn("Error processing JSON value for {}.", key, e);
+                }
+            }
+        });
+        return map;
+    }
+
+    /**
+     * Sets annotations to add to a Port.
+     *
+     * @param replace annotations to be added by this configuration.
+     *                null value represent key removal request
+     * @return self
+     */
+    public PortAnnotationConfig annotations(Map<String, String> replace) {
+        ObjectNode anns = object.objectNode();
+        if (replace != null) {
+            replace.forEach((k, v) -> {
+                anns.put(k, v);
+            });
+        }
+        object.set(ENTRIES, anns);
+        return this;
+    }
+
+    /**
+     * Add configuration to set or remove annotation entry.
+     *
+     * @param key annotations key
+     * @param value annotations value. specifying null removes the entry.
+     * @return self
+     */
+    public PortAnnotationConfig annotation(String key, String value) {
+        JsonNode ent = object.path(ENTRIES);
+        ObjectNode obj = (ent.isObject()) ? (ObjectNode) ent : object.objectNode();
+
+        obj.put(key, value);
+
+        object.set(ENTRIES, obj);
+        return this;
+    }
+
+    /**
+     * Remove configuration about specified key.
+     *
+     * @param key annotations key
+     * @return self
+     */
+    public PortAnnotationConfig annotation(String key) {
+        JsonNode ent = object.path(ENTRIES);
+        ObjectNode obj = (ent.isObject()) ? (ObjectNode) ent : object.objectNode();
+
+        obj.remove(key);
+
+        object.set(ENTRIES, obj);
+        return this;
+    }
+
+    /**
+     * Create a detached {@link PortAnnotationConfig}.
+     * <p>
+     * Note: created instance needs to be initialized by #init(..) before using.
+     */
+    public PortAnnotationConfig() {
+        super();
+    }
+
+    /**
+     * Create a detached {@link PortAnnotationConfig} for specified port.
+     * <p>
+     * Note: created instance is not bound to NetworkConfigService,
+     * thus cannot use {@link #apply()}. Must be passed to the service
+     * using NetworkConfigService#applyConfig
+     *
+     * @param cp ConnectPoint
+     */
+    public PortAnnotationConfig(ConnectPoint cp) {
+        ObjectMapper mapper = new ObjectMapper();
+        init(cp, CONFIG_KEY, mapper.createObjectNode(), mapper, null);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java b/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java
index 300d915..89cc6e8 100644
--- a/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/device/DefaultPortDescription.java
@@ -88,6 +88,19 @@
              annotations);
     }
 
+    /**
+     * Creates a port description using the supplied information.
+     *
+     * @param base port description to copy fields from
+     * @param annotations to be used in the copied description.
+     *        Note: Annotations on {@code base} will be ignored.
+     * @return copied port description
+     */
+    public static DefaultPortDescription copyReplacingAnnotation(PortDescription base,
+                                                                 SparseAnnotations annotations) {
+        return new DefaultPortDescription(base, annotations);
+    }
+
     @Override
     public PortNumber portNumber() {
         return number;
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java b/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java
index 0bd8b91..5cabfbd 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java
@@ -36,6 +36,7 @@
 import org.onosproject.net.config.basics.BasicLinkConfig;
 import org.onosproject.net.config.basics.BasicRegionConfig;
 import org.onosproject.net.config.basics.BasicUiTopoLayoutConfig;
+import org.onosproject.net.config.basics.PortAnnotationConfig;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.region.RegionId;
 import org.onosproject.ui.model.topo.UiTopoLayoutId;
@@ -112,6 +113,14 @@
                 public BasicUiTopoLayoutConfig createConfig() {
                     return new BasicUiTopoLayoutConfig();
                 }
+            },
+            new ConfigFactory<ConnectPoint, PortAnnotationConfig>(CONNECT_POINT_SUBJECT_FACTORY,
+                    PortAnnotationConfig.class,
+                    PortAnnotationConfig.CONFIG_KEY) {
+                @Override
+                public PortAnnotationConfig createConfig() {
+                    return new PortAnnotationConfig();
+                }
             }
     );
 
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
index a3dbcad..6fbb21c 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
@@ -58,6 +58,7 @@
 import org.onosproject.net.config.PortConfigOperator;
 import org.onosproject.net.config.PortConfigOperatorRegistry;
 import org.onosproject.net.config.basics.BasicDeviceConfig;
+import org.onosproject.net.config.basics.PortAnnotationConfig;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceAdminService;
 import org.onosproject.net.device.DeviceDescription;
@@ -148,6 +149,9 @@
         = synchronizedListMultimap(
            newListMultimap(new ConcurrentHashMap<>(), CopyOnWriteArrayList::new));
 
+    // not part of portOps. must be executed at the end
+    private PortAnnotationOperator portAnnotationOp;
+
     /**
      * Local storage for connectivity status of devices.
      */
@@ -165,6 +169,9 @@
 
     @Activate
     public void activate() {
+        portAnnotationOp = new PortAnnotationOperator(networkConfigService);
+        portOpsIndex.put(PortAnnotationConfig.class, portAnnotationOp);
+
         backgroundService = newSingleThreadScheduledExecutor(
                              groupedThreads("onos/device", "manager-background", log));
         localNodeId = clusterService.getLocalNode().id();
@@ -976,7 +983,7 @@
         for (PortConfigOperator portOp : portOps) {
             work = portOp.combine(cpt, work);
         }
-        return work;
+        return portAnnotationOp.combine(cpt, work);
     }
 
 }
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/PortAnnotationOperator.java b/core/net/src/main/java/org/onosproject/net/device/impl/PortAnnotationOperator.java
new file mode 100644
index 0000000..3041a07
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/PortAnnotationOperator.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2017-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.net.device.impl;
+
+import java.util.Map;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DefaultAnnotations.Builder;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.PortConfigOperator;
+import org.onosproject.net.config.basics.PortAnnotationConfig;
+import org.onosproject.net.device.DefaultPortDescription;
+import org.onosproject.net.device.PortDescription;
+
+/**
+ * Implementations of {@link PortConfigOperator} to weave
+ * annotations added via {@link PortAnnotationConfig}.
+ */
+public class PortAnnotationOperator implements PortConfigOperator {
+
+    private NetworkConfigService networkConfigService;
+
+    /**
+     * Creates {@link PortAnnotationOperator} instance.
+     */
+    public PortAnnotationOperator() {
+    }
+
+    PortAnnotationOperator(NetworkConfigService networkConfigService) {
+        bindService(networkConfigService);
+    }
+
+    @Override
+    public void bindService(NetworkConfigService networkConfigService) {
+        this.networkConfigService = networkConfigService;
+    }
+
+    private PortAnnotationConfig lookupConfig(ConnectPoint cp) {
+        if (networkConfigService == null) {
+            return null;
+        }
+        return networkConfigService.getConfig(cp, PortAnnotationConfig.class);
+    }
+
+    @Override
+    public PortDescription combine(ConnectPoint cp, PortDescription descr) {
+        PortAnnotationConfig cfg = lookupConfig(cp);
+        if (cfg == null) {
+            return descr;
+        }
+        Map<String, String> annotations = cfg.annotations();
+        if (annotations.isEmpty()) {
+            return descr;
+        }
+
+        Builder builder = DefaultAnnotations.builder();
+        builder.putAll(descr.annotations());
+        builder.putAll(annotations);
+
+        return DefaultPortDescription.copyReplacingAnnotation(descr, builder.build());
+    }
+
+}
diff --git a/core/net/src/test/java/org/onosproject/net/config/basics/PortAnnotationConfigTest.java b/core/net/src/test/java/org/onosproject/net/config/basics/PortAnnotationConfigTest.java
new file mode 100644
index 0000000..48e3ce3
--- /dev/null
+++ b/core/net/src/test/java/org/onosproject/net/config/basics/PortAnnotationConfigTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2017-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.net.config.basics;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.*;
+import static org.onosproject.net.ConnectPoint.deviceConnectPoint;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onlab.junit.TestUtils;
+import org.onlab.junit.TestUtils.TestUtilsException;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.TestServiceDirectory;
+import org.onosproject.codec.CodecService;
+import org.onosproject.codec.impl.CodecManager;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.config.BaseConfig;
+import org.onosproject.net.config.ConfigApplyDelegate;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.NumericNode;
+import com.google.common.collect.ImmutableMap;
+
+public class PortAnnotationConfigTest {
+
+    private static final String SAMPLE_JSONFILE = "port_annotation_config.json";
+
+    private static TestServiceDirectory directory;
+    private static ServiceDirectory original;
+
+    private ObjectMapper mapper;
+
+    private final ConfigApplyDelegate noopDelegate = cfg -> { };
+
+    /**
+     * {@value #SAMPLE_JSONFILE} after parsing.
+     */
+    private JsonNode node;
+
+    // sample data
+    private final ConnectPoint cp = deviceConnectPoint("of:0000000000000001/2");
+
+    private final String key = "foo";
+    private final String value = "bar";
+
+
+    // TODO consolidate code-clone in ProtectionConfigTest, and define constants for field name
+    @BeforeClass
+    public static void setUpClass() throws TestUtilsException {
+        directory = new TestServiceDirectory();
+
+        CodecManager codecService = new CodecManager();
+        codecService.activate();
+        directory.add(CodecService.class, codecService);
+
+        // replace service directory used by BaseConfig
+        original = TestUtils.getField(BaseConfig.class, "services");
+        TestUtils.setField(BaseConfig.class, "services", directory);
+    }
+
+    @AfterClass
+    public static void tearDownClass() throws TestUtilsException {
+        TestUtils.setField(BaseConfig.class, "services", original);
+    }
+
+    @Before
+    public void setUp() throws JsonProcessingException, IOException, TestUtilsException {
+
+        mapper = new ObjectMapper();
+        // Jackson configuration for ease of Numeric node comparison
+        // - treat integral number node as long node
+        mapper.enable(DeserializationFeature.USE_LONG_FOR_INTS);
+        mapper.setNodeFactory(new JsonNodeFactory(false) {
+            @Override
+            public NumericNode numberNode(int v) {
+                return super.numberNode((long) v);
+            }
+            @Override
+            public NumericNode numberNode(short v) {
+                return super.numberNode((long) v);
+            }
+        });
+
+        InputStream stream = PortAnnotationConfig.class
+                                .getResourceAsStream(SAMPLE_JSONFILE);
+        JsonNode tree = mapper.readTree(stream);
+
+        node = tree.path("ports")
+                            .path(cp.toString())
+                            .path(PortAnnotationConfig.CONFIG_KEY);
+        assertTrue(node.isObject());
+    }
+
+    @Test
+    public void readTest() {
+        PortAnnotationConfig sut = new PortAnnotationConfig();
+        sut.init(cp, PortAnnotationConfig.CONFIG_KEY, node, mapper, noopDelegate);
+
+        assertThat(sut.subject(), is(cp));
+        Map<String, String> annotations = sut.annotations();
+        assertThat(annotations.size(), is(1));
+        assertThat(annotations.get(key), is(value));
+    }
+
+    public void writeEntryTest() throws JsonProcessingException, IOException {
+
+        PortAnnotationConfig w = new PortAnnotationConfig();
+        w.init(cp, PortAnnotationConfig.CONFIG_KEY, mapper.createObjectNode(), mapper, noopDelegate);
+
+        // write equivalent to sample
+        w.annotation(key, value);
+
+        // reparse JSON
+        JsonNode r = mapper.readTree(mapper.writeValueAsString(w.node()));
+
+        PortAnnotationConfig sut = new PortAnnotationConfig();
+        sut.init(cp, PortAnnotationConfig.CONFIG_KEY, r, mapper, noopDelegate);
+
+        assertThat(sut.subject(), is(cp));
+        Map<String, String> annotations = sut.annotations();
+        assertThat(annotations.size(), is(1));
+        assertThat(annotations.get(key), is(value));
+    }
+
+    public void writeMapTest() throws JsonProcessingException, IOException {
+
+        PortAnnotationConfig w = new PortAnnotationConfig();
+        w.init(cp, PortAnnotationConfig.CONFIG_KEY, mapper.createObjectNode(), mapper, noopDelegate);
+
+        // write equivalent to sample
+        w.annotations(ImmutableMap.of(key, value));
+
+        // reparse JSON
+        JsonNode r = mapper.readTree(mapper.writeValueAsString(w.node()));
+
+        PortAnnotationConfig sut = new PortAnnotationConfig();
+        sut.init(cp, PortAnnotationConfig.CONFIG_KEY, r, mapper, noopDelegate);
+
+        assertThat(sut.subject(), is(cp));
+        Map<String, String> annotations = sut.annotations();
+        assertThat(annotations.size(), is(1));
+        assertThat(annotations.get(key), is(value));
+    }
+
+}
diff --git a/core/net/src/test/resources/org/onosproject/net/config/basics/port_annotation_config.json b/core/net/src/test/resources/org/onosproject/net/config/basics/port_annotation_config.json
new file mode 100644
index 0000000..8a88ed8
--- /dev/null
+++ b/core/net/src/test/resources/org/onosproject/net/config/basics/port_annotation_config.json
@@ -0,0 +1,11 @@
+{
+  "ports" : {
+    "of:0000000000000001/2" : {
+      "annotations" : {
+        "entries" : {
+          "foo" : "bar"
+        }
+      }
+    }
+  }
+}
