diff --git a/DataSourceVMwareGuestInfo.py b/DataSourceVMwareGuestInfo.py
index 2cb589a..73b9219 100644
--- a/DataSourceVMwareGuestInfo.py
+++ b/DataSourceVMwareGuestInfo.py
@@ -23,6 +23,7 @@
 import copy
 from distutils.spawn import find_executable
 from distutils.util import strtobool
+import ipaddress
 import json
 import os
 import socket
@@ -557,6 +558,21 @@
     return name
 
 
+def is_valid_ip_addr(val):
+    """
+    Returns false if the address is loopback, link local or unspecified;
+    otherwise true is returned.
+    """
+    addr = None
+    try:
+        addr = ipaddress.ip_address(val)
+    except:
+        return False
+    if addr.is_link_local or addr.is_loopback or addr.is_unspecified:
+        return False
+    return True
+
+
 def get_host_info():
     '''
     Returns host information such as the host name and network interfaces.
@@ -607,15 +623,25 @@
             key = mac
             val = {}
             if af_inet4:
-                val["ipv4"] = af_inet4
+                af_inet4_vals = []
+                for ip_info in af_inet4:
+                    if not is_valid_ip_addr(ip_info['addr']):
+                        continue
+                    af_inet4_vals.append(ip_info)
+                val["ipv4"] = af_inet4_vals
             if af_inet6:
-                val["ipv6"] = af_inet6
+                af_inet6_vals = []
+                for ip_info in af_inet6:
+                    if not is_valid_ip_addr(ip_info['addr']):
+                        continue
+                    af_inet6_vals.append(ip_info)
+                val["ipv6"] = af_inet6_vals
             by_mac[key] = val
 
         if af_inet4:
             for ip_info in af_inet4:
                 key = ip_info['addr']
-                if key == '127.0.0.1':
+                if not is_valid_ip_addr(key):
                     continue
                 val = copy.deepcopy(ip_info)
                 del val['addr']
@@ -626,7 +652,7 @@
         if af_inet6:
             for ip_info in af_inet6:
                 key = ip_info['addr']
-                if key == '::1':
+                if not is_valid_ip_addr(key):
                     continue
                 val = copy.deepcopy(ip_info)
                 del val['addr']
@@ -660,12 +686,26 @@
     host_info = None
     while host_info == None:
         host_info = get_host_info()
-        if wait_on_ipv4 and LOCAL_IPV4 not in host_info:
-            LOG.info("ipv4 not ready")
-            host_info = None
-        if wait_on_ipv6 and LOCAL_IPV6 not in host_info:
-            LOG.info("ipv6 not ready")
-            host_info = None
+        if wait_on_ipv4:
+            ipv4_ready = False
+            if 'network' in host_info:
+                if 'interfaces' in host_info['network']:
+                    if 'by-ipv4' in host_info['network']['interfaces']:
+                        if len(host_info['network']['interfaces']['by-ipv4']) > 0:
+                            ipv4_ready = True
+            if not ipv4_ready:
+                LOG.info("ipv4 not ready")
+                host_info = None
+        if wait_on_ipv6:
+            ipv6_ready = False
+            if 'network' in host_info:
+                if 'interfaces' in host_info['network']:
+                    if 'by-ipv6' in host_info['network']['interfaces']:
+                        if len(host_info['network']['interfaces']['by-ipv6']) > 0:
+                            ipv6_ready = True
+            if not ipv6_ready:
+                LOG.info("ipv6 not ready")
+                host_info = None
         if host_info == None:
             LOG.info("waiting on network")
             time.sleep(1)
