diff --git a/NTPClient.cpp b/NTPClient.cpp
old mode 100755
new mode 100644
index fffe105..97bba85
--- a/NTPClient.cpp
+++ b/NTPClient.cpp
@@ -35,25 +35,12 @@ NTPClient::NTPClient(UDP& udp, const char* poolServerName) {
   this->_poolServerName = poolServerName;
 }
 
-NTPClient::NTPClient(UDP& udp, IPAddress poolServerIP) {
-  this->_udp            = &udp;
-  this->_poolServerIP   = poolServerIP;
-  this->_poolServerName = NULL;
-}
-
 NTPClient::NTPClient(UDP& udp, const char* poolServerName, long timeOffset) {
   this->_udp            = &udp;
   this->_timeOffset     = timeOffset;
   this->_poolServerName = poolServerName;
 }
 
-NTPClient::NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset){
-  this->_udp            = &udp;
-  this->_timeOffset     = timeOffset;
-  this->_poolServerIP   = poolServerIP;
-  this->_poolServerName = NULL;
-}
-
 NTPClient::NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval) {
   this->_udp            = &udp;
   this->_timeOffset     = timeOffset;
@@ -61,14 +48,6 @@ NTPClient::NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsi
   this->_updateInterval = updateInterval;
 }
 
-NTPClient::NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset, unsigned long updateInterval) {
-  this->_udp            = &udp;
-  this->_timeOffset     = timeOffset;
-  this->_poolServerIP   = poolServerIP;
-  this->_poolServerName = NULL;
-  this->_updateInterval = updateInterval;
-}
-
 void NTPClient::begin() {
   this->begin(NTP_DEFAULT_LOCAL_PORT);
 }
@@ -86,10 +65,6 @@ bool NTPClient::forceUpdate() {
     Serial.println("Update from NTP Server");
   #endif
 
-  // flush any existing packets
-  while(this->_udp->parsePacket() != 0)
-    this->_udp->flush();
-
   this->sendNTPPacket();
 
   // Wait till data is there or timeout...
@@ -112,9 +87,16 @@ bool NTPClient::forceUpdate() {
   // this is NTP time (seconds since Jan 1 1900):
   unsigned long secsSince1900 = highWord << 16 | lowWord;
 
+  uint32_t frac  = (uint32_t) this->_packetBuffer[44] << 24
+               | (uint32_t) this->_packetBuffer[45] << 16
+               | (uint32_t) this->_packetBuffer[46] <<  8
+               | (uint32_t) this->_packetBuffer[47] <<  0;
+  uint16_t mssec = ((uint64_t) frac * 1000) >> 32;
+
+this->_ms = mssec;
   this->_currentEpoc = secsSince1900 - SEVENZYYEARS;
 
-  return true;  // return true after successful update
+  return true;
 }
 
 bool NTPClient::update() {
@@ -123,7 +105,7 @@ bool NTPClient::update() {
     if (!this->_udpSetup) this->begin();                         // setup the UDP client if needed
     return this->forceUpdate();
   }
-  return false;   // return false if update does not occur
+  return true;
 }
 
 unsigned long NTPClient::getEpochTime() const {
@@ -144,6 +126,9 @@ int NTPClient::getMinutes() const {
 int NTPClient::getSeconds() const {
   return (this->getEpochTime() % 60);
 }
+int NTPClient::getMilliSeconds() const {
+  return (millis()-this->_lastUpdate+this->_ms)%1000;
+  }
 
 String NTPClient::getFormattedTime() const {
   unsigned long rawTime = this->getEpochTime();
@@ -156,7 +141,7 @@ String NTPClient::getFormattedTime() const {
   unsigned long seconds = rawTime % 60;
   String secondStr = seconds < 10 ? "0" + String(seconds) : String(seconds);
 
-  return hoursStr + ":" + minuteStr + ":" + secondStr;
+  return hoursStr + ":" + minuteStr + ":" + secondStr+":" +(String) this->getMilliSeconds();
 }
 
 void NTPClient::end() {
@@ -194,11 +179,7 @@ void NTPClient::sendNTPPacket() {
 
   // all NTP fields have been given values, now
   // you can send a packet requesting a timestamp:
-  if  (this->_poolServerName) {
-    this->_udp->beginPacket(this->_poolServerName, 123);
-  } else {
-    this->_udp->beginPacket(this->_poolServerIP, 123);
-  }
+  this->_udp->beginPacket(this->_poolServerName, 123); //NTP requests are to port 123
   this->_udp->write(this->_packetBuffer, NTP_PACKET_SIZE);
   this->_udp->endPacket();
 }
diff --git a/NTPClient.h b/NTPClient.h
old mode 100755
new mode 100644
index 20ec43b..49e5f1b
--- a/NTPClient.h
+++ b/NTPClient.h
@@ -14,9 +14,9 @@ class NTPClient {
     bool          _udpSetup       = false;
 
     const char*   _poolServerName = "pool.ntp.org"; // Default time server
-    IPAddress     _poolServerIP;
     int           _port           = NTP_DEFAULT_LOCAL_PORT;
     long          _timeOffset     = 0;
+    uint16_t      _ms =0;
 
     unsigned long _updateInterval = 60000;  // In ms
 
@@ -25,6 +25,7 @@ class NTPClient {
 
     byte          _packetBuffer[NTP_PACKET_SIZE];
 
+
     void          sendNTPPacket();
 
   public:
@@ -33,9 +34,6 @@ class NTPClient {
     NTPClient(UDP& udp, const char* poolServerName);
     NTPClient(UDP& udp, const char* poolServerName, long timeOffset);
     NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
-    NTPClient(UDP& udp, IPAddress poolServerIP);
-    NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset);
-    NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset, unsigned long updateInterval);
 
     /**
      * Set time server name
@@ -73,6 +71,7 @@ class NTPClient {
     int getHours() const;
     int getMinutes() const;
     int getSeconds() const;
+    int getMilliSeconds() const;
 
     /**
      * Changes the time offset. Useful for changing timezones dynamically