diff --git a/homeassistant/components/tts/__init__.py b/homeassistant/components/tts/__init__.py
index 9b4df2749c035bd21b8b0d2c3aa156658899ea00..fb99219416fdc1dce26440e41a26204ac4974d27 100644
--- a/homeassistant/components/tts/__init__.py
+++ b/homeassistant/components/tts/__init__.py
@@ -12,6 +12,7 @@ import logging
 import mimetypes
 import os
 import re
+import io
 
 from aiohttp import web
 import voluptuous as vol
@@ -30,6 +31,7 @@ import homeassistant.helpers.config_validation as cv
 
 DOMAIN = 'tts'
 DEPENDENCIES = ['http']
+REQUIREMENTS = ["mutagen==1.36.2"]
 
 _LOGGER = logging.getLogger(__name__)
 
@@ -255,6 +257,8 @@ class SpeechManager(object):
     def async_register_engine(self, engine, provider, config):
         """Register a TTS provider."""
         provider.hass = self.hass
+        if provider.name is None:
+            provider.name = engine
         self.providers[engine] = provider
 
     @asyncio.coroutine
@@ -276,6 +280,8 @@ class SpeechManager(object):
                 language))
 
         # options
+        if provider.default_options and options:
+            options = provider.default_options.copy().update(options)
         options = options or provider.default_options
         if options is not None:
             invalid_opts = [opt_name for opt_name in options.keys()
@@ -296,7 +302,7 @@ class SpeechManager(object):
         # is file store in file cache
         elif use_cache and key in self.file_cache:
             filename = self.file_cache[key]
-            self.hass.async_add_job(self.async_file_to_mem(key))
+            yield from self.async_file_to_mem(key)
         # load speech from provider into memory
         else:
             filename = yield from self.async_get_tts_audio(
@@ -323,6 +329,9 @@ class SpeechManager(object):
         # create file infos
         filename = ("{}.{}".format(key, extension)).lower()
 
+        data = self.write_tags(
+            filename, data, provider, message, language, options)
+
         # save to memory
         self._async_store_to_memcache(key, filename, data)
 
@@ -412,11 +421,43 @@ class SpeechManager(object):
         content, _ = mimetypes.guess_type(filename)
         return (content, self.mem_cache[key][MEM_CACHE_VOICE])
 
+    @staticmethod
+    def write_tags(filename, data, provider, message, language, options):
+        """Write ID3 tags to file.
+
+        Async friendly.
+        """
+        import mutagen
+
+        data_bytes = io.BytesIO(data)
+        data_bytes.name = filename
+        data_bytes.seek(0)
+
+        album = provider.name
+        artist = language
+
+        if options is not None:
+            if options.get('voice') is not None:
+                artist = options.get('voice')
+
+        try:
+            tts_file = mutagen.File(data_bytes, easy=True)
+            if tts_file is not None:
+                tts_file['artist'] = artist
+                tts_file['album'] = album
+                tts_file['title'] = message
+                tts_file.save(data_bytes)
+        except mutagen.MutagenError as err:
+            _LOGGER.error("ID3 tag error: %s", err)
+
+        return data_bytes.getvalue()
+
 
 class Provider(object):
     """Represent a single provider."""
 
     hass = None
+    name = None
 
     @property
     def default_language(self):
diff --git a/homeassistant/components/tts/amazon_polly.py b/homeassistant/components/tts/amazon_polly.py
index e40c10f5e1478c372b037f6acad425af1e1d2d49..7dab49482ed7a801c3dfe325ecade18b913136e4 100644
--- a/homeassistant/components/tts/amazon_polly.py
+++ b/homeassistant/components/tts/amazon_polly.py
@@ -138,6 +138,7 @@ class AmazonPollyProvider(Provider):
         self.supported_langs = supported_languages
         self.all_voices = all_voices
         self.default_voice = self.config.get(CONF_VOICE)
+        self.name = 'Amazon Polly'
 
     @property
     def supported_languages(self):
diff --git a/homeassistant/components/tts/demo.py b/homeassistant/components/tts/demo.py
index 95362b49db90c8785e2db6dc19800bd1e354f32b..d9d1eccec8d163000352c7ac3bd43390eb8f7638 100644
--- a/homeassistant/components/tts/demo.py
+++ b/homeassistant/components/tts/demo.py
@@ -32,6 +32,7 @@ class DemoProvider(Provider):
     def __init__(self, lang):
         """Initialize demo provider."""
         self._lang = lang
+        self.name = 'Demo'
 
     @property
     def default_language(self):
diff --git a/homeassistant/components/tts/google.py b/homeassistant/components/tts/google.py
index 32c9663eedc807fe9e79318557bd5e04f974f053..be84e0e029b954e77dc1bb739b8ad0270b2a37cd 100644
--- a/homeassistant/components/tts/google.py
+++ b/homeassistant/components/tts/google.py
@@ -58,6 +58,7 @@ class GoogleProvider(Provider):
                            "AppleWebKit/537.36 (KHTML, like Gecko) "
                            "Chrome/47.0.2526.106 Safari/537.36")
         }
+        self.name = 'Google'
 
     @property
     def default_language(self):
diff --git a/homeassistant/components/tts/picotts.py b/homeassistant/components/tts/picotts.py
index 49addd9b1778b061665af1c701acb891865eb609..a22196cfbe09e9a21c2c3ab7b6b7d26538397a84 100644
--- a/homeassistant/components/tts/picotts.py
+++ b/homeassistant/components/tts/picotts.py
@@ -38,6 +38,7 @@ class PicoProvider(Provider):
     def __init__(self, lang):
         """Initialize Pico TTS provider."""
         self._lang = lang
+        self.name = 'PicoTTS'
 
     @property
     def default_language(self):
diff --git a/homeassistant/components/tts/voicerss.py b/homeassistant/components/tts/voicerss.py
index b0c74d1de30e9aeb33fce707ae870b70dcd0e764..ee50cc30ccabb693f0b6f0932cbe6a2358573f87 100644
--- a/homeassistant/components/tts/voicerss.py
+++ b/homeassistant/components/tts/voicerss.py
@@ -95,6 +95,7 @@ class VoiceRSSProvider(Provider):
         self.hass = hass
         self._extension = conf[CONF_CODEC]
         self._lang = conf[CONF_LANG]
+        self.name = 'VoiceRSS'
 
         self._form_data = {
             'key': conf[CONF_API_KEY],
diff --git a/homeassistant/components/tts/yandextts.py b/homeassistant/components/tts/yandextts.py
index 824ca6ca38f46cbf6613a977e265db0755083ed0..b60f9cab61ee3ad1186ca17ef28acf321e95c897 100644
--- a/homeassistant/components/tts/yandextts.py
+++ b/homeassistant/components/tts/yandextts.py
@@ -82,6 +82,7 @@ class YandexSpeechKitProvider(Provider):
         self._language = conf.get(CONF_LANG)
         self._emotion = conf.get(CONF_EMOTION)
         self._speed = str(conf.get(CONF_SPEED))
+        self.name = 'YandexTTS'
 
     @property
     def default_language(self):
diff --git a/requirements_all.txt b/requirements_all.txt
index e3e06dcebe86d1a87a0b7ab0ccf3a9bc16c3937f..d8d598dc17fac29fc12606f0eae8009ce905cdce 100755
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -328,6 +328,9 @@ mficlient==0.3.0
 # homeassistant.components.sensor.miflora
 miflora==0.1.15
 
+# homeassistant.components.tts
+mutagen==1.36.2
+
 # homeassistant.components.sensor.usps
 myusps==1.0.2
 
diff --git a/tests/components/tts/test_init.py b/tests/components/tts/test_init.py
index f7985b8af74df3f0b0c8bc605b90e3182f424491..0db7c1a5befea2bd20ef1dd569a2750c88db4e1f 100644
--- a/tests/components/tts/test_init.py
+++ b/tests/components/tts/test_init.py
@@ -341,6 +341,10 @@ class TestTTS(object):
         assert len(calls) == 1
         req = requests.get(calls[0].data[ATTR_MEDIA_CONTENT_ID])
         _, demo_data = self.demo_provider.get_tts_audio("bla", 'en')
+        demo_data = tts.SpeechManager.write_tags(
+            "265944c108cbb00b2a621be5930513e03a0bb2cd_en_-_demo.mp3",
+            demo_data, self.demo_provider,
+            "I person is on front of your door.", 'en', None)
         assert req.status_code == 200
         assert req.content == demo_data
 
@@ -351,6 +355,7 @@ class TestTTS(object):
         config = {
             tts.DOMAIN: {
                 'platform': 'demo',
+                'language': 'de',
             }
         }
 
@@ -367,6 +372,10 @@ class TestTTS(object):
         assert len(calls) == 1
         req = requests.get(calls[0].data[ATTR_MEDIA_CONTENT_ID])
         _, demo_data = self.demo_provider.get_tts_audio("bla", "de")
+        demo_data = tts.SpeechManager.write_tags(
+            "265944c108cbb00b2a621be5930513e03a0bb2cd_de_-_demo.mp3",
+            demo_data, self.demo_provider,
+            "I person is on front of your door.", 'de', None)
         assert req.status_code == 200
         assert req.content == demo_data