diff --git a/tests/conftest.py b/tests/conftest.py
index 072c74d7d219431e30d2c17a1ef6154690b52bb3..d1bb084c86ba85ea505e434da1896422e586309e 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -48,7 +48,7 @@ def training_config():
     return {
         "dataset_params": {
             "datasets": {
-                "training": "./tests/data/training_page",
+                "training": "./tests/data/training/training_dataset",
             },
             "train": {
                 "name": "training-train",
@@ -165,3 +165,8 @@ def training_config():
             },
         },
     }
+
+
+@pytest.fixture
+def prediction_data_path():
+    return FIXTURES / "prediction"
diff --git a/tests/data/evaluation/predict_training-test_0.txt b/tests/data/evaluation/predict_training-test_0.txt
deleted file mode 100644
index e7ba36931357cdf46eff450b85875af134ffbe46..0000000000000000000000000000000000000000
--- a/tests/data/evaluation/predict_training-test_0.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-nb_chars: 49
-cer: 1.1429
-nb_words: 9
-wer: 1.0
-nb_words_no_punct: 9
-wer_no_punct: 1.0
-sample_time: 0.8385
-time: 1.6771
-nb_samples: 2
diff --git a/tests/data/evaluation/predict_training-train_0.txt b/tests/data/evaluation/predict_training-train_0.txt
deleted file mode 100644
index 4cd86dfacf9792c25b330f4c3ff76575a31d6c3d..0000000000000000000000000000000000000000
--- a/tests/data/evaluation/predict_training-train_0.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-nb_chars: 43
-cer: 1.2791
-nb_words: 9
-wer: 1.0
-nb_words_no_punct: 9
-wer_no_punct: 1.0
-sample_time: 0.8334
-time: 1.6668
-nb_samples: 2
diff --git a/tests/data/evaluation/predict_training-val_0.txt b/tests/data/evaluation/predict_training-val_0.txt
deleted file mode 100644
index d4aea2c8c3d2182de4f6dde6172622ffc39b941c..0000000000000000000000000000000000000000
--- a/tests/data/evaluation/predict_training-val_0.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-nb_chars: 41
-cer: 1.2683
-nb_words: 9
-wer: 1.0
-nb_words_no_punct: 9
-wer_no_punct: 1.0
-sample_time: 0.8314
-time: 1.6628
-nb_samples: 2
diff --git a/tests/data/training_page/charset.pkl b/tests/data/prediction/charset.pkl
similarity index 100%
rename from tests/data/training_page/charset.pkl
rename to tests/data/prediction/charset.pkl
diff --git a/tests/data/prediction/images/0a56e8b3-95cd-4fa5-a17b-5b0ff9e6ea84.png b/tests/data/prediction/images/0a56e8b3-95cd-4fa5-a17b-5b0ff9e6ea84.png
new file mode 100644
index 0000000000000000000000000000000000000000..c781ad2cedbfef480cc294aab2c8ddd067d832de
Binary files /dev/null and b/tests/data/prediction/images/0a56e8b3-95cd-4fa5-a17b-5b0ff9e6ea84.png differ
diff --git a/tests/data/prediction/images/0dfe8bcd-ed0b-453e-bf19-cc697012296e.png b/tests/data/prediction/images/0dfe8bcd-ed0b-453e-bf19-cc697012296e.png
new file mode 100644
index 0000000000000000000000000000000000000000..8af4906cc9b4c4afb76903d2db87ae535ffbf0f9
Binary files /dev/null and b/tests/data/prediction/images/0dfe8bcd-ed0b-453e-bf19-cc697012296e.png differ
diff --git a/tests/data/prediction/images/2c242f5c-e979-43c4-b6f2-a6d4815b651d.png b/tests/data/prediction/images/2c242f5c-e979-43c4-b6f2-a6d4815b651d.png
new file mode 100644
index 0000000000000000000000000000000000000000..b301683f1aabedad3c2972ed1f1e05bd982c575b
Binary files /dev/null and b/tests/data/prediction/images/2c242f5c-e979-43c4-b6f2-a6d4815b651d.png differ
diff --git a/tests/data/prediction/images/ffdec445-7f14-4f5f-be44-68d0844d0df1.png b/tests/data/prediction/images/ffdec445-7f14-4f5f-be44-68d0844d0df1.png
new file mode 100644
index 0000000000000000000000000000000000000000..39c44016781cd0dca5ea76526a65be89c13a272c
Binary files /dev/null and b/tests/data/prediction/images/ffdec445-7f14-4f5f-be44-68d0844d0df1.png differ
diff --git a/tests/data/prediction/parameters.yml b/tests/data/prediction/parameters.yml
new file mode 100644
index 0000000000000000000000000000000000000000..76f665e2b0354dfbdf3122e0482439703fdc82da
--- /dev/null
+++ b/tests/data/prediction/parameters.yml
@@ -0,0 +1,24 @@
+---
+version: 0.0.1
+parameters:
+  mean: [166.8418783515498, 166.8418783515498, 166.8418783515498]
+  std: [34.084189571536385, 34.084189571536385, 34.084189571536385]
+  max_char_prediction: 200
+  encoder:
+    input_channels: 3
+    dropout: 0.5
+  decoder:
+    enc_dim: 256
+    l_max: 15000
+    dec_pred_dropout: 0.1
+    attention_win: 100
+    use_1d_pe: True
+    use_lstm: False
+    vocab_size: 96
+    h_max: 500
+    w_max: 1000
+    dec_num_layers: 8
+    dec_dim_feedforward: 256
+    dec_num_heads: 4
+    dec_att_dropout: 0.1
+    dec_res_dropout: 0.1
diff --git a/tests/data/prediction/popp_line_model.pt b/tests/data/prediction/popp_line_model.pt
new file mode 100644
index 0000000000000000000000000000000000000000..67b9565aee8a50f9d9b73fed2deb7e452d3828fb
--- /dev/null
+++ b/tests/data/prediction/popp_line_model.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:072302b3c54aa6e9a3afb06cf45c2a8e97e20d300854bfacd585cba61282e252
+size 84723223
diff --git a/tests/data/training/best_0.pt b/tests/data/training/models/best_0.pt
similarity index 100%
rename from tests/data/training/best_0.pt
rename to tests/data/training/models/best_0.pt
diff --git a/tests/data/training/last_3.pt b/tests/data/training/models/last_3.pt
similarity index 100%
rename from tests/data/training/last_3.pt
rename to tests/data/training/models/last_3.pt
diff --git a/tests/data/training/training_dataset/charset.pkl b/tests/data/training/training_dataset/charset.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..3626a2bcb8870b2d0151df06dc30c57089183d9f
Binary files /dev/null and b/tests/data/training/training_dataset/charset.pkl differ
diff --git a/tests/data/training_page/images/0a34e13a-4ab0-4a91-8d7c-b1d8fee32628.png b/tests/data/training/training_dataset/images/0a34e13a-4ab0-4a91-8d7c-b1d8fee32628.png
similarity index 100%
rename from tests/data/training_page/images/0a34e13a-4ab0-4a91-8d7c-b1d8fee32628.png
rename to tests/data/training/training_dataset/images/0a34e13a-4ab0-4a91-8d7c-b1d8fee32628.png
diff --git a/tests/data/training_page/images/0a576062-303c-4893-a729-c09c92865d31.png b/tests/data/training/training_dataset/images/0a576062-303c-4893-a729-c09c92865d31.png
similarity index 100%
rename from tests/data/training_page/images/0a576062-303c-4893-a729-c09c92865d31.png
rename to tests/data/training/training_dataset/images/0a576062-303c-4893-a729-c09c92865d31.png
diff --git a/tests/data/training_page/images/0a70e14f-feda-4607-989c-36cf581ddff5.png b/tests/data/training/training_dataset/images/0a70e14f-feda-4607-989c-36cf581ddff5.png
similarity index 100%
rename from tests/data/training_page/images/0a70e14f-feda-4607-989c-36cf581ddff5.png
rename to tests/data/training/training_dataset/images/0a70e14f-feda-4607-989c-36cf581ddff5.png
diff --git a/tests/data/training_page/images/0b2457c8-81f1-4600-84d9-f8bf2822a991.png b/tests/data/training/training_dataset/images/0b2457c8-81f1-4600-84d9-f8bf2822a991.png
similarity index 100%
rename from tests/data/training_page/images/0b2457c8-81f1-4600-84d9-f8bf2822a991.png
rename to tests/data/training/training_dataset/images/0b2457c8-81f1-4600-84d9-f8bf2822a991.png
diff --git a/tests/data/training_page/images/fb3edb59-3678-49f8-8e16-8e32e3b0f051.png b/tests/data/training/training_dataset/images/fb3edb59-3678-49f8-8e16-8e32e3b0f051.png
similarity index 100%
rename from tests/data/training_page/images/fb3edb59-3678-49f8-8e16-8e32e3b0f051.png
rename to tests/data/training/training_dataset/images/fb3edb59-3678-49f8-8e16-8e32e3b0f051.png
diff --git a/tests/data/training_page/images/fe498de2-ece4-4fbe-8b53-edfce1b820f0.png b/tests/data/training/training_dataset/images/fe498de2-ece4-4fbe-8b53-edfce1b820f0.png
similarity index 100%
rename from tests/data/training_page/images/fe498de2-ece4-4fbe-8b53-edfce1b820f0.png
rename to tests/data/training/training_dataset/images/fe498de2-ece4-4fbe-8b53-edfce1b820f0.png
diff --git a/tests/data/training/training_dataset/labels.json b/tests/data/training/training_dataset/labels.json
new file mode 100644
index 0000000000000000000000000000000000000000..82602c7cef358b2f243a49c3e45c66d1cd231753
--- /dev/null
+++ b/tests/data/training/training_dataset/labels.json
@@ -0,0 +1,26 @@
+{
+    "test": {
+        "tests/data/training/training_dataset/images/fb3edb59-3678-49f8-8e16-8e32e3b0f051.png": {
+            "text": "Both her wrists bore"
+        },
+        "tests/data/training/training_dataset/images/fe498de2-ece4-4fbe-8b53-edfce1b820f0.png": {
+            "text": "SOME years ago a contemporary"
+        }
+    },
+    "train": {
+        "tests/data/training/training_dataset/images/0a34e13a-4ab0-4a91-8d7c-b1d8fee32628.png": {
+            "text": "The latter do not regard"
+        },
+        "tests/data/training/training_dataset/images/0a70e14f-feda-4607-989c-36cf581ddff5.png": {
+            "text": "At the beginning of"
+        }
+    },
+    "val": {
+        "tests/data/training/training_dataset/images/0a576062-303c-4893-a729-c09c92865d31.png": {
+            "text": "One can remember with"
+        },
+        "tests/data/training/training_dataset/images/0b2457c8-81f1-4600-84d9-f8bf2822a991.png": {
+            "text": "The play was no more"
+        }
+    }
+}
diff --git a/tests/data/training_page/labels.json b/tests/data/training_page/labels.json
deleted file mode 100644
index 4ae72a713741d4375944d736e4bdb5a53d474122..0000000000000000000000000000000000000000
--- a/tests/data/training_page/labels.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-    "test": {
-        "tests/data/training_page/images/fb3edb59-3678-49f8-8e16-8e32e3b0f051.png": {
-            "text": "Both her wrists bore"
-        },
-        "tests/data/training_page/images/fe498de2-ece4-4fbe-8b53-edfce1b820f0.png": {
-            "text": "SOME years ago a contemporary"
-        }
-    },
-    "train": {
-        "tests/data/training_page/images/0a34e13a-4ab0-4a91-8d7c-b1d8fee32628.png": {
-            "text": "The latter do not regard"
-        },
-        "tests/data/training_page/images/0a70e14f-feda-4607-989c-36cf581ddff5.png": {
-            "text": "At the beginning of"
-        }
-    },
-    "val": {
-        "tests/data/training_page/images/0a576062-303c-4893-a729-c09c92865d31.png": {
-            "text": "One can remember with"
-        },
-        "tests/data/training_page/images/0b2457c8-81f1-4600-84d9-f8bf2822a991.png": {
-            "text": "The play was no more"
-        }
-    }
-}
diff --git a/tests/test_prediction.py b/tests/test_prediction.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ad7c51023ef4b5d6ae5a7b840140d0f646cf15d
--- /dev/null
+++ b/tests/test_prediction.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+
+import pytest
+import torch
+
+from dan.predict.prediction import DAN
+from dan.utils import read_image
+
+
+@pytest.mark.parametrize(
+    "image_name, expected_prediction",
+    (
+        (
+            "0a56e8b3-95cd-4fa5-a17b-5b0ff9e6ea84.png",
+            {"text": ["ⓈBellisson ⒻGeorges Ⓑ91 ⓁP ⒸM ⓀCh ⓄPlombier ⓅPatron?12241"]},
+        ),
+        (
+            "0dfe8bcd-ed0b-453e-bf19-cc697012296e.png",
+            {"text": ["ⓈTemplié ⒻMarcelle Ⓑ93 ⓁS Ⓚch ⓄE dactylo Ⓟ18376"]},
+        ),
+        (
+            "2c242f5c-e979-43c4-b6f2-a6d4815b651d.png",
+            {"text": ["Ⓢd ⒻCharles Ⓑ11 ⓁP ⒸC ⓀF Ⓞd Ⓟ14 31"]},
+        ),
+        (
+            "ffdec445-7f14-4f5f-be44-68d0844d0df1.png",
+            {"text": ["ⓈNaudin ⒻMarie Ⓑ53 ⓁS Ⓒv ⓀBelle mère"]},
+        ),
+    ),
+)
+def test_predict(
+    image_name,
+    expected_prediction,
+    prediction_data_path,
+):
+    device = "cpu"
+
+    dan_model = DAN(device)
+    dan_model.load(
+        prediction_data_path / "popp_line_model.pt",
+        prediction_data_path / "parameters.yml",
+        prediction_data_path / "charset.pkl",
+        mode="eval",
+    )
+
+    image = read_image(prediction_data_path / "images" / image_name)
+    image = dan_model.preprocess(image)
+
+    input_tensor = torch.tensor(image).permute(2, 0, 1).unsqueeze(0)
+    input_tensor = input_tensor.to(device)
+    input_sizes = [image.shape[:2]]
+
+    prediction = dan_model.predict(input_tensor, input_sizes)
+
+    assert prediction == expected_prediction
diff --git a/tests/test_training.py b/tests/test_training.py
index 44f87f0814953f157d8bf9d890859869c2947401..85a01927766335330f1c0279af857ba40e3fa1bb 100644
--- a/tests/test_training.py
+++ b/tests/test_training.py
@@ -57,7 +57,7 @@ def test_train_and_test(
 
     # Check that the trained model is correct
     for model_name in [expected_best_model_name, expected_last_model_name]:
-        expected_model = torch.load(FIXTURES / "training" / model_name)
+        expected_model = torch.load(FIXTURES / "training" / "models" / model_name)
         trained_model = torch.load(
             Path(
                 "outputs",