diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako
index f369fcce3a37c313daf47f2ada7de6494f0d47df..682614802d7d3383a5699c7b3d88ad1211db3968 100644
--- a/gui/slick/views/config_general.mako
+++ b/gui/slick/views/config_general.mako
@@ -431,6 +431,16 @@
                             </label>
                         </div>
 
+                        <div class="field-pair">
+                            <label for="notify_on_login">
+                                <span class="component-title">Notify on login</span>
+                                <span class="component-desc">
+                                    <input type="checkbox" name="notify_on_login" class="enabler" id="notify_on_login" ${('', 'checked="checked"')[bool(sickbeard.NOTIFY_ON_LOGIN)]}/>
+                                    <p>enable to be notified when a new login happens in webserver</p>
+                                </span>
+                            </label>
+                        </div>
+
                         <div class="field-pair">
                             <label for="web_ipv6">
                                 <span class="component-title">Listen on IPv6</span>
diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py
index dfe627411d080e9f83c723ac66eb2f431cf319cd..8cd96b162a23a70ae3ea6a43ee265096bdce6767 100644
--- a/sickbeard/__init__.py
+++ b/sickbeard/__init__.py
@@ -180,6 +180,7 @@ API_KEY = None
 API_ROOT = None
 
 ENABLE_HTTPS = False
+NOTIFY_ON_LOGIN = False
 HTTPS_CERT = None
 HTTPS_KEY = None
 
@@ -575,7 +576,7 @@ def initialize(consoleLogging=True):
     with INIT_LOCK:
 
         global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, GIT_NEWVER, ACTUAL_LOG_DIR, LOG_DIR, LOG_NR, LOG_SIZE, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, ENCRYPTION_SECRET, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, WEB_COOKIE_SECRET, WEB_USE_GZIP, API_KEY, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \
-            HANDLE_REVERSE_PROXY, USE_NZBS, USE_TORRENTS, NZB_METHOD, NZB_DIR, DOWNLOAD_PROPERS, RANDOMIZE_PROVIDERS, CHECK_PROPERS_INTERVAL, ALLOW_HIGH_PRIORITY, SAB_FORCED, TORRENT_METHOD, \
+            HANDLE_REVERSE_PROXY, USE_NZBS, USE_TORRENTS, NZB_METHOD, NZB_DIR, DOWNLOAD_PROPERS, RANDOMIZE_PROVIDERS, CHECK_PROPERS_INTERVAL, ALLOW_HIGH_PRIORITY, SAB_FORCED, TORRENT_METHOD, NOTIFY_ON_LOGIN, \
             SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, SAB_CATEGORY_BACKLOG, SAB_CATEGORY_ANIME, SAB_CATEGORY_ANIME_BACKLOG, SAB_HOST, \
             NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_CATEGORY_BACKLOG, NZBGET_CATEGORY_ANIME, NZBGET_CATEGORY_ANIME_BACKLOG, NZBGET_PRIORITY, NZBGET_HOST, NZBGET_USE_HTTPS, backlogSearchScheduler, \
             TORRENT_USERNAME, TORRENT_PASSWORD, TORRENT_HOST, TORRENT_PATH, TORRENT_SEED_TIME, TORRENT_PAUSED, TORRENT_HIGH_BANDWIDTH, TORRENT_LABEL, TORRENT_LABEL_ANIME, TORRENT_VERIFY_CERT, TORRENT_RPCURL, TORRENT_AUTH_TYPE, \
@@ -815,6 +816,8 @@ def initialize(consoleLogging=True):
 
         ENABLE_HTTPS = bool(check_setting_int(CFG, 'General', 'enable_https', 0))
 
+        NOTIFY_ON_LOGIN  = bool(check_setting_int(CFG, 'General', 'notify_on_login', 0))
+
         HTTPS_CERT = check_setting_str(CFG, 'General', 'https_cert', 'server.crt')
         HTTPS_KEY = check_setting_str(CFG, 'General', 'https_key', 'server.key')
 
@@ -1688,6 +1691,7 @@ def save_config():
     new_config['General']['debug'] = int(DEBUG)
     new_config['General']['default_page'] = DEFAULT_PAGE
     new_config['General']['enable_https'] = int(ENABLE_HTTPS)
+    new_config['General']['notify_on_login'] = int(NOTIFY_ON_LOGIN)
     new_config['General']['https_cert'] = HTTPS_CERT
     new_config['General']['https_key'] = HTTPS_KEY
     new_config['General']['handle_reverse_proxy'] = int(HANDLE_REVERSE_PROXY)
diff --git a/sickbeard/common.py b/sickbeard/common.py
index 731aaa84896b266d875e8d8e09217072db5e7e74..3af49f8ce9b90fdd20e242bf125a79fdeb900255 100644
--- a/sickbeard/common.py
+++ b/sickbeard/common.py
@@ -78,13 +78,17 @@ NOTIFY_DOWNLOAD = 2
 NOTIFY_SUBTITLE_DOWNLOAD = 3
 NOTIFY_GIT_UPDATE = 4
 NOTIFY_GIT_UPDATE_TEXT = 5
+NOTIFY_LOGIN = 6
+NOTIFY_LOGIN_TEXT = 7
 
 notifyStrings = NumDict({
     NOTIFY_SNATCH: "Started Download",
     NOTIFY_DOWNLOAD: "Download Finished",
     NOTIFY_SUBTITLE_DOWNLOAD: "Subtitle Download Finished",
     NOTIFY_GIT_UPDATE: "SickRage Updated",
-    NOTIFY_GIT_UPDATE_TEXT: "SickRage Updated To Commit#: "
+    NOTIFY_GIT_UPDATE_TEXT: "SickRage Updated To Commit#: ",
+    NOTIFY_LOGIN : "SickRage new login",
+    NOTIFY_LOGIN_TEXT : "New login from IP: {0}. http://geomaplookup.net/?ip={0}"
 })
 
 # Episode statuses
diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py
index 5aa6f95c16b8d189b00fe7e199a2166c110f6769..4d86695a3450e09029aa603aaf8d3f43c9ed2814 100644
--- a/sickbeard/helpers.py
+++ b/sickbeard/helpers.py
@@ -1757,3 +1757,10 @@ def getTVDBFromID(indexer_id, indexer):
         return tvdb_id
     else:
         return tvdb_id
+
+def is_ip_private(ip):
+    priv_lo = re.compile("^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
+    priv_24 = re.compile("^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
+    priv_20 = re.compile("^192\.168\.\d{1,3}.\d{1,3}$")
+    priv_16 = re.compile("^172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{1,3}.[0-9]{1,3}$")
+    return priv_lo.match(ip) or priv_24.match(ip) or priv_20.match(ip) or priv_16.match(ip)
diff --git a/sickbeard/notifiers/__init__.py b/sickbeard/notifiers/__init__.py
index 4ed59e1f7c62e9933dd781af5811876840d012fc..ab4472ec4acc4b3d791af006584f468f8dbb7867 100644
--- a/sickbeard/notifiers/__init__.py
+++ b/sickbeard/notifiers/__init__.py
@@ -107,3 +107,8 @@ def notify_snatch(ep_name):
 def notify_git_update(new_version=""):
     for n in notifiers:
         n.notify_git_update(new_version)
+
+
+def notify_login(ipaddress):
+    for n in notifiers:
+        n.notify_login(ipaddress)
diff --git a/sickbeard/notifiers/boxcar2.py b/sickbeard/notifiers/boxcar2.py
index 5bb79cd7490b93b79eeed2c5f87c1094d73a5506..28fadc43eade167bfc260bf47748d60e4abb7272 100644
--- a/sickbeard/notifiers/boxcar2.py
+++ b/sickbeard/notifiers/boxcar2.py
@@ -104,6 +104,12 @@ class Boxcar2Notifier(object):
             title = notifyStrings[NOTIFY_GIT_UPDATE]
             self._notifyBoxcar2(title, update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_BOXCAR2:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._notifyBoxcar2(title, update_text.format(ipaddress))
+
     def _notifyBoxcar2(self, title, message, accesstoken=None):
         """
         Sends a boxcar2 notification based on the provided info or SB config
diff --git a/sickbeard/notifiers/emailnotify.py b/sickbeard/notifiers/emailnotify.py
index 34249c92de064129a725b9fcab8a7d0e73b216ab..ce8d4ead9d3e3935946f8e9dcbb20cf63b963be1 100644
--- a/sickbeard/notifiers/emailnotify.py
+++ b/sickbeard/notifiers/emailnotify.py
@@ -170,6 +170,9 @@ class EmailNotifier(object):
     def notify_git_update(self, new_version="??"):
         pass
 
+    def notify_login(self, ipaddress=""):
+        pass
+
     def _generate_recipients(self, show):
         addrs = []
         myDB = db.DBConnection()
diff --git a/sickbeard/notifiers/freemobile.py b/sickbeard/notifiers/freemobile.py
index dc040d819291291f3f54d8ba86ec3b74484ad209..bf9ac00b4bb0ae5a85aaad1c0adb145ec60a281d 100644
--- a/sickbeard/notifiers/freemobile.py
+++ b/sickbeard/notifiers/freemobile.py
@@ -102,6 +102,12 @@ class FreeMobileNotifier(object):
             title = notifyStrings[NOTIFY_GIT_UPDATE]
             self._notifyFreeMobile(title, update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_FREEMOBILE:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._notifyFreeMobile(title, update_text.format(ipaddress))
+
     def _notifyFreeMobile(self, title, message, cust_id=None, apiKey=None, force=False):
         """
         Sends a SMS notification
diff --git a/sickbeard/notifiers/growl.py b/sickbeard/notifiers/growl.py
index a1a234c4442c59e3622d34d3b686b253136be8af..aa86c8aa6ec2672083679d0a1471d0920427f08a 100644
--- a/sickbeard/notifiers/growl.py
+++ b/sickbeard/notifiers/growl.py
@@ -52,6 +52,12 @@ class GrowlNotifier(object):
             title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._sendGrowl(title, update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_GROWL:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._sendGrowl(title, update_text.format(ipaddress))
+
     def _send_growl(self, options, message=None):
 
         # Send Notification
diff --git a/sickbeard/notifiers/kodi.py b/sickbeard/notifiers/kodi.py
index aeb35c7a872a497a25d6c0280a0ecd20fdc2a150..2e9f36b022b508a27d5c2d6e43b1e88865ec5a13 100644
--- a/sickbeard/notifiers/kodi.py
+++ b/sickbeard/notifiers/kodi.py
@@ -531,6 +531,12 @@ class KODINotifier(object):
             title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._notify_kodi(update_text + new_version, title)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_KODI:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._notify_kodi(update_text.format(ipaddress), title)
+
     def test_notify(self, host, username, password):
         return self._notify_kodi("Testing KODI notifications from SickRage", "Test Notification", host, username, password, force=True)
 
diff --git a/sickbeard/notifiers/libnotify.py b/sickbeard/notifiers/libnotify.py
index ab4efff673a9e51ba30a22db6e920d880d56381a..40a6c1c69ba63425362a224bcc35fec518412fd2 100644
--- a/sickbeard/notifiers/libnotify.py
+++ b/sickbeard/notifiers/libnotify.py
@@ -102,6 +102,12 @@ class LibnotifyNotifier(object):
             title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._notify(title, update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_LIBNOTIFY:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._notify(title, update_text.format(ipaddress))
+
     def test_notify(self):
         return self._notify('Test notification', "This is a test notification from SickRage", force=True)
 
diff --git a/sickbeard/notifiers/nma.py b/sickbeard/notifiers/nma.py
index d34e11089a139663901d93a400f925ac72fa9037..ad5ea24d4cfdcd898d544d47065864d318aecd68 100644
--- a/sickbeard/notifiers/nma.py
+++ b/sickbeard/notifiers/nma.py
@@ -32,6 +32,14 @@ class NMA_Notifier(object):
             title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._sendNMA(nma_api=None, nma_priority=None, event=title, message=update_text + new_version)
 
+
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_NMA:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._sendNMA(nma_api=None, nma_priority=None, event=title, message=update_text.format(ipaddress))
+
+
     def _sendNMA(self, nma_api=None, nma_priority=None, event=None, message=None, force=False):
 
         title = 'SickRage'
diff --git a/sickbeard/notifiers/nmj.py b/sickbeard/notifiers/nmj.py
index 8b8be514480d0b8fb88c74c0f13c0eedc46e414d..47e8309f1b927d96704f6edc19861ad5802f958e 100644
--- a/sickbeard/notifiers/nmj.py
+++ b/sickbeard/notifiers/nmj.py
@@ -101,6 +101,9 @@ class NMJNotifier(object):
         return False
         # Not implemented, no reason to start scanner.
 
+    def notify_login(self, ipaddress=""):
+        return False
+
     def test_notify(self, host, database, mount):
         return self._sendNMJ(host, database, mount)
 
diff --git a/sickbeard/notifiers/nmjv2.py b/sickbeard/notifiers/nmjv2.py
index a99b8c92fc9fb7d8700eac05d0037d64d95b4871..9a4d57fddefb1db3d5d630cb4acb4f8faee31954 100644
--- a/sickbeard/notifiers/nmjv2.py
+++ b/sickbeard/notifiers/nmjv2.py
@@ -47,6 +47,9 @@ class NMJv2Notifier(object):
         return False
         # Not implemented, no reason to start scanner.
 
+    def notify_login(self, ipaddress=""):
+        return False
+
     def test_notify(self, host):
         return self._sendNMJ(host)
 
diff --git a/sickbeard/notifiers/plex.py b/sickbeard/notifiers/plex.py
index 941b8223c309f1905310e365b14003e7bec31d51..e0e0987b182e3d554b5dd2faeef01e9e085e9b1d 100644
--- a/sickbeard/notifiers/plex.py
+++ b/sickbeard/notifiers/plex.py
@@ -156,6 +156,13 @@ class PLEXNotifier(object):
             if update_text and title and new_version:
                 self._notify_pmc(update_text + new_version, title)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_PLEX:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            if update_text and title and new_version:
+                self._notify_pmc(update_text.format(ipaddress), title)
+
     def test_notify_pmc(self, host, username, password):
         return self._notify_pmc('This is a test notification from SickRage', 'Test Notification', host, username, password, force=True)
 
diff --git a/sickbeard/notifiers/prowl.py b/sickbeard/notifiers/prowl.py
index 8f1bde7513000c7c962459a29398ba97c36bfb4c..fd47d5a6387c875c17c8ed619d8ec0953d8dcdc4 100644
--- a/sickbeard/notifiers/prowl.py
+++ b/sickbeard/notifiers/prowl.py
@@ -86,6 +86,12 @@ class ProwlNotifier(object):
             self._send_prowl(prowl_api=None, prowl_priority=None,
                              event=title, message=update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_PROWL:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._send_prowl(prowl_api=None, prowl_priority=None,
+                             event=title, message=update_text.format(ipaddress))
 
     @staticmethod
     def _generate_recipients(show=None):
diff --git a/sickbeard/notifiers/pushalot.py b/sickbeard/notifiers/pushalot.py
index 77c0ea71488c139c4542624a242e298341002cea..6a3c82b02a0c457172d6ea3cbee246f93e18c0f6 100644
--- a/sickbeard/notifiers/pushalot.py
+++ b/sickbeard/notifiers/pushalot.py
@@ -57,6 +57,14 @@ class PushalotNotifier(object):
                                event=title, 
                                message=update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_PUSHALOT:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._sendPushalot(pushalot_authorizationtoken=None,
+                               event=title, 
+                               message=update_text.format(ipaddress))
+
     def _sendPushalot(self, pushalot_authorizationtoken=None, event=None, message=None, force=False):
 
         if not sickbeard.USE_PUSHALOT and not force:
diff --git a/sickbeard/notifiers/pushbullet.py b/sickbeard/notifiers/pushbullet.py
index 0e633b81eacbcce37ae3c80cb32b5b5c2ed380dc..2a218ba8661791b4f8c1dfe76472fac613b0fdb3 100644
--- a/sickbeard/notifiers/pushbullet.py
+++ b/sickbeard/notifiers/pushbullet.py
@@ -63,6 +63,10 @@ class PushbulletNotifier(object):
         if sickbeard.USE_PUSHBULLET:
             self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_GIT_UPDATE], message=notifyStrings[NOTIFY_GIT_UPDATE_TEXT] + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_PUSHBULLET:
+            self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_LOGIN], message=notifyStrings[NOTIFY_LOGIN_TEXT].format(ipaddress))
+
     def _sendPushbullet(self, pushbullet_api=None, pushbullet_device=None, event=None, message=None):
 
         if not (sickbeard.USE_PUSHBULLET or event == 'Test' or event is None):
diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py
index 3d6ca648ccca34c78f88c5729502d2e9cc3c7eb1..a0914e7dd4b392738c51899a0f3d6b1c0952d70a 100644
--- a/sickbeard/notifiers/pushover.py
+++ b/sickbeard/notifiers/pushover.py
@@ -151,6 +151,12 @@ class PushoverNotifier(object):
             title = notifyStrings[NOTIFY_GIT_UPDATE]
             self._notifyPushover(title, update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_PUSHOVER:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._notifyPushover(title, update_text.format(ipaddress))
+
     def _notifyPushover(self, title, message, sound=None, userKey=None, apiKey=None, force=False):
         """
         Sends a pushover notification based on the provided info or SR config
diff --git a/sickbeard/notifiers/pytivo.py b/sickbeard/notifiers/pytivo.py
index dfdc8ab8991d663b9ae8ce2398ef156aefc65d96..c6fd68d6151ee4757a02edfc4cef7b58e9483d92 100644
--- a/sickbeard/notifiers/pytivo.py
+++ b/sickbeard/notifiers/pytivo.py
@@ -42,6 +42,9 @@ class pyTivoNotifier(object):
     def notify_git_update(self, new_version):
         pass
 
+    def notify_login(self, ipaddress=""):
+        pass
+
     def update_library(self, ep_obj):
 
         # Values from config
diff --git a/sickbeard/notifiers/synoindex.py b/sickbeard/notifiers/synoindex.py
index b1275ce95b942699ec03eef9e121b5e6ef10261d..30c844feb5af6443a79466015a5bc64c986412ee 100644
--- a/sickbeard/notifiers/synoindex.py
+++ b/sickbeard/notifiers/synoindex.py
@@ -41,6 +41,9 @@ class synoIndexNotifier(object):
     def notify_git_update(self, new_version):
         pass
 
+    def notify_login(self, ipaddress=""):
+        pass
+
     def moveFolder(self, old_path, new_path):
         self.moveObject(old_path, new_path)
 
diff --git a/sickbeard/notifiers/synologynotifier.py b/sickbeard/notifiers/synologynotifier.py
index 2f3f62d26f8d7871f782e421f844e628ec1110f6..cadac287d19021cbd7402695b9fc88fac1d9a191 100644
--- a/sickbeard/notifiers/synologynotifier.py
+++ b/sickbeard/notifiers/synologynotifier.py
@@ -47,6 +47,12 @@ class synologyNotifier(object):
             title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._send_synologyNotifier(update_text + new_version, title)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_SYNOLOGYNOTIFIER:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._send_synologyNotifier(update_text.format(ipaddress), title)
+
     def _send_synologyNotifier(self, message, title):
         synodsmnotify_cmd = ["/usr/syno/bin/synodsmnotify", "@administrators", title, message]
         logger.log(u"Executing command " + str(synodsmnotify_cmd))
diff --git a/sickbeard/notifiers/trakt.py b/sickbeard/notifiers/trakt.py
index 6733c5d1b38eb0e360a55fb88f9b4a89752e9b25..33c4a2873bdebb2bc3a5328ab56ae5dc8e04ed31 100644
--- a/sickbeard/notifiers/trakt.py
+++ b/sickbeard/notifiers/trakt.py
@@ -43,6 +43,9 @@ class TraktNotifier(object):
     def notify_git_update(self, new_version):
         pass
 
+    def notify_login(self, ipaddress=""):
+        pass
+
     def update_library(self, ep_obj):
         """
         Sends a request to trakt indicating that the given episode is part of our library.
diff --git a/sickbeard/notifiers/tweet.py b/sickbeard/notifiers/tweet.py
index 99f6554c098cbbe06431197eb0d2870b09bef144..0f114758019cda43527390b51191f5e54a28bfe3 100644
--- a/sickbeard/notifiers/tweet.py
+++ b/sickbeard/notifiers/tweet.py
@@ -60,6 +60,12 @@ class TwitterNotifier(object):
             title = common.notifyStrings[common.NOTIFY_GIT_UPDATE]
             self._notifyTwitter(title + " - " + update_text + new_version)
 
+    def notify_login(self, ipaddress=""):
+        if sickbeard.USE_TWITTER:
+            update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT]
+            title = common.notifyStrings[common.NOTIFY_LOGIN]
+            self._notifyTwitter(title + " - " + update_text.format(ipaddress))
+
     def test_notify(self):
         return self._notifyTwitter("This is a test notification from SickRage", force=True)
 
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index 30f166731ebf74e7927daf61e6294bceb5eab6f2..4dd00180c5b4c52a09cd75fc8647fbbb80f4afbb 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -298,6 +298,9 @@ class LoginHandler(BaseHandler):
                 and (self.get_argument('password') == password or not password):
             api_key = sickbeard.API_KEY
 
+        if sickbeard.NOTIFY_ON_LOGIN and not helpers.is_ip_private(self.request.remote_ip):
+            notifiers.notify_login(self.request.remote_ip)
+
         if api_key:
             remember_me = int(self.get_argument('remember_me', default=0) or 0)
             self.set_secure_cookie('sickrage_user', api_key, expires_days=30 if remember_me > 0 else None)
@@ -3756,7 +3759,7 @@ class ConfigGeneral(Config):
 
         sickbeard.save_config()
 
-    def saveGeneral(self, log_dir=None, log_nr=5, log_size=1048576, web_port=None, web_log=None, encryption_version=None, web_ipv6=None,
+    def saveGeneral(self, log_dir=None, log_nr=5, log_size=1048576, web_port=None, notify_on_login=None, web_log=None, encryption_version=None, web_ipv6=None,
                     trash_remove_show=None, trash_rotate_logs=None, update_frequency=None, skip_removed_files=None,
                     indexerDefaultLang='en', ep_default_deleted_status=None, launch_browser=None, showupdate_hour=3, web_username=None,
                     api_key=None, indexer_default=None, timezone_display=None, cpu_preset='NORMAL',
@@ -3809,7 +3812,7 @@ class ConfigGeneral(Config):
         # sickbeard.LOG_DIR is set in config.change_LOG_DIR()
         sickbeard.COMING_EPS_MISSED_RANGE = try_int(coming_eps_missed_range, 7)
         sickbeard.DISPLAY_ALL_SEASONS = config.checkbox_to_value(display_all_seasons)
-
+        sickbeard.NOTIFY_ON_LOGIN = config.checkbox_to_value(notify_on_login)
         sickbeard.WEB_PORT = try_int(web_port)
         sickbeard.WEB_IPV6 = config.checkbox_to_value(web_ipv6)
         # sickbeard.WEB_LOG is set in config.change_LOG_DIR()