diff --git a/appointment-import/src/main/java/smash/appointment/parse/Main.java b/appointment-import/src/main/java/smash/appointment/parse/Main.java
index 7ade6f3b0a90d79e9c0049e3c4fcf36160ee04ac..8db86858cfbbcdc461ed881ffc9775cb65551231 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/Main.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/Main.java
@@ -1,5 +1,6 @@
 package smash.appointment.parse;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Calendar;
 import java.util.List;
@@ -29,14 +30,17 @@ public class Main {
 		Option lihControls = Option.builder().required().argName("file").hasArg().desc("LIH controls").longOpt("lih-controls").build();
 		Option lihMappingControls = Option.builder().required().argName("file").hasArg().desc("LIH controls mapping").longOpt("lih-mapping").build();
 		Option redCap = Option.builder().required().argName("file").hasArg().desc("RedCap appointments").longOpt("red-cap").build();
+		Option redCapCalendar = Option.builder().required().argName("file").hasArg().desc("RedCap calendar sql").longOpt("red-cap-calendar").build();
 		Option duplicates = Option.builder().required().argName("file").hasArg().desc("duplicates").longOpt("duplicates").build();
 		options.addOption(agenda);
+
 		options.addOption(subjects);
 		options.addOption(controls);
 		options.addOption(flyingTeam);
 		options.addOption(lihControls);
 		options.addOption(lihMappingControls);
 		options.addOption(redCap);
+		options.addOption(redCapCalendar);
 		options.addOption(duplicates);
 
 		CommandLineParser parser = new DefaultParser();
@@ -83,6 +87,9 @@ public class Main {
 			String redCapFile = line.getOptionValue("red-cap");
 			appointmentDao.addAppointments(processRedCapAppointments(redCapFile));
 
+			String redCapCalendarFile = line.getOptionValue("red-cap-calendar");
+			appointmentDao.addAppointments(processRedCapCalendar(redCapCalendarFile));
+
 			System.out.println("delete from web_visit_appointment_types;");
 			System.out.println("delete from web_appointment_appointment_types;");
 			System.out.println("delete from web_subject_languages;");
@@ -110,6 +117,14 @@ public class Main {
 		}
 	}
 
+	private List<AppointmentEntry> processRedCapCalendar(String redCapCalendarFile) throws FileNotFoundException, IOException {
+		RedcapCalendarParser redcapCalendarParser = new RedcapCalendarParser();
+		redcapCalendarParser.setSubjectDao(subjectDao);
+		Calendar date = Calendar.getInstance();
+		date.set(Calendar.HOUR, 0);
+		return redcapCalendarParser.parse(redCapCalendarFile, date);
+	}
+
 	private void removeDuplicates(String duplicatesFile) throws IOException {
 		logger.info("PROCESSING FILE: " + duplicatesFile);
 		DuplicateRemoveParser parser = new DuplicateRemoveParser();
diff --git a/appointment-import/src/main/java/smash/appointment/parse/RedcapCalendarParser.java b/appointment-import/src/main/java/smash/appointment/parse/RedcapCalendarParser.java
index 41a5d791d53a07ad39a1fc3c35db84bb9d3ebd1d..e9b86aee73fc5c1b014fbef24a416eb8e8b8ec08 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/RedcapCalendarParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/RedcapCalendarParser.java
@@ -81,7 +81,7 @@ public class RedcapCalendarParser {
 		if (subject == null) {
 			subject = findSubject(query);
 		}
-		if (subject != null && !subject.getToBeSeenAt().equalsIgnoreCase("LIH")) {
+		if (subject != null && !subject.getToBeSeenAt().toLowerCase().startsWith("l")) {
 			return null;
 		}
 		result.setLocation("LIH");
@@ -93,7 +93,12 @@ public class RedcapCalendarParser {
 		if (result.getTypes().contains(AppointmentType.OTHER)) {
 			logger.warn("Cannot find types for: " + query);
 		}
-		return result;
+		if (result.getTypes().contains(AppointmentType.LEVEL_ASAMP)) {
+			return result;
+		} else {
+			logger.debug("Skipping LIH appointment: " + query);
+			return null;
+		}
 	}
 
 	CellParser cellParser = new CellParser();
@@ -107,6 +112,14 @@ public class RedcapCalendarParser {
 				query = query.substring(index);
 				if (query.startsWith("_lev a_")) {
 					collection = AppointmentTypeCollection.LEVEL_A;
+				} else {
+					index = query.indexOf("_", 1);
+					if (index >= 0) {
+						query = query.substring(index);
+						if (query.startsWith("_lev a_")) {
+							collection = AppointmentTypeCollection.LEVEL_A;
+						}
+					}
 				}
 			}
 			if (collection == null) {
diff --git a/appointment-import/src/main/java/smash/appointment/parse/RedcapMissingSqlExporter.java b/appointment-import/src/main/java/smash/appointment/parse/RedcapMissingSqlExporter.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a15d6c16bf49e2e55f8f5562b3e0439696fb95c
--- /dev/null
+++ b/appointment-import/src/main/java/smash/appointment/parse/RedcapMissingSqlExporter.java
@@ -0,0 +1,52 @@
+package smash.appointment.parse;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+public class RedcapMissingSqlExporter {
+	static SubjectDao subjectDao = new SubjectDao();
+	
+	public static void main(String[] args) throws Exception {
+		List<Subject> subjects = new ArrayList<>();
+		for (int count =0 ;count<10000;count++) {
+			String nd = count+"";
+			while (nd.length()<4) {
+				nd = "0"+nd;
+			}
+			Subject subject = new Subject("name "+nd, "surname"+nd, "ND"+nd, count+"");
+			
+			String screening = nd;
+			if (screening.startsWith("0")) {
+				screening = screening.substring(1);
+			}
+			subject.setScreeningNumber("P-"+screening);
+			subject.setToBeSeenAt("PRC");
+			if (count>=3000) {
+				screening=screening.substring(1);
+				subject.setScreeningNumber("L-"+screening);
+				subject.setToBeSeenAt("LIH");
+			}
+			if (count>=7000) {
+				subject.setScreeningNumber("F-"+nd);
+				subject.setToBeSeenAt("FLYING TEAM");
+			}
+			subjects.add(subject);
+		}
+		subjectDao.setSubjects(subjects);
+		
+		RedcapCalendarParser parser = new RedcapCalendarParser();
+		parser.setSubjectDao(subjectDao);
+		Calendar date = Calendar.getInstance();
+		date.set(2017, 2, 21, 1, 0, 0);
+		List<AppointmentEntry> entries = parser.parse("E:/redcap_events_calendar-20032017.sql", date);
+		
+		VisitSqlExporter sqlExporter = new VisitSqlExporter();
+		for (AppointmentEntry entry: entries) {
+			Visit visit = new Visit(entry.getSubject());
+			visit.addAppointment(entry);
+			visit.setStartDate(entry.getDay());
+			System.out.println(sqlExporter.toSql(visit));
+		}
+	}
+}
diff --git a/appointment-import/src/main/java/smash/appointment/parse/RedcapParser.java b/appointment-import/src/main/java/smash/appointment/parse/RedcapParser.java
index 59e8eaf9cf7e9c07a289e19a01196c3c91e8a820..77daba4800f5cb51d19bd23ef250805d335e67d0 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/RedcapParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/RedcapParser.java
@@ -47,35 +47,32 @@ public class RedcapParser {
 							subject.setBirthDate(tmp[2]);
 						}
 
-						// for now only PRC and flying team subjects
-						if (subject.getToBeSeenAt() == null || subject.getToBeSeenAt().startsWith("P") || subject.getToBeSeenAt().startsWith("F")) {
-							List<AppointmentEntry> subjectAppointments = new ArrayList<>();
-							if (!tmp[9].isEmpty()) {
-								subjectAppointments.add(createEntryLevelA(tmp[9], tmp[10], subject));
-							}
-
-							if (!tmp[13].isEmpty()) {
-								subjectAppointments.add(createEntryLevelB(tmp[13], tmp[14], subject));
-							}
-
-							if (!tmp[17].isEmpty()) {
-								subjectAppointments.add(createEntryLevelBG(tmp[17], tmp[18], subject));
-							}
-
-							if (!tmp[21].isEmpty()) {
-								subjectAppointments.add(createEntryLevelBV(tmp[21], tmp[22], subject));
-							}
-
-							if (!tmp[41].isEmpty()) {
-								subjectAppointments.add(createEntryLevelSB(tmp[41], subject));
-							}
-
-							if (!tmp[45].isEmpty()) {
-								subjectAppointments.add(createEntryLevelMPower(tmp[45], subject));
-							}
-
-							result.addAll(subjectAppointments);
+						List<AppointmentEntry> subjectAppointments = new ArrayList<>();
+						if (!tmp[9].isEmpty()) {
+							subjectAppointments.add(createEntryLevelA(tmp[9], tmp[10], subject));
 						}
+
+						if (!tmp[13].isEmpty()) {
+							subjectAppointments.add(createEntryLevelB(tmp[13], tmp[14], subject));
+						}
+
+						if (!tmp[17].isEmpty()) {
+							subjectAppointments.add(createEntryLevelBG(tmp[17], tmp[18], subject));
+						}
+
+						if (!tmp[21].isEmpty()) {
+							subjectAppointments.add(createEntryLevelBV(tmp[21], tmp[22], subject));
+						}
+
+						if (!tmp[41].isEmpty()) {
+							subjectAppointments.add(createEntryLevelSB(tmp[41], subject));
+						}
+
+						if (!tmp[45].isEmpty()) {
+							subjectAppointments.add(createEntryLevelMPower(tmp[45], subject));
+						}
+
+						result.addAll(subjectAppointments);
 					}
 				}
 
diff --git a/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java b/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java
index 8eba162f1e452e4a568cee1a264bf93a81830c35..7d78c4d363d6509150f560fd46445fbd59fa670e 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/SubjectDao.java
@@ -32,8 +32,10 @@ public class SubjectDao {
 
 	Subject getByScreeningNumber(String screeningNumber) {
 		for (Subject s : subjects) {
-			if (screeningNumber.equals(s.getScreeningNumber())) {
-				return s;
+			for (String number: s.getScreeningNumber().split(";")) {
+				if (screeningNumber.equals(number.trim())) {
+					return s;
+				}				
 			}
 		}
 		return null;
diff --git a/appointment-import/src/main/java/smash/appointment/parse/VisitSqlExporter.java b/appointment-import/src/main/java/smash/appointment/parse/VisitSqlExporter.java
index 7dbc577be9f30d938861ad6e5f4ff03d9e6e57ea..ad544f75172a77252da124a601d60cccff4d87d5 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/VisitSqlExporter.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/VisitSqlExporter.java
@@ -16,7 +16,7 @@ public class VisitSqlExporter extends SqlExporter {
 		result.append("is_finished)");
 
 		result.append("values (");
-		result.append("(SELECT id from web_subject where screening_number = "+getStringVal(visit.getSubject().getScreeningNumber()) + "),");
+		result.append("(SELECT id from web_subject where screening_number like "+getStringVal('%'+visit.getSubject().getScreeningNumber()+'%') + "),");
 		result.append(getStringVal(visit.getStartDate()) + ",");
 		result.append(getStringVal(visit.getEndDate()) + ",");
 		result.append("false,");