diff --git a/js/ntpGraph.js b/js/ntpGraph.js
index 326a993b49d67d50ee76eb041ddb74e9b2787c83..8ae557e5f223a887e6ff636b640880ed61794ecc 100644
--- a/js/ntpGraph.js
+++ b/js/ntpGraph.js
@@ -1,4 +1,4 @@
-import Plotly from 'plotly.js-dist'
+import chart from 'chart.js'
 
 let graphIndexCounter = 0;
 let graphElements = document.querySelectorAll("jl-ntp-graph");
@@ -10,8 +10,8 @@ graphElements.forEach((elememt) => {
     <span id="${graphIndexCounter}-Banner" data-index="${graphIndexCounter}" class="ntpBanner">${ip}</span>
     <span id="${graphIndexCounter}-Content" class="ntpContent">
         <a target="_blank" href="https://www.ntppool.org/scores/${ip}" class="linkToNtpPool">Server auf dem NTP Pool anzeigen</a>
-        <div id="${graphIndexCounter}-Delay"></div>
-        <div id="${graphIndexCounter}-Score"></div>
+        <canvas id="${graphIndexCounter}-Delay"></canvas>
+        <canvas id="${graphIndexCounter}-Score"></canvas>
     </span>
     `;
     let currentIndex = graphIndexCounter;
@@ -20,19 +20,23 @@ graphElements.forEach((elememt) => {
     let xhr = new XMLHttpRequest();
 
     xhr.onreadystatechange = function (){
-        if(xhr.status == 200 && xhr.readyState == 4){
+        if(xhr.status === 200 && xhr.readyState === 4){
             let rawData = JSON.parse(this.responseText);
             let x = [];
             let yScore = [];
             let yDelay = [];
-            rawData["history"].forEach((entry) => {
-                x.push(new Date(entry["ts"] * 1000));
+            rawData["history"].forEach((entry, index) => {
+                let date = new Date(entry["ts"] * 1000).toLocaleDateString();
+                if(index % 10 !== 0){
+                    date = "";
+                }
+                x.push(date);
                 yScore.push(entry["score"]);
                 yDelay.push(entry["offset"]);
             });
 
-            drawPlot(currentIndex + "-Delay", x, yDelay, ip + " Delay");
-            drawPlot(currentIndex + "-Score", x, yScore, ip + " Score");
+            drawPlot(currentIndex + "-Delay", x, yDelay, "Delay");
+            drawPlot(currentIndex + "-Score", x, yScore, "Score");
 
 
         }
@@ -42,43 +46,22 @@ graphElements.forEach((elememt) => {
 });
 
 function drawPlot(elementName, x, y, title){
-    let score = {
-        x: x,
-        y: y,
-        mode: 'lines',
-        marker: {
-            color: '#1cb09a'
-        }
-    };
-    let layout = {
-        title: {
-            text: title,
-            font: {
-                color: "#b3b3b3",
-            }
-        },
-        plot_bgcolor: "#171e2b",
-        paper_bgcolor: "#171e2b",
-        xaxis: {
-            gridcolor: "rgb(68, 68, 68)",
-            zerolinecolor: "#b3b3b3",
-            linecolor: "#b3b3b3",
-            tickfont: {
-                color: "#b3b3b3",
-            },
-        },
-        yaxis: {
-            gridcolor: "rgb(68, 68, 68)",
-            zerolinecolor: "#b3b3b3",
-            linecolor: "#b3b3b3",
-            tickfont: {
-                color: "#b3b3b3",
-            },
-        }
-    };
-    let config = {
-        responsive: true
-    };
+    let ctx = document.getElementById(elementName).getContext('2d');
 
-    Plotly.newPlot(elementName, [score], layout, config);
+    new Chart(ctx, {
+        type: 'line',
+        responsive: true,
+        scaleShowVerticalLines: false,
+        showTooltips: false,
+        data: {
+            labels: x,
+            datasets: [{
+                label: title,
+                data: y,
+                borderColor: '#199a87',
+                fill: false,
+                radius: 0,
+            }]
+        },
+    });
 }
\ No newline at end of file
diff --git a/js/ntpMenu.js b/js/ntpMenu.js
index 4e62949b58d89796ac10999ec19c1bb8ddfe2cbf..4fe714189fadf653cc4f6b5a518e0bcb962cfbd5 100644
--- a/js/ntpMenu.js
+++ b/js/ntpMenu.js
@@ -1,5 +1,3 @@
-let Plotly = require('plotly.js-dist')
-
 let ntpNav = document.querySelectorAll(".ntpBanner");
 
 ntpNav.forEach((element) => {
@@ -12,8 +10,6 @@ ntpNav.forEach((element) => {
             contentElement.classList.remove("visible");
         } else {
             contentElement.classList.add("visible");
-            Plotly.relayout(index + "-Delay", {autosize: true});
-            Plotly.relayout(index + "-Score", {autosize: true});
         }
     }
 });
\ No newline at end of file
diff --git a/package.json b/package.json
index 39161732e08abecc7697ea403ddf27f8f2dca7b8..b2c8019bc768ed70715e15ee81e08a490268b8a0 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
   },
   "dependencies": {
     "basiclightbox": "^5.0.4",
-    "plotly.js-dist": "^1.58.4",
+    "chart.js": "^2.9.4",
     "sass": "^1.32.8",
     "webpack": "^5.28.0"
   }
diff --git a/yarn.lock b/yarn.lock
index 13853a7ff4f4e3388e04b7bcf5e25477ac302bce..74ce46ccd6c9859d419aa8466553664f42cb82a6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -319,6 +319,29 @@ chalk@^4.1.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
+chart.js@^2.9.4:
+  version "2.9.4"
+  resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684"
+  integrity sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==
+  dependencies:
+    chartjs-color "^2.1.0"
+    moment "^2.10.2"
+
+chartjs-color-string@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71"
+  integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==
+  dependencies:
+    color-name "^1.0.0"
+
+chartjs-color@^2.1.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0"
+  integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==
+  dependencies:
+    chartjs-color-string "^0.6.0"
+    color-convert "^1.9.3"
+
 "chokidar@>=2.0.0 <4.0.0":
   version "3.5.1"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
@@ -359,7 +382,7 @@ clone-deep@^4.0.1:
     kind-of "^6.0.2"
     shallow-clone "^3.0.0"
 
-color-convert@^1.9.0:
+color-convert@^1.9.0, color-convert@^1.9.3:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
   integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
@@ -378,7 +401,7 @@ color-name@1.1.3:
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
   integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-color-name@~1.1.4:
+color-name@^1.0.0, color-name@~1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
@@ -772,6 +795,11 @@ mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
+moment@^2.10.2:
+  version "2.29.1"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
+  integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
+
 neo-async@^2.6.2:
   version "2.6.2"
   resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
@@ -874,11 +902,6 @@ pkg-dir@^4.2.0:
   dependencies:
     find-up "^4.0.0"
 
-plotly.js-dist@^1.58.4:
-  version "1.58.4"
-  resolved "https://registry.yarnpkg.com/plotly.js-dist/-/plotly.js-dist-1.58.4.tgz#d57b73d27af57a0d6cd2cf9428a001962889cf5b"
-  integrity sha512-oXCTRJFN8FBsHZSQPYoM3LuJQchPUrf6sOXFC0EFdvcr5lmJmLcAsW74jDy9PkRpm3PB+A+2oY1hsUMmk2eZbw==
-
 punycode@^2.1.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"