diff --git a/CMakeLists.txt b/CMakeLists.txt
index ae7120fb9535b89c78cb098f3842c723c1a9cf65..86683865938f22106b730737cbafdbbce54690e8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,6 +32,8 @@ add_executable(validateSerials "validateSerials.cpp")
 
 add_executable(testXmlStructure "testxmlstructure.cxx")
 
+add_executable(makeProdSheet "makeProdSheet.cpp")
+
 target_link_libraries(toolbox Qt5::Network Qt5::Core Qt5::Xml proddbaccess)
 target_link_libraries(proddbaccess Qt5::Network Qt5::Core Qt5::Xml)
 
@@ -53,3 +55,5 @@ target_link_libraries(setSentForAnalysisAfterIrradiation proddbaccess proddbclie
 target_link_libraries(setIrradiationInfo proddbaccess proddbclient boost_program_options Qt5::Gui Qt5::Widgets)
 target_link_libraries(setAnnealingInfo proddbaccess proddbclient boost_program_options Qt5::Gui Qt5::Widgets)
 target_link_libraries(validateSerials proddbaccess)
+
+target_compile_features(makeProdSheet PRIVATE cxx_std_17)
diff --git a/makeProdSheet.cpp b/makeProdSheet.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ca3bef06e313c1e00b7035599597daa430ce719f
--- /dev/null
+++ b/makeProdSheet.cpp
@@ -0,0 +1,204 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+#include <filesystem>
+#include <cstdlib>
+#include <chrono>
+
+bool checkFilesExist(std::string texFileName, std::string csvFileName, std::string prodSheetPdfName){
+
+  bool oneFileExists = false;
+
+  if(std::filesystem::exists(texFileName)){
+    std::cerr << "ERROR - " << texFileName << " already exists" << std::endl;
+    oneFileExists = true;
+  }
+  if (std::filesystem::exists(csvFileName)){
+    std::cerr << "ERROR - " << csvFileName << " already exists" << std::endl;
+    oneFileExists = true;
+  }
+  if (std::filesystem::exists(prodSheetPdfName)){
+    std::cerr << "ERROR - " << prodSheetPdfName << " already exists" << std::endl;
+    oneFileExists = true;
+  }
+
+  return oneFileExists;
+}
+
+bool makeTexFile(std::vector<std::string> serialList, std::string texFileName){
+
+  std::fstream serialTexFile;
+  serialTexFile.open(texFileName, std::fstream::out);
+  if(serialTexFile.is_open()){
+    serialTexFile << "\\newcommand{\\serialZeroR}{" << serialList[0] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialZeroB}{" << serialList[8] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialOneR}{" << serialList[1] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialOneB}{" << serialList[9] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialTwoR}{" << serialList[16] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialTwoB}{" << serialList[24] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialThreeR}{" << serialList[17] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialThreeB}{" << serialList[25] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFourR}{" << serialList[2] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFourB}{" << serialList[10] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFiveR}{" << serialList[3] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFiveB}{" << serialList[11] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSixR}{" << serialList[18] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSixB}{" << serialList[26] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSevenR}{" << serialList[19] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSevenB}{" << serialList[27] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialEightR}{" << serialList[4] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialEightB}{" << serialList[12] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialNineR}{" << serialList[5] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialNineB}{" << serialList[13] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialAR}{" << serialList[20] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialAB}{" << serialList[28] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialBR}{" << serialList[21] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialBB}{" << serialList[29] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialCR}{" << serialList[6] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialCB}{" << serialList[14] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialDR}{" << serialList[7] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialDB}{" << serialList[15] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialER}{" << serialList[22] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialEB}{" << serialList[30] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFR}{" << serialList[23] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFB}{" << serialList[31] << "}" << std::endl;
+    /*
+    serialTexFile << "\\newcommand{\\serialZeroR}{" << serialList[0] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialZeroB}{" << serialList[1] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialOneR}{" << serialList[2] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialOneB}{" << serialList[3] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialTwoR}{" << serialList[4] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialTwoB}{" << serialList[5] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialThreeR}{" << serialList[6] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialThreeB}{" << serialList[7] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFourR}{" << serialList[8] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFourB}{" << serialList[9] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFiveR}{" << serialList[10] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFiveB}{" << serialList[11] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSixR}{" << serialList[12] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSixB}{" << serialList[13] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSevenR}{" << serialList[14] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialSevenB}{" << serialList[15] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialEightR}{" << serialList[16] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialEightB}{" << serialList[17] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialNineR}{" << serialList[18] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialNineB}{" << serialList[19] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialAR}{" << serialList[20] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialAB}{" << serialList[21] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialBR}{" << serialList[22] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialBB}{" << serialList[23] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialCR}{" << serialList[24] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialCB}{" << serialList[25] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialDR}{" << serialList[26] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialDB}{" << serialList[27] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialEB}{" << serialList[29] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialER}{" << serialList[28] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFR}{" << serialList[30] << "}" << std::endl;
+    serialTexFile << "\\newcommand{\\serialFB}{" << serialList[31] << "}" << std::endl;
+    */
+  } else {
+    std::cerr << "ERROR - couldnt open tex-file" << std::endl;
+    return false;
+  }
+  return true;
+}
+
+bool makeCsvFile(std::vector<std::string> serialList, std::string csvFileName){
+
+  std::fstream serialCsvFile;
+  serialCsvFile.open(csvFileName, std::fstream::out);
+  if(serialCsvFile.is_open()){
+    serialCsvFile << serialList[0] << " " << serialList[8] << std::endl;
+    serialCsvFile << serialList[1] << " " << serialList[9] << std::endl;
+    serialCsvFile << serialList[16] << " " << serialList[24] << std::endl;
+    serialCsvFile << serialList[17] << " " << serialList[25] << std::endl;
+    serialCsvFile << serialList[2] << " " << serialList[10] << std::endl;
+    serialCsvFile << serialList[3] << " " << serialList[11] << std::endl;
+    serialCsvFile << serialList[18] << " " << serialList[26] << std::endl;
+    serialCsvFile << serialList[19] << " " << serialList[27] << std::endl;
+    serialCsvFile << serialList[4] << " " << serialList[12] << std::endl;
+    serialCsvFile << serialList[5] << " " << serialList[13] << std::endl;
+    serialCsvFile << serialList[20] << " " << serialList[28] << std::endl;
+    serialCsvFile << serialList[21] << " " << serialList[29] << std::endl;
+    serialCsvFile << serialList[6] << " " << serialList[14] << std::endl;
+    serialCsvFile << serialList[7] << " " << serialList[15] << std::endl;
+    serialCsvFile << serialList[22] << " " << serialList[30] << std::endl;
+    serialCsvFile << serialList[23] << " " << serialList[31] << std::endl;
+    /*
+    for (int i=0; i < serialList.size()-1; i+=2){
+      serialCsvFile << serialList[i] << " " << serialList[i+1] << std::endl;
+    }
+    */
+  } else {
+    std::cerr << "ERROR - couldnt open csv-file" << std::endl;
+    return false;
+  }
+  return true;
+}
+
+bool makePdfFile(std::string prodSheetPdfName){
+  //std::system("cp /home/orestis/Dokumente/Laufzettel/headerProductionSheet.tex .");
+  std::system("cp /home/tau/oafedulidis/APDStuff/makeProdSheet/tex/headerProductionSheet.tex .");
+  //std::system("cp /home/orestis/Dokumente/Laufzettel/productionSheet.tex .");
+  std::system("cp /home/tau/oafedulidis/APDStuff/makeProdSheet/tex/productionSheet.tex .");
+  std::system("pdflatex productionSheet.tex > /dev/null");
+  if(std::filesystem::exists(prodSheetPdfName)){
+    std::system("rm productionSheet.log productionSheet.aux productionSheet.tex serialsAssigned.tex headerProductionSheet.tex");
+    return true;
+  }
+  else {
+    return false;
+  }
+}
+
+int main(){
+
+  std::string serialFileName = "serials.dat";
+  std::string csvFileName = "apd_assignments_on_alveole.csv";
+  std::string texFileName = "serialsAssigned.tex";
+  std::string prodSheetPdfName = "productionSheet.pdf";
+
+  std::string lineBuffer;
+  std::vector<std::string> serialList;
+  serialList.clear();
+
+  std::fstream serialFile;
+  serialFile.open(serialFileName, std::fstream::in);
+  if(serialFile.is_open()){
+    while(std::getline(serialFile, lineBuffer)){
+      if(lineBuffer.size() == 9) lineBuffer = "0" + lineBuffer;
+      if(lineBuffer.size() == 10) serialList.push_back(lineBuffer);
+    }
+    serialFile.close();
+  } else {
+    std::cerr << "ERROR - could not open File: " << serialFileName << std::endl;
+    return 1;
+  }
+
+  if(serialList.size() == 32){
+    std::cout << "found " << serialList.size() << " serials" << std::endl;
+    std::cout << "creating tex-file for production sheet" << std::endl;
+    std::cout << "creating csv-file for APD serials where Crystals and Barcodes needs to be added" << std::endl;
+    if(!checkFilesExist(texFileName, csvFileName, prodSheetPdfName)){
+      if(!makeTexFile(serialList, texFileName)) return 1;
+      if(!makeCsvFile(serialList, csvFileName)) return 1;
+    } else {
+      return 1;
+    }
+  } else {
+    std::cerr << "ERROR - unexpected amount of serials, expected 32 but got " << serialList.size();
+    return 1;
+  }
+  std::cout << "serialsAssigned.tex and apd_assignments_on_alveole.csv created" << std::endl;
+  std::cout << "know executing pdflatex to compile productionSheet.pdf" << std::endl;
+
+  if(makePdfFile(prodSheetPdfName)){
+    std::cout << "productionSheet.pdf created and cleared output" << std::endl;
+  } else {
+    std::cout << "could not create productionSheet.pdf" << std::endl;
+    return 1;
+  }
+
+  return 0;
+}
diff --git a/toolbox.cpp b/toolbox.cpp
index 88fd14da7dfbb8974a88314f27141745d0b758b0..9de3c3f9de43d8a3afe5ad959ae3266d65662108 100644
--- a/toolbox.cpp
+++ b/toolbox.cpp
@@ -2,6 +2,7 @@
 #include <iostream>
 #include <string>
 #include <vector>
+#include <algorithm>
 
 #include "ProdDbAccess.h"
 #include "BulkDbAccess.h"
@@ -22,6 +23,10 @@ vector<string> loadSerialsFromFileName(string m_fileName, bool m_debug = false)
     while (in.good()) {
         getline(in,line);
         if (line.length() == 0 || !isdigit(line[0])) continue;
+        line.erase(std::remove_if(line.begin(), line.end(), [](char c) {return !std::isdigit(c); }), line.end());
+        while (line.length() < 10) {
+            line = "0" + line;
+        }
         result.push_back(line);
         if (m_debug) cout << "Found serial: " << line << endl;
     }
@@ -38,7 +43,7 @@ AbsDbAccess *suitedDbAccess(size_t nAPDs, bool debug = false) {
   }
   else {
     if (debug)
-      std::cout << "Initializing BulkDbAccess which becomes efficient for many queries. Patience, this might take a minute...";
+      std::cout << "Initializing ProdDbAccess, since only a few APDs are being queried...";
     result = new ProdDbAccess();
   }
   return result;