diff --git a/src/streamlink/plugins/wwenetwork.py b/src/streamlink/plugins/wwenetwork.py
index 6200c462..cb18a093 100644
--- a/src/streamlink/plugins/wwenetwork.py
+++ b/src/streamlink/plugins/wwenetwork.py
@@ -1,47 +1,29 @@
 from __future__ import print_function
-import re
-from pprint import pprint
 
-import time
+import json
+import logging
+import re
 
 from streamlink import PluginError
-from streamlink.cache import Cache
 from streamlink.plugin import Plugin, PluginArguments, PluginArgument
 from streamlink.plugin.api import useragents
-from streamlink.plugin.api import validate
-from streamlink.compat import urlparse, parse_qsl
 from streamlink.stream import HLSStream
+from streamlink.utils import memoize
+from streamlink.compat import urlparse, parse_qsl
+from streamlink.utils.times import seconds_to_hhmmss
+
+log = logging.getLogger(__name__)
 
 
 class WWENetwork(Plugin):
-    url_re = re.compile(r"https?://network.wwe.com")
-    content_id_re = re.compile(r'''"content_id" : "(\d+)"''')
-    playback_scenario = "HTTP_CLOUD_WIRED"
-    login_url = "https://secure.net.wwe.com/workflow.do"
-    login_page_url = "https://secure.net.wwe.com/enterworkflow.do?flowId=account.login&forwardUrl=http%3A%2F%2Fnetwork.wwe.com"
-    api_url = "https://ws.media.net.wwe.com/ws/media/mf/op-findUserVerifiedEvent/v-2.3"
-    _info_schema = validate.Schema(
-        validate.union({
-            "status": validate.union({
-                "code": validate.all(validate.xml_findtext(".//status-code"), validate.transform(int)),
-                "message": validate.xml_findtext(".//status-message"),
-            }),
-            "urls": validate.all(
-                validate.xml_findall(".//url"),
-                [validate.getattr("text")]
-            ),
-            validate.optional("fingerprint"): validate.xml_findtext(".//updated-fingerprint"),
-            validate.optional("session_key"): validate.xml_findtext(".//session-key"),
-            "session_attributes": validate.all(
-                validate.xml_findall(".//session-attribute"),
-                [validate.getattr("attrib"),
-                 validate.union({
-                     "name": validate.get("name"),
-                     "value": validate.get("value")
-                 })]
-            )
-        })
-    )
+    url_re = re.compile(r"https?://watch.wwe.com/(channel)?")
+    site_config_re = re.compile(r'''">window.__data = (\{.*?\})</script>''')
+    stream_url = "https://dce-frontoffice.imggaming.com/api/v2/stream/{id}"
+    live_url = "https://dce-frontoffice.imggaming.com/api/v2/event/live"
+    login_url = "https://dce-frontoffice.imggaming.com/api/v2/login"
+    API_KEY = "cca51ea0-7837-40df-a055-75eb6347b2e7"
+
+    customer_id = 16
     arguments = PluginArguments(
         PluginArgument(
             "email",
@@ -66,105 +48,105 @@ class WWENetwork(Plugin):
     def __init__(self, url):
         super(WWENetwork, self).__init__(url)
         self.session.http.headers.update({"User-Agent": useragents.CHROME})
-        self._session_attributes = Cache(filename="plugin-cache.json", key_prefix="wwenetwork:attributes")
-        self._session_key = self.cache.get("session_key")
-        self._authed = self._session_attributes.get("ipid") and self._session_attributes.get("fprt")
+        self.auth_token = None
 
     @classmethod
     def can_handle_url(cls, url):
         return cls.url_re.match(url) is not None
 
+    def get_title(self):
+        if self.page_config:
+            for page in self.page_config["cache"]["page"].values():
+                return page['item']['title']
+
+    def request(self, method, url, **kwargs):
+        headers = kwargs.pop("headers", {})
+        headers.update({"x-api-key": self.API_KEY,
+                        "Origin": "https://watch.wwe.com",
+                        "Referer": "https://watch.wwe.com/signin",
+                        "Accept": "application/json",
+                        "Realm": "dce.wwe"})
+        if self.auth_token:
+            headers["Authorization"] = "Bearer {0}".format(self.auth_token)
+
+        kwargs["raise_for_status"] = False
+        log.debug("API request: {0} {1}".format(method, url))
+        res = self.session.http.request(method, url, headers=headers, **kwargs)
+        data = self.session.http.json(res)
+
+        if "status" in data and data["status"] != 200:
+            log.debug("API request failed: {0}:{1} ({2})".format(data["status"], data.get("code"), "; ".join(data.get("messages", []))))
+        return data
+
     def login(self, email, password):
         self.logger.debug("Attempting login as {0}", email)
         # sets some required cookies to login
-        self.session.http.get(self.login_page_url)
-        # login
-        res = self.session.http.post(self.login_url, data=dict(registrationAction='identify',
-                                                  emailAddress=email,
-                                                  password=password,
-                                                  submitButton=""),
-                        headers={"Referer": self.login_page_url},
-                        allow_redirects=False)
-
-        self._authed = "Authentication Error" not in res.text
-        if self._authed:
-            self._session_attributes.set("ipid", res.cookies.get("ipid"), expires=3600 * 1.5)
-            self._session_attributes.set("fprt", res.cookies.get("fprt"), expires=3600 * 1.5)
-
-        return self._authed
-
-    def _update_session_attribute(self, key, value):
-        if value:
-            self._session_attributes.set(key, value, expires=3600 * 1.5)  # 1h30m expiry
-            self.session.http.cookies.set(key, value)
+        data = self.request('POST', self.login_url,
+                            data=json.dumps({"id": email, "secret": password}),
+                            headers={"Content-Type": "application/json"})
+        if "authorisationToken" in data:
+            self.auth_token = data["authorisationToken"]
 
-    @property
-    def session_key(self):
-        return self._session_key
+        return self.auth_token
 
-    @session_key.setter
-    def session_key(self, value):
-        self.cache.set("session_key", value)
-        self._session_key = value
+    @property
+    @memoize
+    def page_config(self):
+        log.debug("Loading page config")
+        res = self.session.http.get(self.url)
+        m = self.site_config_re.search(res.text)
+        return m and json.loads(m.group(1))
 
     def _get_media_info(self, content_id):
         """
         Get the info about the content, based on the ID
-        :param content_id:
+        :param content_id: contentId for the video
         :return:
         """
-        params = {"identityPointId": self._session_attributes.get("ipid"),
-                  "fingerprint": self._session_attributes.get("fprt"),
-                  "contentId": content_id,
-                  "playbackScenario": self.playback_scenario,
-                  "platform": "WEB_MEDIAPLAYER_5",
-                  "subject": "LIVE_EVENT_COVERAGE",
-                  "frameworkURL": "https://ws.media.net.wwe.com",
-                  "_": int(time.time())}
-        if self.session_key:
-            params["sessionKey"] = self.session_key
-        url = self.api_url.format(id=content_id)
-        res = self.session.http.get(url, params=params)
-        return self.session.http.xml(res, ignore_ns=True, schema=self._info_schema)
-
-    def _get_content_id(self):
+        info = self.request('GET', self.stream_url.format(id=content_id))
+        return self.request('GET', info.get("playerUrlCallback"))
+
+    def _get_video_id(self):
         #  check the page to find the contentId
-        res = self.session.http.get(self.url)
-        m = self.content_id_re.search(res.text)
-        if m:
-            return m.group(1)
+        log.debug("Searching for content ID")
+        if self.page_config:
+            for page in self.page_config["cache"]["page"].values():
+                try:
+                    if page['item']['type'] == "channel":
+                        return self._get_live_id()
+                    else:
+                        return "vod/{id}".format(id=page['item']['customFields']['DiceVideoId'])
+                except KeyError:
+                    log.error("Could not find video ID")
+                    return
+
+    def _get_live_id(self):
+        log.debug("Loading live event")
+        res = self.request('GET', self.live_url)
+        for event in res.get('events', []):
+            return "event/{sportId}/{propertyId}/{tournamentId}/{id}".format(**event)
 
     def _get_streams(self):
-        email = self.get_option("email")
-        password = self.get_option("password")
+        if not self.login(self.get_option("email"), self.get_option("password")):
+            raise PluginError("Login failed")
 
-        if not self._authed and (not email and not password):
-            self.logger.error("A login for WWE Network is required, use --wwenetwork-email/"
-                              "--wwenetwork-password to set them")
-            return
+        try:
+            start_point = int(float(dict(parse_qsl(urlparse(self.url).query)).get("startPoint", 0.0)))
+            if start_point > 0:
+                log.info("Stream will start at {0}".format(seconds_to_hhmmss(start_point)))
+        except ValueError:
+            start_point = 0
 
-        if not self._authed:
-            if not self.login(email, password):
-                self.logger.error("Failed to login, check your username/password")
-                return
+        content_id = self._get_video_id()
 
-        content_id = self._get_content_id()
         if content_id:
             self.logger.debug("Found content ID: {0}", content_id)
             info = self._get_media_info(content_id)
-            if info["status"]["code"] == 1:
-                # update the session attributes
-                self._update_session_attribute("fprt", info.get("fingerprint"))
-                for attr in info["session_attributes"]:
-                    self._update_session_attribute(attr["name"], attr["value"])
-
-                if info.get("session_key"):
-                    self.session_key = info.get("session_key")
-                for url in info["urls"]:
-                    for s in HLSStream.parse_variant_playlist(self.session, url, name_fmt="{pixels}_{bitrate}").items():
-                        yield s
+            if info.get("hlsUrl"):
+                for s in HLSStream.parse_variant_playlist(self.session, info["hlsUrl"], start_offset=start_point).items():
+                    yield s
             else:
-                raise PluginError("Could not load streams: {message} ({code})".format(**info["status"]))
+                log.error("Could not find the HLS URL")
 
 
 __plugin__ = WWENetwork
diff --git a/src/streamlink/utils/times.py b/src/streamlink/utils/times.py
index ae509fde..2226477e 100644
--- a/src/streamlink/utils/times.py
+++ b/src/streamlink/utils/times.py
@@ -48,6 +48,13 @@ def hours_minutes_seconds(value):
     return s
 
 
+def seconds_to_hhmmss(seconds):
+    hours, seconds = divmod(seconds, 3600)
+    minutes, seconds = divmod(seconds, 60)
+    return "{0:02d}:{1:02d}:{2}".format(int(hours), int(minutes), "{0:02.1f}".format(seconds) if seconds % 1 else "{0:02d}".format(int(seconds)))
+
+
 __all__ = [
     "hours_minutes_seconds",
+    "seconds_to_hhmmss"
 ]

diff --git a/tests/plugins/test_wwenetwork.py b/tests/plugins/test_wwenetwork.py
index bd51724d..bc485a9a 100644
--- a/tests/plugins/test_wwenetwork.py
+++ b/tests/plugins/test_wwenetwork.py
@@ -6,7 +6,7 @@ from streamlink.plugins.wwenetwork import WWENetwork
 class TestPluginWWENetwork(unittest.TestCase):
     def test_can_handle_url(self):
         should_match = [
-            'http://network.wwe.com/shows/collections/267406022',
+            'https://watch.wwe.com/in-ring/3622',
         ]
         for url in should_match:
             self.assertTrue(WWENetwork.can_handle_url(url))
diff --git a/tests/test_utils_times.py b/tests/test_utils_times.py
index a1f5b81d..927f9459 100644
--- a/tests/test_utils_times.py
+++ b/tests/test_utils_times.py
@@ -1,6 +1,6 @@
 import unittest
 
-from streamlink.utils.times import hours_minutes_seconds
+from streamlink.utils.times import hours_minutes_seconds, seconds_to_hhmmss
 
 
 class TestUtilsTimes(unittest.TestCase):
@@ -37,3 +37,13 @@ class TestUtilsTimes(unittest.TestCase):
 
         with self.assertRaises(ValueError):
             hours_minutes_seconds("11:ERR:00")
+
+    def test_seconds_to_hhmmss(self):
+
+        self.assertEqual(seconds_to_hhmmss(0), "00:00:00")
+        self.assertEqual(seconds_to_hhmmss(1), "00:00:01")
+        self.assertEqual(seconds_to_hhmmss(60), "00:01:00")
+        self.assertEqual(seconds_to_hhmmss(3600), "01:00:00")
+
+        self.assertEqual(seconds_to_hhmmss(13997), "03:53:17")
+        self.assertEqual(seconds_to_hhmmss(13997.4), "03:53:17.4")

Updated WWEN plugin PLZ
<!--
Thanks for reporting a plugin issue!
USE THE TEMPLATE. Otherwise your plugin issue may be rejected.

First, see the contribution guidelines:
https://github.com/streamlink/streamlink/blob/master/CONTRIBUTING.md#contributing-to-streamlink

Also check the list of open and closed plugin issues:
https://github.com/streamlink/streamlink/issues?q=is%3Aissue+label%3A%22plugin+issue%22

Please see the text preview to avoid unnecessary formatting errors.
-->


## Plugin Issue

WWE have now gone to 2.0 and is doing 1080p VOD, plugin needs updating PLZ


### Description

WWE have now gone to 2.0 and is doing 1080p VOD, plugin needs updating PLZ I have tried letmeatit and still same problem and adownloader. uses index.m3u8 and not bitrate.m3u8 master has added code as well.


### Reproduction steps / Explicit stream URLs to test

<!-- How can we reproduce this? Please note the exact steps below using the list format supplied. If you need more steps please add them. -->

1. ...
2. ...
3. ...


### Log output

<!--
TEXT LOG OUTPUT IS REQUIRED for a plugin issue!
Use the `--loglevel debug` parameter and avoid using parameters which suppress log output.
https://streamlink.github.io/cli.html#cmdoption-l

Make sure to **remove usernames and passwords**
You can copy the output to https://gist.github.com/ or paste it below.
-->

```
REPLACE THIS TEXT WITH THE LOG OUTPUT
```


### Additional comments, screenshots, etc.



[Love Streamlink? Please consider supporting our collective. Thanks!](https://opencollective.com/streamlink/donate)

tests/plugins/test_wwenetwork.py::TestPluginWWENetwork::test_can_handle_url tests/plugins/test_wwenetwork.py::TestPluginWWENetwork::test_can_handle_url_negative tests/test_utils_times.py::TestUtilsTimes::test_hours_minutes_seconds tests/test_utils_times.py::TestUtilsTimes::test_seconds_to_hhmmss