Index: binaries/data/mods/public/gui/credits/credits.js
===================================================================
--- binaries/data/mods/public/gui/credits/credits.js	(revision 18174)
+++ binaries/data/mods/public/gui/credits/credits.js	(working copy)
@@ -1,5 +1,6 @@
 var g_PanelNames = ["special", "programming", "art", "translators", "misc", "donators"];
-var g_PanelTexts = [];
+var g_ButtonNames = {};
+var g_PanelTexts = {};
 var g_ActivePanel = -1;
 
 function init()
@@ -6,11 +7,45 @@
 {
 	// Load credits list from the disk and parse them
 	for (let name of g_PanelNames)
-		g_PanelTexts.push(parseJSONCredits(name));
+	{
+		let json = Engine.ReadJSONFile("gui/credits/texts/" + name + ".json");
+		if (!json || !json.Content)
+		{
+			error("Could not load credits for " + name + "!");
+			continue;
+		}
+		g_ButtonNames[name] = json.Title || name;
+		g_PanelTexts[name] = parseHelper(json.Content);
+	}
 
+	placeButtons();
 	selectPanel(0);
 }
 
+function placeButtons()
+{
+	const numButtons = 20;
+	if (g_PanelNames.length > numButtons)
+		warn("Could not display some credits.");
+
+	for (let i = 0; i < numButtons; ++i)
+	{
+		let button = Engine.GetGUIObjectByName("creditsPanelButton[" + i + "]");
+		if (i >= g_PanelNames.length)
+		{
+			button.hidden = true;
+			continue;
+		}
+		let size = button.size;
+		size.top = i * 35;
+		size.bottom = size.top + 30;
+		button.size = size;
+		button.onPress = (function(i){ return function() {selectPanel(i);}; })(i);
+		let buttonText = Engine.GetGUIObjectByName("creditsPanelButtonText[" + i + "]");
+		buttonText.caption = translate(g_ButtonNames[g_PanelNames[i]]);
+	}
+}
+
 // Run through a "Content" list and parse elements for formatting and translation
 function parseHelper(list)
 {
@@ -48,30 +83,18 @@
 	return result;
 }
 
-function parseJSONCredits(panelName)
-{
-	let json = Engine.ReadJSONFile("gui/credits/texts/" + panelName + ".json");
-	if (!json || !json.Content)
-	{
-		error("Could not load credits for " + panelName + "!");
-		return "";
-	}
-
-	return parseHelper(json.Content);
-}
-
 function selectPanel(i)
 {
 	if (g_ActivePanel != -1)
 	{
-		let oldPanelButton = Engine.GetGUIObjectByName(g_PanelNames[g_ActivePanel] + "PanelButton");
+		let oldPanelButton = Engine.GetGUIObjectByName("creditsPanelButton[" + g_ActivePanel+ "]");
 		oldPanelButton.sprite = "BackgroundBox";
 	}
 
 	g_ActivePanel = i;
-	let newPanelButton = Engine.GetGUIObjectByName(g_PanelNames[g_ActivePanel] + "PanelButton");
+	let newPanelButton = Engine.GetGUIObjectByName("creditsPanelButton[" + g_ActivePanel+ "]");
 	newPanelButton.sprite = "ForegroundBox";
 
 	let creditsText = Engine.GetGUIObjectByName("creditsText");
-	creditsText.caption = g_PanelTexts[i];
+	creditsText.caption = g_PanelTexts[g_PanelNames[i]];
 }
Index: binaries/data/mods/public/gui/credits/credits.xml
===================================================================
--- binaries/data/mods/public/gui/credits/credits.xml	(revision 18174)
+++ binaries/data/mods/public/gui/credits/credits.xml	(working copy)
@@ -8,59 +8,26 @@
 
 <objects>
 	<script file="gui/common/functions_global_object.js"/>
-	<script file="gui/credits/credits.js"/>
+	<script directory="gui/credits/"/>
 
 	<!-- Add a translucent black background to fade out the menu page -->
 	<object type="image" z="0" sprite="ModernFade"/>
 
 	<object type="image" style="ModernDialog" size="50%-473 24 50%+473 100%-24">
-		<object style="ModernLabelText" type="text" size="50%-128 -18 50%+128 14">
+		<object style="ModernLabelText" name="dialogTitle" type="text" size="50%-128 -18 50%+128 14">
 			<translatableAttribute id="caption">0 A.D. Credits</translatableAttribute>
 		</object>
 
-		<object name="specialPanelButton" type="button" sprite="BackgroundBox" size="20 50 150 80">
-			<action on="Press">selectPanel(0);</action>
-			<object type="text" style="ModernLabelText" ghost="true">
-				<translatableAttribute id="caption">Special Credits</translatableAttribute>
-			</object>
+		<object type="image" size="20 30 210 100%-54">
+			<repeat count="20">
+				<object name="creditsPanelButton[n]" type="button" sprite="BackgroundBox" size="0 0 190 30">
+					<object type="text" name="creditsPanelButtonText[n]" style="ModernLabelText" ghost="true">
+					</object>
+				</object>
+			</repeat>
 		</object>
 
-		<object name="programmingPanelButton" type="button" sprite="BackgroundBox" size="155 50 305 80">
-			<action on="Press">selectPanel(1);</action>
-			<object type="text" style="ModernLabelText" ghost="true">
-				<translatableAttribute id="caption">Programming</translatableAttribute>
-			</object>
-		</object>
-
-		<object name="artPanelButton" type="button" sprite="BackgroundBox" size="310 50 460 80">
-			<action on="Press">selectPanel(2);</action>
-			<object type="text" style="ModernLabelText" ghost="true">
-				<translatableAttribute id="caption">Art</translatableAttribute>
-			</object>
-		</object>
-
-		<object name="translatorsPanelButton" type="button" sprite="BackgroundBox" size="465 50 615 80">
-			<action on="Press">selectPanel(3);</action>
-			<object type="text" style="ModernLabelText" ghost="true">
-				<translatableAttribute id="caption">Translators</translatableAttribute>
-			</object>
-		</object>
-
-		<object name="miscPanelButton" type="button" sprite="BackgroundBox" size="620 50 770 80">
-			<action on="Press">selectPanel(4);</action>
-			<object type="text" style="ModernLabelText" ghost="true">
-				<translatableAttribute id="caption">Miscellaneous</translatableAttribute>
-			</object>
-		</object>
-
-		<object name="donatorsPanelButton" type="button" sprite="BackgroundBox" size="775 50 925 80">
-			<action on="Press">selectPanel(5);</action>
-			<object type="text" style="ModernLabelText" ghost="true">
-				<translatableAttribute id="caption">Donors</translatableAttribute>
-			</object>
-		</object>
-
-		<object type="image" sprite="ModernFade" size="20 85 100%-20 100%-54">
+		<object type="image" sprite="ModernFade" size="220 30 100%-20 100%-54">
 			<object name="creditsText" type="text" style="textPanel"/>
 		</object>
 
Index: binaries/data/mods/public/gui/credits/texts/art.json
===================================================================
--- binaries/data/mods/public/gui/credits/texts/art.json	(revision 18174)
+++ binaries/data/mods/public/gui/credits/texts/art.json	(working copy)
@@ -1,4 +1,5 @@
 {
+	"Title": "Art",
 	"Content": [
 	{
 		"Title": "Artistic managers",
Index: binaries/data/mods/public/gui/credits/texts/donators.json
===================================================================
--- binaries/data/mods/public/gui/credits/texts/donators.json	(revision 18174)
+++ binaries/data/mods/public/gui/credits/texts/donators.json	(working copy)
@@ -1,4 +1,5 @@
 {
+	"Title": "Donors",
 	"Content" : [
 	{
 		"Title": "Pledgie Drive 1",
Index: binaries/data/mods/public/gui/credits/texts/misc.json
===================================================================
--- binaries/data/mods/public/gui/credits/texts/misc.json	(revision 18174)
+++ binaries/data/mods/public/gui/credits/texts/misc.json	(working copy)
@@ -1,4 +1,5 @@
 {
+	"Title": "Miscellaneous",
 	"Content": [
 	{
 		"Title": "History References",
Index: binaries/data/mods/public/gui/credits/texts/programming.json
===================================================================
--- binaries/data/mods/public/gui/credits/texts/programming.json	(revision 18174)
+++ binaries/data/mods/public/gui/credits/texts/programming.json	(working copy)
@@ -1,4 +1,5 @@
 {
+	"Title": "Programming",
 	"Content": [
 	{
 		"Title": "Programming managers",
Index: binaries/data/mods/public/gui/credits/texts/special.json
===================================================================
--- binaries/data/mods/public/gui/credits/texts/special.json	(revision 18174)
+++ binaries/data/mods/public/gui/credits/texts/special.json	(working copy)
@@ -1,4 +1,5 @@
 {
+	"Title": "Special Credits",
 	"Content": [
 	{
 		"Title": "In Memoriam",
Index: binaries/data/mods/public/gui/credits/texts/translators.json
===================================================================
--- binaries/data/mods/public/gui/credits/texts/translators.json	(revision 18174)
+++ binaries/data/mods/public/gui/credits/texts/translators.json	(working copy)
@@ -1,4 +1,5 @@
 {
+    "Title": "Translators",
     "Content": [
         {
             "List": [
@@ -1994,4 +1995,4 @@
             "LangName": "T\u00fcrk\u00e7e"
         }
     ]
-}
\ No newline at end of file
+}
Index: source/tools/i18n/creditTranslators.py
===================================================================
--- source/tools/i18n/creditTranslators.py	(revision 18174)
+++ source/tools/i18n/creditTranslators.py	(working copy)
@@ -72,7 +72,7 @@
 langsLists = {}
 
 # Create the new JSON data
-newJSONData = {'Content': []}
+newJSONData = {'Title': 'Translators', 'Content': []}
 
 # First get the already existing lists. If they correspond with some of the credited languages,
 # add them to the new data after processing, else add them immediately.
