diff --git a/src/server/server.pro b/src/server/server.pro
index dc1cc8f..eaf92c0 100644
--- a/src/server/server.pro
+++ b/src/server/server.pro
@@ -10,9 +10,10 @@ VERSION = $$(TIMED_VERSION)
 INCLUDEPATH += ../h
 
 QMAKE_LIBDIR_FLAGS += -L../lib -L../voland
-LIBS += -ltimed-qt5 -ltimed-voland-qt5
+LIBS += -ltimed-qt5 -ltimed-voland-qt5 -liodata-qt5
 
-IODATA_TYPES = queue.type config.type settings.type customization.type tzdata.type
+typeinfo.files = queue.type config.type settings.type customization.type tzdata.type
+typeinfo.path = $$(DESTDIR)/usr/share/timed/typeinfo
 
 CONFIG(dsme_dbus_if) {
     SOURCES += dsme-mode.cpp
@@ -103,7 +104,7 @@ systemd.files = timed-qt5.service
 oneshot.path = $$(DESTDIR)/usr/lib/oneshot.d
 oneshot.files = setcaps-timed-qt5.sh
 
-INSTALLS += target xml timedrc dbusconf systemd oneshot
+INSTALLS += target xml timedrc dbusconf systemd oneshot typeinfo
 
 QMAKE_CXXFLAGS  += -Wall
 
diff --git a/src/server/timed.cpp b/src/server/timed.cpp
index 80b950a..2c535e9 100644
--- a/src/server/timed.cpp
+++ b/src/server/timed.cpp
@@ -39,11 +39,6 @@
 
 #include "../voland/interface.h"
 
-#include "queue.type.h"
-#include "config.type.h"
-#include "customization.type.h"
-#include "settings.type.h"
-
 #if HAVE_DSME
 #include "interfaces.h"
 #endif
@@ -251,7 +246,7 @@ void Timed::init_configuration()
   const char *input_path = configuration_path();
   iodata::storage *config_storage = new iodata::storage ;
   config_storage->set_primary_path(input_path) ;
-  config_storage->set_validator(etc_timed_rc_validator(), "config_t") ;
+  config_storage->set_validator(configuration_type(), "config_t") ;
 
   /* Because config_storage->load() also sets up the default values, we
    * must call it even if we know that the input file is not present ... */
@@ -319,7 +314,7 @@ void Timed::init_customization()
   const char *input_path = customization_path();
   iodata::storage *storage = new iodata::storage ;
   storage->set_primary_path(input_path) ;
-  storage->set_validator(customization_data_validator(), "customization_t") ;
+  storage->set_validator(customization_type(), "customization_t") ;
 
   /* Because config_storage->load() also sets up the default values, we
    * must call it even if we know that the input file is not present ... */
@@ -433,7 +428,7 @@ void Timed::init_read_settings()
   shared_settings_storage = new iodata::storage;
   shared_settings_storage->set_primary_path(shared_settings_path.toStdString());
   shared_settings_storage->set_secondary_path(shared_settings_path.toStdString() + ".bak");
-  shared_settings_storage->set_validator(settings_data_validator(), "settings_t");
+  shared_settings_storage->set_validator(settings_file_type(), "settings_t");
 
   /* If possible, read shared settings file */
   if (access(qUtf8Printable(shared_settings_path), R_OK) == 0
@@ -451,7 +446,7 @@ void Timed::init_read_settings()
     /* Private data has been migrated / is otherwise unreadable */
     private_settings_storage->set_primary_path("/dev/null");
   }
-  private_settings_storage->set_validator(settings_data_validator(), "settings_t");
+  private_settings_storage->set_validator(settings_file_type(), "settings_t");
 
   /* If reading shared settings file failed, read private / dummy data */
   if (!tree) {
@@ -571,7 +566,7 @@ void Timed::init_load_events()
   shared_event_storage = new iodata::storage;
   shared_event_storage->set_primary_path(shared_events_path.toStdString());
   shared_event_storage->set_secondary_path(shared_events_path.toStdString() + ".bak");
-  shared_event_storage->set_validator(events_data_validator(), "event_queue_t");
+  shared_event_storage->set_validator(event_queue_type(), "event_queue_t");
 
   if (permissions_shared_events()) {
     iodata::record *events = shared_event_storage->load();
@@ -584,7 +579,7 @@ void Timed::init_load_events()
   private_event_storage = new iodata::storage;
   private_event_storage->set_primary_path(private_events_path.toStdString());
   private_event_storage->set_secondary_path(private_events_path.toStdString() + ".bak");
-  private_event_storage->set_validator(events_data_validator(), "event_queue_t");
+  private_event_storage->set_validator(event_queue_type(), "event_queue_t");
 
   if (permissions_private_events()) {
     iodata::record *events = private_event_storage->load();
diff --git a/src/server/timed.h b/src/server/timed.h
index 7a65592..71200fb 100644
--- a/src/server/timed.h
+++ b/src/server/timed.h
@@ -56,14 +56,14 @@ struct Timed : public QCoreApplication
 {
 public:
   inline const char *configuration_path() { return  "/etc/timed-qt5.rc" ; }
-  // inline const char *configuration_type() { return  "/usr/share/timed/typeinfo/config.type" ; }
+  inline const char *configuration_type() { return  "/usr/share/timed/typeinfo/config.type" ; }
 
   inline const char *customization_path() { return  "/usr/share/timed/customization.data" ; } // TODO: make it configurable
-  // inline const char *customization_type() { return  "/usr/share/timed/typeinfo/customization.type" ; }
+  inline const char *customization_type() { return  "/usr/share/timed/typeinfo/customization.type" ; }
 
-  // inline const char *settings_file_type() { return  "/usr/share/timed/typeinfo/settings.type" ; }
+  inline const char *settings_file_type() { return  "/usr/share/timed/typeinfo/settings.type" ; }
 
-  // inline const char *event_queue_type() { return  "/usr/share/timed/typeinfo/queue.type" ; }
+  inline const char *event_queue_type() { return  "/usr/share/timed/typeinfo/queue.type" ; }
 
 private:
   bool format24_by_default ;
diff --git a/src/server/tzdata.cpp b/src/server/tzdata.cpp
index e911bca..51b33cc 100644
--- a/src/server/tzdata.cpp
+++ b/src/server/tzdata.cpp
@@ -140,13 +140,13 @@ string tzdata::set_str(const set<olson*> &x)
 
 // --- initialization ---
 
-#include "tzdata.type.h"
+static iodata::validator *tzdata_validator = iodata::validator::from_file("/usr/share/timed/typeinfo/tzdata.type") ;
 
 static iodata::record *open_database(const char *path, const char *type)
 {
   log_notice("opening file '%s', reading record of type '%s'", path, type) ;
   iodata::storage file ;
-  file.set_validator(tzdata_validator(), type) ;
+  file.set_validator(tzdata_validator, type) ;
   file.set_primary_path(path) ;
   if (iodata::record *res = file.load())
     return res ;
