diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp
index e0fe3b9..bb7955d 100644
--- a/src/base_tab/gamebase/PGNGameBase.cpp
+++ b/src/base_tab/gamebase/PGNGameBase.cpp
@@ -81,7 +81,7 @@ void PGNGameBase::Save(std::vector<std::uint32_t> to_ignore,
         several = true;
       }
       std::shared_ptr<Game> g = GetCurrentGame();
-      new_pgn.Write(g->GetPGN());
+      new_pgn.Write(GetPGN(g));
     }
     id++;
   }
@@ -96,7 +96,7 @@ void PGNGameBase::Save(std::vector<std::uint32_t> to_ignore,
         several = true;
       }
       std::shared_ptr<Game> g = current->GetCurrentGame();
-      new_pgn.Write(g->GetPGN());
+      new_pgn.Write(GetPGN(g));
     }
   }
 
@@ -106,7 +106,7 @@ void PGNGameBase::Save(std::vector<std::uint32_t> to_ignore,
     } else {
       several = true;
     }
-    new_pgn.Write(g->GetPGN());
+    new_pgn.Write(GetPGN(g));
   }
 
   new_pgn.Close();
@@ -126,8 +126,56 @@ void PGNGameBase::Export(std::shared_ptr<GameBase> base) {
       several = true;
     }
     std::shared_ptr<Game> g = base->GetCurrentGame();
-    new_pgn.Write(g->GetPGN());
+    new_pgn.Write(GetPGN(g));
   }
 
   new_pgn.Close();
 }
+
+std::string PGNGameBase::GetPGN(std::shared_ptr<Game> g) {
+  std::string pgn;
+  HalfMove *m=g->GetMoves();
+
+  for (auto const &element : g->ListTags()) {
+    pgn += '[' + element + " \"" + g->GetTag(element) + "\"]\n";
+  }
+  pgn += GetMovesPGN(m,m->IsABlackMove());
+
+  pgn += " " + g->GetResult();
+  return (pgn);
+}
+
+std::string PGNGameBase::GetMovesPGN(HalfMove *m, bool needDots) {
+  std::string part;
+  bool newNeedDots = false;
+
+  if (!m->IsABlackMove() || needDots) {
+    part += std::to_string(m->Number) + ".";
+    if (needDots) {
+      part += "..";
+    }
+  }
+  part += m->move;
+
+  if (m->GetNbLineComment() > 0) {
+    part += " {";
+    part += m->GetComment();
+    part += "}";
+    newNeedDots = true;
+  }
+
+  if (m->GetVariations().size() > 0) {
+    newNeedDots = true;
+    for (HalfMove *v : m->GetVariations()) {
+      part += " (";
+      part += GetMovesPGN(v, m->IsABlackMove());
+      part += ")";
+    }
+  }
+
+  if (m->GetMainline() != NULL) {
+    part += " " + GetMovesPGN(m->GetMainline(), !m->IsABlackMove() && newNeedDots);
+  }
+
+  return (part);
+}
\ No newline at end of file
diff --git a/src/base_tab/gamebase/PGNGameBase.hpp b/src/base_tab/gamebase/PGNGameBase.hpp
index 507a29a..ee1c99b 100644
--- a/src/base_tab/gamebase/PGNGameBase.hpp
+++ b/src/base_tab/gamebase/PGNGameBase.hpp
@@ -18,4 +18,6 @@ public:
             std::vector<std::shared_ptr<Game>> new_games);
   void Reset();
   void Export(std::shared_ptr<GameBase> base);
+  static std::string GetMovesPGN(HalfMove *m, bool needDots);
+  static std::string GetPGN(std::shared_ptr<Game> g);
 };
\ No newline at end of file
diff --git a/src/game_tab/Game.cpp b/src/game_tab/Game.cpp
index 8b52ca6..1bc1e4c 100644
--- a/src/game_tab/Game.cpp
+++ b/src/game_tab/Game.cpp
@@ -99,7 +99,6 @@ bool Game::Play(std::string move) {
     if (moves == NULL) {
       moves = m;
     }
-    wxLogDebug("%s", GetPGN());
     return (true);
   }
   return (false);
@@ -139,17 +138,7 @@ std::string Game::GetFen() {
   return (current->GetFen());
 }
 
-std::string Game::GetPGN() {
-  std::string pgn;
-  if (moves != NULL) {
-    for (auto const &element : tags) {
-      pgn += '[' + element.first + " \"" + element.second + "\"]\n";
-    }
-    pgn += moves->GetPGN();
-  }
-  pgn += " " + result;
-  return (pgn);
-}
+std::string Game::GetResult() { return (result); }
 
 void Game::SetResult(std::string result) { this->result = result; }
 
diff --git a/src/game_tab/Game.hpp b/src/game_tab/Game.hpp
index f0414c8..f70ebee 100644
--- a/src/game_tab/Game.hpp
+++ b/src/game_tab/Game.hpp
@@ -26,6 +26,7 @@ public:
   HalfMove *GetCurrentMove();
   HalfMove *GetMoves();
   std::string GetFen();
+  std::string GetResult();
   bool Play(std::string move);
   bool IsBlackToPlay();
   void Previous();
@@ -35,7 +36,6 @@ public:
   void SetMoveAsMainline(HalfMove *m);
   void SetCurrent(HalfMove *m);
   std::vector<std::string> ListTags();
-  std::string GetPGN();
   void SetResult(std::string result);
   /**
    * @brief Build current game
diff --git a/src/game_tab/HalfMove.cpp b/src/game_tab/HalfMove.cpp
index 0aa957e..0472b7c 100644
--- a/src/game_tab/HalfMove.cpp
+++ b/src/game_tab/HalfMove.cpp
@@ -172,42 +172,9 @@ bool HalfMove::IsVariation() {
 
 std::string HalfMove::GetFen() { return (fen); }
 
-std::string HalfMove::GetPGN() { return (GetPGN(IsBlack)); }
+std::vector<HalfMove *> HalfMove::GetVariations() { return (variations); }
 
-std::string HalfMove::GetPGN(bool needDots) {
-  std::string part;
-  bool newNeedDots = false;
-
-  if (!IsBlack || needDots) {
-    part += std::to_string(Number) + ".";
-    if (needDots) {
-      part += "..";
-    }
-  }
-  part += move;
-
-  if (GetNbLineComment() > 0) {
-    part += " {";
-    part += GetComment();
-    part += "}";
-    newNeedDots = true;
-  }
-
-  if (variations.size() > 0) {
-    newNeedDots = true;
-    for (HalfMove *v : variations) {
-      part += " (";
-      part += v->GetPGN(IsBlack);
-      part += ")";
-    }
-  }
-
-  if (mainline != NULL) {
-    part += " " + mainline->GetPGN(!IsBlack && newNeedDots);
-  }
-
-  return (part);
-}
+bool HalfMove::IsABlackMove() { return (IsBlack); }
 
 void HalfMove::BuildAndVerify(HalfMove *m, std::string fen) {
   arbiter.Setup(fen);
diff --git a/src/game_tab/HalfMove.hpp b/src/game_tab/HalfMove.hpp
index 51b38a0..6ea0c5a 100644
--- a/src/game_tab/HalfMove.hpp
+++ b/src/game_tab/HalfMove.hpp
@@ -20,7 +20,6 @@ class HalfMove : public cgeditor::CGEHalfMove {
   std::vector<HalfMove *> variations;
   std::string fen;
   char capture;
-  std::string GetPGN(bool needDots);
   void BuildAndVerify(HalfMove *m, std::string fen);
 
 public:
@@ -47,6 +46,8 @@ public:
   /// @brief Get parent of the current move
   HalfMove *GetParent();
   HalfMove *GetMainline();
+  std::vector<HalfMove *> GetVariations();
+
   std::map<char, std::uint8_t> GetLineCaptures();
 
   /// @brief Set parent of the current move
@@ -54,7 +55,7 @@ public:
   std::string GetFen();
   void SetFen(std::string fen);
   void SetCapture(char c);
-  std::string GetPGN();
+  bool IsABlackMove();
 
   /**
    * @brief Build current move