diff --git a/core/net/src/main/java/org/onosproject/net/host/impl/HostAnnotationOperator.java b/core/net/src/main/java/org/onosproject/net/host/impl/HostAnnotationOperator.java
new file mode 100644
index 0000000..06ce4d6
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/host/impl/HostAnnotationOperator.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.host.impl;
+
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DefaultAnnotations.Builder;
+import org.onosproject.net.HostId;
+import org.onosproject.net.config.Config;
+import org.onosproject.net.config.HostConfigOperator;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.HostAnnotationConfig;
+import org.onosproject.net.host.DefaultHostDescription;
+import org.onosproject.net.host.HostDescription;
+
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Implementations of {@link HostConfigOperator} to weave
+ * annotations added via {@link HostAnnotationConfig}.
+ */
+public class HostAnnotationOperator implements HostConfigOperator {
+
+    private NetworkConfigService networkConfigService;
+
+    /**
+     * Creates {@link HostAnnotationOperator} instance.
+     */
+    public HostAnnotationOperator() {
+    }
+
+    HostAnnotationOperator(NetworkConfigService networkConfigService) {
+        bindService(networkConfigService);
+    }
+
+    @Override
+    public void bindService(NetworkConfigService networkConfigService) {
+        this.networkConfigService = networkConfigService;
+    }
+
+    private HostAnnotationConfig lookupConfig(HostId hostId) {
+        if (networkConfigService == null) {
+            return null;
+        }
+        return networkConfigService.getConfig(hostId, HostAnnotationConfig.class);
+    }
+
+    @Override
+    public HostDescription combine(HostId hostId, HostDescription descr,
+                                   Optional<Config> prevConfig) {
+        HostAnnotationConfig cfg = lookupConfig(hostId);
+        if (cfg == null) {
+            return descr;
+        }
+        Map<String, String> annotations = cfg.annotations();
+
+        Builder builder = DefaultAnnotations.builder();
+        builder.putAll(descr.annotations());
+        if (prevConfig.isPresent()) {
+            HostAnnotationConfig prevHostAnnotationConfig = (HostAnnotationConfig) prevConfig.get();
+            for (String key : prevHostAnnotationConfig.annotations().keySet()) {
+                if (!annotations.containsKey(key)) {
+                    builder.remove(key);
+                }
+            }
+        }
+        builder.putAll(annotations);
+
+        return DefaultHostDescription.copyReplacingAnnotation(descr, builder.build());
+    }
+
+}
diff --git a/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java b/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
index 1136951..97e3cb4 100644
--- a/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
+++ b/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
@@ -26,10 +26,12 @@
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
 import org.onosproject.net.HostLocation;
+import org.onosproject.net.config.Config;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.BasicHostConfig;
+import org.onosproject.net.config.basics.HostAnnotationConfig;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.edge.EdgePortService;
 import org.onosproject.net.host.HostAdminService;
@@ -57,6 +59,7 @@
 import org.slf4j.Logger;
 
 import java.util.Dictionary;
+import java.util.Optional;
 import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -138,10 +141,12 @@
     private boolean greedyLearningIpv6 = HM_GREEDY_LEARNING_IPV6_DEFAULT;
 
     private HostMonitor monitor;
+    private HostAnnotationOperator hostAnnotationOperator;
 
 
     @Activate
     public void activate(ComponentContext context) {
+        hostAnnotationOperator = new HostAnnotationOperator(networkConfigService);
         store.setDelegate(delegate);
         eventDispatcher.addSink(HostEvent.class, listenerRegistry);
         cfgService.registerProperties(getClass());
@@ -352,6 +357,19 @@
             if (!allowDuplicateIps) {
                 removeDuplicates(hostId, hostDescription);
             }
+
+            BasicHostConfig cfg = networkConfigService.getConfig(hostId, BasicHostConfig.class);
+            if (!isAllowed(cfg)) {
+                log.warn("Host {} is not allowed to be added into the contol domain", hostId);
+                return;
+            }
+
+            hostDescription = BasicHostOperator.combine(cfg, hostDescription);
+            HostAnnotationConfig annoConfig = networkConfigService.getConfig(hostId, HostAnnotationConfig.class);
+            if (annoConfig != null) {
+                hostDescription = hostAnnotationOperator.combine(hostId, hostDescription, Optional.of(annoConfig));
+            }
+
             store.createOrUpdateHost(provider().id(), hostId,
                                      hostDescription, replaceIps);
 
@@ -507,7 +525,8 @@
         public boolean isRelevant(NetworkConfigEvent event) {
             return (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED
                     || event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)
-                    && (event.configClass().equals(BasicHostConfig.class));
+                    && (event.configClass().equals(BasicHostConfig.class)
+                    || event.configClass().equals(HostAnnotationConfig.class));
         }
 
         @Override
@@ -521,7 +540,7 @@
 
             if (!isAllowed(cfg)) {
                 kickOutBadHost(hostId);
-            } else {
+            } else if (event.configClass().equals(BasicHostConfig.class)) {
                 Host host = getHost(hostId);
                 HostDescription desc =
                         (host == null) ? null : BasicHostOperator.descriptionOf(host);
@@ -529,6 +548,20 @@
                 if (desc != null) {
                     he = store.createOrUpdateHost(host.providerId(), hostId, desc, false);
                 }
+            } else if (event.configClass().equals(HostAnnotationConfig.class)) {
+                Host host = getHost(hostId);
+                HostProvider hp = getProvider(host.providerId());
+                HostDescription desc = (host == null) ? null : BasicHostOperator.descriptionOf(host);
+                Optional<Config> prevConfig = event.prevConfig();
+                log.debug("Host annotations: {} prevconfig {} desc {}", hostId, prevConfig, desc);
+                desc = hostAnnotationOperator.combine(hostId, desc, prevConfig);
+                if (desc != null && hp != null) {
+                    log.debug("Host annotations update - updated host description :{}", desc.toString());
+                    he = store.createOrUpdateHost(hp.id(), hostId, desc, false);
+                    if (he != null && he.subject() != null) {
+                        log.debug("Host annotations update - Host Event : {}", he.subject().annotations());
+                    }
+                }
             }
 
             if (he != null) {
