diff --git a/inc/sys.hpp b/inc/sys.hpp
index 3b92217..5317ee5 100644
--- a/inc/sys.hpp
+++ b/inc/sys.hpp
@@ -3,7 +3,7 @@
 namespace sys
 {
   const char *transformFilePath(const char *filename);
-  size_t saveDataToFile(const char *filename, const char *data, size_t size);
-  size_t loadDataFromFile(const char *filename, char *data, size_t size);
+  size_t saveDataToFile(const char *filename, void *data, size_t size);
+  size_t loadDataFromFile(const char *filename, void *data, size_t size);
   bool fileExists(const char *filename);
 }
\ No newline at end of file
diff --git a/inc/values/DnaManager.hpp b/inc/values/DnaManager.hpp
index 230720c..c6a1c16 100644
--- a/inc/values/DnaManager.hpp
+++ b/inc/values/DnaManager.hpp
@@ -16,6 +16,7 @@ struct Unit
 {
   Dna *dna;
   Liked liked;
+  int index;
 };
 
 class DnaManager
@@ -25,13 +26,14 @@ public:
   void deinit();
   Unit next();
   void like(Unit unit);
+  int generation;
 
 private:
   uint128 randSeed;
   uint128 id;
+  int queued;
+  int showed;
   std::vector<Dna> vector;
-  std::list<int> queued;
-  std::list<int> showed;
   std::vector<int> liked;
   std::vector<int> disliked;
 
diff --git a/src/App.cpp b/src/App.cpp
index 6437890..1f160e5 100644
--- a/src/App.cpp
+++ b/src/App.cpp
@@ -15,8 +15,7 @@ void App::init(int screenWidth, int screenHeight)
 
   canvasTexure = LoadRenderTexture(screenWidth, screenWidth);
   manager.init();
-  unit = manager.next();
-  canvas.newGen(canvasTexure, unit.dna);
+  upTex(Liked::tbd);
   float posY = (screenHeight - screenWidth) / 2.0f;
   float recPosX = screenWidth * 0.2f;
   dest = {0, posY, (float)screenWidth, (float)screenWidth};
@@ -26,8 +25,11 @@ void App::init(int screenWidth, int screenHeight)
 
 void App::upTex(Liked liked)
 {
-  unit.liked = liked;
-  manager.like(unit);
+  if (liked != Liked::tbd)
+  {
+    unit.liked = liked;
+    manager.like(unit);
+  }
   unit = manager.next();
   if (unit.dna != nullptr)
   {
@@ -65,6 +67,9 @@ void App::draw()
   Rectangle source = {0, 0, (float)canvasTexure.texture.width, (float)-canvasTexure.texture.height};
   Vector2 origin = {0.0f, 0.0f};
   DrawTexturePro(canvasTexure.texture, source, dest, origin, 0.0f, WHITE);
+
+  const char *text = TextFormat("GEN %d: %d / %d", manager.generation, unit.index + 1, NUM_PER_GEN);
+  DrawText(text, dest.x + 10, dest.y - 30, 20, BLACK);
 }
 
 void App::deinit()
diff --git a/src/sys.cpp b/src/sys.cpp
index e7d7764..c64c61f 100644
--- a/src/sys.cpp
+++ b/src/sys.cpp
@@ -20,7 +20,7 @@ namespace sys
 #endif
   }
 
-  size_t saveDataToFile(const char *filename, const char *data, size_t size)
+  size_t saveDataToFile(const char *filename, void *data, size_t size)
   {
     const char *saveFilePath = transformFilePath(filename);
 
@@ -34,7 +34,7 @@ namespace sys
     return ret;
   }
 
-  size_t loadDataFromFile(const char *filename, char *data, size_t size)
+  size_t loadDataFromFile(const char *filename, void *data, size_t size)
   {
     const char *saveFilePath = transformFilePath(filename);
 
diff --git a/src/values/DnaManager.cpp b/src/values/DnaManager.cpp
index d2e9370..5c149d6 100644
--- a/src/values/DnaManager.cpp
+++ b/src/values/DnaManager.cpp
@@ -11,12 +11,12 @@ void DnaManager::init()
 {
   if (sys::fileExists("id"))
   {
-    sys::loadDataFromFile("id", (char *)&id, sizeof(uint128));
+    sys::loadDataFromFile("id", &id, sizeof(uint128));
   }
   else
   {
     id = mrand::getState(time(nullptr));
-    sys::saveDataToFile("id", (const char *)&id, sizeof(uint128));
+    sys::saveDataToFile("id", &id, sizeof(uint128));
   }
 
   if (sys::fileExists("data"))
@@ -28,17 +28,45 @@ void DnaManager::init()
       return;
 
     fread(&randSeed, 1, sizeof(uint128), file);
+    fread(&generation, 1, sizeof(int), file);
+    fread(&showed, 1, sizeof(showed), file);
+    queued = showed;
+    int size, tmp;
+
+    fread(&size, sizeof(size), 1, file);
+    for (int i = 0; i < size; i++)
+    {
+      fread(&tmp, sizeof(tmp), 1, file);
+      liked.push_back(tmp);
+    }
+
+    fread(&size, sizeof(size), 1, file);
+    for (int i = 0; i < size; i++)
+    {
+      fread(&tmp, sizeof(tmp), 1, file);
+      disliked.push_back(tmp);
+    }
     fclose(file);
   }
   else
   {
     randSeed = id;
+    queued = 0;
+    showed = 0;
+    generation = 0;
   }
+
   vector.resize(NUM_PER_GEN);
-  for (std::size_t i = 0; i < NUM_PER_GEN; i++)
+  if (sys::fileExists("array"))
   {
-    DNA::newDna(&vector[i], &randSeed);
-    queued.push_back(i);
+    sys::loadDataFromFile("array", vector.data(), sizeof(Dna) * NUM_PER_GEN);
+  }
+  else
+  {
+    for (std::size_t i = 0; i < NUM_PER_GEN; i++)
+    {
+      DNA::newDna(&vector[i], &randSeed);
+    }
   }
 }
 
@@ -50,25 +78,42 @@ void DnaManager::deinit()
   if (file == NULL)
     return;
   fwrite(&randSeed, 1, sizeof(uint128), file);
+  fwrite(&generation, 1, sizeof(int), file);
+  fwrite(&showed, 1, sizeof(showed), file);
+
+  int tmp;
+  tmp = liked.size();
+  fwrite(&tmp, sizeof(tmp), 1, file);
+  fwrite(liked.data(), sizeof(int) * tmp, 1, file);
+
+  tmp = disliked.size();
+
+  fwrite(&tmp, sizeof(tmp), 1, file);
+  fwrite(disliked.data(), sizeof(tmp) * tmp, 1, file);
+
+  fclose(file);
+
+  filename = sys::transformFilePath("array");
+  file = fopen(filename, "wb");
+  if (file == NULL)
+    return;
+  fwrite(vector.data(), sizeof(Dna) * NUM_PER_GEN, 1, file);
   fclose(file);
 }
 
 Unit DnaManager::next()
 {
-  int index = queued.front();
-  queued.pop_front();
-  showed.push_back(index);
-  Dna *ret = &vector[index];
-  return {ret, Liked::tbd};
+  Dna *ret = &vector[queued];
+  int index = queued++;
+  return {ret, Liked::tbd, index};
 }
 
 void DnaManager::like(Unit unit)
 {
   int found = -1;
-  for (auto &&i : showed)
+  if (unit.index == showed)
   {
-    if (&vector[i] == unit.dna)
-      found = i;
+    found = showed;
   }
 
   if (found == -1)
@@ -90,11 +135,14 @@ void DnaManager::like(Unit unit)
     return;
   }
 
-  showed.remove(found);
+  showed++;
 
-  if (showed.size() == 0 && queued.size() == 0)
+  if (showed == NUM_PER_GEN && queued == NUM_PER_GEN)
   {
     newGen();
+    queued = 0;
+    showed = 0;
+    generation += 1;
   }
 }
 
@@ -105,7 +153,6 @@ void DnaManager::newGen()
     for (std::size_t i = 0; i < NUM_PER_GEN; i++)
     {
       DNA::newDna(&vector[i], &randSeed);
-      queued.push_back(i);
     }
     disliked.clear();
     return;
@@ -148,6 +195,5 @@ void DnaManager::newGen()
   for (size_t i = 0; i < NUM_PER_GEN; i++)
   {
     DNA::mutate(&vector[i], NUM_OF_MUT, &randSeed);
-    queued.push_back(i);
   }
 }
\ No newline at end of file