diff --git a/cli/src/main/java/org/onosproject/cli/net/LinkResourceTestCommand.java b/cli/src/main/java/org/onosproject/cli/net/LinkResourceTestCommand.java
deleted file mode 100644
index f372f9c..0000000
--- a/cli/src/main/java/org/onosproject/cli/net/LinkResourceTestCommand.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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.cli.net;
-
-import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
-import org.onosproject.net.Path;
-import org.onosproject.net.intent.IntentId;
-import org.onosproject.net.resource.link.DefaultLinkResourceRequest;
-import org.onosproject.net.resource.link.LinkResourceAllocations;
-import org.onosproject.net.resource.link.LinkResourceRequest;
-import org.onosproject.net.resource.link.LinkResourceService;
-import org.onosproject.net.topology.PathService;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Commands to test out LinkResourceManager directly.
- *
- * @deprecated in Emu release
- */
-@Deprecated
-@Command(scope = "onos", name = "resource-request",
-        description = "request or remove resources"
-                    + "[Using deprecated LinkResourceService]")
-public class LinkResourceTestCommand extends AbstractShellCommand {
-
-    // default is bandwidth.
-    @Option(name = "-m", aliases = "--mpls", description = "MPLS resource",
-            required = false, multiValued = false)
-    private boolean isMpls = false;
-
-    @Option(name = "-o", aliases = "--optical", description = "Optical resource",
-            required = false, multiValued = false)
-    private boolean isOptical = false;
-
-    @Option(name = "-d", aliases = "--delete", description = "Delete resource by intent ID",
-            required = false, multiValued = false)
-    private boolean remove = false;
-
-    @Argument(index = 0, name = "srcString", description = "Link source",
-            required = true, multiValued = false)
-    String srcString = null;
-
-    @Argument(index = 1, name = "dstString", description = "Link destination",
-            required = true, multiValued = false)
-    String dstString = null;
-
-    @Argument(index = 2, name = "id", description = "Identifier",
-            required = true, multiValued = false)
-    int id;
-
-    private LinkResourceService resService;
-    private PathService pathService;
-
-    private static final int BANDWIDTH = 1_000_000;
-
-    @Override
-    protected void execute() {
-        resService = get(LinkResourceService.class);
-        pathService = get(PathService.class);
-
-        DeviceId src = DeviceId.deviceId(getDeviceId(srcString));
-        DeviceId dst = DeviceId.deviceId(getDeviceId(dstString));
-        IntentId intId = IntentId.valueOf(id);
-
-        Set<Path> paths = pathService.getPaths(src, dst);
-
-        if (paths == null || paths.isEmpty()) {
-            print("No path between %s and %s", srcString, dstString);
-            return;
-        }
-
-        if (remove) {
-            LinkResourceAllocations lra = resService.getAllocations(intId);
-            resService.releaseResources(lra);
-            return;
-        }
-
-        for (Path p : paths) {
-            List<Link> links = p.links();
-            LinkResourceRequest.Builder request = null;
-            if (isMpls) {
-                List<Link> nlinks = Lists.newArrayList();
-                try {
-                    nlinks.addAll(links.subList(1, links.size() - 2));
-                    request = DefaultLinkResourceRequest.builder(intId, nlinks)
-                            .addMplsRequest();
-                } catch (IndexOutOfBoundsException e) {
-                    log.warn("could not allocate MPLS path", e);
-                    continue;
-                }
-            } else if (isOptical) {
-                request = DefaultLinkResourceRequest.builder(intId, links)
-                        .addLambdaRequest();
-            } else {
-                request = DefaultLinkResourceRequest.builder(intId, links)
-                        .addBandwidthRequest(BANDWIDTH);
-            }
-
-            if (request != null) {
-                LinkResourceRequest lrr = request.build();
-                LinkResourceAllocations lra = resService.requestResources(lrr);
-                if (lra != null) {
-                    break;
-                }
-                print("Allocated:\n%s", lra);
-            } else {
-                log.info("nothing to request");
-            }
-        }
-    }
-
-    public String getDeviceId(String deviceString) {
-        int slash = deviceString.indexOf('/');
-        if (slash <= 0) {
-            return "";
-        }
-        return deviceString.substring(0, slash);
-    }
-
-}
diff --git a/cli/src/main/java/org/onosproject/cli/net/ResourceAllocationsCommand.java b/cli/src/main/java/org/onosproject/cli/net/ResourceAllocationsCommand.java
deleted file mode 100644
index 968781f..0000000
--- a/cli/src/main/java/org/onosproject/cli/net/ResourceAllocationsCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2014 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.cli.net;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Link;
-import org.onosproject.net.link.LinkService;
-import org.onosproject.net.resource.link.LinkResourceService;
-
-/**
- * Lists allocations by link. Lists all allocations if link is unspecified.
- *
- * @deprecated in Emu release
- */
-@Deprecated
-@Command(scope = "onos", name = "resource-allocations",
-        description = "Lists allocations by link. Lists all allocations if link is unspecified."
-                    + "[Using deprecated LinkResourceService]")
-public class ResourceAllocationsCommand extends AbstractShellCommand {
-
-    private static final String FMT = "src=%s/%s, dst=%s/%s, type=%s%s";
-    private static final String COMPACT = "%s/%s-%s/%s";
-
-    @Argument(index = 0, name = "srcString", description = "Link source",
-              required = false, multiValued = false)
-    String srcString = null;
-    @Argument(index = 1, name = "dstString", description = "Link destination",
-              required = false, multiValued = false)
-    String dstString = null;
-
-    @Override
-    protected void execute() {
-        LinkResourceService resourceService = get(LinkResourceService.class);
-        LinkService linkService = get(LinkService.class);
-
-        if (srcString == null || dstString == null) {
-            print("----- Displaying all resource allocations -----");
-            resourceService.getAllocations().forEach(alloc -> print("%s", alloc));
-            return;
-        }
-
-        ConnectPoint src = ConnectPoint.deviceConnectPoint(srcString);
-        ConnectPoint dst = ConnectPoint.deviceConnectPoint(dstString);
-
-        Link link = linkService.getLink(src, dst);
-        if (link != null) {
-            resourceService.getAllocations(link).forEach(alloc -> print("%s", alloc));
-        } else {
-            print("No path found for endpoints: %s, %s", src, dst);
-        }
-    }
-}
diff --git a/cli/src/main/java/org/onosproject/cli/net/ResourceAvailableCommand.java b/cli/src/main/java/org/onosproject/cli/net/ResourceAvailableCommand.java
deleted file mode 100644
index 007eb12..0000000
--- a/cli/src/main/java/org/onosproject/cli/net/ResourceAvailableCommand.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2014 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.cli.net;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Link;
-import org.onosproject.net.link.LinkService;
-import org.onosproject.net.resource.link.LinkResourceService;
-import org.onosproject.net.resource.ResourceRequest;
-
-/**
- * Lists allocations by link.
- *
- * @deprecated in Emu release
- */
-@Deprecated
-@Command(scope = "onos", name = "resource-available",
-         description = "Lists available resources by link"
-                     + "[Using deprecated LinkResourceService]")
-public class ResourceAvailableCommand extends AbstractShellCommand {
-
-    private static final String FMT = "src=%s/%s, dst=%s/%s, type=%s%s";
-    private static final String COMPACT = "%s/%s-%s/%s";
-
-    @Argument(index = 0, name = "srcString", description = "Link source",
-              required = false, multiValued = false)
-    String srcString = null;
-    @Argument(index = 1, name = "dstString", description = "Link destination",
-              required = false, multiValued = false)
-    String dstString = null;
-
-    @Override
-    protected void execute() {
-        LinkResourceService resourceService = get(LinkResourceService.class);
-        LinkService linkService = get(LinkService.class);
-
-        Iterable<ResourceRequest> itr = null;
-        try {
-            ConnectPoint src = ConnectPoint.deviceConnectPoint(srcString);
-
-            ConnectPoint dst = ConnectPoint.deviceConnectPoint(dstString);
-
-            Link link = linkService.getLink(src, dst);
-
-            itr = resourceService.getAvailableResources(link);
-
-            int lambdaCount = 0;
-            for (ResourceRequest req : itr) {
-                switch (req.type()) {
-                    case LAMBDA:
-                        lambdaCount++;
-                        break;
-                    case BANDWIDTH:
-                        print("%s", req);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            if (lambdaCount > 0) {
-                print("Number of available lambdas: %d", lambdaCount);
-            }
-
-        } catch (Exception e) {
-            print("Invalid link %s", e.getMessage());
-        }
-    }
-}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 9aa0b89..f110960 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -368,29 +368,6 @@
             </completers>
         </command>
 
-        <!-- Should deprecate following 3 commands soon. -->
-        <command>
-            <action class="org.onosproject.cli.net.ResourceAllocationsCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.ResourceAvailableCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LinkResourceTestCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-                <null/>
-            </completers>
-        </command>
         <command>
             <action class="org.onosproject.cli.net.ClustersListCommand"/>
         </command>
diff --git a/core/api/src/main/java/org/onosproject/net/resource/link/LinkResourceService.java b/core/api/src/main/java/org/onosproject/net/resource/link/LinkResourceService.java
deleted file mode 100644
index 71ea7e1..0000000
--- a/core/api/src/main/java/org/onosproject/net/resource/link/LinkResourceService.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2014 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.resource.link;
-
-import org.onosproject.event.ListenerService;
-import org.onosproject.net.Link;
-import org.onosproject.net.intent.IntentId;
-import org.onosproject.net.resource.ResourceRequest;
-
-/**
- * Service for providing link resource allocation.
- *
- * @deprecated in Emu Release
- */
-@Deprecated
-public interface LinkResourceService
-    extends ListenerService<LinkResourceEvent, LinkResourceListener> {
-
-    /**
-     * Requests resources.
-     *
-     * @param req resources to be allocated
-     * @return allocated resources
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    LinkResourceAllocations requestResources(LinkResourceRequest req);
-
-    /**
-     * Releases resources.
-     *
-     * @param allocations resources to be released
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    void releaseResources(LinkResourceAllocations allocations);
-
-    /**
-     * Updates previously made allocations with a new resource request.
-     *
-     * @param req            updated resource request
-     * @param oldAllocations old resource allocations
-     * @return new resource allocations
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    LinkResourceAllocations updateResources(LinkResourceRequest req,
-                                            LinkResourceAllocations oldAllocations);
-
-    /**
-     * Returns all allocated resources.
-     *
-     * @return allocated resources
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    Iterable<LinkResourceAllocations> getAllocations();
-
-    /**
-     * Returns all allocated resources to given link.
-     *
-     * @param link a target link
-     * @return allocated resources
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    Iterable<LinkResourceAllocations> getAllocations(Link link);
-
-    /**
-     * Returns the resources allocated for an Intent.
-     *
-     * @param intentId the target Intent's id
-     * @return allocated resources for Intent
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    LinkResourceAllocations getAllocations(IntentId intentId);
-
-    /**
-     * Returns available resources for given link.
-     *
-     * @param link a target link
-     * @return available resources for the target link
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    Iterable<ResourceRequest> getAvailableResources(Link link);
-
-    /**
-     * Returns available resources for given link.
-     *
-     * @param link        a target link
-     * @param allocations allocations to be included as available
-     * @return available resources for the target link
-     * @deprecated in Emu Release
-     */
-    @Deprecated
-    Iterable<ResourceRequest> getAvailableResources(Link link,
-                                                    LinkResourceAllocations allocations);
-
-}
diff --git a/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java b/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java
deleted file mode 100644
index 7eb189e..0000000
--- a/core/net/src/main/java/org/onosproject/net/resource/impl/LinkResourceManager.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright 2014-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.net.resource.impl;
-
-import com.google.common.collect.Sets;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onosproject.event.AbstractListenerManager;
-import org.onosproject.net.Link;
-import org.onosproject.net.intent.IntentId;
-import org.onosproject.net.resource.ResourceAllocation;
-import org.onosproject.net.resource.ResourceRequest;
-import org.onosproject.net.resource.ResourceType;
-import org.onosproject.net.resource.link.BandwidthResourceAllocation;
-import org.onosproject.net.resource.link.BandwidthResourceRequest;
-import org.onosproject.net.resource.link.DefaultLinkResourceAllocations;
-import org.onosproject.net.resource.link.LambdaResourceAllocation;
-import org.onosproject.net.resource.link.LambdaResourceRequest;
-import org.onosproject.net.resource.link.LinkResourceAllocations;
-import org.onosproject.net.resource.link.LinkResourceEvent;
-import org.onosproject.net.resource.link.LinkResourceListener;
-import org.onosproject.net.resource.link.LinkResourceRequest;
-import org.onosproject.net.resource.link.LinkResourceService;
-import org.onosproject.net.resource.link.LinkResourceStore;
-import org.onosproject.net.resource.link.LinkResourceStoreDelegate;
-import org.onosproject.net.resource.link.MplsLabel;
-import org.onosproject.net.resource.link.MplsLabelResourceAllocation;
-import org.onosproject.net.resource.link.MplsLabelResourceRequest;
-import org.slf4j.Logger;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import static org.onosproject.security.AppGuard.checkPermission;
-import static org.slf4j.LoggerFactory.getLogger;
-import static org.onosproject.security.AppPermission.Type.*;
-
-
-/**
- * Provides basic implementation of link resources allocation.
- */
-@Component(immediate = true)
-@Service
-public class LinkResourceManager
-        extends AbstractListenerManager<LinkResourceEvent, LinkResourceListener>
-        implements LinkResourceService {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private LinkResourceStore store;
-
-    @Activate
-    public void activate() {
-        eventDispatcher.addSink(LinkResourceEvent.class, listenerRegistry);
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        eventDispatcher.removeSink(LinkResourceEvent.class);
-        log.info("Stopped");
-    }
-
-
-    @Override
-    public LinkResourceAllocations requestResources(LinkResourceRequest req) {
-        checkPermission(LINK_WRITE);
-
-        // TODO Concatenate multiple bandwidth requests.
-        // TODO Support multiple lambda resource requests.
-        // TODO Throw appropriate exception.
-        Set<ResourceAllocation> allocs = new HashSet<>();
-        Map<Link, Set<ResourceAllocation>> allocsPerLink = new HashMap<>();
-        for (ResourceRequest r : req.resources()) {
-            switch (r.type()) {
-            case BANDWIDTH:
-                BandwidthResourceRequest br = (BandwidthResourceRequest) r;
-                allocs.add(new BandwidthResourceAllocation(br.bandwidth()));
-                break;
-            case LAMBDA:
-                LambdaResourceRequest lr = (LambdaResourceRequest) r;
-                allocs.add(new LambdaResourceAllocation(lr.lambda()));
-                break;
-            case MPLS_LABEL:
-                for (Link link : req.links()) {
-                    if (allocsPerLink.get(link) == null) {
-                        allocsPerLink.put(link, new HashSet<>());
-                    }
-
-                    Optional<MplsLabel> label = req.resources(link).stream()
-                            .filter(x -> x.type() == ResourceType.MPLS_LABEL)
-                            .map(x -> (MplsLabelResourceRequest) x)
-                            .map(MplsLabelResourceRequest::mplsLabel)
-                            .findFirst();
-
-                    if (label.isPresent()) {
-                        allocsPerLink.get(link).add(new MplsLabelResourceAllocation(label.get()));
-                    } else {
-                        log.info("Failed to allocate MPLS resource.");
-                        break;
-                    }
-                }
-                break;
-            default:
-                break;
-            }
-        }
-
-        Map<Link, Set<ResourceAllocation>> allocations = new HashMap<>();
-        for (Link link : req.links()) {
-            allocations.put(link, new HashSet<>(allocs));
-            Set<ResourceAllocation> linkAllocs = allocsPerLink.get(link);
-            if (linkAllocs != null) {
-                allocations.get(link).addAll(linkAllocs);
-            }
-        }
-        LinkResourceAllocations result =
-                new DefaultLinkResourceAllocations(req, allocations);
-        store.allocateResources(result);
-        return result;
-
-    }
-
-    @Override
-    public void releaseResources(LinkResourceAllocations allocations) {
-        checkPermission(LINK_WRITE);
-        final LinkResourceEvent event = store.releaseResources(allocations);
-        if (event != null) {
-            post(event);
-        }
-    }
-
-    @Override
-    public LinkResourceAllocations updateResources(LinkResourceRequest req,
-            LinkResourceAllocations oldAllocations) {
-        checkPermission(LINK_WRITE);
-        releaseResources(oldAllocations);
-         return requestResources(req);
-    }
-
-    @Override
-    public Iterable<LinkResourceAllocations> getAllocations() {
-        checkPermission(LINK_READ);
-        return store.getAllocations();
-    }
-
-    @Override
-    public Iterable<LinkResourceAllocations> getAllocations(Link link) {
-        checkPermission(LINK_READ);
-        return store.getAllocations(link);
-    }
-
-    @Override
-    public LinkResourceAllocations getAllocations(IntentId intentId) {
-        checkPermission(LINK_READ);
-        return store.getAllocations(intentId);
-    }
-
-    @Override
-    public Iterable<ResourceRequest> getAvailableResources(Link link) {
-        checkPermission(LINK_READ);
-
-        Set<ResourceAllocation> freeRes = store.getFreeResources(link);
-        Set<ResourceRequest> result = new HashSet<>();
-        for (ResourceAllocation alloc : freeRes) {
-            switch (alloc.type()) {
-            case BANDWIDTH:
-                result.add(new BandwidthResourceRequest(
-                        ((BandwidthResourceAllocation) alloc).bandwidth()));
-                break;
-            case LAMBDA:
-                result.add(new LambdaResourceRequest(
-                        ((LambdaResourceAllocation) alloc).lambda()));
-                break;
-            case MPLS_LABEL:
-                result.add(new MplsLabelResourceRequest(
-                        ((MplsLabelResourceAllocation) alloc).mplsLabel()));
-                break;
-            default:
-                break;
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public Iterable<ResourceRequest> getAvailableResources(Link link,
-            LinkResourceAllocations allocations) {
-        checkPermission(LINK_READ);
-
-        Set<ResourceAllocation> allocatedRes = allocations.getResourceAllocation(link);
-        Set<ResourceRequest> result = Sets.newHashSet(getAvailableResources(link));
-        result.removeAll(allocatedRes);
-        return result;
-    }
-
-    /**
-     * Store delegate to re-post events emitted from the store.
-     */
-    private class InternalStoreDelegate implements LinkResourceStoreDelegate {
-        @Override
-        public void notify(LinkResourceEvent event) {
-            post(event);
-        }
-    }
-}
diff --git a/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java b/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java
index 033952f..e32cdec 100644
--- a/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java
+++ b/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java
@@ -541,4 +541,4 @@
         }
         return permissions;
     }
-}
\ No newline at end of file
+}
