diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py
index 00fee80239787dc34e97a83e4d78cdf26aebeb1e..ddfc2f49153b7997daa964c4f2772febec11e406 100644
--- a/homeassistant/components/media_player/__init__.py
+++ b/homeassistant/components/media_player/__init__.py
@@ -41,6 +41,7 @@ ATTR_MEDIA_DURATION = 'media_duration'
 
 MEDIA_STATE_UNKNOWN = 'unknown'
 MEDIA_STATE_PLAYING = 'playing'
+MEDIA_STATE_PAUSED = 'paused'
 MEDIA_STATE_STOPPED = 'stopped'
 
 
diff --git a/homeassistant/components/media_player/cast.py b/homeassistant/components/media_player/cast.py
index 32b86e4b90b6376a08637a9f2371fe1b6db11f34..35d9748c663b229b731cf6dd37bab3c8f691090a 100644
--- a/homeassistant/components/media_player/cast.py
+++ b/homeassistant/components/media_player/cast.py
@@ -10,15 +10,18 @@ import logging
 
 try:
     import pychromecast
+    import pychromecast.controllers.youtube as youtube
 except ImportError:
     # We will throw error later
     pass
 
+# ATTR_MEDIA_ALBUM, ATTR_MEDIA_IMAGE_URL,
+# ATTR_MEDIA_TITLE, ATTR_MEDIA_ARTIST,
 from homeassistant.components.media_player import (
     MediaPlayerDevice, STATE_NO_APP, ATTR_MEDIA_STATE,
-    ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_TITLE, ATTR_MEDIA_ARTIST,
-    ATTR_MEDIA_ALBUM, ATTR_MEDIA_IMAGE_URL, ATTR_MEDIA_DURATION,
-    ATTR_MEDIA_VOLUME, MEDIA_STATE_PLAYING, MEDIA_STATE_STOPPED)
+    ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_DURATION, ATTR_MEDIA_VOLUME,
+    MEDIA_STATE_PLAYING, MEDIA_STATE_PAUSED, MEDIA_STATE_STOPPED,
+    MEDIA_STATE_UNKNOWN)
 
 
 # pylint: disable=unused-argument
@@ -57,7 +60,9 @@ class CastDevice(MediaPlayerDevice):
     """ Represents a Cast device on the network. """
 
     def __init__(self, host):
-        self.cast = pychromecast.PyChromecast(host)
+        self.cast = pychromecast.Chromecast(host)
+        self.youtube = youtube.YouTubeController()
+        self.cast.register_handler(self.youtube)
 
     @property
     def name(self):
@@ -67,47 +72,47 @@ class CastDevice(MediaPlayerDevice):
     @property
     def state(self):
         """ Returns the state of the device. """
-        status = self.cast.app
-
-        if status is None or status.app_id == pychromecast.APP_ID['HOME']:
+        if self.cast.is_idle:
             return STATE_NO_APP
         else:
-            return status.description
+            return self.cast.app_display_name
+
+    @property
+    def media_state(self):
+        """ Returns the media state. """
+        media_controller = self.cast.media_controller
+
+        if media_controller.is_playing:
+            return MEDIA_STATE_PLAYING
+        elif media_controller.is_paused:
+            return MEDIA_STATE_PAUSED
+        elif media_controller.is_idle:
+            return MEDIA_STATE_STOPPED
+        else:
+            return MEDIA_STATE_UNKNOWN
 
     @property
     def state_attributes(self):
         """ Returns the state attributes. """
-        ramp = self.cast.get_protocol(pychromecast.PROTOCOL_RAMP)
-
-        if ramp and ramp.state != pychromecast.RAMP_STATE_UNKNOWN:
-            state_attr = {}
-
-            if ramp.state == pychromecast.RAMP_STATE_PLAYING:
-                state_attr[ATTR_MEDIA_STATE] = MEDIA_STATE_PLAYING
-            else:
-                state_attr[ATTR_MEDIA_STATE] = MEDIA_STATE_STOPPED
-
-            if ramp.content_id:
-                state_attr[ATTR_MEDIA_CONTENT_ID] = ramp.content_id
-
-            if ramp.title:
-                state_attr[ATTR_MEDIA_TITLE] = ramp.title
+        cast_status = self.cast.status
+        media_status = self.cast.media_status
 
-            if ramp.artist:
-                state_attr[ATTR_MEDIA_ARTIST] = ramp.artist
+        state_attr = {
+            ATTR_MEDIA_STATE: self.media_state,
+            'application_id': self.cast.app_id,
+        }
 
-            if ramp.album:
-                state_attr[ATTR_MEDIA_ALBUM] = ramp.album
+        if cast_status:
+            state_attr[ATTR_MEDIA_VOLUME] = cast_status.volume_level,
 
-            if ramp.image_url:
-                state_attr[ATTR_MEDIA_IMAGE_URL] = ramp.image_url
+        if media_status:
+            if media_status.content_id:
+                state_attr[ATTR_MEDIA_CONTENT_ID] = media_status.content_id
 
-            if ramp.duration:
-                state_attr[ATTR_MEDIA_DURATION] = ramp.duration
+            if media_status.duration:
+                state_attr[ATTR_MEDIA_DURATION] = media_status.duration
 
-            state_attr[ATTR_MEDIA_VOLUME] = ramp.volume
-
-            return state_attr
+        return state_attr
 
     def turn_off(self):
         """ Service to exit any running app on the specimedia player ChromeCast and
@@ -117,46 +122,31 @@ class CastDevice(MediaPlayerDevice):
 
     def volume_up(self):
         """ Service to send the chromecast the command for volume up. """
-        ramp = self.cast.get_protocol(pychromecast.PROTOCOL_RAMP)
-
-        if ramp:
-            ramp.volume_up()
+        self.cast.volume_up()
 
     def volume_down(self):
         """ Service to send the chromecast the command for volume down. """
-        ramp = self.cast.get_protocol(pychromecast.PROTOCOL_RAMP)
-
-        if ramp:
-            ramp.volume_down()
+        self.cast.volume_down()
 
     def media_play_pause(self):
         """ Service to send the chromecast the command for play/pause. """
-        ramp = self.cast.get_protocol(pychromecast.PROTOCOL_RAMP)
+        media_state = self.media_state
 
-        if ramp:
-            ramp.playpause()
+        if media_state in (MEDIA_STATE_STOPPED, MEDIA_STATE_PAUSED):
+            self.cast.media_controller.play()
+        elif media_state == MEDIA_STATE_PLAYING:
+            self.cast.media_controller.pause()
 
     def media_play(self):
         """ Service to send the chromecast the command for play/pause. """
-        ramp = self.cast.get_protocol(pychromecast.PROTOCOL_RAMP)
-
-        if ramp and ramp.state == pychromecast.RAMP_STATE_STOPPED:
-            ramp.playpause()
+        if self.media_state in (MEDIA_STATE_STOPPED, MEDIA_STATE_PAUSED):
+            self.cast.media_controller.play()
 
     def media_pause(self):
         """ Service to send the chromecast the command for play/pause. """
-        ramp = self.cast.get_protocol(pychromecast.PROTOCOL_RAMP)
-
-        if ramp and ramp.state == pychromecast.RAMP_STATE_PLAYING:
-            ramp.playpause()
-
-    def media_next_track(self):
-        """ Service to send the chromecast the command for next track. """
-        ramp = self.cast.get_protocol(pychromecast.PROTOCOL_RAMP)
-
-        if ramp:
-            ramp.next()
+        if self.media_state == MEDIA_STATE_PLAYING:
+            self.cast.media_controller.pause()
 
     def play_youtube_video(self, video_id):
         """ Plays specified video_id on the Chromecast's YouTube channel. """
-        pychromecast.play_youtube_video(video_id, self.cast.host)
+        self.youtube.play_video(video_id)
diff --git a/requirements.txt b/requirements.txt
index 86605af82c0dd61173724cf473c538b8682764b7..69335d351de987d1cac202733ed512cb49a6bf87 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -18,7 +18,7 @@ phue>=0.8
 ledcontroller>=1.0.7
 
 # media_player.cast
-pychromecast>=0.5
+pychromecast>=0.6
 
 # keyboard
 pyuserinput>=0.1.9