diff --git a/core/api/src/main/java/org/onlab/onos/net/HostLocation.java b/core/api/src/main/java/org/onlab/onos/net/HostLocation.java
index 22673a6..626b027 100644
--- a/core/api/src/main/java/org/onlab/onos/net/HostLocation.java
+++ b/core/api/src/main/java/org/onlab/onos/net/HostLocation.java
@@ -1,13 +1,12 @@
 package org.onlab.onos.net;
 
-import java.util.Objects;
-
 /**
  * Representation of a network edge location where an end-station host is
  * connected.
  */
 public class HostLocation extends ConnectPoint {
 
+    // Note that time is explicitly excluded from the notion of equality.
     private final long time;
 
     public HostLocation(DeviceId deviceId, PortNumber portNumber, long time) {
@@ -25,18 +24,4 @@
         return time;
     }
 
-    @Override
-    public int hashCode() {
-        return 31 * super.hashCode() + Objects.hash(time);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof HostLocation) {
-            final HostLocation other = (HostLocation) obj;
-            return super.equals(obj) && Objects.equals(this.time, other.time);
-        }
-        return false;
-    }
-
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/HostService.java b/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
index 357fb61..a42e231 100644
--- a/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
@@ -43,7 +43,6 @@
      * @param vlanId vlan identifier
      * @return set of hosts in the given vlan id
      */
-    // FIXME: change long to VLanId
     Set<Host> getHostsByVlan(VlanId vlanId);
 
     /**
@@ -62,6 +61,8 @@
      */
     Set<Host> getHostsByIp(IpAddress ip);
 
+    // TODO: consider adding Host getHostByIp(IpAddress ip, VlanId vlan);
+
     /**
      * Returns the set of hosts whose most recent location is the specified
      * connection point.
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostStore.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostStore.java
index 91c02d8..c53d2c8 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostStore.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostStore.java
@@ -48,7 +48,7 @@
      * @return appropriate event or null if no change resulted
      */
     HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId,
-            HostDescription hostDescription) {
+                                 HostDescription hostDescription) {
         Host host = hosts.get(hostId);
         if (host == null) {
             return createHost(providerId, hostId, hostDescription);
@@ -58,12 +58,12 @@
 
     // creates a new host and sends HOST_ADDED
     private HostEvent createHost(ProviderId providerId, HostId hostId,
-            HostDescription descr) {
+                                 HostDescription descr) {
         DefaultHost newhost = new DefaultHost(providerId, hostId,
-                descr.hwAddress(),
-                descr.vlan(),
-                descr.location(),
-                descr.ipAddresses());
+                                              descr.hwAddress(),
+                                              descr.vlan(),
+                                              descr.location(),
+                                              descr.ipAddresses());
         synchronized (this) {
             hosts.put(hostId, newhost);
             locations.put(descr.location(), newhost);
@@ -73,23 +73,23 @@
 
     // checks for type of update to host, sends appropriate event
     private HostEvent updateHost(ProviderId providerId, Host host,
-            HostDescription descr) {
+                                 HostDescription descr) {
         DefaultHost updated;
         HostEvent event;
-        // Consider only actual location (not timestamp) change?
-        if (!(host.location().port().equals(descr.location().port()))) {
+        if (!host.location().equals(descr.location())) {
             updated = new DefaultHost(providerId, host.id(),
-                    host.mac(),
-                    host.vlan(),
-                    descr.location(),
-                    host.ipAddresses());
+                                      host.mac(),
+                                      host.vlan(),
+                                      descr.location(),
+                                      host.ipAddresses());
             event = new HostEvent(HOST_MOVED, updated);
+
         } else if (!(host.ipAddresses().equals(descr.ipAddresses()))) {
             updated = new DefaultHost(providerId, host.id(),
-                    host.mac(),
-                    host.vlan(),
-                    descr.location(),
-                    descr.ipAddresses());
+                                      host.mac(),
+                                      host.vlan(),
+                                      descr.location(),
+                                      descr.ipAddresses());
             event = new HostEvent(HOST_UPDATED, updated);
         } else {
             return null;
@@ -134,7 +134,7 @@
      * @return iterable collection of all hosts
      */
     Iterable<Host> getHosts() {
-        return Collections.unmodifiableSet(new HashSet<Host>(hosts.values()));
+        return Collections.unmodifiableSet(new HashSet<>(hosts.values()));
     }
 
     /**
@@ -154,7 +154,7 @@
      * @return set of hosts in the vlan
      */
     Set<Host> getHosts(VlanId vlanId) {
-        Set<Host> vlanset = new HashSet<Host>();
+        Set<Host> vlanset = new HashSet<>();
         for (Host h : hosts.values()) {
             if (h.vlan().equals(vlanId)) {
                 vlanset.add(h);
diff --git a/tools/dev/bash_profile b/tools/dev/bash_profile
index d4aa64a..a9852ba 100644
--- a/tools/dev/bash_profile
+++ b/tools/dev/bash_profile
@@ -12,7 +12,7 @@
 
 # Setup a path
 export PS=":"
-export PATH="$PATH:$ONOS_ROOT/tools/dev;$ONOS_ROOT/tools/package"
+export PATH="$PATH:$ONOS_ROOT/tools/dev:$ONOS_ROOT/tools/package"
 export PATH="$PATH:$MAVEN/bin:$KARAF/bin"
 export PATH="$PATH:."
 
diff --git a/tools/package/package b/tools/package/package
index 870acc6..0bf8a39 100755
--- a/tools/package/package
+++ b/tools/package/package
@@ -29,18 +29,13 @@
 # Unroll the Apache Karaf bits and make the ONOS top-level directories.
 unzip $KARAF_ZIP
 mkdir bin
-mkdir lib
 
 # Stage the ONOS admin scripts
 cp -r $ONOS_ROOT/tools/package/bin .
 
 # Stage the ONOS bundles
-mkdir -p lib/org/onlab 
-cp -r $M2_REPO/org/onlab lib/org
-
-
-# Patch the Apache Karaf distribution file to point to the lib as maven repo
-#perl -pi.old -e "s|^org.ops4j.pax.url.mvn.repositories= |org.ops4j.pax.url.mvn.repositories= \\\n    file:../../lib, |" $ONOS_STAGE/$KARAF_DIST/etc/org.ops4j.pax.url.mvn.cfg
+mkdir -p system/org/onlab 
+cp -r $M2_REPO/org/onlab system/org/
 
 # Patch the Apache Karaf distribution file to add ONOS features repository
 perl -pi.old -e "s|^(featuresRepositories=.*)|\1,mvn:org.onlab.onos/onos-features/$ONOS_VERSION/xml/features|" \
