diff --git a/appointment-import/src/main/java/smash/appointment/parse/LihControlMappingParser.java b/appointment-import/src/main/java/smash/appointment/parse/LihControlMappingParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f5b0e2d074163c29c24e142d8e68fd4fc174f4b
--- /dev/null
+++ b/appointment-import/src/main/java/smash/appointment/parse/LihControlMappingParser.java
@@ -0,0 +1,136 @@
+package smash.appointment.parse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.ss.usermodel.Row;
+
+public class LihControlMappingParser extends SubjectParser {
+
+	@Override
+	protected String parseScreeningNumber(Row row) {
+		String number = getString(row.getCell(0));
+		if (number.trim().isEmpty()) {
+			return "";
+		} else {
+			if (number.length() == 1) {
+				number = "00" + number;
+			} else if (number.length() == 2) {
+				number = "0" + number;
+			}
+			return "L-" + number;
+		}
+	}
+
+	@Override
+	protected String parseName(Row row) {
+		return getString(row.getCell(8));
+	}
+
+	@Override
+	protected String parseSurname(Row row) {
+		return getString(row.getCell(9));
+	}
+
+	@Override
+	protected String parseNdNumber(Row row) {
+		return getString(row.getCell(7));
+	}
+
+	@Override
+	protected String getSheetName() {
+		return "Sheet1";
+	}
+
+	@Override
+	protected int getInitRow() {
+		return 1;
+	}
+
+	@Override
+	protected String parseBirthDate(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parsemPowerId(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseAddDate(Row row) {
+		return getDate(row.getCell(1));
+	}
+
+	@Override
+	protected String parseReferal(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseDiagnosisYear(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseMail(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parsePhone3(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parsePhone2(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parsePhone1(Row row) {
+		return getString(row.getCell(10));
+	}
+
+	@Override
+	protected String parseCity(Row row) {
+		return "";
+
+	}
+
+	@Override
+	protected String parseCountry(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseZipCode(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseAddress(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseRemarks(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseDiagnosis(Row row) {
+		return "";
+	}
+
+	@Override
+	protected SubjectType parseType(Row row) {
+		return SubjectType.CONTROL;
+	}
+
+	@Override
+	protected List<String> parseLanguages(Row row) {
+		return new ArrayList<>();
+	}
+
+}
diff --git a/appointment-import/src/main/java/smash/appointment/parse/LihControlParser.java b/appointment-import/src/main/java/smash/appointment/parse/LihControlParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..82955aa267155aa4531f55609ad3abc33f6130a5
--- /dev/null
+++ b/appointment-import/src/main/java/smash/appointment/parse/LihControlParser.java
@@ -0,0 +1,179 @@
+package smash.appointment.parse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.ss.usermodel.Row;
+
+public class LihControlParser extends SubjectParser {
+
+	@Override
+	protected String parseScreeningNumber(Row row) {
+		String number = getString(row.getCell(0));
+		if (number.trim().isEmpty()) {
+			return "";
+		} else {
+			return "L-" + number;
+		}
+	}
+
+	@Override
+	protected String parseName(Row row) {
+		return getString(row.getCell(2));
+	}
+
+	@Override
+	protected String parseSurname(Row row) {
+		return getString(row.getCell(1));
+	}
+
+	@Override
+	protected String parseNdNumber(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String getSheetName() {
+		return "Screening log";
+	}
+
+	@Override
+	protected int getInitRow() {
+		return 1;
+	}
+
+	@Override
+	protected String parseBirthDate(Row row) {
+		return getDate(row.getCell(5));
+	}
+
+	@Override
+	protected String parsemPowerId(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseAddDate(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseReferal(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseDiagnosisYear(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseMail(Row row) {
+		return getString(row.getCell(8));
+	}
+
+	@Override
+	protected String parsePhone3(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parsePhone2(Row row) {
+		return getString(row.getCell(7));
+	}
+
+	@Override
+	protected String parsePhone1(Row row) {
+		return getString(row.getCell(6));
+	}
+
+	@Override
+	protected String parseCity(Row row) {
+		return getString(row.getCell(12));
+
+	}
+
+	@Override
+	protected String parseCountry(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseZipCode(Row row) {
+		return getString(row.getCell(11));
+	}
+
+	@Override
+	protected String parseAddress(Row row) {
+		return getString(row.getCell(9)) + ", " + getString(row.getCell(10));
+	}
+
+	@Override
+	protected String parseRemarks(Row row) {
+		List<String> remarks = new ArrayList<>();
+		String info = getString(row.getCell(4));
+		if (!info.trim().isEmpty()) {
+			remarks.add("PD family relation=" + info);
+		}
+		remarks.add(getString(row.getCell(13)));
+		remarks.add(getComments(row.getCell(14)));
+		remarks.add(getComments(row.getCell(15)));
+		remarks.add(getComments(row.getCell(16)));
+		remarks.add(getString(row.getCell(18)));
+		remarks.add(getString(row.getCell(19)));
+		String result = "";
+		for (String string : remarks) {
+			if (!string.trim().isEmpty()) {
+				result += string.trim() + "\n";
+			}
+		}
+		return result;
+	}
+
+	@Override
+	protected String parseDiagnosis(Row row) {
+		return "";
+	}
+
+	@Override
+	protected SubjectType parseType(Row row) {
+		return SubjectType.CONTROL;
+	}
+
+	@Override
+	protected List<String> parseLanguages(Row row) {
+		List<String> result = new ArrayList<>();
+
+		String languages = getString(row.getCell(3));
+		String langAbbreviations[] = new String[] {};
+		if (languages.indexOf(",") >= 0) {
+			langAbbreviations = languages.split(",");
+		} else {
+			langAbbreviations = languages.split("/");
+		}
+		for (String string : langAbbreviations) {
+			if (!string.trim().isEmpty()) {
+				result.add(getMappedLanguage(string.trim()));
+			}
+		}
+		return result;
+	}
+
+	private String getMappedLanguage(String abbreviation) {
+		switch (abbreviation.toUpperCase()) {
+			case ("F"):
+				return "French";
+			case ("D"):
+				return "German";
+			case ("GB"):
+				return "English";
+			case ("P"):
+				return "Portuguese";
+			case ("ENG"):
+				return "English";
+		}
+		logger.warn("Unknown language abbreviation: " + abbreviation);
+		return "";
+	}
+
+}
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 9696575936a66b166e478c4f34dcf66f80e091b7..5c6f94cb29ca670739a31f431efb9e6e0cde03b5 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/Main.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/Main.java
@@ -27,10 +27,14 @@ public class Main {
 		Option subjects = Option.builder().required().argName("file").hasArg().desc("PRC subjects").longOpt("subjects").build();
 		Option controls = Option.builder().required().argName("file").hasArg().desc("PRC controls").longOpt("controls").build();
 		Option flyingTeam = Option.builder().required().argName("file").hasArg().desc("PRC flying-team").longOpt("flying-team").build();
+		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();
 		options.addOption(agenda);
 		options.addOption(subjects);
 		options.addOption(controls);
 		options.addOption(flyingTeam);
+		options.addOption(lihControls);
+		options.addOption(lihMappingControls);
 
 		CommandLineParser parser = new DefaultParser();
 		try {
@@ -51,6 +55,16 @@ public class Main {
 				subjectDao.addSubject(subject, "[" + flyingTeamFile + ";" + subject.getScreeningNumber() + ";" + subject.getName() + " " + subject.getSurname() + "]");
 			}
 
+			String lihMappingControlsFile = line.getOptionValue("lih-mapping");
+			for (Subject subject : processLihMappingControls(lihMappingControlsFile)) {
+				subjectDao.addSubject(subject, "[" + lihMappingControlsFile + ";" + subject.getScreeningNumber() + ";" + subject.getName() + " " + subject.getSurname() + "]");
+			}
+
+			String lihControlsFile = line.getOptionValue("lih-controls");
+			for (Subject subject : processLihControls(lihControlsFile)) {
+				subjectDao.addSubject(subject, "[" + lihControlsFile + ";" + subject.getScreeningNumber() + ";" + subject.getName() + " " + subject.getSurname() + "]");
+			}
+
 			logger.debug("SUBJECTS: ");
 			for (Subject subject : subjectDao.getSubjects()) {
 				logger.debug(subject);
@@ -66,6 +80,16 @@ public class Main {
 		}
 	}
 
+	private List<Subject> processLihMappingControls(String lihMappingControlsFile) throws Exception{
+		LihControlMappingParser parser = new LihControlMappingParser();
+		return parser.processExcel(lihMappingControlsFile);
+	}
+
+	private List<Subject> processLihControls(String lihControlsFile) throws Exception{
+		LihControlParser parser = new LihControlParser();
+		return parser.processExcel(lihControlsFile);
+	}
+
 	private List<Subject> processFlyingTeamControls(String flyingTeamFile) throws Exception {
 		PrcFlyingParser parser = new PrcFlyingParser();
 		return parser.processExcel(flyingTeamFile);
diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java
index 44496a88855cb7a68b258a3abfa2828d1d95d01b..dbf0dc8c6a4e779c5e276577142d7efabed1e117 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java
@@ -1,5 +1,8 @@
 package smash.appointment.parse;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 
@@ -8,7 +11,7 @@ public class PrcControlParser extends SubjectParser {
 	@Override
 	protected String parseScreeningNumber(Row row) {
 		String number = getString(row.getCell(16));
-		if (number.isEmpty()) {
+		if (number.trim().isEmpty()) {
 			return "";
 		} else {
 			return "P-" + number;
@@ -153,4 +156,9 @@ public class PrcControlParser extends SubjectParser {
 		return SubjectType.CONTROL;
 	}
 
+	@Override
+	protected List<String> parseLanguages(Row row) {
+		return new ArrayList<>();
+	}
+
 }
diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java
index 5e27552df3a89f61c0e3ac116c28255b64b04a21..ff69003ab5130798a0e8db139fd95e292d800a1b 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java
@@ -1,5 +1,8 @@
 package smash.appointment.parse;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 
@@ -8,7 +11,7 @@ public class PrcFlyingParser extends SubjectParser {
 	@Override
 	protected String parseScreeningNumber(Row row) {
 		String number = getString(row.getCell(25));
-		if (number.isEmpty()) {
+		if (number.trim().isEmpty()) {
 			return "";
 		} else {
 			return "P-" + number;
@@ -142,5 +145,9 @@ public class PrcFlyingParser extends SubjectParser {
 	protected SubjectType parseType(Row row) {
 		return null;
 	}
+	@Override
+	protected List<String> parseLanguages(Row row) {
+		return new ArrayList<>();
+	}
 
 }
diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java
index 7b76573ff58ee9a9ee5237e9e06150ab5f319109..c2aea1029b8417688b77fee8b1b59c881c48253b 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java
@@ -1,5 +1,8 @@
 package smash.appointment.parse;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 
@@ -7,7 +10,12 @@ public class PrcSubjectsParser extends SubjectParser {
 
 	@Override
 	protected String parseScreeningNumber(Row row) {
-		return "P-" + getString(row.getCell(25));
+		String number = getString(row.getCell(25));
+		if (number.trim().isEmpty()) {
+			return "";
+		} else {
+			return "P-" + number;
+		}
 	}
 
 	@Override
@@ -125,4 +133,9 @@ public class PrcSubjectsParser extends SubjectParser {
 		return SubjectType.SUBJECT;
 	}
 
+	@Override
+	protected List<String> parseLanguages(Row row) {
+		return new ArrayList<>();
+	}
+
 }
diff --git a/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java b/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java
index 6b21835261f82175b1238dcf8c6f423c59858bf7..3d5652f69b68a5e3f17ec32d5d999de40ea6ae96 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java
@@ -16,7 +16,9 @@ import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Comment;
 import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -84,10 +86,13 @@ public abstract class SubjectParser {
 		result.setmPowerId(parsemPowerId(row));
 		result.setBirthDate(parseBirthDate(row));
 		result.setType(parseType(row));
+		result.setLanguages(parseLanguages(row));
 
 		return result;
 	}
 
+	protected abstract List<String> parseLanguages(Row row);
+
 	protected abstract SubjectType parseType(Row row);
 
 	protected abstract String parseBirthDate(Row row);
@@ -142,6 +147,18 @@ public abstract class SubjectParser {
 		return df.formatCellValue(cell).trim();
 	}
 
+	protected String getComments(Cell cell) {
+		Comment comment = cell.getCellComment();
+		if (comment != null) {
+			RichTextString richTextString = comment.getString();
+			if (richTextString != null) {
+				return richTextString.getString();
+
+			}
+		}
+		return "";
+	}
+
 	protected String getDate(Cell cell) {
 		if (cell == null) {
 			return "";
diff --git a/appointment-import/src/test/java/smash/appointment/parse/AllTests.java b/appointment-import/src/test/java/smash/appointment/parse/AllTests.java
index 5aaea5c96f9646e676ea97f75dc921964bac8042..71c7e659a4d91942129cace99a9438c4c4e16d33 100644
--- a/appointment-import/src/test/java/smash/appointment/parse/AllTests.java
+++ b/appointment-import/src/test/java/smash/appointment/parse/AllTests.java
@@ -6,6 +6,8 @@ import org.junit.runners.Suite.SuiteClasses;
 
 @RunWith(Suite.class)
 @SuiteClasses({ CellParserTest.class, //
+		LihControlMappingParserTest.class, //
+		LihControlParserTest.class, //
 		PrcFlyingParserTest.class, //
 		PrcSubjectsParserTest.class, //
 		RedcapParserTest.class, //
@@ -14,6 +16,7 @@ import org.junit.runners.Suite.SuiteClasses;
 		SubjectParserTest.class, //
 		XlsxCalendarProcessorTest.class, //
 })
+
 public class AllTests {
 
 }
diff --git a/appointment-import/src/test/java/smash/appointment/parse/LihControlMappingParserTest.java b/appointment-import/src/test/java/smash/appointment/parse/LihControlMappingParserTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..33d36da9df6bc99b91aab4f111c6b8934a57c340
--- /dev/null
+++ b/appointment-import/src/test/java/smash/appointment/parse/LihControlMappingParserTest.java
@@ -0,0 +1,58 @@
+package smash.appointment.parse;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LihControlMappingParserTest extends TestBase {
+	Logger						logger		= Logger.getLogger(LihControlMappingParserTest.class);
+
+	LihControlMappingParser processor	= new LihControlMappingParser();
+
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	@Before
+	public void setUp()  {
+		super.setUp();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() throws Exception {
+		List<Subject> entries = processor.processExcel("testFiles/lihControlMappingExample.xlsx");
+		assertTrue(entries.size() > 0);
+
+		Subject subject = entries.get(0);
+		assertEquals("L-001", subject.getScreeningNumber());
+		assertEquals("Piotrek", subject.getName());
+		assertEquals("Gawron", subject.getSurname());
+		assertEquals("", subject.getAddress());
+		assertEquals("", subject.getZipCode());
+		assertEquals("", subject.getCity());
+		assertEquals("", subject.getCountry());
+		assertEquals("343", subject.getPhone1());
+		assertEquals("", subject.getPhone2());
+		assertEquals("", subject.getPhone3());
+		assertEquals("", subject.getMail());
+		assertEquals("", subject.getDiagnosisYear());
+		assertEquals("", subject.getDiagnosis());
+		assertEquals("", subject.getReferal());
+		assertEquals("2015-08-03", subject.getAddDate());
+		assertEquals("ND3333", subject.getNdNumber());
+		assertEquals("", subject.getBirthDate());
+	}
+
+
+}
diff --git a/appointment-import/src/test/java/smash/appointment/parse/LihControlParserTest.java b/appointment-import/src/test/java/smash/appointment/parse/LihControlParserTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b610128ed28a8c7850ecbaacf5a5c3af64a07def
--- /dev/null
+++ b/appointment-import/src/test/java/smash/appointment/parse/LihControlParserTest.java
@@ -0,0 +1,64 @@
+package smash.appointment.parse;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LihControlParserTest extends TestBase {
+	Logger						logger		= Logger.getLogger(LihControlParserTest.class);
+
+	LihControlParser processor	= new LihControlParser();
+
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	@Before
+	public void setUp()  {
+		super.setUp();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() throws Exception {
+		List<Subject> entries = processor.processExcel("testFiles/lihControlExample.xlsx");
+		assertTrue(entries.size() > 0);
+
+		Subject subject = entries.get(0);
+		assertEquals("L-001", subject.getScreeningNumber());
+		assertEquals("Name", subject.getName());
+		assertEquals("Surname", subject.getSurname());
+		assertTrue(subject.getRemarks().contains("001 rdv 01/09/2015 9h jyf"));
+		assertTrue(subject.getRemarks().contains("PD family relation=pd info"));		
+		assertEquals("11, Rue blabla", subject.getAddress());
+		assertEquals("L-3322", subject.getZipCode());
+		assertEquals("Luxembourg", subject.getCity());
+		assertEquals("", subject.getCountry());
+		assertEquals("123456789", subject.getPhone1());
+		assertEquals("321654", subject.getPhone2());
+		assertEquals("", subject.getPhone3());
+		assertEquals("email@pt.lu", subject.getMail());
+		assertEquals("", subject.getDiagnosisYear());
+		assertEquals("", subject.getDiagnosis());
+		assertEquals("", subject.getReferal());
+		assertEquals("", subject.getAddDate());
+		assertEquals("", subject.getNdNumber());
+		assertEquals("1937-01-03", subject.getBirthDate());
+		assertTrue(subject.getRemarks().contains("some other remark"));		
+		assertTrue(subject.getRemarks().contains("at home: NMS + RFQ 1 + RFQ 2 + REM + PDSS: manque une page ds RFQ => Linda pr level b 09/09/15"));		
+		assertTrue(subject.getLanguages().contains("French"));		
+		assertTrue(subject.getLanguages().contains("German"));		
+	}
+
+
+}
diff --git a/appointment-import/testFiles/lihControlExample.xlsx b/appointment-import/testFiles/lihControlExample.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..526e749bdf8cb818d13e98b763afb22b3ec3b071
Binary files /dev/null and b/appointment-import/testFiles/lihControlExample.xlsx differ