diff --git a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/C32SectionSwitch.java b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/C32SectionSwitch.java
index 490b9e9..ad64993 100644
--- a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/C32SectionSwitch.java
+++ b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/C32SectionSwitch.java
@@ -633,9 +633,11 @@
 
 					d = CDAValueUtil.getDate(ivlts.getValue());
 
-					;
-
-					sb.append(CDAValueUtil.DATE_PRETTY.format(d));
+					if (d != null) {
+						sb.append(CDAValueUtil.DATE_PRETTY.format(d));
+					} else {
+						sb.append(ivlts.getValue());
+					}
 				}
 
 			}
diff --git a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/EncounterUtil.java b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/EncounterUtil.java
index 713b8ea..74000ca 100644
--- a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/EncounterUtil.java
+++ b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/EncounterUtil.java
@@ -12,8 +12,10 @@
 package org.eclipse.mdht.cda.xml.ui.handlers;
 
 import java.util.Date;
+import java.util.HashMap;
 
 import org.apache.commons.lang.StringUtils;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.mdht.uml.cda.Act;
 import org.eclipse.mdht.uml.cda.Author;
 import org.eclipse.mdht.uml.cda.Encounter;
@@ -32,6 +34,8 @@
  */
 public class EncounterUtil {
 
+	public static HashMap<EObject, MatchEncounterBy> encounterCache = new HashMap<EObject, MatchEncounterBy>();
+
 	/**
 	 *
 	 * @TODO Fix with proper date comparison routines
@@ -101,12 +105,17 @@
 
 	public static MatchEncounterBy matchesEncounter(Encounter encounter, Act act) {
 
+		if (encounterCache.containsKey(act)) {
+			return encounterCache.get(act);
+		}
 		if (act == null) {
+			encounterCache.put(act, MatchEncounterBy.NOMATCH);
 			return MatchEncounterBy.NOMATCH;
 		}
 		for (II ii : act.getIds()) {
 			for (II iii : encounter.getIds()) {
 				if (CDAValueUtil.getKey(ii).equals(CDAValueUtil.getKey(iii))) {
+					encounterCache.put(act, MatchEncounterBy.NOMATCH);
 					return MatchEncounterBy.BYID;
 				}
 			}
@@ -132,15 +141,18 @@
 			for (Author author : act.getAuthors()) {
 				if (author.getTime() != null && !StringUtils.isEmpty(author.getTime().getValue())) {
 					observationTime = CDAValueUtil.getDate(author.getTime().getValue());
+
 					result = MatchEncounterBy.BYAUTHORID;
 				}
 			}
 		}
 
 		if (observationTime != null && isWithinEncounterDateRate(encounter, observationTime)) {
+			encounterCache.put(act, result);
 			return result;
 		}
 
+		encounterCache.put(act, MatchEncounterBy.NOMATCH);
 		return MatchEncounterBy.NOMATCH;
 
 	}
@@ -194,9 +206,14 @@
 	 */
 	public static MatchEncounterBy matchesEncounter(Encounter encounter, Organizer organizer) {
 
+		if (encounterCache.containsKey(organizer)) {
+			return encounterCache.get(organizer);
+		}
+
 		for (II ii : organizer.getIds()) {
 			for (II iii : encounter.getIds()) {
 				if (CDAValueUtil.getKey(ii).equals(CDAValueUtil.getKey(iii))) {
+					encounterCache.put(organizer, MatchEncounterBy.BYID);
 					return MatchEncounterBy.BYID;
 				}
 			}
@@ -228,9 +245,11 @@
 		}
 
 		if (observationTime != null && isWithinEncounterDateRate(encounter, observationTime)) {
+			encounterCache.put(organizer, result);
 			return result;
 		}
 
+		encounterCache.put(organizer, MatchEncounterBy.NOMATCH);
 		return MatchEncounterBy.NOMATCH;
 
 	}
diff --git a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java
index f384cac..916de1c 100644
--- a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java
+++ b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java
@@ -1560,6 +1560,7 @@
 						}
 
 					}
+					EncounterUtil.encounterCache.clear();
 					clinicalDocument.eResource().unload();
 					currentProcessingTime += stopwatch.elapsed(TimeUnit.MILLISECONDS);
 					/*
diff --git a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java
index 97f213f..dad2f91 100644
--- a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java
+++ b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java
@@ -593,8 +593,12 @@
 					d = CDAValueUtil.getDate(ivlts.getLow().getValue());
 
 					;
+					if (d != null) {
+						sb.append(CDAValueUtil.DATE_PRETTY.format(d));
+					} else {
+						sb.append(ivlts.getLow().getValue());
+					}
 
-					sb.append(CDAValueUtil.DATE_PRETTY.format(d));
 				}
 
 			}
@@ -602,10 +606,14 @@
 				if (!StringUtils.isEmpty(ivlts.getHigh().getValue())) {
 
 					d = CDAValueUtil.getDate(ivlts.getHigh().getValue());
-					if (sb.length() > 0) {
-						sb.append(" - ");
+					if (d != null) {
+						if (sb.length() > 0) {
+							sb.append(" - ");
+						}
+						sb.append(CDAValueUtil.DATE_PRETTY.format(d));
+					} else {
+						sb.append(ivlts.getHigh().getValue());
 					}
-					sb.append(CDAValueUtil.DATE_PRETTY.format(d));
 				}
 			}
 		}
