diff --git a/mdproxy.py b/mdproxy.py
index 6160c8efe629af4cf32e85228ff01fa83d3a80ea..ef73bd30f8ee0a9b6f15dff0260a3d1804bf7846 100755
--- a/mdproxy.py
+++ b/mdproxy.py
@@ -1,9 +1,11 @@
 #!/usr/bin/env python
+import requests
 
-from flask import Flask, request
+from lxml import etree as ET
+from flask import Flask
 from urllib.parse import unquote
-import requests
-# import traceback
+from dateutil import parser, tz
+from datetime import datetime
 
 app = Flask(__name__)
 
@@ -13,18 +15,30 @@ cached = {}
 signer = 'http://localhost:5001/sign'
 
 
+class Entity(object):
+    md = None
+    valid_until = 0
+
+
 @app.route('/cache/<path:eid>', methods=['GET'])
 def cache(eid):
     global cached
     entity = unquote(eid)
     print(f"entity: {entity}")
     if entity in cached:
-        print(f"serve {entity}")
-        return cached[entity]
+        if cached[entity].valid_until > datetime.now(tz.tzutc()):
+            print(f"serve {entity}")
+            return cached[entity].md
     else:
         print(f"request {entity}")
         result = requests.get(f"{signer}/{entity}").text
-        cached[entity] = result
+        parsed = ET.fromstring(result)
+        validUntil = parsed.get('validUntil')
+        # cacheDuration = parsed.get('cacheDuration')
+        cached_entity = Entity
+        cached_entity.md = result
+        cached_entity.valid_until = parser.isoparse(validUntil)
+        cached[entity] = cached_entity
         return result
 
 
diff --git a/mdserver.py b/mdserver.py
index 5015ac3221163bcd9b3b323f5f96a617c5656de2..1bf6f5da042b01038e6c8e7b22a7e282940da6a6 100755
--- a/mdserver.py
+++ b/mdserver.py
@@ -3,12 +3,13 @@ import sys
 import copy
 
 from lxml import etree as ET
-from signxml import XMLSigner, XMLVerifier
-# import hashlib
-
-from flask import Flask, request
+from signxml import XMLSigner
+from flask import Flask
 from urllib.parse import unquote
-# import traceback
+from dateutil import parser, tz
+from datetime import datetime
+
+# import hashlib
 
 app = Flask(__name__)
 
@@ -22,24 +23,36 @@ cert = open("meta.crt").read()
 key = open("meta.key").read()
 
 
+class Entity(object):
+    md = None
+    valid_until = 0
+
+
 @app.route('/sign/<path:eid>', methods=['GET'])
 def sign(eid):
     global idps, signed, cert
     entity = unquote(eid)
-    try:
-        if entity in signed:
+    if entity in signed:
+        signed_entity = signed[entity]
+        if signed_entity.valid_until > datetime.now(tz.tzutc()):
             print(f"serve {entity}")
-            return signed[entity]
-        elif entity in idps:
+            return signed[entity].md
+
+    if entity in idps:
+        try:
             print(f"sign {entity}")
-            signed_element = XMLSigner().sign(idps[entity], key=key, cert=cert)
+            signed_element = XMLSigner().sign(idps[entity].md, key=key, cert=cert)
             signed_xml = ET.tostring(signed_element, pretty_print=True).decode()
-            signed[entity] = signed_xml
+            signed_entity = Entity
+            signed_entity.md = signed_xml
+            signed_entity.valid_until = idps[entity].valid_until
+            signed[entity] = signed_entity
             return signed_xml
-    except Exception as e:
-        print(entity)
-        print(f"  {e}")
-        # traceback.print_exc()
+        except Exception as e:
+            print(entity)
+            print(f"  {e}")
+
+    return "No valid metadata\n", 404
 
 
 for mdfile in sys.argv[1:]:
@@ -47,12 +60,18 @@ for mdfile in sys.argv[1:]:
     root = tree.getroot()
     ns = copy.deepcopy(root.nsmap)
     ns['xml'] = 'http://www.w3.org/XML/1998/namespace'
-
-    for idp in root.findall('md:EntityDescriptor', ns):
-        entityID = idp.attrib.get('entityID', 'none')
+    validUntil = root.get('validUntil')
+    cacheDuration = root.get('cacheDuration')
+    for entity_descriptor in root.findall('md:EntityDescriptor', ns):
+        entityID = entity_descriptor.attrib.get('entityID', 'none')
+        entity_descriptor.set('validUntil', validUntil)
+        entity_descriptor.set('cacheDuration', cacheDuration)
+        entity = Entity
+        entity.md = entity_descriptor
+        entity.valid_until = parser.isoparse(validUntil)
         if entityID not in idps:
             print(entityID)
-            idps[entityID] = idp
+            idps[entityID] = entity
             found += 1
 
 print(f"Found: {found}")
diff --git a/requirements.txt b/requirements.txt
index 18520a310defae0bb031e9df6353facfa1f17bb5..f3c10b9d7d25b1162bbc62934e2020e9cd392358 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,3 +2,4 @@ lxml
 signxml
 flask
 requests
+python-dateutil