Testing beta 58

His Dad [02-09-19 - 01:25]
Testing beta 58


Signed-off-by: His Dad <John@hisdad.org>
Filename
Doc/Changelog.txt
Doc/Description.txt
Doc/Help-Missing_Achievements.txt
Doc/Installation.odt
Doc/Installation.pdf
HistOffline.lua
HistOfflineBeta.lua
Screenshots/DLC.jpg
Screenshots/Dungeon Mode-Public Dungeons.jpg
Screenshots/Dungeon-Mode_DLC.jpg
Screenshots/Group Dungeon.jpg
Screenshots/Group Dungeons-Vet.jpg
Screenshots/Leveling.jpg
Screenshots/Locations.jpg
Screenshots/Public Dungeons.jpg
Screenshots/Skill Quests.jpg
Screenshots/Trials-Vet.jpg
Screenshots/World Bosses.jpg
data/DLC.lua
data/DLC_Grp.lua
data/Dungeons.ods
data/Group1.lua
data/Group2.lua
data/Public.lua
data/Quest.lua
data/Quest2.lua
data/Trials-old.lua
data/Trials.lua
data/WB.lua
data/WB2.lua
data/de/de.lua
data/en/en.lua
data/fr/fr.lua
data/ids.lua
data/keys.lua
data/make_box.lua
data/structure.txt
data/utility.lua
history.txt
diff --git a/Doc/Changelog.txt b/Doc/Changelog.txt
index 90406ac..7ae8265 100644
--- a/Doc/Changelog.txt
+++ b/Doc/Changelog.txt
@@ -1,3 +1,12 @@
+
+2019-02-09 version 58-beta 02
+Very major changes to simplify the programming.
+It is mostly data driven, which limits how I can present the information.
+If its not in the Achievement text, too bad..
+
+Must use IUP 3.26 or later
+
+
 2018-11-29 version 57
 	Fix Murkmire WB MIssing

diff --git a/Doc/Description.txt b/Doc/Description.txt
index d1c9c17..8ed2f77 100644
--- a/Doc/Description.txt
+++ b/Doc/Description.txt
@@ -26,12 +26,11 @@ The Level and Location panels are only populated going forward. The game itself
 If more than one account is used on the computer, you have an option to select the account you wish to view.


-[SIZE=4]Dungeon Achievements[/SIZE]
+[SIZE=4]Achievements[/SIZE]
 [LIST]
-[*]All Dungeons uncompleted have pale red text.
+[*]All Achievements uncompleted have red background.
 [*]Group and Public Dungeons are complete if you have the "Conqueror" Achievement.
-[*]An Alliance is Complete (The column heading is Green) if you have the Alliance Conqueror Achievement.
-[*]Veteran Dungeons are odd since there are several achievements. This is a number after the Dungeon Name. If you think you should have the achievement but don't, make a comment on the website.
+[*]Veteran Dungeons have several achievements.
 [/LIST]

 [SIZE=4]Trials[/SIZE]
@@ -59,9 +58,7 @@ If more than one account is used on the computer, you have an option to select t
 [SIZE=4]World Bosses[/SIZE]
 [LIST]
 [*]There are six bosses in a zone, 5 zones in an Alliance. Get all 30!
-[*]Doesn't show which are missing.
-[*]Has VVardenfell Bosses.
-[*]Doesn't show Orsinium DLC
+[*]Select the zone to show the detail.
 [/LIST]

 [SIZE=4]Quests With Skill Points[/SIZE]
@@ -69,14 +66,13 @@ If more than one account is used on the computer, you have an option to select t
 [*]See if you have missed any!
 [*]Select the zone to show the detail.
 [*]Click on link to browse to UESP's webpage on the quest.
-[*]Doesn't show Orsinium DLC
 [*] Zos bug in Malabal Tor, can't fix, SOL
 [/LIST]

-[SIZE=4]DLC[/SIZE]
+[SIZE=4]DLC Group[/SIZE]
 [LIST]
-[*]This is the Group and Public Dungeons.
-[*]DLC Trials are in "Trials"
+[*]This is the Group Dungeons. DLC public Dungeons are in "Public"
+[*]DLC Trials are in "Trials Norn, Vet Hard"
 [/LIST]

 [SIZE=4]Installation[/SIZE]
@@ -84,7 +80,7 @@ Install the Add-on in the usual way.
 Read "installation.pdf" in the Doc folder for details on installing the IUP toolkit


-Enjoy. Please report bugs to the forum. This is work in progress. None of my characters have been to craglorn or done all the Vet dungeons so some stuff is untested.
+Enjoy. Please report bugs to the forum. This is work in progress.

 [SIZE=4]Translations[/SIZE]
 German Translations by Joklix and Snakefish.
diff --git a/Doc/Help-Missing_Achievements.txt b/Doc/Help-Missing_Achievements.txt
deleted file mode 100644
index 00c433b..0000000
--- a/Doc/Help-Missing_Achievements.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-The game only saves state on clean logout, so if you crash, your recent achievements won't be known.
-
-
-Just wait a day.
-The system will reload if it is more than a day old.
-
-
diff --git a/Doc/Installation.odt b/Doc/Installation.odt
index 04ace28..03f7e27 100644
Binary files a/Doc/Installation.odt and b/Doc/Installation.odt differ
diff --git a/Doc/Installation.pdf b/Doc/Installation.pdf
index 85967f0..d1a4656 100644
Binary files a/Doc/Installation.pdf and b/Doc/Installation.pdf differ
diff --git a/HistOffline.lua b/HistOffline.lua
index 60f5fe7..3e965ab 100644
--- a/HistOffline.lua
+++ b/HistOffline.lua
@@ -11,59 +11,57 @@ FG_Colour_Complete = "#000000"
 BG_Colour_Not_Complete = "#FFB67D"
 BG_Colour_Complete = "#A4FF5A"
 Colour_Heading_Complete = "#58FA58"
-local dname, key, count, ccount, colour, bgcolour
+Settings_s ="./my/visibility.lua"

---force_lang = "fr"  --	or "de" or "fr"  for debugging
+
+--force_lang = "de"  --	or "de" or "fr"  for debugging

 -- ========================
-version= "57"
+version= "58-Beta-03"
 require( "iuplua" )
 require( "iupluacontrols" )
+
+
+if (iup._VERSION_NUMBER < 326000) then
+	iup.Message("Old Version of IUP-LUA", "Upgrade to 3.26 or later.")
+	iup.Close()
+end
+
 iup.SetGlobal("UTF8MODE","YES")
 dofile "../../SavedVariables/History.lua"
-Trials_Dat={}
-Trials_Order={"N","V","VH"}
-Grp_Dat={}

-Grp_Order={"1N","1V","1VH","2N","2V","2VH"}
-Grp1_Order={"1N","1V","1VH"}
-Grp2_Order={"2N","2V","2VH"}
+Trials_Order={"Trials Norm","Trials Vet","Trials Hard"}
+Group_Dat={}
+
+Group_Order={"Group 1N","Group 1V","Group 1VH","Group 2N","Group 2V","Group 2VH"}
+Grp1_Order={"Group 1N","Group 1V","Group 1VH"}
+Grp2_Order={"Group 2N","Group 2V","Group 2VH"}

-for _,i in ipairs(Grp_Order) do
-	Grp_Dat[i]={}
-end
-for _,i in ipairs(Trials_Order) do
-	Trials_Dat[i]={}
-end

-dofile "./data/Keys.lua"		--Linking tables, must do first
-dofile "./data/DLC.lua"			--Achievement to Grid lookup, language independent
+Ach_Detail = {}		--Forward Reference
+accounts = {}
+
+dofile "./data/utility.lua"		-- utility functions
+dofile "./data/keys.lua"
+dofile "./data/DLC_Grp.lua"
+dofile "./data/DLC.lua"
 dofile "./data/Group1.lua"		-- Grp Mode 1 data, N, V, VH
 dofile "./data/Group2.lua"		-- Grp Mode 2 data, N, V, VH
 dofile "./data/Public.lua"
-dofile "./data/Quest2.lua"
+dofile "./data/Quest.lua"
 dofile "./data/Veteran.lua"		-- Auxiliary Achievements for Vet Dungeons
-dofile "./data/WB2.lua"
+dofile "./data/WB.lua"
 dofile "./data/Trials.lua"
 dofile "./data/Special.lua"		-- Record of non standard Achievement ID's we need to keep.
-dofile "./data/utility.lua"		-- utility functions
+dofile "./data/Strings.lua"		-- String Handling
+
+

 --generate_id ()			-- Generate the file the addon uses to filter Achievement ID's
 -- This is used by the in game part history.lua to only record achievements that are used.
 -- Uncomment when need to run.


--- generate achievement lookups from key (cell)
-for _,i in ipairs(Grp_Order) do
-	Grp_Dat[i].reverse_id = reverse_id(Grp_Dat[i].id)
-end
-
-for _,i in ipairs(Trials_Order) do
-	Trials_Dat[i].reverse_id = reverse_id(Trials_Dat[i].id)
-end
-
-Pub_Dat_Char.reverse_id = reverse_id(Pub_Dat_Char.id)
-DLC_Dat.reverse_id = reverse_id(DLC_Dat.id)

 lingua= {}		-- Translated data
 load_lang = function (lang)
@@ -79,15 +77,10 @@ load_lang = function (lang)

 	lingua[lang].Area_names = Area_names		-- dofile writes to global variables
 	lingua[lang].L = L
-	lingua[lang].pub_names = pub_names
-	lingua[lang].grp_names = grp_names
-	lingua[lang].DLC_Location_names = DLC_Location_names
 	lingua[lang].Ach_Detail = Ach_Detail
 end


-
-accounts = {}
 accounts_list = {}		-- String list for selection dialog
 playerNames = {}		-- Get name from ID.

@@ -97,6 +90,8 @@ for acc,_ in pairs(History_SV["Default"]) do
 	accounts[acc].hasblankworlds = false
 	accounts[acc].player = {}
 	accounts[acc].playerIDs = {}	-- intermediate table for sorting. WIP. Controls presentation order
+	accounts[acc].AllplayerIDs = {}	-- Unfiltered
+
 	accounts[acc].playerIDs_vet= {}	-- subset of names which are >L50
 	table.insert(accounts_list, acc)

@@ -113,9 +108,6 @@ for acc,_ in pairs(History_SV["Default"]) do
 	-- Reset Globals
 	Area_names = lingua[accounts[acc].lang].Area_names
 	L = lingua[accounts[acc].lang].L
-	pub_names = lingua[accounts[acc].lang].pub_names
-	grp_names = lingua[accounts[acc].lang].grp_names
-	DLC_Location_names = lingua[accounts[acc].lang].DLC_Location_names
 	Ach_Detail = lingua[accounts[acc].lang].Ach_Detail
 -- load worlds
 	nworlds = 0
@@ -126,21 +118,23 @@ for acc,_ in pairs(History_SV["Default"]) do
 		end
 	end

--- insert marker for older chars
---	table.insert(accounts[acc].worlds, "##NEITHER##")
-

 -- Load Character Data
 	for playerID, _ in pairs(History_SV["Default"][acc]["$AccountWide"]["data"]) do

 		if playerID == "" then
-		print("acct: " .. acc)
+		print("Error: account: " .. acc .. " has blank playerID")
 		end
-		table.insert (accounts[acc].playerIDs, playerID)
+
+		table.insert (accounts[acc].AllplayerIDs, playerID)
+
 		accounts[acc].player[playerID] = {}		-- stub table to hold char data, later becomes "me"
 --
 		local me = accounts[acc].player[playerID]											-- shorter reference: our code
 		local thischar = History_SV["Default"][acc]["$AccountWide"]["data"][playerID]	-- shorter reference: History DB
+
+		me.visible = true			--enable for display
+
 		-- Pull in some char data for processing
 		if thischar.name == nil  then --	Old Format
 	--	    print("Old Format  " .. playerID)
@@ -186,10 +180,11 @@ for acc,_ in pairs(History_SV["Default"]) do
 		me.ach = thischar.ach
 	end

-	table.sort(accounts[acc].playerIDs,function(a,b)  return (playerNames[a] < playerNames[b]) end)
+	table.sort(accounts[acc].AllplayerIDs,function(a,b)  return (playerNames[a] < playerNames[b]) end)
 	table.sort(accounts[acc].playerIDs_vet,function(a,b) return (playerNames[a] < playerNames[b]) end)
 end

+load_visibility()


 --[[ ==========================================
@@ -246,6 +241,8 @@ end
 	Status_bar = iup.label{title=L.Welcome .. " " .. L.Version .. " " .. version .. ".", expand = "HORIZONTAL"}
 	iup.Append(accounts[acc].mode_zbox, accounts[acc].dung_tabs)

+
+
   -- Mode Buttons (Toggles)
   --[[  These control the display.
    Char mode lists the characters and information for them (default for prior versions)
@@ -255,206 +252,66 @@ end

    accounts[acc].char_tog = iup.toggle{ title = L.Characters}
    accounts[acc].dung_tog = iup.toggle{ title = L.Dungeons}
-   accounts[acc].view_tog = iup.toggle{ title = L.View_Toggle, VISIBLE = "NO"}
+   accounts[acc].filter_but = iup.button{title=L.Filter}

-  local tog = accounts[acc].char_tog
+     local tog = accounts[acc].char_tog
   function tog:action(x)
 	if x == 1 then
-	accounts[acc].mode_zbox.value =accounts[acc].char_tabs
-	iup.SetAttribute(accounts[acc].view_tog, "VISIBLE", "NO")
+		accounts[acc].mode_zbox.value =accounts[acc].char_tabs
 	end
   end


-  tog = accounts[acc].dung_tog
-  function tog:action(x)
-	if x == 1 then
-	accounts[acc].mode_zbox.value = accounts[acc].dung_tabs
-	iup.SetAttribute(accounts[acc].view_tog, "VISIBLE", "YES")
-	end
-  end
-
-
-
+	tog = accounts[acc].dung_tog
+	function tog:action(x)
+		if x == 1 then
+			accounts[acc].mode_zbox.value = accounts[acc].dung_tabs
+		end
+	 end

-  accounts[acc].mode = iup.frame {
-								iup.hbox{
-									iup.radio {
-										iup.hbox{
-												accounts[acc].char_tog,
-												accounts[acc].dung_tog,
-												},
-										},
-									accounts[acc].view_tog,
+	 accounts[acc].mode = iup.frame {
+									iup.hbox{
+										iup.radio {
+											iup.hbox{
+													accounts[acc].char_tog,
+													accounts[acc].dung_tog,
+													},
+											},
+											accounts[acc].filter_but,
+										}
 									}
-								}
-
-  accounts[acc].mode.title =  L.Mode
-  accounts[acc].mode.margin = "15x5"
-
-  accounts[acc].alldungeons = {}
-  -- Prepare for Dungeon data recording as we iterate through characters.
-  accounts[acc].dung = {}		-- put all dungeon mode stuff here. Populate it with character data.
-  -- N Normal,   V Vet,    VH   Vet hard mode
-  dung = accounts[acc].dung
-  dung.pub = {}
-  dung.pub.box = {}
-  dung.pub.key = {}
-  dung.pub.name = "pub"
-  table.insert(accounts[acc].alldungeons,dung.pub)
-
-  dung.DLC = {}
-  dung.DLC.box = {}
-  dung.DLC.key = {}
-  dung.DLC.name = "DLC"
-  table.insert(accounts[acc].alldungeons,dung.DLC)
-  dung.Grp = {}		-- these ones are indexed.
-  dung.Trials = {}
-  tog = accounts[acc].view_tog
+	 accounts[acc].mode.title =  L.Mode
+	 accounts[acc].mode.margin = "15x5"

-  function tog:action(x)
-		if x == 1 then   --hide completed columns
-			for _, ADung in pairs (accounts[acc].alldungeons) do	-- for each dungeon
-			    if (ADung.ShowColumn == nil)  then
-					print ("ADung.ShowColumn is nil for " .. ADung.name)
-					break
-				end
-				for col,show in pairs(ADung.ShowColumn) do
-					if show  then
-						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"100")
-					else
-						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"0")
-					end
-				end  --]]
-			end
-		else   -- show all
-			for _, ADung in pairs (accounts[acc].alldungeons) do	-- for each dungeon
-			    if (ADung.ShowColumn == nil)  then
-					print ("ADung.ShowColumn is nil for " .. ADung.name)
-					break
-				end

-				for col,show in pairs(ADung.ShowColumn) do
-						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"100")
-				end
-			end
-		end
-	end

-  -- Set up dungeon mode Group Dungeons
-  for _,i in ipairs(Grp_Order) do
-	dung.Grp[i]= {}
-	dung.Grp[i].name = "Grp: " .. L.Grp_TabName[i]
-	dung.Grp[i].key ={}   -- key lookup
-	dung.Grp[i].box = iup.matrix {numcol=#accounts[acc].playerIDs,     numlin=_size(Grp_Dat[i].id), widthdef=100}
-	iup.SetAttribute(dung.Grp[i].box, "READONLY", "YES")
-
-	dung.Grp[i].tab = iup.vbox {
-						["tabtitle"] =L.Grp_TabName[i],
-						dung.Grp[i].box,
-						iup.fill{},
-					}
+	 accounts[acc].alldungeons = {}
+	  -- Prepare for Dungeon data recording as we iterate through characters.
+	 accounts[acc].dung = {}		-- put all dungeon mode stuff here. Populate it with character data.
+	  -- N Normal,   V Vet,    VH   Vet hard mode
+	 dung = accounts[acc].dung

--- Mouseover
-	dung.Grp[i].box.dat = Grp_Dat[i]
---	dung.Grp[i].box.mousemove_cb = box_mousemove_cb
---	dung.Grp[i].box.leavewindow_cb = box_leavewindow_cb

-	--set lines Heading
-	dung.Grp[i].box:setcell(0,0, L.Location)
-	--Set Line titles
-	for line,key in ipairs(Grp_Dat[i].key) do
-		dung.Grp[i].box:setcell(line, 0, grp_names[key])
-	end

-	--Create Columns for Chars
-	for col ,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp[i].box:setcell(0, col, playerNames[playerID])
-	end

-	table.insert(accounts[acc].alldungeons,dung.Grp[i])
-  end

-  -- a table for each dungeon to which we add characters
-  for _,i in ipairs(Grp1_Order) do
-    for _,key in ipairs(grp1tokey) do
-	  dung.Grp[i].key[key] = {}
-	  for _,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp[i].key[key][playerID] = false
-	  end
+	local button = accounts[acc].filter_but
+	function button:action(x)
+		select_box(accounts[acc])
 	end
-  end
-
-  for _,i in ipairs(Grp2_Order) do
-    for _,key in ipairs(grp2tokey) do
-	  dung.Grp[i].key[key] = {}
-	  for _,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp[i].key[key][playerID] = false
-	  end
-	end
-  end
-
-  -- Set up dungeon mode  Trials
-  for _,i in ipairs(Trials_Order) do	--N V VH
-		dung.Trials[i]= {}
-		dung.Trials[i].name = L.Trial_TabName[i]
-		dung.Trials[i].key ={}   -- key lookup
-		dung.Trials[i].box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=_size(Trials_Dat[i].id), widthdef=120}
-		iup.SetAttribute(dung.Trials[i].box, "READONLY", "YES")
-
-		dung.Trials[i].tab = iup.vbox {
-							["tabtitle"] =L.Trial_TabName[i],
-							dung.Trials[i].box,
-							iup.fill{},
-						}
-		dung.Trials[i].box.dat = Trials_Dat[i]
-	--	dung.Trials[i].box.mousemove_cb = box_mousemove_cb
-		dung.Trials[i].box.leavewindow_cb = box_leavewindow_cb
-
-
-		--set lines Heading
-		dung.Trials[i].box:setcell(0,0, L.Location)
-		--Set Line titles
-		for line,key in ipairs(Trials_Dat[i].key) do
-			dung.Trials[i].box:setcell(line, 0, Trials_Names[i][key])
-		end
-
-		--Create Columns for Chars
-		for col ,playerID in ipairs(accounts[acc].playerIDs) do
-			dung.Trials[i].box:setcell(0, col, playerNames[playerID])
-		end
-
-
-
-		-- a table for each dungeon to which we add characters
-		for _,key in ipairs(Trials2key[i]) do
-		  dung.Trials[i].key[key] = {}
-		  for _,playerID in ipairs(accounts[acc].playerIDs) do
-			dung.Trials[i].key[key][playerID] = false
-		  end
-		end
-		table.insert(accounts[acc].alldungeons,dung.Trials[i])
-  end
-
-
-
-
---  for _,i in ipairs(Pub_Dat_Char.key) do
---	  dung.pub.key[i] = {}
---  end
-
-  for _,i in ipairs(DLC2key) do
-	  dung.DLC.key[i] = {}
-  end

   -- ================  END Accountwide Data

+
   --=================  START OF CHARACTER MODE DISPLAY

 -- Creates boxes, stage from names to allow sorting
-	for _,playerID in ipairs(accounts[acc].playerIDs) do
-		local me = accounts[acc].player[playerID]											-- shorter reference: our code
-		local thischar = History_SV["Default"][acc]["$AccountWide"]["data"][playerID]	-- shorter reference: History DB
+	for _,playerID in ipairs(accounts[acc].AllplayerIDs) do
+
+		me = accounts[acc].player[playerID]										-- shorter reference: our code
+		me.data_tabs = iup.tabs{} --Data tabs for Char
+
+		thischar = History_SV["Default"][acc]["$AccountWide"]["data"][playerID]	-- shorter reference: History DB


 		-- Generate the leveling box.  ============================
@@ -491,172 +348,21 @@ end
 				me.leveling_box:setcell(i,6, thischar.levels[j].map)
 			end
 		end
-		-- Create Grp Dungeon Boxes ====================================
-		me.Grp ={}		-- Put them all together
-
-		for _, i in ipairs(Grp_Order) do		-- For Each Grp Dungeon
-			me.Grp[i] = {}						--  Dungeon data storage
-			me.Grp[i].vet = Grp_Dat[i].vet
-			me.Grp[i].box = iup.matrix {numcol=4, numcol_visible=4,  numlin=Grp_Dat[i].lines, widthdef=100}
-			iup.SetAttribute(me.Grp[i].box, "READONLY", "YES")
-
-			me.Grp[i].box.ach = thischar.ach		-- Put the Achievements here so the mouseover can get the users details
-			me.Grp[i].box.dat = Grp_Dat[i]		-- for mouseover
-			me.Grp[i].box.mousemove_cb = box_mousemove_cb
-			me.Grp[i].box.leavewindow_cb = box_leavewindow_cb
-
-			--Set Column titles in box
-			for j=1, 4 do
-				me.Grp[i].box:setcell(0,j, Area_names[j].long)
-			end
-
-
-			-- set background to red
-		--	iup.SetAttribute(me.Grp[i].box,  "BGCOLOR", BG_Colour_Not_Complete)
-
-			-- set text to black if achievement found.
-
-			for id, Gdat in pairs (Grp_Dat[i].id) do
-				local bgcolour,key
-				if thischar.ach[id] ~= nil then
-					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
-					iup.SetAttribute(me.Grp[i].box, bgcolour, BG_Colour_Complete)
-					-- Add char to dungeon
-					key = tostring(Gdat.L .. Gdat.C)
-					if  dung.Grp[i].key[key] == nil then
-						print ("dung.Grp[i].key[key]   key:  " .. key .. " is nil.")
-					end
-					dung.Grp[i].key[key][playerID] = true
-				else
-					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
-					iup.SetAttribute(me.Grp[i].box, bgcolour, BG_Colour_Not_Complete)
-				end
-			end
-
-			-- Create display tab
-			me.Grp[i].tab = iup.vbox {
-						["tabtitle"] =L.Grp_TabName[i],
-						me.Grp[i].box,
-						iup.fill{},
-				}
-		end
-
-		-- these IDs are in Specials.lua
-		--Set background of heading if all done
-		if thischar.ach[1073] ~= nil then  --EP Vanquisher
-				iup.SetAttribute(me.Grp["1N"].box,  "BGCOLOR0:1", Colour_Heading_Complete)
-		end
-
-		if thischar.ach[1074] ~= nil then  --DC Vanquisher
-				iup.SetAttribute(me.Grp["1N"].box ,  "BGCOLOR0:2", Colour_Heading_Complete)
-		end
-
-		if thischar.ach[1075] ~= nil then  --AD Vanquisher
-				iup.SetAttribute(me.Grp["1N"].box ,  "BGCOLOR0:3", Colour_Heading_Complete)
-		end
-
-		for _,i in ipairs(Grp_Order) do
-			for _, id in pairs (Grp_Dat[i].id) do
-				local key = tostring(id.L).. tostring(id.C)	-- make name key
-				me.Grp[i].box:setcell(id.L, id.C, grp_names[key])
-			end
-		end
-
-		-- Create Trials Dungeon Boxes ====================================
-		me.Trials ={}		-- Put them all together
-
-		for _, i in ipairs(Trials_Order) do		-- For Each Dungeon
-			me.Trials[i] = {}						-- Dungeon data storage
-			me.Trials[i].vet = Trials_Dat[i].vet
-			me.Trials[i].box = iup.matrix {numcol=1, numcol_visible=1, numlin=_size(Trials_Dat[i].id), widthdef=110}
-
-			me.Trials[i].box.ach = thischar.ach		-- Put the Achievements here so the mouseover can get the users details
-			me.Trials[i].box.dat = Trials_Dat[i]		-- for mouseover
-			me.Trials[i].box.mousemove_cb = box_mousemove_cb
-			me.Trials[i].box.leavewindow_cb = box_leavewindow_cb
-
-			--Set Column titles in box
-			for line,key in ipairs (Trials2key[i]) do  -- Load Dungeons Name. Info LC is the Dungeon Identifier
-					me.Trials[i].box:setcell(line,0, Trials_Names[i][key])
-			end
-
-			iup.SetAttribute(me.Trials[i].box,  "WIDTH0", "170")		-- Ach Description, is Col 0
-
-			iup.SetAttribute(me.Trials[i].box,  "BGCOLOR*:1", BG_Colour_Not_Complete)
-			--iup.SetAttribute(me.Trials[i].box,  "FGCOLOR*:1", "DEFAULT")
-			-- set text if achievement found and change background
-			for id, Gdat in pairs (Trials_Dat[i].id) do
-				local bgcolour
-				if thischar.ach[id] ~= nil then
-					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
-					me.Trials[i].box:setcell(Gdat.L,Gdat.C, L.YesLabel)
-					iup.SetAttribute(me.Trials[i].box, bgcolour, BG_Colour_Complete)
-					-- Add char to dungeon
-					dung.Trials[i].key[Gdat.key][playerID] = true
-				else
-					me.Trials[i].box:setcell(Gdat.L,Gdat.C, L.NoLabel)
-				end
-
-			end
-
-			-- Create display tab
-			me.Trials[i].tab = iup.vbox {
-						["tabtitle"] =L.Trial_TabName[i],
-						me.Trials[i].box,
-						iup.fill{},
-				}
-		end
+		dofile "./data/make_box.lua"

+		make_a_tab(playerID, dung, accounts[acc], "Public",Pub_Dat_Char)

-		-- Create Pub Dungeon Achievements Box==========================
-		me.Pub_box = iup.matrix {numcol=4, numcol_visible=4,  numlin=5, widthdef=100}
-		iup.SetAttribute(me.Pub_box, "READONLY", "YES")
-		me.Pub_box.dat = Pub_Dat_Char
-		me.Pub_box.ach = thischar.ach
-		me.Pub_box.mousemove_cb = box_mousemove_cb
-		me.Pub_box.leavewindow_cb = box_leavewindow_cb

-		for i=1, 4 do  -- Load text
-			me.Pub_box:setcell(0,i, Area_names[i].long)
+		for _,i in ipairs(Trials_Order) do
+			make_a_tab(playerID, dung, accounts[acc], i,Trials_Dat[i])
 		end

-		iup.SetAttribute(me.Pub_box,  "BGCOLOR" , BG_Colour_Not_Complete)
-
-		for id,_ in pairs (Pub_Dat_Char.id) do
-			local bgcolour = "BGCOLOR" .. Pub_Dat_Char.id[id].L .. ":" .. Pub_Dat_Char.id[id].C
-			if thischar.ach[id] ~= nil then
-				iup.SetAttribute(me.Pub_box, bgcolour, BG_Colour_Complete)
-				-- Add char to dungeon
-				local key = tostring(Pub_Dat_Char.id[id].L .. Pub_Dat_Char.id[id].C)
-				if dung.pub.key[key] == nil then	-- Add if needed
-					dung.pub.key[key]  = {}
-				end
-				dung.pub.key[key][playerID] = true
-			else
-				iup.SetAttribute(me.Pub_box, bgcolour, BG_Colour_Not_Complete)
-			end
+		for _,i in ipairs(Group_Order) do
+			make_a_tab(playerID, dung, accounts[acc], i,Group_Dat[i])
 		end

-		if thischar.ach[1068] ~= nil then  --EP Conqueror
-				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:1", Colour_Heading_Complete)
-		end
+		make_a_tab(playerID, dung, accounts[acc], "DLC Group" , DLC_Grp_Dat)

-		if thischar.ach[1070] ~= nil then  --DC Conqueror
-				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:2", Colour_Heading_Complete)
-		end
-
-		if thischar.ach[1069] ~= nil then  --AD Conqueror
-				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:3", Colour_Heading_Complete)
-		end
-
-		for id,dat in pairs (Pub_Dat_Char.id) do  -- Load text
-				local key = tostring(tostring(dat.L) .. tostring(dat.C))	-- make name key
-				local dname = pub_names[key]
-					if dname == nil then
-				dname = "key " .. key .." not found in pub_names"
-				end
-				me.Pub_box:setcell(dat.L,dat.C,dname)
-		end

 		-- Create Locations Box==============================================
 		me.Map_box= iup.matrix {numcol=6, numcol_visible=6,  numlin=0, widthdef=70}
@@ -715,10 +421,10 @@ end
 			end
 		Line= Line +1
 		end
-
 -- Create WorldBoss Achievements Box==========================

 		me.WB_box= Location_Box()
+		-- print("Done WB Box")
 		Populate_Dat(me.WB_box, WB_dat,me.ach)


@@ -727,52 +433,150 @@ end
 		me.SQ_box= Location_Box()
 		Populate_Dat(me.SQ_box, SQ_dat,me.ach)

-
 --========== DLC

-		me.DLC_box= iup.matrix {numcol=7, numcol_visible=7,  numlin=4, widthdef=115}
-		iup.SetAttribute(me.DLC_box, "READONLY", "YES")
-		me.DLC_box.dat = DLC_Dat
-		me.DLC_box.ach = thischar.ach
-		me.DLC_box.mousemove_cb = box_mousemove_cb
-		me.DLC_box.leavewindow_cb = box_leavewindow_cb
-		--Set Column titles
-
-		me.DLC_box:setcell(0,1, Area_names[6].long)		-- Orsinium
-		me.DLC_box:setcell(0,2, Area_names[8].long)		-- IC
-		me.DLC_box:setcell(0,3, Area_names[9].long)		-- Hist
-		me.DLC_box:setcell(0,4, Area_names[10].long)	-- Horns
-		me.DLC_box:setcell(0,5, Area_names[11].long)	-- Bones
---		me.DLC_box:setcell(0,6, Area_names[12].long)	-- VVardenfell
-		me.DLC_box:setcell(0,6, Area_names[14].long)	-- Wolf
-		me.DLC_box:setcell(0,7, Area_names[15].long)	-- Murk
-
-		for id,_ in pairs (DLC_Dat.id) do
-				local L = DLC_Dat.id[id].L
-				local C = DLC_Dat.id[id].C
-				local key = tostring(L).. tostring(C)	-- make name key
-				me.DLC_box:setcell(L, C, DLC_Location_names[key])
-		end
+		me.DLC2 = {}
+		me.DLC2_tabs = iup.flattabs{}		-- we add our tabs to here for display. (list of vboxes)


-		-- set text to black and bg to green if achievement found.
-		for id,_ in pairs (DLC_Dat.id) do
-			local bgcolour = "BGCOLOR" .. DLC_Dat.id[id].L .. ":" .. DLC_Dat.id[id].C
-			if thischar.ach[id] ~= nil then
-				iup.SetAttribute(me.DLC_box, bgcolour, BG_Colour_Complete)
-				-- Add char to dungeon
-				key = tostring(DLC_Dat.id[id].L .. DLC_Dat.id[id].C)
-				dung.DLC.key[key][playerID] = true
-			else
-				iup.SetAttribute(me.DLC_box, bgcolour, BG_Colour_Not_Complete)
+		local wrap_size = math.floor(250/3.7)
+	--	print ("wrap_size:  "  .. wrap_size)
+
+
+		for i,dlc in ipairs (DLC_Order) do
+
+
+			me.DLC2[dlc] = {}
+			me.DLC2[dlc].box = iup.matrixex {READONLY="YES", numcol=4, numcol_visible=4, numlin=#DLC_Dat2[dlc].line}
+			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH1", 50)
+			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH2", 130)
+			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH3", 250)		--Size is about 1/4 of character
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT1", "ACENTER")
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT2", "ALEFT")
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT3", "ALEFT")
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT4", "ALEFT")
+			me.DLC2[dlc].box:setcell(0, 1, L.Ach_ID)
+			me.DLC2[dlc].box:setcell(0, 2, L.Achievement)
+			me.DLC2[dlc].box:setcell(0, 4, L.Completed)
+			me.DLC2[dlc].box.name = dlc2
+
+				-- Filter for text on DLC2
+			me.DLC2[dlc].filter_l = iup.list{editbox="YES", SIZE="80x60"}
+			me.DLC2[dlc].filter_r = iup.list{editbox="YES", SIZE="80x60"}
+			me.DLC2[dlc].filter_tog = iup.toggle{title=L.Filter}
+			me.DLC2[dlc].filter_vet = iup.toggle{title=L.Vet}
+			me.DLC2[dlc].filter_vanq = iup.toggle{title=L.Vanquisher}
+			me.DLC2[dlc].filter_conq = iup.toggle{title=L.Conqueror}
+
+			me.DLC2[dlc].filter_f = iup.frame {
+								iup.hbox{
+									me.DLC2[dlc].filter_l,
+									iup.space{size=20},
+									me.DLC2[dlc].filter_r,
+									iup.space{size=20},
+									iup.vbox {
+										me.DLC2[dlc].filter_tog,
+										me.DLC2[dlc].filter_vet,
+										me.DLC2[dlc].filter_vanq,
+										me.DLC2[dlc].filter_conq,
+										},
+									},
+								}
+
+
+
+			me.DLC2[dlc].filter_f.title =  L.Filter
+			me.DLC2[dlc].filter_f.margin = "15x5"
+
+
+			me.DLC2[dlc].filter = function (v)		-- vi is 1 or 0
+				for l =1, #DLC_Dat2[dlc].line do
+					--	print("Get:" .. me.DLC2[dlc].box:getcell(l, 3))
+					if v == 1 then
+						if  string.find (me.DLC2[dlc].box:getcell(l, 3), L.Vet) ~= nil then
+							iup.SetAttribute(me.DLC2[dlc].box,"VISIBLELIN" .. tostring(l) , "NO")
+						else
+							iup.SetAttribute(me.DLC2[dlc].box,"VISIBLELIN" .. tostring(l) , "YES")
+						end
+					else
+						iup.SetAttribute(me.DLC2[dlc].box,"VISIBLELIN" .. tostring(l) , "YES")
+					end
+
+				end
+
+			 end
+
+			local thistog=me.DLC2[dlc].filter_vet
+
+			function thistog:action(v)
+				me.DLC2[dlc].filter(v)
 			end
-		end

-		if thischar.ach[1248] ~= nil then  --"Hero of Wrothgar",
-				iup.SetAttribute(me.DLC_box,  "BGCOLOR0:1", Colour_Heading_Complete)
+
+
+
+			--Add data
+			for line,id in ipairs(DLC_Dat2[dlc].line) do
+				if Ach_Detail[id] == nil then
+					print("Ach id: " .. id .. " in DLC but not in master data.")
+					break
+				end
+				me.DLC2[dlc].box:setcell(line, 1, tostring(id))
+				me.DLC2[dlc].box:setcell(line, 2, Ach_Detail[id].name)
+
+				local split = split_w(Ach_Detail[id].description)			-- Split into array of words
+				local flow  = flow_w(split, wrap_size)
+			--	print(join_s(flow))
+			--	print("")
+				me.DLC2[dlc].box:setcell(line, 3, join_s(flow))
+				iup.SetAttribute(me.DLC2[dlc].box,"FITTOTEXT", "L".. tostring(line))
+
+
+				local bgcolour1 = "BGCOLOR" .. tostring(line) .. ":1"	--Detail and Description Columns
+				local bgcolour2 = "BGCOLOR" .. tostring(line) .. ":2"
+				local bgcolour3 = "BGCOLOR" .. tostring(line) .. ":3"
+				local bgcolour4 = "BGCOLOR" .. tostring(line) .. ":4"
+				if thischar.ach[id] ~= nil then
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour1, BG_Colour_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour2, BG_Colour_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour3, BG_Colour_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour4, BG_Colour_Complete)
+					me.DLC2[dlc].box:setcell(line, 4, os.date(dateformat,thischar.ach[id].time))
+
+
+					-- Add char to dungeon
+	--				key = tostring(DLC_Dat.id[id].L .. DLC_Dat.id[id].C)
+	--				dung.DLC.key[key][playerID] = true
+				else
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour1, BG_Colour_Not_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour2, BG_Colour_Not_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour3, BG_Colour_Not_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour4, BG_Colour_Not_Complete)
+				end
+			end	--lines in box
+
+			-- make a tab out that DLC.
+			me.DLC2[dlc].tab = iup.vbox{
+				iup.hbox{
+					me.DLC2[dlc].box,
+			--		me.DLC2[dlc].filter_f,
+				},
+				iup.fill{}
+			}
+			me.DLC2[dlc].tab.tabtitle=DLC_Names[i]
+
+
+			--Check for Special Completion
+			if (DLC_Dat2[dlc].complete ~= nil and thischar.ach[DLC_Dat2[dlc].complete]) then
+			 -- print(me.name ..  "  Complete.")
+
+			end
+
+			iup.Append(me.DLC2_tabs,me.DLC2[dlc].tab)			--Accumulate here for display
+--]]
 		end

-	 -- ====================================
+--====================================
 	--  == Prepare for the character data display tabs
 		me.tab = iup.vbox{
 					["tabtitle"] = me.name,		-- This vbox will be a tab and the tab text is this
@@ -792,28 +596,6 @@ end
 					iup.label{SEPARATOR="HORIZONTAL"}
 					}

-		me.data_tabs = iup.tabs{} --Data tabs for Char
-		-- All Grp Dungeons
-		for _,i in ipairs (Grp_Order) do
-			if me.isvet or me.Grp[i].vet == false then
-				-- non vet chars only see non-vet dungeons
-				iup.Append(me.data_tabs, me.Grp[i].tab)
-			end
-		end
-
-		-- All Trials Dungeons
-		for _,i in ipairs (Trials_Order) do
-			if me.isvet or me.Trials[i].vet == false then
-				-- non vet chars only see non-vet dungeons
-				iup.Append(me.data_tabs, me.Trials[i].tab)
-			end
-		end
-
-		iup.Append(me.data_tabs,	iup.vbox {	["tabtitle"] =L.PubDungeon,
-												iup.label{title=L.PubLab,expand="HORIZONTAL"},
-												me.Pub_box,
-												iup.fill{}
-											})
 		if me.isvet then
 		--[[
 		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.VetDungeon,
@@ -852,18 +634,21 @@ end
 												me.SQ_box.Detail_zbox,
 												iup.fill{}
 											})
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.DLC,
-												iup.label{title=L.DLCLab,expand="HORIZONTAL"},
-												me.DLC_box,
-												iup.fill{}
-											})


-		iup.Append(me.tab,me.data_tabs)
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] ="DLC2",
+						iup.label{title=L.DLCLab,expand="HORIZONTAL"},
+						me.DLC2_tabs,
+						iup.fill{},
+					})
+
+

-		iup.Append(accounts[acc].char_tabs,me.tab)
+		iup.Append(me.tab,me.data_tabs)		-- Add Dungeons/Data under the Character

-		local wide =((#accounts[acc].playerIDs+1) * 110)
+		iup.Append(accounts[acc].char_tabs,me.tab) -- Add Char tab to Account
+
+		local wide =((#accounts[acc].AllplayerIDs+1) * 110)
 		if wide < 690  then
 			wide = 690
 		elseif wide >960 then
@@ -877,141 +662,84 @@ end
 iup.Append(accounts[acc].char_tabs, accounts[acc].log_tab)

 --=================  END OF CHARACTER MODE DISPLAY
+
 --=================  START OF DUNGEON MODE DISPLAY
+-- Generic function for populating dungeon mode boxes

-   -- Generic function for populating these tables
-	populate = function(ADung,Grp_key)
-		if ADung.key == nil  then
-			print ("ADung.key  is nil (fatal)")
-		end
+populate = function(ADung)
+-- For the Dungeon Mode Dungeon, process the keys table and set the Box contents.

-		ADung.ShowColumn = {}		-- Save Column Completion Information
-		-- Set Column Show Information to false
-		for col,playerID in ipairs(accounts[acc].playerIDs) do
-			ADung.ShowColumn[col] = false
-		end
+	if ADung == nil then
+		print("Populate: ADung is nil")
+		return
+	end

+	if ADung.box == nil then
+		print("Populate: ADung.box is nil")
+		return
+	end

-		for line, key in ipairs(Grp_key) do  -- for lines going down, get the key
+	ADung.ShowColumn = {}		-- Save Column Completion Information
+	-- Set Column Show Information to false
+	for col,playerID in ipairs(accounts[acc].AllplayerIDs) do
+		ADung.ShowColumn[col] = false
+	end

-			-- does that char exist in the table. Check by PlayerID
-			for col,playerID in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-				if ADung.key[key] == nil  then
-					ADung.key[key] = {}
-				end

-				if ADung.key[key][playerID]  then
-					ADung.box:setcell(line,col, L.YesLabel)
-					iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Complete)
-				else
-					ADung.box:setcell(line,col, L.NoLabel)
-					iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Not_Complete)
-					ADung.ShowColumn[col] = true		-- flag entire column as not complete, thus to show it.
-				end
-			end
-		end
+		-- does that char exist in the keys table. Check by PlayerID
+	for col,playerID in ipairs(accounts[acc].AllplayerIDs) do	-- over each char in order
+		-- print("Populate2: "  .. "col: " .. col ..",  playerID:  " .. playerID)
+		for line, Ach in ipairs(ADung.box.dat.id) do
+			local line_bool = ADung.keys[line][playerID]

-		--Ok, Set the Column Width flag Hide sometimes
-		--And column Heading background Always
-		for col,state in pairs(ADung.ShowColumn) do
-			if state then
-				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Not_Complete)
+			--	print("   Populate: "  .. "line " .. line)
+
+			if line_bool  then
+			--	print("   Populate2: "  .. "key: " .. key ..",  key_bool:  true")
+				ADung.box:setcell(line, col, L.YesLabel)
+				iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Complete)
 			else
-				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Complete)
+			--	print("   Populate2: "  .. "key: " .. key ..",  key_bool:  false")
+				ADung.box:setcell(line,col, L.NoLabel)
+				iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Not_Complete)
+				ADung.ShowColumn[col] = true		-- flag entire column as not complete, thus to show it.
 			end
 		end
-
-	end
-
-	-- Create Pub Dungeon Character Box=========================
-
-	dung.pub.box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#Pub_Dat_Char.key, widthdef=100}
-
-		dung.pub.box.dat = Pub_Dat_Char
---	dung.pub.box.mousemove_cb = box_mousemove_cb
-	dung.pub.box.leavewindow_cb = box_leavewindow_cb
-
-	--Set Line titles
-	for line,key in ipairs(Pub_Dat_Char.key) do
-		dung.pub.box:setcell(line, 0, pub_names[key])
 	end
-	--set lines
-	dung.pub.box:setcell(0,0, L.Location)

-	--Create Columns for Chars
-	for col ,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.pub.box:setcell(0, col, playerNames[playerID])
+	--Ok, Set the Column Width flag Hide sometimes
+	--And column Heading background Always
+	for col,state in pairs(ADung.ShowColumn) do
+		if state then
+			iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Not_Complete)
+		else
+			iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Complete)
+		end
 	end

-	iup.SetAttribute(dung.pub.box, "READONLY", "YES")
+end

-	-- Populate with character data ============================
-	-- print ("Populating Pub")
-	populate(dung.pub,Pub_Dat_Char.key)

-	-- Create Pub Dungeon Tab ==================================

-	dung.pub.tab = iup.vbox {
-						["tabtitle"] =L.Pub,
-						dung.pub.box,
-						iup.fill{},
-				}
+	-- Populate dungeons boxes with character data ============================

-	iup.Append(accounts[acc].dung_tabs, dung.pub.tab)
+	populate(dung["Public"])
+	populate(dung["DLC Group"])

-	-- Grp Dungeons  ===========================================
-
-	for _,i in ipairs (Grp_Order) do
-		iup.Append(accounts[acc].dung_tabs, dung.Grp[i].tab)
-		-- Populate with character data ============================
-		-- print ("populate Grp,i: " .. i)
-		populate(dung.Grp[i], Grp_Dat[i].key)
+	for _,i in pairs(Trials_Order) do
+		populate(dung[i])
 	end

-	-- Create DLC Dungeon Character Box=========================
-
-	dung.DLC.box = iup.matrix {numcol=#accounts[acc].playerIDs ,  numlin=#DLC2key, widthdef=100}
-
-	dung.DLC.box.dat = DLC_Dat
---	dung.DLC.box.mousemove_cb = box_mousemove_cb
-	dung.DLC.box.leavewindow_cb = box_leavewindow_cb
-
-	--Set Line titles
-	for i, key in ipairs(DLC2key) do
-		dung.DLC.box:setcell(i, 0, DLC_Location_names[key])
-	end
-	--set lines
-	dung.DLC.box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs ) do
-		dung.DLC.box:setcell(0, i, playerNames[playerID])
+	for _,i in pairs(Group_Order) do
+		populate(dung[i])
 	end

-	iup.SetAttribute(dung.DLC.box, "READONLY", "YES")

-	populate(dung.DLC,DLC_Dat.key)
-
-
-	-- Create DLC Dungeon Tab ==================================
-	dung.DLC.tab = iup.vbox {
-						["tabtitle"] =L.DLC,
-						dung.DLC.box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.DLC.tab)


 -- Commented out because we expect all dung to be populated
 -- if #accounts[acc].playerIDs_vet > 0  then  -- skip vet and trials if no eligible chars

-		-- Create Trials  Tab ============================================
-		for _,i in ipairs (Trials_Order) do
-			iup.Append(accounts[acc].dung_tabs, dung.Trials[i].tab)
-			-- Populate with character data ============================
-		--	print ("populate Trials")
-			populate(dung.Trials[i], Trials_Dat[i].key)
-		end
-
 --end -- has vet chars

 end -- Accounts
diff --git a/HistOfflineBeta.lua b/HistOfflineBeta.lua
deleted file mode 100644
index f007ac5..0000000
--- a/HistOfflineBeta.lua
+++ /dev/null
@@ -1,1216 +0,0 @@
--- The MIT License (MIT) http://opensource.org/licenses/MIT
--- Copyright (c) 2014-2016 His Dad
-
--- Some code from the luatz project (MIT Licence)
-
--- Configuration ==========
---local dateformat = "%Y-%m-%d, %H:%M"
-dateformat_log = "%Y-%m-%d, %H:%M:%S"
-FG_Colour_Not_Complete = "#FFB67D"
-FG_Colour_Complete = "#000000"
-BG_Colour_Not_Complete = "#FFB67D"
-BG_Colour_Complete = "#A4FF5A"
-Colour_Heading_Complete = "#58FA58"
-local dname, key, count, ccount, colour, bgcolour
-
---force_lang = "fr"  --	or "de" or "fr"  for debugging
-
--- ========================
-version= "57-Beta-01"
-require( "iuplua" )
-require( "iupluacontrols" )
---require( "iupluamatrixex" )
-iup.SetGlobal("UTF8MODE","YES")
-dofile "../../SavedVariables/History.lua"
-Trials_Dat={}
-Trials_Order={"N","V","VH"}
-Grp_Dat={}
-
-Grp_Order={"1N","1V","1VH","2N","2V","2VH"}
-Grp1_Order={"1N","1V","1VH"}
-Grp2_Order={"2N","2V","2VH"}
-
-
-for _,i in ipairs(Grp_Order) do
-	Grp_Dat[i]={}
-end
-for _,i in ipairs(Trials_Order) do
-	Trials_Dat[i]={}
-end
-
-dofile "./data/Keys.lua"		--Linking tables, must do first
-dofile "./data/DLC.lua"			--Achievement to Grid lookup, language independent
-dofile "./data/Group1.lua"		-- Grp Mode 1 data, N, V, VH
-dofile "./data/Group2.lua"		-- Grp Mode 2 data, N, V, VH
-dofile "./data/Public.lua"
-dofile "./data/Quest2.lua"
-dofile "./data/Veteran.lua"		-- Auxiliary Achievements for Vet Dungeons
-dofile "./data/WB2.lua"
-dofile "./data/Trials.lua"
-dofile "./data/Special.lua"		-- Record of non standard Achievement ID's we need to keep.
-dofile "./data/utility.lua"		-- utility functions
-dofile "./data/Strings.lua"		-- String Handling
-
---generate_id ()			-- Generate the file the addon uses to filter Achievement ID's
--- This is used by the in game part history.lua to only record achievements that are used.
--- Uncomment when need to run.
-
-
--- generate achievement lookups from key (cell)
-for _,i in ipairs(Grp_Order) do
-	Grp_Dat[i].reverse_id = reverse_id(Grp_Dat[i].id)
-end
-
-for _,i in ipairs(Trials_Order) do
-	Trials_Dat[i].reverse_id = reverse_id(Trials_Dat[i].id)
-end
-
-Pub_Dat_Char.reverse_id = reverse_id(Pub_Dat_Char.id)
-DLC_Dat.reverse_id = reverse_id(DLC_Dat.id)
-
-lingua= {}		-- Translated data
-load_lang = function (lang)
-	if lingua[lang] ~= nil
-	then return
-	end
-
-	local path = "./data/" .. lang .. "/"
-
-	dofile (path .. lang .. ".lua")
-	dofile (path .. lang .."-data.lua")			--Achievement Data from game
-	lingua[lang] = {}
-
-	lingua[lang].Area_names = Area_names		-- dofile writes to global variables
-	lingua[lang].L = L
-	lingua[lang].pub_names = pub_names
-	lingua[lang].grp_names = grp_names
-	lingua[lang].DLC_Location_names = DLC_Location_names
-	lingua[lang].Ach_Detail = Ach_Detail
-end
-
-accounts = {}
-accounts_list = {}		-- String list for selection dialog
-playerNames = {}		-- Get name from ID.
-
-for acc,_ in pairs(History_SV["Default"]) do
-	accounts[acc] = {}
-	accounts[acc].worlds = {}
-	accounts[acc].hasblankworlds = false
-	accounts[acc].player = {}
-	accounts[acc].playerIDs = {}	-- intermediate table for sorting. WIP. Controls presentation order
-	accounts[acc].playerIDs_vet= {}	-- subset of names which are >L50
-	table.insert(accounts_list, acc)
-
-  -- ===	Load Language Tables
-    accounts[acc].lang = (History_SV["Default"][acc]["$AccountWide"].lang)
-	if accounts[acc].lang == nil then
-		accounts[acc].lang = "en"
-	end
-
-	if force_lang ~= nil then
-		accounts[acc].lang = force_lang	-- Force the language for testing
-	end
-	load_lang(accounts[acc].lang)
-	-- Reset Globals
-	Area_names = lingua[accounts[acc].lang].Area_names
-	L = lingua[accounts[acc].lang].L
-	pub_names = lingua[accounts[acc].lang].pub_names
-	grp_names = lingua[accounts[acc].lang].grp_names
-	DLC_Location_names = lingua[accounts[acc].lang].DLC_Location_names
-	Ach_Detail = lingua[accounts[acc].lang].Ach_Detail
--- load worlds
-	nworlds = 0
-	if History_SV["Default"][acc]["$AccountWide"]["worlds"] ~= nil then
-		for i,j in pairs(History_SV["Default"][acc]["$AccountWide"]["worlds"]) do
-			nworlds = nworlds +1
-			table.insert(accounts[acc].worlds, i)
-		end
-	end
-
--- insert marker for older chars
---	table.insert(accounts[acc].worlds, "##NEITHER##")
-
-
--- Load Character Data
-	for playerID, _ in pairs(History_SV["Default"][acc]["$AccountWide"]["data"]) do
-
-		if playerID == "" then
-		print("acct: " .. acc)
-		end
-		table.insert (accounts[acc].playerIDs, playerID)
-		accounts[acc].player[playerID] = {}		-- stub table to hold char data, later becomes "me"
---
-		local me = accounts[acc].player[playerID]											-- shorter reference: our code
-		local thischar = History_SV["Default"][acc]["$AccountWide"]["data"][playerID]	-- shorter reference: History DB
-		-- Pull in some char data for processing
-		if thischar.name == nil  then --	Old Format
-	--	    print("Old Format  " .. playerID)
-			me.name = playerID
-		else
-			me.name = thischar.name
-		end
-		playerNames[playerID]=me.name
-
-		-- == Gender
-		if thischar.Gender =="M" then
-			me.gender = L.Male
-		elseif thischar.Gender == "F" then
-			me.gender = L.Female
-		end
-		-- ==Level
-		local level = thischar.level
-
-		me.level = level
-		if (level <=50) then
-			me.levelstr = tostring(level)
-			me.isvet = false
-		else
-			me.levelstr = "V" .. tostring(level -50)
-			me.isvet = true
-			table.insert(accounts[acc].playerIDs_vet,playerID)
-		end
-		-- == Cumulative TimePlayed
-		if thischar.timeplayed == nil then
-			me.timeplayed = math.floor(thischar.levels[level].time/60)   -- Old version compat
-		else
-			me.timeplayed = math.floor(thischar.timeplayed/60)
-		end
-		-- world
-
-		if thischar.world == nil then
-			accounts[acc].hasblankworlds = true		-- causes display of "##NEITHER##
-		else
-			me.world = thischar.world		-- server
-		end
-
-		-- a quick link to my Achievements
-		me.ach = thischar.ach
-	end
-
-	table.sort(accounts[acc].playerIDs,function(a,b)  return (playerNames[a] < playerNames[b]) end)
-	table.sort(accounts[acc].playerIDs_vet,function(a,b) return (playerNames[a] < playerNames[b]) end)
-end
-
-
-
---[[ ==========================================
-	Iterate over all accounts and PlayerIDs creating display items
---]]
- for acc,_ in pairs (accounts) do
-
-  -- ====  Accountwide Data
-  -- Setup Log data
-	accounts[acc].logtabs  =iup.tabs{}
-	-- Log Display table presentation
-	accounts[acc].logtable = {}
-	accounts[acc].logtable=iup.matrix{numcol=2, numcol_visible=2,  numlin=0,numlin_visible=8}
-	accounts[acc].logtable:setcell(0,0, L.TStamp)
-	iup.SetAttribute(accounts[acc].logtable,  "ALIGNMENT0", "ACENTER")
-	iup.SetAttribute(accounts[acc].logtable,  "ALIGNMENT2", "ALEFT")
-	iup.SetAttribute(accounts[acc].logtable,  "WIDTH0", 80)
-	iup.SetAttribute(accounts[acc].logtable,  "WIDTH1", 100)
-	iup.SetAttribute(accounts[acc].logtable,  "WIDTH2", 300)
-	iup.SetAttribute(accounts[acc].logtable,  "READONLY", "YES")
-	-- Load log data
-
-	local Line=0
-	local TimeStr = ""
-	accounts[acc].logtable.numlin = Line
-	for _,j in ipairs (History_SV["Default"][acc]["$AccountWide"]["log"]) do
-		Line= Line +1
-		accounts[acc].logtable.numlin = Line
-		TimeStr = os.date(dateformat_log,j["TimeStamp"])
-		accounts[acc].logtable:setcell( Line,0, TimeStr)
-		if j["Char"] ~= nil then
-			accounts[acc].logtable:setcell( Line,1, j["Char"])
-		end
-		accounts[acc].logtable:setcell( Line,2, j["text"])
-	end
-
-	-- Setup Log Display
-	accounts[acc].log_tab=iup.vbox {
-			["tabtitle"] =L.LogTab,
-			accounts[acc].logtable,
-			iup.fill{}
-			}
-	-- Top Level Panels
-	-- accounts[acc].world_zbox = iup.zbox{}  -- display main panel containing worlds (servers)  -- not used ATM
-	accounts[acc].mode_zbox = iup.zbox{}  -- display submain panel containing tabs and dungeons
-	accounts[acc].char_tabs = iup.tabs{}  -- Top level of Char_Tabs, Character Info in Here
-	accounts[acc].dung_tabs = iup.tabs{}  -- Top level of Dung_Tabs, Dungeon  Info in Here
-
-
-	iup.Append(accounts[acc].mode_zbox, accounts[acc].char_tabs)
-
-	detail_name = iup.label {title="",expand = "HORIZONTAL"}
-	detail_desc = iup.label {title="",expand = "HORIZONTAL"}
-	Status_bar = iup.label{title=L.Welcome .. " " .. L.Version .. " " .. version .. ".", expand = "HORIZONTAL"}
-	iup.Append(accounts[acc].mode_zbox, accounts[acc].dung_tabs)
-
-
-
-  -- Mode Buttons (Toggles)
-  --[[  These control the display.
-   Char mode lists the characters and information for them (default for prior versions)
-   Dung Mode lists the dungeons and which characters have done them.
-   Buttons are arranged in radio mode
-   --]]
-
-   accounts[acc].char_tog = iup.toggle{ title = L.Characters}
-   accounts[acc].dung_tog = iup.toggle{ title = L.Dungeons}
-   accounts[acc].view_tog = iup.toggle{ title = L.View_Toggle, VISIBLE = "NO"}
-
-  local tog = accounts[acc].char_tog
-  function tog:action(x)
-	if x == 1 then
-	accounts[acc].mode_zbox.value =accounts[acc].char_tabs
-	iup.SetAttribute(accounts[acc].view_tog, "VISIBLE", "NO")
-	end
-  end
-
-
-  tog = accounts[acc].dung_tog
-  function tog:action(x)
-	if x == 1 then
-	accounts[acc].mode_zbox.value = accounts[acc].dung_tabs
-	iup.SetAttribute(accounts[acc].view_tog, "VISIBLE", "YES")
-	end
-  end
-
-
-
-
-  accounts[acc].mode = iup.frame {
-								iup.hbox{
-									iup.radio {
-										iup.hbox{
-												accounts[acc].char_tog,
-												accounts[acc].dung_tog,
-												},
-										},
-									accounts[acc].view_tog,
-									}
-								}
-  accounts[acc].mode.title =  L.Mode
-  accounts[acc].mode.margin = "15x5"
-
-
-
-  accounts[acc].alldungeons = {}
-  -- Prepare for Dungeon data recording as we iterate through characters.
-  accounts[acc].dung = {}		-- put all dungeon mode stuff here. Populate it with character data.
-  -- N Normal,   V Vet,    VH   Vet hard mode
-  dung = accounts[acc].dung
-  dung.pub = {}
-  dung.pub.box = {}
-  dung.pub.key = {}
-  dung.pub.name = "pub"
-  table.insert(accounts[acc].alldungeons,dung.pub)
-
-  dung.DLC = {}
-  dung.DLC.box = {}
-  dung.DLC.key = {}
-  dung.DLC.name = "DLC"
-  table.insert(accounts[acc].alldungeons,dung.DLC)
-  dung.Grp = {}		-- these ones are indexed.
-  dung.Trials = {}
-  tog = accounts[acc].view_tog
-
-  function tog:action(x)
-		if x == 1 then   --hide completed columns
-			for _, ADung in pairs (accounts[acc].alldungeons) do	-- for each dungeon
-			    if (ADung.ShowColumn == nil)  then
-					print ("ADung.ShowColumn is nil for " .. ADung.name)
-					break
-				end
-				for col,show in pairs(ADung.ShowColumn) do
-					if show  then
-						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"100")
-					else
-						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"0")
-					end
-				end  --]]
-			end
-		else   -- show all
-			for _, ADung in pairs (accounts[acc].alldungeons) do	-- for each dungeon
-			    if (ADung.ShowColumn == nil)  then
-					print ("ADung.ShowColumn is nil for " .. ADung.name)
-					break
-				end
-
-				for col,show in pairs(ADung.ShowColumn) do
-						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"100")
-				end
-			end
-		end
-	end
-
-  -- Set up dungeon mode Group Dungeons
-  for _,i in ipairs(Grp_Order) do
-	dung.Grp[i]= {}
-	dung.Grp[i].name = "Grp: " .. L.Grp_TabName[i]
-	dung.Grp[i].key ={}   -- key lookup
-	dung.Grp[i].box = iup.matrix {numcol=#accounts[acc].playerIDs,     numlin=_size(Grp_Dat[i].id), widthdef=100}
-	iup.SetAttribute(dung.Grp[i].box, "READONLY", "YES")
-
-	dung.Grp[i].tab = iup.vbox {
-						["tabtitle"] =L.Grp_TabName[i],
-						dung.Grp[i].box,
-						iup.fill{},
-					}
-
--- Mouseover
-	dung.Grp[i].box.dat = Grp_Dat[i]
---	dung.Grp[i].box.mousemove_cb = box_mousemove_cb
---	dung.Grp[i].box.leavewindow_cb = box_leavewindow_cb
-
-	--set lines Heading
-	dung.Grp[i].box:setcell(0,0, L.Location)
-	--Set Line titles
-	for line,key in ipairs(Grp_Dat[i].key) do
-		dung.Grp[i].box:setcell(line, 0, grp_names[key])
-	end
-
-	--Create Columns for Chars
-	for col ,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp[i].box:setcell(0, col, playerNames[playerID])
-	end
-
-	table.insert(accounts[acc].alldungeons,dung.Grp[i])
-  end
-
-  -- a table for each dungeon to which we add characters
-  for _,i in ipairs(Grp1_Order) do
-    for _,key in ipairs(grp1tokey) do
-	  dung.Grp[i].key[key] = {}
-	  for _,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp[i].key[key][playerID] = false
-	  end
-	end
-  end
-
-  for _,i in ipairs(Grp2_Order) do
-    for _,key in ipairs(grp2tokey) do
-	  dung.Grp[i].key[key] = {}
-	  for _,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp[i].key[key][playerID] = false
-	  end
-	end
-  end
-
-  -- Set up dungeon mode  Trials
-  for _,i in ipairs(Trials_Order) do
-		dung.Trials[i]= {}
-		dung.Trials[i].name = L.Trial_TabName[i]
-		dung.Trials[i].key ={}   -- key lookup
-		dung.Trials[i].box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=_size(Trials_Dat[i].id), widthdef=100}
-		iup.SetAttribute(dung.Trials[i].box, "READONLY", "YES")
-
-		dung.Trials[i].tab = iup.vbox {
-							["tabtitle"] =L.Trial_TabName[i],
-							dung.Trials[i].box,
-							iup.fill{},
-						}
-		dung.Trials[i].box.dat = Trials_Dat[i]
-	--	dung.Trials[i].box.mousemove_cb = box_mousemove_cb
-		dung.Trials[i].box.leavewindow_cb = box_leavewindow_cb
-
-
-		--set lines Heading
-		dung.Trials[i].box:setcell(0,0, L.Location)
-		--Set Line titles
-		for line,key in ipairs(Trials_Dat[i].key) do
-			dung.Trials[i].box:setcell(line, 0, Trials_Names[i][key])
-		end
-
-		--Create Columns for Chars
-		for col ,playerID in ipairs(accounts[acc].playerIDs) do
-			dung.Trials[i].box:setcell(0, col, playerNames[playerID])
-		end
-
-
-
-		-- a table for each dungeon to which we add characters
-		for _,key in ipairs(Trials2key[i]) do
-		  dung.Trials[i].key[key] = {}
-		  for _,playerID in ipairs(accounts[acc].playerIDs) do
-			dung.Trials[i].key[key][playerID] = false
-		  end
-		end
-		table.insert(accounts[acc].alldungeons,dung.Trials[i])
-  end
-
-
-
-
---  for _,i in ipairs(Pub_Dat_Char.key) do
---	  dung.pub.key[i] = {}
---  end
-
-  for _,i in ipairs(DLC2key) do
-	  dung.DLC.key[i] = {}
-  end
-
-  -- ================  END Accountwide Data
-
-  --=================  START OF CHARACTER MODE DISPLAY
-
--- Creates boxes, stage from names to allow sorting
-	for _,playerID in ipairs(accounts[acc].playerIDs) do
-		local me = accounts[acc].player[playerID]											-- shorter reference: our code
-		local thischar = History_SV["Default"][acc]["$AccountWide"]["data"][playerID]	-- shorter reference: History DB
-
-
-		-- Generate the leveling box.  ============================
-
-		me.leveling_box = iup.matrix {numcol=6, numcol_visible=6,  widthdef=60}
-		me.leveling_box:setcell(0,1, L.Level)
-		me.leveling_box:setcell(0,2, L.PTime)
-		me.leveling_box:setcell(0,3, L.Start)
-		me.leveling_box:setcell(0,4, L.Deaths)
-		me.leveling_box:setcell(0,5, L.APts)
-		me.leveling_box:setcell(0,6, L.Location)
-		iup.SetAttribute(me.leveling_box, "WIDTH6", "100")
-		iup.SetAttribute(me.leveling_box, "READONLY", "YES")
-
-
-		-- levels as stored are unsorted, so create a level table which is sorted,
-		local levels = {}
-		for i,_ in pairs(thischar.levels) do
-			table.insert(levels, i)
-		end
-
-		table.sort(levels)
-
-		for i,j in ipairs(levels) do		-- traverse in sorted order
-			local timelevel = math.floor(thischar.levels[j].time)
-			me.leveling_box.numlin = i
-			me.leveling_box:setcell(i,1, j)
-			me.leveling_box:setcell(i,2, math.floor(timelevel/60))
-			me.leveling_box:setcell(i,3, os.date("%Y-%m-%d",thischar.levels[j].begin))
-			me.leveling_box:setcell(i,4, thischar.levels[j].deaths)
-			me.leveling_box:setcell(i,5, thischar.levels[j].Ach_Points)
-			-- Do we have map name for this level?
-			if thischar.levels[j].map ~= nil then
-				me.leveling_box:setcell(i,6, thischar.levels[j].map)
-			end
-		end
-		-- Create Grp Dungeon Boxes ====================================
-		me.Grp ={}		-- Put them all together
-
-		for _, i in ipairs(Grp_Order) do		-- For Each Grp Dungeon
-			me.Grp[i] = {}						--  Dungeon data storage
-			me.Grp[i].vet = Grp_Dat[i].vet
-			me.Grp[i].box = iup.matrix {numcol=4, numcol_visible=4,  numlin=Grp_Dat[i].lines, widthdef=100}
-			iup.SetAttribute(me.Grp[i].box, "READONLY", "YES")
-
-			me.Grp[i].box.ach = thischar.ach		-- Put the Achievements here so the mouseover can get the users details
-			me.Grp[i].box.dat = Grp_Dat[i]		-- for mouseover
-			me.Grp[i].box.mousemove_cb = box_mousemove_cb
-			me.Grp[i].box.leavewindow_cb = box_leavewindow_cb
-
-			--Set Column titles in box
-			for j=1, 4 do
-				me.Grp[i].box:setcell(0,j, Area_names[j].long)
-			end
-
-
-			-- set background to red
-		--	iup.SetAttribute(me.Grp[i].box,  "BGCOLOR", BG_Colour_Not_Complete)
-
-			-- set text to black if achievement found.
-
-			for id, Gdat in pairs (Grp_Dat[i].id) do
-				local bgcolour,key
-				if thischar.ach[id] ~= nil then
-					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
-					iup.SetAttribute(me.Grp[i].box, bgcolour, BG_Colour_Complete)
-					-- Add char to dungeon
-					key = tostring(Gdat.L .. Gdat.C)
-					if  dung.Grp[i].key[key] == nil then
-						print ("dung.Grp[i].key[key]   key:  " .. key .. " is nil.")
-					end
-					dung.Grp[i].key[key][playerID] = true
-				else
-					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
-					iup.SetAttribute(me.Grp[i].box, bgcolour, BG_Colour_Not_Complete)
-				end
-			end
-
-			-- Create display tab
-			me.Grp[i].tab = iup.vbox {
-						["tabtitle"] =L.Grp_TabName[i],
-						me.Grp[i].box,
-						iup.fill{},
-				}
-		end
-
-		-- these IDs are in Specials.lua
-		--Set background of heading if all done
-		if thischar.ach[1073] ~= nil then  --EP Vanquisher
-				iup.SetAttribute(me.Grp["1N"].box,  "BGCOLOR0:1", Colour_Heading_Complete)
-		end
-
-		if thischar.ach[1074] ~= nil then  --DC Vanquisher
-				iup.SetAttribute(me.Grp["1N"].box ,  "BGCOLOR0:2", Colour_Heading_Complete)
-		end
-
-		if thischar.ach[1075] ~= nil then  --AD Vanquisher
-				iup.SetAttribute(me.Grp["1N"].box ,  "BGCOLOR0:3", Colour_Heading_Complete)
-		end
-
-		for _,i in ipairs(Grp_Order) do
-			for _, id in pairs (Grp_Dat[i].id) do
-				local key = tostring(id.L).. tostring(id.C)	-- make name key
-				me.Grp[i].box:setcell(id.L, id.C, grp_names[key])
-			end
-		end
-
-		-- Create Trials Dungeon Boxes ====================================
-		me.Trials ={}		-- Put them all together
-
-		for _, i in ipairs(Trials_Order) do		-- For Each Dungeon
-			me.Trials[i] = {}						-- Dungeon data storage
-			me.Trials[i].vet = Trials_Dat[i].vet
-			me.Trials[i].box = iup.matrix {numcol=1, numcol_visible=1, numlin=_size(Trials_Dat[i].id), widthdef=110}
-
-			me.Trials[i].box.ach = thischar.ach		-- Put the Achievements here so the mouseover can get the users details
-			me.Trials[i].box.dat = Trials_Dat[i]		-- for mouseover
-			me.Trials[i].box.mousemove_cb = box_mousemove_cb
-			me.Trials[i].box.leavewindow_cb = box_leavewindow_cb
-
-			--Set Column titles in box
-			for line,key in ipairs (Trials2key[i]) do  -- Load Dungeons Name. Info LC is the Dungeon Identifier
-					me.Trials[i].box:setcell(line,0, Trials_Names[i][key])
-			end
-
-			iup.SetAttribute(me.Trials[i].box,  "WIDTH0", "170")		-- Ach Description, is Col 0
-
-			iup.SetAttribute(me.Trials[i].box,  "BGCOLOR*:1", BG_Colour_Not_Complete)
-			--iup.SetAttribute(me.Trials[i].box,  "FGCOLOR*:1", "DEFAULT")
-			-- set text if achievement found and change background
-			for id, Gdat in pairs (Trials_Dat[i].id) do
-				local bgcolour
-				if thischar.ach[id] ~= nil then
-					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
-					me.Trials[i].box:setcell(Gdat.L,Gdat.C, L.YesLabel)
-					iup.SetAttribute(me.Trials[i].box, bgcolour, BG_Colour_Complete)
-					-- Add char to dungeon
-					dung.Trials[i].key[Gdat.key][playerID] = true
-				else
-					me.Trials[i].box:setcell(Gdat.L,Gdat.C, L.NoLabel)
-				end
-
-			end
-
-			-- Create display tab
-			me.Trials[i].tab = iup.vbox {
-						["tabtitle"] =L.Trial_TabName[i],
-						me.Trials[i].box,
-						iup.fill{},
-				}
-		end
-
-
-		-- Create Pub Dungeon Achievements Box==========================
-		me.Pub_box = iup.matrix {READONLY="YES",numcol=4, numcol_visible=4,  numlin=5, widthdef=100}
-		iup.SetAttribute(me.Pub_box, "READONLY", "YES")
-		me.Pub_box.dat = Pub_Dat_Char
-		me.Pub_box.ach = thischar.ach
-		me.Pub_box.mousemove_cb = box_mousemove_cb
-		me.Pub_box.leavewindow_cb = box_leavewindow_cb
-
-		for i=1, 4 do  -- Load text
-			me.Pub_box:setcell(0,i, Area_names[i].long)
-		end
-
-		iup.SetAttribute(me.Pub_box,  "BGCOLOR" , BG_Colour_Not_Complete)
-
-		for id,_ in pairs (Pub_Dat_Char.id) do
-			local bgcolour = "BGCOLOR" .. Pub_Dat_Char.id[id].L .. ":" .. Pub_Dat_Char.id[id].C
-			if thischar.ach[id] ~= nil then
-				iup.SetAttribute(me.Pub_box, bgcolour, BG_Colour_Complete)
-				-- Add char to dungeon
-				local key = tostring(Pub_Dat_Char.id[id].L .. Pub_Dat_Char.id[id].C)
-				if dung.pub.key[key] == nil then	-- Add if needed
-					dung.pub.key[key]  = {}
-				end
-				dung.pub.key[key][playerID] = true
-			else
-				iup.SetAttribute(me.Pub_box, bgcolour, BG_Colour_Not_Complete)
-			end
-		end
-
-		if thischar.ach[1068] ~= nil then  --EP Conqueror
-				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:1", Colour_Heading_Complete)
-		end
-
-		if thischar.ach[1070] ~= nil then  --DC Conqueror
-				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:2", Colour_Heading_Complete)
-		end
-
-		if thischar.ach[1069] ~= nil then  --AD Conqueror
-				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:3", Colour_Heading_Complete)
-		end
-
-		for id,dat in pairs (Pub_Dat_Char.id) do  -- Load text
-				local key = tostring(tostring(dat.L) .. tostring(dat.C))	-- make name key
-				local dname = pub_names[key]
-					if dname == nil then
-				dname = "key " .. key .." not found in pub_names"
-				end
-				me.Pub_box:setcell(dat.L,dat.C,dname)
-		end
-
-		-- Create Locations Box==============================================
-		me.Map_box= iup.matrix {numcol=6, numcol_visible=6,  numlin=0, widthdef=70}
-
-		me.Map_box:setcell(0,0, L.Location)
-		me.Map_box:setcell(0,1, L.Visits)
-		me.Map_box:setcell(0,2, L.FirstVisited)
-		me.Map_box:setcell(0,3, L.FirstLevel)
-		me.Map_box:setcell(0,4, L.TimesLeveled)
-		me.Map_box:setcell(0,5, L.FirstDeath)
-		me.Map_box:setcell(0,6, L.Deaths)
-
-		iup.SetAttribute(me.Map_box, "READONLY", "YES")
-		iup.SetAttribute(me.Map_box, "ALIGNMENT0", "ALEFT")
-		iup.SetAttribute(me.Map_box, "WIDTH0", "100")
-		iup.SetAttribute(me.Map_box, "WIDTH1", "40")
-		iup.SetAttribute(me.Map_box, "WIDTH4", "55")
-		iup.SetAttribute(me.Map_box, "WIDTH6", "40")
-
-
-		local map_names = {}
-		for map,_ in pairs(thischar.maps) do
-			table.insert(map_names,map)
-		end
-
-		table.sort(map_names)
-		local Line =1
-		for _, map in ipairs(map_names) do
-			me.Map_box.numlin = Line
-
-			me.Map_box:setcell( Line,0, map)
-
-			if thischar.maps[map].visit ~= nil then
-				me.Map_box:setcell( Line,1, thischar.maps[map].visit)
-			end
-
-			if thischar.maps[map].firstvisitdate ~= nil then
-				local firstvisit = os.date(dateformat,thischar.maps[map].firstvisitdate)
-				me.Map_box:setcell( Line,2, firstvisit)
-			end
-
-			if thischar.maps[map].firstlevel ~= nil then
-				me.Map_box:setcell( Line,3, thischar.maps[map].firstlevel)
-			end
-
-			if thischar.maps[map].timeslevel ~= nil then
-				me.Map_box:setcell( Line,4, thischar.maps[map].timeslevel)
-			end
-
-			if thischar.maps[map].firstdeathlevel ~= nil then
-				me.Map_box:setcell( Line,5, thischar.maps[map].firstdeathlevel)
-			end
-
-			if thischar.maps[map].deaths ~= nil then
-				me.Map_box:setcell( Line,6, thischar.maps[map].deaths )
-			end
-		Line= Line +1
-		end
--- Create WorldBoss Achievements Box==========================
-
-		me.WB_box= Location_Box()
-		print("Done WB Box")
-		Populate_Dat(me.WB_box, WB_dat,me.ach)
-
-
--- Create SkillQuest Achievements Box==========================
-
-		me.SQ_box= Location_Box()
-		Populate_Dat(me.SQ_box, SQ_dat,me.ach)
-
---========== DLC
-
-		me.DLC_box= iup.matrix {numcol=7, numcol_visible=7,  numlin=4, widthdef=115}
-		iup.SetAttribute(me.DLC_box, "READONLY", "YES")
-		me.DLC_box.dat = DLC_Dat
-		me.DLC_box.ach = thischar.ach
-		me.DLC_box.mousemove_cb = box_mousemove_cb
-		me.DLC_box.leavewindow_cb = box_leavewindow_cb
-		--Set Column titles
-
-		me.DLC_box:setcell(0,1, Area_names[6].long)		-- Orsinium
-		me.DLC_box:setcell(0,2, Area_names[8].long)		-- IC
-		me.DLC_box:setcell(0,3, Area_names[9].long)		-- Hist
-		me.DLC_box:setcell(0,4, Area_names[10].long)	-- Horns
-		me.DLC_box:setcell(0,5, Area_names[11].long)	-- Bones
---		me.DLC_box:setcell(0,6, Area_names[12].long)	-- VVardenfell
-		me.DLC_box:setcell(0,6, Area_names[14].long)	-- Wolf
-		me.DLC_box:setcell(0,7, Area_names[15].long)	-- Murk
-
-		for id,_ in pairs (DLC_Dat.id) do
-				local L = DLC_Dat.id[id].L
-				local C = DLC_Dat.id[id].C
-				local key = tostring(L).. tostring(C)	-- make name key
-				me.DLC_box:setcell(L, C, DLC_Location_names[key])
-		end
-
-
-		-- set text to black and bg to green if achievement found.
-		for id,_ in pairs (DLC_Dat.id) do
-			local bgcolour = "BGCOLOR" .. DLC_Dat.id[id].L .. ":" .. DLC_Dat.id[id].C
-			if thischar.ach[id] ~= nil then
-				iup.SetAttribute(me.DLC_box, bgcolour, BG_Colour_Complete)
-				-- Add char to dungeon
-				key = tostring(DLC_Dat.id[id].L .. DLC_Dat.id[id].C)
-				dung.DLC.key[key][playerID] = true
-			else
-				iup.SetAttribute(me.DLC_box, bgcolour, BG_Colour_Not_Complete)
-			end
-		end
-
-		if thischar.ach[1248] ~= nil then  --"Hero of Wrothgar",
-				iup.SetAttribute(me.DLC_box,  "BGCOLOR0:1", Colour_Heading_Complete)
-		end
-
-		me.DLC2 = {}
-		me.DLC2_tabs = iup.flattabs{}		-- we add our tabs to here for display. (list of vboxes)
-
-
-		local wrap_size = math.floor(250/3.7)
-	--	print ("wrap_size:  "  .. wrap_size)
-		for i,dlc in ipairs (DLC_Order) do
-
-			me.DLC2[dlc] = {}
-			me.DLC2[dlc].box = iup.matrixex {READONLY="YES", numcol=4, numcol_visible=4, numlin=#DLC_Dat2[dlc].line}
-			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH1", 50)
-			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH2", 130)
-			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH3", 250)		--Size is about 1/4 of character
-			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT1", "ACENTER")
-			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT2", "ALEFT")
-			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT3", "ALEFT")
-			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT4", "ALEFT")
-			me.DLC2[dlc].box:setcell(0, 1, L.Ach_ID)
-			me.DLC2[dlc].box:setcell(0, 2, L.Achievement)
-			me.DLC2[dlc].box:setcell(0, 4, L.Completed)
-			me.DLC2[dlc].box.name = dlc2
-
-				-- Filter for text on DLC2
-			me.DLC2[dlc].filter_l = iup.list{editbox="YES", SIZE="80x60"}
-			me.DLC2[dlc].filter_r = iup.list{editbox="YES", SIZE="80x60"}
-			me.DLC2[dlc].filter_tog = iup.toggle{title=L.Filter}
-			me.DLC2[dlc].filter_vet = iup.toggle{title=L.Vet}
-			me.DLC2[dlc].filter_vanq = iup.toggle{title=L.Vanquisher}
-			me.DLC2[dlc].filter_conq = iup.toggle{title=L.Conqueror}
-
-			me.DLC2[dlc].filter_f = iup.frame {
-								iup.hbox{
-									me.DLC2[dlc].filter_l,
-									iup.space{size=20},
-									me.DLC2[dlc].filter_r,
-									iup.space{size=20},
-									iup.vbox {
-										me.DLC2[dlc].filter_tog,
-										me.DLC2[dlc].filter_vet,
-										me.DLC2[dlc].filter_vanq,
-										me.DLC2[dlc].filter_conq,
-										},
-									},
-								}
-
-
-
-			me.DLC2[dlc].filter_f.title =  L.Filter
-			me.DLC2[dlc].filter_f.margin = "15x5"
-
-
-			me.DLC2[dlc].filter = function (v)		-- vi is 1 or 0
-				for l =1, #DLC_Dat2[dlc].line do
-						print("Get:" .. me.DLC2[dlc].box:getcell(l, 3))
-					if v == 1 then
-						if  string.find (me.DLC2[dlc].box:getcell(l, 3), L.Vet) ~= nil then
-							iup.SetAttribute(me.DLC2[dlc].box,"VISIBLELIN" .. tostring(l) , "NO")
-						else
-							iup.SetAttribute(me.DLC2[dlc].box,"VISIBLELIN" .. tostring(l) , "YES")
-						end
-					else
-						iup.SetAttribute(me.DLC2[dlc].box,"VISIBLELIN" .. tostring(l) , "YES")
-					end
-
-				end
-
-			 end
-
-			local thistog=me.DLC2[dlc].filter_vet
-
-			function thistog:action(v)
-				me.DLC2[dlc].filter(v)
-			end
-
-
-
-
-			--Add data
-			for line,id in ipairs(DLC_Dat2[dlc].line) do
-				if Ach_Detail[id] == nil then
-					print("Ach id: " .. id .. " in DLC but not in master data.")
-					break
-				end
-				me.DLC2[dlc].box:setcell(line, 1, tostring(id))
-				me.DLC2[dlc].box:setcell(line, 2, Ach_Detail[id].name)
-
-				local split = split_w(Ach_Detail[id].description)			-- Split into array of words
-				local flow  = flow_w(split, wrap_size)
-			--	print(join_s(flow))
-			--	print("")
-				me.DLC2[dlc].box:setcell(line, 3, join_s(flow))
-				iup.SetAttribute(me.DLC2[dlc].box,"FITTOTEXT", "L".. tostring(line))
-
-
-				local bgcolour1 = "BGCOLOR" .. tostring(line) .. ":1"	--Detail and Description Columns
-				local bgcolour2 = "BGCOLOR" .. tostring(line) .. ":2"
-				local bgcolour3 = "BGCOLOR" .. tostring(line) .. ":3"
-				local bgcolour4 = "BGCOLOR" .. tostring(line) .. ":4"
-				if thischar.ach[id] ~= nil then
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour1, BG_Colour_Complete)
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour2, BG_Colour_Complete)
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour3, BG_Colour_Complete)
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour4, BG_Colour_Complete)
-					me.DLC2[dlc].box:setcell(line, 4, os.date(dateformat,thischar.ach[id].time))
-
-
-					-- Add char to dungeon
-	--				key = tostring(DLC_Dat.id[id].L .. DLC_Dat.id[id].C)
-	--				dung.DLC.key[key][playerID] = true
-				else
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour1, BG_Colour_Not_Complete)
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour2, BG_Colour_Not_Complete)
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour3, BG_Colour_Not_Complete)
-					iup.SetAttribute(me.DLC2[dlc].box, bgcolour4, BG_Colour_Not_Complete)
-				end
-			end	--lines in box
-
-			-- make a tab out that DLC.
-			me.DLC2[dlc].tab = iup.vbox{
-				iup.hbox{
-					me.DLC2[dlc].box,
-					me.DLC2[dlc].filter_f,
-				},
-				iup.fill{}
-			}
-			me.DLC2[dlc].tab.tabtitle=DLC_Names[i]
-
-
-			--Check for Special Completion
-			if (DLC_Dat2[dlc].complete ~= nil and thischar.ach[DLC_Dat2[dlc].complete]) then
-			 -- print(me.name ..  "  Complete.")
-
-			end
-
-			iup.Append(me.DLC2_tabs,me.DLC2[dlc].tab)			--Accumulate here for display
-
-		end
-
-
-
- -- ====================================
-	--  == Prepare for the character data display tabs
-		me.tab = iup.vbox{
-					["tabtitle"] = me.name,		-- This vbox will be a tab and the tab text is this
-
-					iup.hbox{		--Top Information bar
-							Alignment = "ACENTER",
-							iup.label{title=thischar.world,PADDING="10X0"},
-							iup.label{title=me.gender, FONT="Times,BOLD,10"},
-							iup.label{title=thischar.Race .." / ".. thischar.Class, PADDING="10X0", FONT="Times,BOLD,10"},
-							iup.label{title=thischar.Alliance, PADDING="10X0"},
-							iup.label{title=L.Level .. ": ".. me.levelstr, PADDING="10X0"},
-							iup.label{title=L.Created .. os.date(dateformat,thischar.Created), PADDING="10X0"},
-							iup.label{title=L.LLog .. os.date(dateformat,thischar.LoginTime), PADDING="10X0"},
-							iup.label{title=L.TPlayed .. me.timeplayed .." " .. L.Hrs},
-							iup.fill{}
-							},
-					iup.label{SEPARATOR="HORIZONTAL"}
-					}
-
-		me.data_tabs = iup.tabs{} --Data tabs for Char
-		-- All Grp Dungeons
-		for _,i in ipairs (Grp_Order) do
-			if me.isvet or me.Grp[i].vet == false then
-				-- non vet chars only see non-vet dungeons
-				iup.Append(me.data_tabs, me.Grp[i].tab)
-			end
-		end
-
-		-- All Trials Dungeons
-		for _,i in ipairs (Trials_Order) do
-			if me.isvet or me.Trials[i].vet == false then
-				-- non vet chars only see non-vet dungeons
-				iup.Append(me.data_tabs, me.Trials[i].tab)
-			end
-		end
-
-		iup.Append(me.data_tabs,	iup.vbox {	["tabtitle"] =L.PubDungeon,
-												iup.label{title=L.PubLab,expand="HORIZONTAL"},
-												me.Pub_box,
-												iup.fill{}
-											})
-		if me.isvet then
-		--[[
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.VetDungeon,
-												iup.label{title=L.VetLab,expand="HORIZONTAL"},
-												me.Vet_box,
-												iup.fill{}
-											})
-
---]]
-		end
-
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.Leveling,
-										--		iup.label{title="LevLabel",expand="HORIZONTAL"},
-												me.leveling_box,
-												iup.fill{}
-											})
-
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.Locations,
-											--	iup.label{title="LevLabel",expand="HORIZONTAL"},
-												me.Map_box,
-												iup.fill{}
-											})
-
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.WBosses,
-												iup.label{title=L.WBLab,expand="HORIZONTAL"},
-												me.WB_box,
-												iup.label{title=L.WB_Detail},
-												me.WB_box.Detail_zbox,
-												iup.fill{}
-											})
-
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.SkillQuests,
-												iup.label{title=L.SkillLab,expand="HORIZONTAL"},
-												me.SQ_box,
-												iup.label{title=L.SQ_Detail},
-												me.SQ_box.Detail_zbox,
-												iup.fill{}
-											})
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.DLC,
-												iup.label{title=L.DLCLab,expand="HORIZONTAL"},
-												me.DLC_box,
-												iup.fill{}
-											})
-
-		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] ="DLC2",
-						iup.label{title=L.DLCLab,expand="HORIZONTAL"},
-						me.DLC2_tabs,
-						iup.fill{},
-					})
-
-
-
-		iup.Append(me.tab,me.data_tabs)		-- Add Dungeons/Data under the Character
-
-		iup.Append(accounts[acc].char_tabs,me.tab) -- Add Char tab to Account
-
-		local wide =((#accounts[acc].playerIDs+1) * 110)
-		if wide < 690  then
-			wide = 690
-		elseif wide >960 then
-			wide =  960
-		end
-
-		accounts[acc].panelsize =  tostring(wide) ..  "x350"
-	end  -- Chars
-
--- Add to end of Characters
-iup.Append(accounts[acc].char_tabs, accounts[acc].log_tab)
-
---=================  END OF CHARACTER MODE DISPLAY
---=================  START OF DUNGEON MODE DISPLAY
-
-   -- Generic function for populating these tables
-	populate = function(ADung,Grp_key)
-		if ADung.key == nil  then
-			print ("ADung.key  is nil (fatal)")
-		end
-
-		ADung.ShowColumn = {}		-- Save Column Completion Information
-		-- Set Column Show Information to false
-		for col,playerID in ipairs(accounts[acc].playerIDs) do
-			ADung.ShowColumn[col] = false
-		end
-
-
-		for line, key in ipairs(Grp_key) do  -- for lines going down, get the key
-
-			-- does that char exist in the table. Check by PlayerID
-			for col,playerID in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-				if ADung.key[key] == nil  then
-					ADung.key[key] = {}
-				end
-
-				if ADung.key[key][playerID]  then
-					ADung.box:setcell(line,col, L.YesLabel)
-					iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Complete)
-				else
-					ADung.box:setcell(line,col, L.NoLabel)
-					iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Not_Complete)
-					ADung.ShowColumn[col] = true		-- flag entire column as not complete, thus to show it.
-				end
-			end
-		end
-
-		--Ok, Set the Column Width flag Hide sometimes
-		--And column Heading background Always
-		for col,state in pairs(ADung.ShowColumn) do
-			if state then
-				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Not_Complete)
-			else
-				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Complete)
-			end
-		end
-
-	end
-
-	-- Create Pub Dungeon Character Box=========================
-
-	dung.pub.box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#Pub_Dat_Char.key, widthdef=100}
-
-		dung.pub.box.dat = Pub_Dat_Char
---	dung.pub.box.mousemove_cb = box_mousemove_cb
-	dung.pub.box.leavewindow_cb = box_leavewindow_cb
-
-	--Set Line titles
-	for line,key in ipairs(Pub_Dat_Char.key) do
-		dung.pub.box:setcell(line, 0, pub_names[key])
-	end
-	--set lines
-	dung.pub.box:setcell(0,0, L.Location)
-
-	--Create Columns for Chars
-	for col ,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.pub.box:setcell(0, col, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.pub.box, "READONLY", "YES")
-
-	-- Populate with character data ============================
-	-- print ("Populating Pub")
-	populate(dung.pub,Pub_Dat_Char.key)
-
-	-- Create Pub Dungeon Tab ==================================
-
-	dung.pub.tab = iup.vbox {
-						["tabtitle"] =L.Pub,
-						dung.pub.box,
-						iup.fill{},
-				}
-
-	iup.Append(accounts[acc].dung_tabs, dung.pub.tab)
-
-	-- Grp Dungeons  ===========================================
-
-	for _,i in ipairs (Grp_Order) do
-		iup.Append(accounts[acc].dung_tabs, dung.Grp[i].tab)
-		-- Populate with character data ============================
-		-- print ("populate Grp,i: " .. i)
-		populate(dung.Grp[i], Grp_Dat[i].key)
-	end
-
-	-- Create DLC Dungeon Character Box=========================
-
-	dung.DLC.box = iup.matrix {numcol=#accounts[acc].playerIDs ,  numlin=#DLC2key, widthdef=100}
-
-	dung.DLC.box.dat = DLC_Dat
---	dung.DLC.box.mousemove_cb = box_mousemove_cb
-	dung.DLC.box.leavewindow_cb = box_leavewindow_cb
-
-	--Set Line titles
-	for i, key in ipairs(DLC2key) do
-		dung.DLC.box:setcell(i, 0, DLC_Location_names[key])
-	end
-	--set lines
-	dung.DLC.box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs ) do
-		dung.DLC.box:setcell(0, i, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.DLC.box, "READONLY", "YES")
-
-	populate(dung.DLC,DLC_Dat.key)
-
-
-	-- Create DLC Dungeon Tab ==================================
-	dung.DLC.tab = iup.vbox {
-						["tabtitle"] =L.DLC,
-						dung.DLC.box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.DLC.tab)
-
-
--- Commented out because we expect all dung to be populated
--- if #accounts[acc].playerIDs_vet > 0  then  -- skip vet and trials if no eligible chars
-
-		-- Create Trials  Tab ============================================
-		for _,i in ipairs (Trials_Order) do
-			iup.Append(accounts[acc].dung_tabs, dung.Trials[i].tab)
-			-- Populate with character data ============================
-		--	print ("populate Trials")
-			populate(dung.Trials[i], Trials_Dat[i].key)
-		end
-
---end -- has vet chars
-
-end -- Accounts
-
-table.sort(accounts_list)
-
-function select_account()
-	local selected
-		if #accounts_list > 1 then
-			selected = iup.ListDialog (1, L.SelectA,
-					#accounts_list,	--Size
-					accounts_list,
-					1, --Initial
-					1,#accounts_list	--MaxCol MaxLine
-					)
-
-			if selected <0 then
-				return nil		-- Canceled				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Not_Complete)
-			else
-				return accounts_list[selected+1]
-			end
-		else
-		return accounts_list[1]		-- only 1 account, no need for Dialog
-		end
-end
-
-
--- Create dialog to choose account
-myaccount=select_account()
-
-
-if myaccount ~=nil then
-	-- Create dialog if not cancelled
-	dlg = iup.dialog{iup.vbox{
-							accounts[myaccount].mode,
-							accounts[myaccount].mode_zbox,
-							detail_name,		-- Hover over information
-							detail_desc,
-							Status_bar,	-- Bottom Status bar.
-							margin="5x5",
-							ngap="3",
-							},
-					title=L.title .. myaccount ,
-					size=accounts[myaccount].panelsize,
-					}
-	-- Shows dialog in the centre of the screen
-	dlg:showxy(iup.CENTER, iup.CENTER)
-
-	if (iup.MainLoopLevel()==0) then
-	  iup.MainLoop()
-	end
-end
diff --git a/Screenshots/DLC.jpg b/Screenshots/DLC.jpg
deleted file mode 100644
index 2960171..0000000
Binary files a/Screenshots/DLC.jpg and /dev/null differ
diff --git a/Screenshots/Dungeon Mode-Public Dungeons.jpg b/Screenshots/Dungeon Mode-Public Dungeons.jpg
new file mode 100644
index 0000000..7097393
Binary files /dev/null and b/Screenshots/Dungeon Mode-Public Dungeons.jpg differ
diff --git a/Screenshots/Dungeon-Mode_DLC.jpg b/Screenshots/Dungeon-Mode_DLC.jpg
deleted file mode 100644
index a4d5f19..0000000
Binary files a/Screenshots/Dungeon-Mode_DLC.jpg and /dev/null differ
diff --git a/Screenshots/Group Dungeon.jpg b/Screenshots/Group Dungeon.jpg
deleted file mode 100644
index fcba640..0000000
Binary files a/Screenshots/Group Dungeon.jpg and /dev/null differ
diff --git a/Screenshots/Group Dungeons-Vet.jpg b/Screenshots/Group Dungeons-Vet.jpg
new file mode 100644
index 0000000..8bf431c
Binary files /dev/null and b/Screenshots/Group Dungeons-Vet.jpg differ
diff --git a/Screenshots/Leveling.jpg b/Screenshots/Leveling.jpg
deleted file mode 100644
index 39f014c..0000000
Binary files a/Screenshots/Leveling.jpg and /dev/null differ
diff --git a/Screenshots/Locations.jpg b/Screenshots/Locations.jpg
deleted file mode 100644
index a90772b..0000000
Binary files a/Screenshots/Locations.jpg and /dev/null differ
diff --git a/Screenshots/Public Dungeons.jpg b/Screenshots/Public Dungeons.jpg
new file mode 100644
index 0000000..74993bf
Binary files /dev/null and b/Screenshots/Public Dungeons.jpg differ
diff --git a/Screenshots/Skill Quests.jpg b/Screenshots/Skill Quests.jpg
new file mode 100644
index 0000000..f53010a
Binary files /dev/null and b/Screenshots/Skill Quests.jpg differ
diff --git a/Screenshots/Trials-Vet.jpg b/Screenshots/Trials-Vet.jpg
deleted file mode 100644
index d68b20a..0000000
Binary files a/Screenshots/Trials-Vet.jpg and /dev/null differ
diff --git a/Screenshots/World Bosses.jpg b/Screenshots/World Bosses.jpg
new file mode 100644
index 0000000..abcaa08
Binary files /dev/null and b/Screenshots/World Bosses.jpg differ
diff --git a/data/DLC.lua b/data/DLC.lua
index 240c7b8..f364f16 100644
--- a/data/DLC.lua
+++ b/data/DLC.lua
@@ -1,5 +1,4 @@
--- Group Dungeons
-DLC_Dat = {}
+
 DLC_Dat2 = {}

 --These match the datafiles used in the game
@@ -12,53 +11,6 @@ for _,dlc in ipairs (DLC_Order) do
 end


-DLC_Dat.id ={
---Orsinium
-[1236]= {L=1, C=1},		-- "Defeat all of Rkindaleft's champions.",
-[1239]= {L=2, C=1}, 	-- "Defeat all of the champions in Old Orsinium.",
-[1304]= {L=3, C=1},		-- "Conquer all challengers and earn the title of Maelstrom Arena Champion.",  (NonVet)
-[1305]=	{L=4, C=1},		-- "Conquer all challengers in Veteran Maelstrom Arena.",
---IC
-[1345] ={L=1, C=2},		-- "Defeat the Overfiend, Ibomez the Flesh Sculptor, the Gravelight Sentry, the Flesh Abomination, the Lord Warden\'s Council, and Lord Warden Dusk in the Imperial City Prison.",
-[880] = {L=2, C=2},		-- "Defeat the Overfiend, Ibomez the Flesh Sculptor, the Gravelight Sentry, the Flesh Abomination, the Lord Warden\'s Council, and Lord Warden Dusk in Veteran Imperial City Prison.",
-[1346] = {L=3, C=2},	-- "Defeat the Adjudicator, the Elite Guard, the Planar Inhibitor, and Molag Kena in White-Gold Tower.",
-[1120] = {L=4, C=2},	-- "Defeat the Adjudicator, the Elite Guard, the Planar Inhibitor, and Molag Kena in Veteran White-Gold Tower."
-
---hist
-[1504] = {L=1, C=3},	-- "Ruins of Mazzatun Vanquisher", "Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in the Ruins of Mazzatun.",
-[1505] = {L=2, C=3},	-- "Ruins of Mazzatun Conqueror", "Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in Veteran Ruins of Mazzatun.",
-[1522] = {L=3, C=3},	-- "Cradle of Shadows Vanquisher", "Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in the Cradle of Shadows.",
-[1523] = {L=4, C=3},	-- "Cradle of Shadows Conqueror", "Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in Veteran Cradle of Shadows.",
-
---Horns
-[1690] = {L=1, C=4},	-- "Bloodroot Forge Vanquisher",  "Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Bloodroot Forge.",
-[1691] = {L=2, C=4}, 	-- "Bloodroot Forge Conqueror", "Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Veteran Bloodroot Forge.",
---[1696] = {L=3, C=4},	-- "Tempered Tantrum", "Defeat the Earthgore Amalgam in Veteran Bloodroot Forge after invoking the Scroll of Glorious Battle.",
-
-[1698] = {L=3, C=4},	-- "Falkreath Hold Vanquisher", "Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Falkreath Hold.",
-[1699] = {L=4, C=4},	-- "Falkreath Hold Conqueror","Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Veteran Falkreath Hold.",
-
---Bones
-[1975] = {L=1, C=5},	-- "Scalecaller Peak Vanquisher", "Defeat Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Scalecaller Peak.",
-[1976] = {L=2, C=5},	-- "Scalecaller Peak Conqueror", "Defeat Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Veteran Scalecaller Peak.",
-[1959] = {L=3, C=5},	-- "Fang Lair Vanquisher", "Defeat Lizabet Charnis, the Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, and Orryn the Black and Thurvokun in Fang Lair.",
-[1960] = {L=4, C=5},	-- "Fang Lair Conqueror", "Defeat Lizabet Charnis, The Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, and Orryn the Black and Thurvokun in Veteran Fang Lair.",
---Wolf
-[2152] = {L=1, C=6},	-- "Moon Hunter Keep Vanquisher",  "Defeat Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Moon Hunter Keep.",
-[2153] = {L=2, C=6},	-- "Moon Hunter Keep Conqueror",   "Defeat Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Veteran Moon Hunter Keep.",
-
-[2162] = {L=3, C=6},	-- "March of Sacrifices Vanquisher", "Defeat the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in March of Sacrifices.",
-[2163] = {L=4, C=6},	-- "March of Sacrifices Conqueror",  "Defeat the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in Veteran March of Sacrifices.",
-
---Murk
-[2362] = {L=1, C=7},	-- (Blackrose Prison) Blackrose Prison Vanquisher,  Defeat Battlemage Ennodius, Tames-the-Beast, Lady Minara, and Drakeeh the Unchained in Blackrose Prison.
-[2363] = {L=2, C=7},	-- (Blackrose Prison) Blackrose Prison Conqueror,  Defeat Battlemage Ennodius, Tames-the-Beast, Lady Minara, and Drakeeh the Unchained in Veteran Blackrose Prison.
--- No Group Dungeons in Vvardenfell
--- No Group Dungeons in Thieves Guild
--- No Group Dungeons in Summerset
-}
-
-DLC_Dat.key = DLC2key
 DLC_Dat2["Orsinium"].line = {
 1324,	-- Wrothgar Master Relic Hunter,  Collect all 20 relics for the House of Orsimer Glories museum.
 1257,	-- Wrothgar Dungeon Slayer,  Complete both Wrothgar public dungeon boss achievements.
diff --git a/data/DLC_Grp.lua b/data/DLC_Grp.lua
new file mode 100644
index 0000000..97954cd
--- /dev/null
+++ b/data/DLC_Grp.lua
@@ -0,0 +1,51 @@
+-- Group Dungeons
+DLC_Grp_Dat = {}
+
+
+DLC_Grp_Dat.id ={
+--Orsinium
+1236,		-- "Defeat all of Rkindaleft's champions.",
+1239, 	-- "Defeat all of the champions in Old Orsinium.",
+
+1304,		-- "Conquer all challengers and earn the title of Maelstrom Arena Champion.",  (NonVet)
+1305,		-- "Conquer all challengers in Veteran Maelstrom Arena.",
+--IC
+1345,		-- "Defeat the Overfiend, Ibomez the Flesh Sculptor, the Gravelight Sentry, the Flesh Abomination, the Lord Warden\'s Council, and Lord Warden Dusk in the Imperial City Prison.",
+880,		-- "Defeat the Overfiend, Ibomez the Flesh Sculptor, the Gravelight Sentry, the Flesh Abomination, the Lord Warden\'s Council, and Lord Warden Dusk in Veteran Imperial City Prison.",
+
+1346,	-- "Defeat the Adjudicator, the Elite Guard, the Planar Inhibitor, and Molag Kena in White-Gold Tower.",
+1120,	-- "Defeat the Adjudicator, the Elite Guard, the Planar Inhibitor, and Molag Kena in Veteran White-Gold Tower."
+
+--hist
+1504,	-- "Ruins of Mazzatun Vanquisher", "Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in the Ruins of Mazzatun.",
+1505,	-- "Ruins of Mazzatun Conqueror", "Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in Veteran Ruins of Mazzatun.",
+1522,	-- "Cradle of Shadows Vanquisher", "Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in the Cradle of Shadows.",
+1523,	-- "Cradle of Shadows Conqueror", "Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in Veteran Cradle of Shadows.",
+
+--Horns
+1690,	-- "Bloodroot Forge Vanquisher",  "Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Bloodroot Forge.",
+1691, 	-- "Bloodroot Forge Conqueror", "Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Veteran Bloodroot Forge.",
+--1696,	-- "Tempered Tantrum", "Defeat the Earthgore Amalgam in Veteran Bloodroot Forge after invoking the Scroll of Glorious Battle.",
+
+1698,	-- "Falkreath Hold Vanquisher", "Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Falkreath Hold.",
+1699,	-- "Falkreath Hold Conqueror","Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Veteran Falkreath Hold.",
+
+--Bones
+1975,	-- "Scalecaller Peak Vanquisher", "Defeat Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Scalecaller Peak.",
+1976,	-- "Scalecaller Peak Conqueror", "Defeat Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Veteran Scalecaller Peak.",
+1959,	-- "Fang Lair Vanquisher", "Defeat Lizabet Charnis, the Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, and Orryn the Black and Thurvokun in Fang Lair.",
+1960,	-- "Fang Lair Conqueror", "Defeat Lizabet Charnis, The Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, and Orryn the Black and Thurvokun in Veteran Fang Lair.",
+--Wolf
+2152,	-- "Moon Hunter Keep Vanquisher",  "Defeat Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Moon Hunter Keep.",
+2153,	-- "Moon Hunter Keep Conqueror",   "Defeat Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Veteran Moon Hunter Keep.",
+
+2162,	-- "March of Sacrifices Vanquisher", "Defeat the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in March of Sacrifices.",
+2163,	-- "March of Sacrifices Conqueror",  "Defeat the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in Veteran March of Sacrifices.",
+
+--Murk
+2362,	-- (Blackrose Prison) Blackrose Prison Vanquisher,  Defeat Battlemage Ennodius, Tames-the-Beast, Lady Minara, and Drakeeh the Unchained in Blackrose Prison.
+2363,	-- (Blackrose Prison) Blackrose Prison Conqueror,  Defeat Battlemage Ennodius, Tames-the-Beast, Lady Minara, and Drakeeh the Unchained in Veteran Blackrose Prison.
+-- No Group Dungeons in Vvardenfell
+-- No Group Dungeons in Thieves Guild
+-- No Group Dungeons in Summerset
+}
diff --git a/data/Dungeons.ods b/data/Dungeons.ods
deleted file mode 100644
index fcdc2e6..0000000
Binary files a/data/Dungeons.ods and /dev/null differ
diff --git a/data/Group1.lua b/data/Group1.lua
index c428ac2..fa29839 100644
--- a/data/Group1.lua
+++ b/data/Group1.lua
@@ -1,82 +1,87 @@
 --Mode 1 Data  N, V, VH

--- key is Achievement ID, L,C are Line Column in Grid
-Grp_Dat["1N"].id = {
-[294]= {L=1, C=1},		-- "Fungal Grotto I Vanquisher",
-[78]= {L=2, C=1},		-- "Darkshade Caverns I Vanquisher"
-[272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
-[357]= {L=4, C=1},		-- "Direfrost Keep Vanquisher"
-[393]= {L=5, C=1},		-- "Blessed Crucible Vanquisher"
-
-[301]= {L=1, C=2},		-- "Spindleclutch I Vanquisher"
-[79]= {L=2, C=2},		-- "Wayrest Sewers I Vanquisher"
-[80]= {L=3, C=2},		-- "Crypt of Hearts I Vanquisher"
-[391]= {L=4, C=2},		-- "Volenfell Vanquisher"
-[410]= {L=5, C=2},		-- "Blackheart Haven Vanquisher"
-
-[325]= {L=1, C=3},		-- "Banished Cells I Vanquisher"
-[11]= {L=2, C=3},		-- "Elden Hollow I Vanquisher",
-[551]= {L=3, C=3},		-- "City of Ash I Vanquisher",
-[81]= {L=4, C=3},		-- "Tempest Island Vanquisher"
-[417]= {L=5, C=3},		-- "Selene's Web Vanquisher"
-
-[570]= {L=1, C=4},		-- "Vaults of Madness Vanquisher"
-}
-Grp_Dat["1N"].vet = false
-Grp_Dat["1N"].lines = 5		-- Number of lines in Grid
-Grp_Dat["1N"].key=grp1tokey	-- from keys.lua file
-Grp_Dat["1N"].name="Grp_Dat[\"1N\"]"
-
-Grp_Dat["1V"].id = {
-[1556]= {L=1, C=1},		-- "Fungal Grotto I Conqueror"
-[1581]= {L=2, C=1},		-- "Darkshade Caverns I Conqueror"
-[1604]= {L=3, C=1},		-- "Arx Corinium Conqueror"
-[1623]= {L=4, C=1},		-- "Direfrost Keep Conqueror"
-[1641]= {L=5, C=1},		-- "Blessed Crucible Conqueror"
-
-[1565]= {L=1, C=2},		-- "Spindleclutch I Conqueror"
-[1589]= {L=2, C=2},		-- "Wayrest Sewers I Conqueror"
-[1610]= {L=3, C=2},		-- "Crypt of Hearts I Conqueror"
-[1629]= {L=4, C=2},		-- "Volenfell Conqueror"
-[1647]= {L=5, C=2},		-- "Blackheart Haven Conqueror"
-
-[1549]= {L=1, C=3},		-- "Banished Cells I Conqueror"
-[1573]= {L=2, C=3},		-- "Elden Hollow I Conqueror"
-[1597]= {L=3, C=3},		-- "City of Ash I Conqueror"
-[1617]= {L=4, C=3},		-- "Tempest Island Conqueror"
-[1635]= {L=5, C=3},		-- "Selene's Web Conqueror"
-
-[1653]= {L=1, C=4},		-- "Vaults of Madness Conqueror"
-}
-Grp_Dat["1V"].vet = true
-Grp_Dat["1V"].lines = 5		-- Number of lines in Grid
-Grp_Dat["1V"].key=grp1tokey	-- from keys.lua file
-Grp_Dat["1V"].name="Grp_Dat[\"1V\"]"
+
+Group_Dat = {}
+
+for _,i in ipairs(Group_Order) do
+
+	Group_Dat[i]={}
+	Group_Dat[i].id={}
+end
+
+append(Group_Dat["Group 1N"].id,
+{
+1073, 	-- EP Vanquisher
+1074, 	-- DC Vanquisher
+1075, 	-- AD Vanquisher
+294,		-- "Fungal Grotto I Vanquisher",
+78,		-- "Darkshade Caverns I Vanquisher"
+272,		-- "Arx Corinium Vanquisher"
+357,		-- "Direfrost Keep Vanquisher"
+393,		-- "Blessed Crucible Vanquisher"
+301,		-- "Spindleclutch I Vanquisher"
+79,		-- "Wayrest Sewers I Vanquisher"
+80,		-- "Crypt of Hearts I Vanquisher"
+391,		-- "Volenfell Vanquisher"
+410,		-- "Blackheart Haven Vanquisher"
+325,		-- "Banished Cells I Vanquisher"
+11,		-- "Elden Hollow I Vanquisher",
+551,		-- "City of Ash I Vanquisher",
+81,		-- "Tempest Island Vanquisher"
+417,		-- "Selene's Web Vanquisher"
+570,		-- "Vaults of Madness Vanquisher"
+})
+
+Group_Dat["Group 1N"].vet = false
+
+
+append(Group_Dat["Group 1V"].id,
+{
+1556,		-- "Fungal Grotto I Conqueror"
+1581,		-- "Darkshade Caverns I Conqueror"
+1604,		-- "Arx Corinium Conqueror"
+1623,		-- "Direfrost Keep Conqueror"
+1641,		-- "Blessed Crucible Conqueror"
+
+1565,		-- "Spindleclutch I Conqueror"
+1589,		-- "Wayrest Sewers I Conqueror"
+1610,		-- "Crypt of Hearts I Conqueror"
+1629,		-- "Volenfell Conqueror"
+1647,		-- "Blackheart Haven Conqueror"
+
+1549,		-- "Banished Cells I Conqueror"
+1573,		-- "Elden Hollow I Conqueror"
+1597,		-- "City of Ash I Conqueror"
+1617,		-- "Tempest Island Conqueror"
+1635,		-- "Selene's Web Conqueror"
+
+1653,		-- "Vaults of Madness Conqueror"
+})
+Group_Dat["Group 1V"].vet = true

 --Hard Mode
-Grp_Dat["1VH"].id = {
-[1561]= {L=1, C=1},		-- "Catch of the Day"
-[1586]= {L=2, C=1},		-- "Well Out of Warranty"
-[1608]= {L=3, C=1},		-- "Snake Skinner"
-[1628]= {L=4, C=1},		-- "A Dish Served Cold"
-[1646]= {L=5, C=1},		-- "Coronation by Fire"
-
-[1570]= {L=1, C=2},		-- "Quiet at Last"
-[1594]= {L=2, C=2},		-- "Down the Gutter"
-[1615]= {L=3, C=2},		-- "A Crypt for Two"
-[1634]= {L=4, C=2},		-- "They Were Just Rusty"
-[1652]= {L=5, C=2},		-- "Thoroughly Plundered"
-
-[1554]= {L=1, C=3},		-- "Soul Splitter"
-[1578]= {L=2, C=3},		-- "Canonreeve Reaver"
-[1602]= {L=3, C=3},		-- "Fire Brigade"
-[1617]= {L=4, C=3},		-- "Tempest Island Conqueror"
-[1640]= {L=5, C=3},		-- "All Wrapped Up"
-
-[1658]= {L=1, C=4},		-- "New Mayor of Crazy Town"
-}
-
-Grp_Dat["1VH"].vet = true
-Grp_Dat["1VH"].lines = 5		-- Number of lines in Grid
-Grp_Dat["1VH"].key=grp1tokey	-- from keys.lua file
-Grp_Dat["1VH"].name="Grp_Dat[\"1VH\"]"
+append(Group_Dat["Group 1VH"].id,
+{
+1561,		-- "Catch of the Day"
+1586,		-- "Well Out of Warranty"
+1608,		-- "Snake Skinner"
+1628,		-- "A Dish Served Cold"
+1646,		-- "Coronation by Fire"
+
+1570,		-- "Quiet at Last"
+1594,		-- "Down the Gutter"
+1615,		-- "A Crypt for Two"
+1634,		-- "They Were Just Rusty"
+1652,		-- "Thoroughly Plundered"
+
+1554,		-- "Soul Splitter"
+1578,		-- "Canonreeve Reaver"
+1602,		-- "Fire Brigade"
+1617,		-- "Tempest Island Conqueror"
+1640,		-- "All Wrapped Up"
+
+1658,		-- "New Mayor of Crazy Town"
+})
+
+Group_Dat["Group 1VH"].vet = true
+
diff --git a/data/Group2.lua b/data/Group2.lua
index 94a51a8..de59612 100644
--- a/data/Group2.lua
+++ b/data/Group2.lua
@@ -1,83 +1,78 @@
 -- Mode 2 Data    N, V, VH

--- key is Achievement ID, L,C are Line Column in Grid
 -- Not all dungeons have second mode

-Grp_Dat["2N"].id = {
-[1562]= {L=1, C=1},		-- "Fungal Grotto II Vanquisher"
-[1587]= {L=2, C=1},		-- "Darkshade Caverns II Vanquisher"
+
+append(Group_Dat["Group 2N"].id,
+{
+1562,		-- "Fungal Grotto II Vanquisher"
+1587,		-- "Darkshade Caverns II Vanquisher"
 --[272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
 --[357]= {L=4, C=1},		-- "Direfrost Keep Vanquisher"
 -- [393]= {L=5, C=1},		-- "Blessed Crucible Vanquisher"

-[1571]= {L=1, C=2},		-- "Spindleclutch II Vanquisher"
-[1595]= {L=2, C=2},		-- "Wayrest Sewers II Vanquisher"
-[1616]= {L=3, C=2},		-- "Crypt of Hearts II Vanquisher"
+1571,		-- "Spindleclutch II Vanquisher"
+1595,		-- "Wayrest Sewers II Vanquisher"
+1616,		-- "Crypt of Hearts II Vanquisher"
 -- [391]= {L=4, C=2},		-- "Volenfell Vanquisher"
 -- [410]= {L=5, C=2},		-- "Blackheart Haven Vanquisher"

-[1555]= {L=1, C=3},		-- "Banished Cells II Vanquisher"
-[1579]= {L=2, C=3},		-- "Elden Hollow II Vanquisher"
-[1603]= {L=3, C=3},		-- "City of Ash II Vanquisher"
+1555,		-- "Banished Cells II Vanquisher"
+1579,		-- "Elden Hollow II Vanquisher"
+1603,		-- "City of Ash II Vanquisher"
 -- [81]= {L=4, C=3},		-- "Tempest Island Vanquisher"
 -- [417]= {L=5, C=3},		-- "Selene's Web Vanquisher"

 -- [570]= {L=5, C=4},		-- "Vaults of Madness Vanquisher"
-}
-Grp_Dat["2N"].vet = false
-Grp_Dat["2N"].lines = 3		-- Number of lines in Grid
-Grp_Dat["2N"].key=grp2tokey	-- from keys.lua file
-Grp_Dat["2N"].name="Grp_Dat[\"2N\"]"
+})
+Group_Dat["Group 2N"].vet = false

-Grp_Dat["2V"].id = {
-[343]= {L=1, C=1},		-- "Fungal Grotto II Conqueror"
-[464]= {L=2, C=1},		-- "Darkshade Caverns II Conqueror"
+append(Group_Dat["Group 2V"].id,
+{
+343,		-- "Fungal Grotto II Conqueror"
+464,		-- "Darkshade Caverns II Conqueror"
 --[272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
 --[357]= {L=4, C=1},		-- "Direfrost Keep Vanquisher"
 -- [393]= {L=5, C=1},		-- "Blessed Crucible Vanquisher"

-[421]= {L=1, C=2},		-- "Spindleclutch II Conqueror"
-[678]= {L=2, C=2},		-- "Wayrest Sewers II Conqueror"
-[876]= {L=3, C=2},		-- "Crypt of Hearts II Conqueror"
+421,		-- "Spindleclutch II Conqueror"
+678,		-- "Wayrest Sewers II Conqueror"
+876,		-- "Crypt of Hearts II Conqueror"
 -- [391]= {L=4, C=2},		-- "Volenfell Vanquisher"
 -- [410]= {L=5, C=2},		-- "Blackheart Haven Vanquisher"

-[545]= {L=1, C=3},		-- "Banished Cells II Conqueror"
-[459]= {L=2, C=3},		-- "Elden Hollow II Conqueror"
-[878]= {L=3, C=3},		-- "City of Ash II Conqueror"
+545,		-- "Banished Cells II Conqueror"
+459,		-- "Elden Hollow II Conqueror"
+878,		-- "City of Ash II Conqueror"
 -- [81]= {L=4, C=3},		-- "Tempest Island Vanquisher"
 -- [417]= {L=5, C=3},		-- "Selene's Web Vanquisher"

 -- [570]= {L=5, C=4},		-- "Vaults of Madness Vanquisher"
-}
-Grp_Dat["2V"].vet = true
-Grp_Dat["2V"].lines = 3		-- Number of lines in Grid
-Grp_Dat["2V"].key=grp2tokey	-- from keys.lua file
-Grp_Dat["2V"].name="Grp_Dat[\"2V\"]"
+})
+Group_Dat["Group 2V"].vet = true

 -- Hard Mode Activated
-Grp_Dat["2VH"].id = {
-[342]= {L=1, C=1},		-- "Fearless Assaulter"
-[467]= {L=2, C=1},		-- "Deadly Engineer"
+append(Group_Dat["Group 2VH"].id,
+{
+342,		-- "Fearless Assaulter"
+467,		-- "Deadly Engineer"
 -- 272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
 -- [357]= {L=4, C=1},		-- "Direfrost Keep Vanquisher"
 -- [393]= {L=5, C=1},		-- Blessed Crucible

-[448]= {L=1, C=2},		-- "Compassionate Hero"
-[681]= {L=2, C=2},		-- "Pellingare Ghoul Slayer"
-[1084]= {L=3, C=2},		-- "The Blade's Edge"
+448,		-- "Compassionate Hero"
+681,		-- "Pellingare Ghoul Slayer"
+1084,		-- "The Blade's Edge"
 -- [391]= {L=4, C=2},		-- "Volenfell Vanquisher"
 -- [410]= {L=5, C=2},		-- "Blackheart Haven Vanquisher"

-[451]= {L=1, C=3},		-- "Cursed Hero"
-[463]= {L=2, C=3},		-- "Closing the Book"
-[1114]= {L=3, C=3},		-- "A World On Fire"
+451,		-- "Cursed Hero"
+463,		-- "Closing the Book"
+1114,		-- "A World On Fire"
 -- [81]= {L=4, C=3},		-- "Tempest Island Vanquisher"
 -- [417]= {L=5, C=3},		-- "Selene's Web Vanquisher"

 -- [570]= {L=5, C=4},		-- "Vaults of Madness Vanquisher"
-}
-Grp_Dat["2VH"].vet = true
-Grp_Dat["2VH"].lines = 3		-- Number of lines in Grid
-Grp_Dat["2VH"].key=grp2tokey	-- from keys.lua file
-Grp_Dat["2VH"].name="Grp_Dat[\"2VH\"]"
+})
+Group_Dat["Group 2VH"].vet = true
+
diff --git a/data/Public.lua b/data/Public.lua
index 72bc6d8..02f201d 100644
--- a/data/Public.lua
+++ b/data/Public.lua
@@ -1,37 +1,91 @@

--- key is Achievement ID, L,C are Line Column in Grid
+
+
+

 --For char Mode
 Pub_Dat_Char= {}
-Pub_Dat_Char.id = {
-[368]= {L=1, C=1 },		-- Crows Wood
-[370]= {L=2, C=1 },		-- Forgotten Crypts Conqueror",
-[300]= {L=3, C=1 },		-- Sanguine's Demesne Conqueror",
-[376]= {L=4, C=1 },		-- Hall of the Dead Conqueror
-[374]= {L=5, C=1 },		-- Lion's Den Conqueror
-
-[1053]= {L=1, C=2 },	-- Bad Man's Hallows Conqueror"
-[1054]= {L=2, C=2 },	-- Bonesnap Ruins Conqueror"
-[378]= {L=3, C=2 },		-- Obsidian Scar Conqueror
-[396]= {L=4, C=2},		-- Lost City Conqueror
-[1055]= {L=5, C=2},		-- Razak's Wheel Conqueror"
-
-[390]= {L=1, C=3},		-- Toothmaul Gully Conqueror"
-[1049]= {L=2, C=3},		-- Root Sunder Conqueror"
-[1050]= {L=3, C=3},		-- Rulanyil's Fall Conqueror"
-[1051]= {L=4, C=3},		-- Crimson Cove Conqueror"
-[1052]= {L=5, C=3},		-- The Vile Manse Conqueror"
-
-[1056]= {L=1, C=4},		-- Village of the Lost Conqueror
-[1857]= {L=2, C=4},		-- Forgotten Wastes Conqueror
-[1854]= {L=3, C=4},		-- "Nchuleftingth Conqueror",
-
-[2094] = {L=4, C=4},	-- "Karnwasten Conqueror" "Defeat all of the champions in Karnwasten.",
--- [2096] = {L=5, C=4},	-- "Karnwasten Group Event" "Defeat the Sea Sload K'Garza in Karnwasten.",
-[2093] = {L=5, C=4},	-- "Sunhold Conqueror""Defeat all of the champions in Sunhold.",
-
-}
+Pub_Dat_Char.id= {}	-- this is an array
+
+append(Pub_Dat_Char.id,
+{
+
+1068,	-- --EP Conqueror
+1069,	-- --AD Conqueror
+1070,	-- --DC Conqueror
+
+368,	-- Crows Wood
+379,	-- "Crow\'s Wood Group Event",
+
+370,	-- Forgotten Crypts Conqueror",
+388,	-- "Forgotten Crypts Group Event",
+
+300,	-- Sanguine\'s Demesne Conqueror",
+372,	-- "Sanguine\'s Group Event",
+
+376,	-- Hall of the Dead Conqueror
+381,	-- "Hall of the Dead Group Event",
+
+374,	-- Lion's Den Conqueror
+371,	-- "Lion\'s Den Group Event"
+
+1053,	-- Bad Man's Hallows Conqueror"
+380,	-- "Bad Man\'s Group Event",
+
+
+1054,	-- Bonesnap Ruins Conqueror"
+714,	-- "Bonesnap Ruins Group Event",
+
+
+378,	-- Obsidian Scar Conqueror
+713,	-- "Obsidian Scar Group Event",
+
+396,	-- Lost City Conqueror
+707,	-- "Na-Totambu Group Event",
+
+1055,	-- Razak's Wheel Conqueror"
+708,	-- "Razak\'s Wheel Group Event",
+
+390,	-- Toothmaul Gully Conqueror"
+468, 	-- "Toothmaul Gully Group Event",
+
+1049,	-- Root Sunder Conqueror"
+470,	-- "Root Sunder Group Event",
+
+
+1050,	-- Rulanyil's Fall Conqueror"
+445,	-- "Rulanyil\'s Fall Group Event",
+
+1051,	-- Crimson Cove Conqueror"
+460, 	-- "Crimson Cove Group Event",
+
+1052,	-- The Vile Manse Conqueror"
+469,	-- "Vile Manse Group Event",
+
+1056,	-- Village of the Lost Conqueror
+874,	-- "Village of the Lost Group Event",
+
+1857,	-- Forgotten Wastes Conqueror
+1855,	-- "Forgotten Wastes Group Event",
+
+1854,	-- "Nchuleftingth Conqueror",
+1846,	-- "Nchuleftingth Group Event",
+
+2094,	-- "Karnwasten Conqueror" "Defeat all of the champions in Karnwasten.",
+2096,	-- "Karnwasten Group Event" "Defeat the Sea Sload K'Garza in Karnwasten.",
+
+2093,	-- "Sunhold Conqueror""Defeat all of the champions in Sunhold.",
+2095,	-- "Sunhold Group Event",
+
+
+1236,	-- "Rkindaleft Conqueror",
+1235,	-- "Rkindaleft Group Event",
+
+1239,	-- "Old Orsinium Conqueror",
+1238,	-- "Old Orsinium Group Event",
+})
+
+
 Pub_Dat_Char.vet = false
-Pub_Dat_Char.key=pubtokey	-- from keys.lua file
 Pub_Dat_Char.name="Pub_Dat_Char"

diff --git a/data/Quest.lua b/data/Quest.lua
new file mode 100644
index 0000000..8b9ad7b
--- /dev/null
+++ b/data/Quest.lua
@@ -0,0 +1,179 @@
+--[[  Taken from Locations2 (en)   for reference
+--EP
+{ name="Stonefalls",Grp="Fungal Grotto", Pub="Crow's Wood"},	--1
+{ name="Deshaan", Grp="Darkshade Caverns", Pub="Forgotten Crypts"},	--2
+{ name="Shadowfen", Grp="Arx Corinum", Pub="Sanguine's Demesne"},	--3
+{ name="Eastmarch", Grp="Direfrost Keep", Pub="Hall of the Dead"},	--4
+{ name="The Rift", Grp="Blessed Crucible", Pub="Lion's Den"},	--5
+--DC
+{ name="Glenumbra", Grp="Spindleclutch", Pub="Bad Man's Hallows"},	--6
+{ name="Stormhaven", Grp="Wayrest Sewers", Pub="Bonesnap Ruins"},	--7
+{ name="Rivenspire", Grp="Crypt of Hearts", Pub="Obsidian Scar"},	--8
+{ name="Alik'r Desert", Grp="Volenfell", Pub="Lost City"},	--9
+{ name="Bangkorai", Grp="Blackheart Haven", Pub="Razaks Wheel"},	--10
+--AD
+{ name="Auridon", Grp="Banished Cells", Pub="Toothmall Gully"},	--11
+{ name="Grahtwood", Grp="Elden Hollow", Pub="Root Sunder Ruins"},	--12
+{ name="Greenshade", Grp="City of Ash", Pub="Rulanyil's Fall"},	--13
+{ name="Malabal-Tor", Grp="Tempest Island", Pub="Crimson Cove"},	--14
+{ name="Reaper's March", Grp="Selene's Web", Pub="The Vile Manse"},	--15
+--Coldharbour
+{ name="Coldharbour", Grp="Vaults of Madness", Pub="Village of the Lost"},	--16
+{ name="Dark Brotherhood"},	--17
+{ name="Thieves Guild"},	--18
+{ name="Imperial City"},	--19
+{ name="VVardenfell"},	--20
+
+{ name="Orsinium"},--21
+{ name="Clockwork City"},	--22
+{ name="Summerset"},	--23
+
+}
+--]]
+
+--Quests that have skill points
+SQ_dat = {
+--["11"] = StoneFalls
+[201] = {Location=1, ["link1"] ="http://www.uesp.net/wiki/Online:The_Death_of_Balreth" },
+[204] = {Location=1, ["link1"] = "http://www.uesp.net/wiki/Online:The_General%27s_Demise"},
+[209] = {Location=1, ["link1"] = "http://www.uesp.net/wiki/Online:Sadal%27s_Final_Defeat"},
+
+--Deshaan
+[363] = {Location=2, ["link1"] = "http://www.uesp.net/wiki/Online:Plague_Bringer"},
+[365] = {Location=2, ["link1"] = "http://www.uesp.net/wiki/Online:The_Judgment_of_Veloth"},
+[364] = {Location=2, ["link1"] = "http://www.uesp.net/wiki/Online:The_Seal_of_Three"},
+
+--Shadowfen
+[950] = {Location=3, ["link1"] = "http://www.uesp.net/wiki/Online:The_Dream_of_the_Hist"},
+[185] = {Location=3, ["link1"] = "http://www.uesp.net/wiki/Online:Keepers_of_the_Shell" },
+[184] = {Location=3, ["link1"] ="http://www.uesp.net/wiki/Online:The_Skin-Stealer%27s_Lair"},
+
+--["41"] = "Eastmarch",
+[599] = {Location=4, ["link1"] = "http://www.uesp.net/wiki/Online:Songs_of_Sovngarde"},
+[597] = {Location=4, ["link1"] = "http://www.uesp.net/wiki/Online:The_Siege_of_Cradlecrush"},
+[598] = {Location=4, ["link1"] = "http://www.uesp.net/wiki/Online:One_Victor,_One_King" },
+
+--["51"] the Rift
+[336] = {Location=5, ["link1"] = "http://www.uesp.net/wiki/Online:Shattered_Hopes"},
+[337] = {Location=5, ["link1"] = "http://www.uesp.net/wiki/Online:Stomping_Sinmur" },
+[335] = {Location=5, ["link1"] = "http://www.uesp.net/wiki/Online:Through_the_Shroud"},
+
+--["12"]Glenumbra
+[31] = {Location=6, ["link1"] = "http://www.uesp.net/wiki/Online:Angof_the_Gravesinger_%28quest%29"},   --v
+[28] = {Location=6, ["link1"] = "http://www.uesp.net/wiki/Online:The_Fall_of_Faolchu"},
+[30] = {Location=6, ["link1"] = "http://www.uesp.net/wiki/Online:Purifying_the_Wyrd_Tree"},
+
+--["22"] = "Stormhaven"
+
+[155] = {Location=7,["link1"] = "http://www.uesp.net/wiki/Online:The_Return_of_the_Dream_Shard"};
+[154] = {Location=7,["link1"] = "http://www.uesp.net/wiki/Online:Sir_Hughes%27_Fate"},
+[156] = {Location=7,["link1"] = "http://www.uesp.net/wiki/Online:Vaermina%27s_Gambit"},
+
+--Rivenspire
+[589] = {Location=8, ["link1"] = "http://www.uesp.net/wiki/Online:The_Blood-Splattered_Shield" },
+[590] = {Location=8, ["link1"] = "http://www.uesp.net/wiki/Online:The_Liberation_of_Northpoint" },
+[591] = {Location=8, ["link1"] = "http://www.uesp.net/wiki/Online:The_Lightless_Remnant"},
+
+--Alik'r Desert
+[517]	={Location=9, ["link1"] = "http://www.uesp.net/wiki/Online:Alasan%27s_Plot" },
+[518]	={Location=9, ["link1"] = "http://www.uesp.net/wiki/Online:Amputating_the_Hand"},
+[516]	={Location=9, ["link1"] = "http://www.uesp.net/wiki/Online:A_Reckoning_with_Uwafa"},
+
+--["52"] = "Bangkorai",
+[145]	={Location=10,	["link1"] = "http://www.uesp.net/wiki/Online:The_Parley"},
+[146]	={Location=10,	["link1"] = "http://www.uesp.net/wiki/Online:Storming_the_Garrison" },
+[147]	={Location=10,	["link1"] = "http://www.uesp.net/wiki/Online:To_Walk_on_Far_Shores"},
+
+
+--["13"] = "Auridon",
+[360]	={Location=11, ["link1"] = "http://www.uesp.net/wiki/Online:Rites_of_the_Queen"},
+[362]	={Location=11, ["link1"] = "http://www.uesp.net/wiki/Online:Sever_All_Ties"},
+[361]	={Location=11, ["link1"] = "http://www.uesp.net/wiki/Online:The_Veil_Falls"},
+
+--["23"] = "Grahtwood",
+[605] = {Location=12, ["link1"] = "http://www.uesp.net/wiki/Online:The_Grip_of_Madness"},
+[606] = {Location=12, ["link1"] = "http://www.uesp.net/wiki/Online:Heart_of_the_Matter" },
+[607] = {Location=12, ["link1"] = "http://www.uesp.net/wiki/Online:A_Lasting_Winter" },
+
+--["33"] = "Greenshade",
+[511] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Pelidil%27s_End"},
+--[945] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Striking_at_the_Heart"},   -- Striking is a composite of 3 quests
+[512] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Striking_at_the_Heart"},      -- Achievement granting skill pt is Valenwood Protector
+[510] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Throne_of_the_Wilderking"},
+
+-- Malabal-Tor
+[284] = {Location=14, ["link1"] = "http://www.uesp.net/wiki/Online:The_Prisoner_of_Jathsogur"},
+[283] = {Location=14, ["link1"] = "http://www.uesp.net/wiki/Online:Reap_What_Is_Sown"},
+---- Has no Achievement
+[99999999] = {Location=14, ["link1"] = "http://www.uesp.net/wiki/Online:Buyer_Beware"},
+
+--Reapers march
+[538] = {Location=15, ["link1"] = "http://www.uesp.net/wiki/Online:The_Den_of_Lorkhaj"},
+[536] = {Location=15,["link1"] = "http://www.uesp.net/wiki/Online:Stonefire_Machinations"},
+[537] = {Location=15,["link1"] = "http://www.uesp.net/wiki/Online:Motes_in_the_Moonlight" },
+
+--Coldharbour
+[613] = {Location=16, ["link1"] = "http://www.uesp.net/wiki/Online:Breaking_the_Shackle"},
+[614] = {Location=16, ["link1"] = "http://www.uesp.net/wiki/Online:The_Final_Assault"},
+[612] = {Location=16, ["link1"] = "http://www.uesp.net/wiki/Online:Light_from_the_Darkness"},
+
+--Brotherhood
+[1436] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Dark_Initiate"},	-- Signed in Blood  "Dark Initiate", "Complete the \"Signed in Blood\" Dark Brotherhood quest in the Gold Coast.",
+[1438] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Sermonizer_Subduer"},	-- A Lesson in Silence	 "Sermonizer Subduer","Complete the \"A Lesson in Silence\" Dark Brotherhood quest in the Gold Coast.",
+[1439] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Brethren_Benefactor"},	-- Questions of Faith	"Brethren Benefactor", "Complete the \"Questions of Faith\" Dark Brotherhood quest in the Gold Coast.",
+[1440] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Assassin_(achievement)"},	-- A Special Request"Assassin", "Complete the \"A Special Request\" Dark Brotherhood quest in the Gold Coast.",
+[1441] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Dark_Discovery"},	--	Dark Revelations  "Dark Discovery", "Complete the \"Dark Revelations\" Dark Brotherhood quest in the Gold Coast.",
+[1442] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Dark_Investigator"},	-- A Ghost from the Past  "Dark Investigator","Complete the \"A Ghost from the Past\" Dark Brotherhood quest in the Gold Coast.",
+--[1443] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Wrath_of_Sithis"},		-- The Wrath of Sithis "Wrath of Sithis", "Complete \"The Wrath of Sithis\" Dark Brotherhood quest in the Gold Coast.",
+[1444] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Silencer"},	--	"Silencer", Filling the Void "Complete the \"Filling the Void\" Dark Brotherhood quest in the Gold Coast.",
+
+-- TG
+[1360] = {Location=18, ["link1"] =	 "http://en.uesp.net/wiki/Online:Always_Travel_Separately"}, 	--Cleaning House	 "Always Travel Separately",  "Complete quest \"Cleaning House\" in Hew's Bane.",
+[1370] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Iron_Wheel_Infiltration"},	--The Long Game	 "Iron Wheel Infiltration", "Complete quest \"The Long Game\" in Hew's Bane.",
+[1361] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Never,_Ever_Steal_From_the_Guild"},	--	"Never, Ever Steal From the Guild", "Complete quest \"A Flawless Plan\" in Hew's Bane.",
+--[1362] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Wedding_Crashers"},	--"Wedding Crashers", "Complete quest \"Forever Hold Your Peace\" in Hew's Bane.",
+[1363] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Broken_Wheel"},	-- "Broken Wheel",  "Complete quest \"Prison Break\" in Hew's Bane.",
+
+
+
+
+-- IC
+[1175] = {Location=19, ["link1"] = "http://en.uesp.net/wiki/Online:The_Sublime_Brazier"},	--"The Sublime Protector",
+
+--Vvardenfell
+[1870] = {Location=20, ["link1"] = "http://en.uesp.net/wiki/Online:Naryu%27s_Confidant"},	--"Naryu's Confidant"  Family Reunion			http://en.uesp.net/wiki/Online:Family_Reunion
+[1869] = {Location=20, ["link1"] = "http://en.uesp.net/wiki/Online:Rising_Sun"},	-- The Heart of a Telvanni	http://en.uesp.net/wiki/Online:The_Heart_of_a_Telvanni
+[1852] = {Location=20, ["link1"] = "http://en.uesp.net/wiki/Online:Champion_of_Vivec"},	--Champion of Vivec
+
+
+--next Column
+-- Orsinium
+[1325] = {Location=21, ["link1"] = "http://en.uesp.net/wiki/Online:A_King-Sized_Problem"},	--	A King-Sized Problem  "Orc King's Councilor","Complete quest \"A King-Sized Problem\" in Wrothgar.",
+[1326] = {Location=21, ["link1"] = "http://en.uesp.net/wiki/Online:The_Anger_of_a_King"},	--	The Anger of a King "Orc King's Marshal","Complete quest \"The Anger of a King\" in Wrothgar.",
+[1327] = {Location=21, ["link1"] = "http://en.uesp.net/wiki/Online:Blood_on_a_King%27s_Hands"},	--Blood on a King's Hands	 "Orc King's Conqueror",  "Complete quest \"Blood on a King's Hands\" in Wrothgar.",
+
+--Clockwork
+[2050] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:To_The_Clockwork_City"},	--To The Clockwork City	 "Land of Gears and Cogs","Complete the \"To the Clockwork City\" quest.",
+[2058] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:In_Search_of_a_Sponsor"},	-- In Search of a Sponsor	"Clockwork Citizen","Complete the \"In Search of a Sponsor\" quest.",
+[2059] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:The_Strangeness_of_Seht"},	-- The Strangeness of Seht	"Smoke and Mirrors","Complete the \"The Strangeness of Seht\" quest.",
+[2060] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Deepening_Shadows"},	-- Deepening Shadows "Middle-Man", "Complete the \"Deepening Shadows\" quest.",
+[2061] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Lost_in_the_Gloam"},	-- Lost in the Gloam "Birds of a Feather","Complete the \"Lost in the Gloam\" quest.",
+[2062] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Unto_the_Dark"},	-- Unto the Dark	"Shadow Boxing", "Complete the \"Unto the Dark\" quest.",
+[2063] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Where_Shadows_Lie"},	--Where Shadows Lie		The Real Sotha Sil" "Complete the \"Where Shadows Lie\" quest.",
+[2064] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:The_Light_of_Knowledge"},	--  The Light of Knowledge "The Burden of Knowledge", "Complete the \"The Light of Knowledge\" quest.",
+
+--Summerset
+[2203] = {Location=23, ["link1"] = "http://en.uesp.net/wiki/Online:Buried_Memories"},	-- Buried Memories   "Mind Games", "Complete the \"Buried Memories\" quest.",
+[2206] = {Location=23, ["link1"] = "http://en.uesp.net/wiki/Online:Lost_in_Translation"},	-- Lost in Translation "Unreliable Narrator", "Complete the \"Lost in Translation\" quest.",
+[2208] = {Location=23, ["link1"] = "http://en.uesp.net/wiki/Online:The_Crystal_Tower"},	-- The Crystal Tower What Must Be Done", "Complete the \"The Crystal Tower\" quest.",
+
+--Murkmire None
+[2333] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Sunken_Treasure"},	--	"Complete the \"Sunken Treasure\" quest.",
+[2334] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Missing_in_Murkmire"},	--	"Complete the \"Missing in Murkmire\" quest.",
+[2335] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Whispers_in_the_Wood"},	--	"Complete the \"Whispers in the Wood\" quest.",
+[2336] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Death_and_Dreaming"},		--
+[2337] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:The_Swamp_and_the_Serpent"},
+[2338] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:The_Remnant_of_Argon_(quest)"},
+[2338] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:By_River_and_Root"},
+
+}
diff --git a/data/Quest2.lua b/data/Quest2.lua
deleted file mode 100644
index 8b9ad7b..0000000
--- a/data/Quest2.lua
+++ /dev/null
@@ -1,179 +0,0 @@
---[[  Taken from Locations2 (en)   for reference
---EP
-{ name="Stonefalls",Grp="Fungal Grotto", Pub="Crow's Wood"},	--1
-{ name="Deshaan", Grp="Darkshade Caverns", Pub="Forgotten Crypts"},	--2
-{ name="Shadowfen", Grp="Arx Corinum", Pub="Sanguine's Demesne"},	--3
-{ name="Eastmarch", Grp="Direfrost Keep", Pub="Hall of the Dead"},	--4
-{ name="The Rift", Grp="Blessed Crucible", Pub="Lion's Den"},	--5
---DC
-{ name="Glenumbra", Grp="Spindleclutch", Pub="Bad Man's Hallows"},	--6
-{ name="Stormhaven", Grp="Wayrest Sewers", Pub="Bonesnap Ruins"},	--7
-{ name="Rivenspire", Grp="Crypt of Hearts", Pub="Obsidian Scar"},	--8
-{ name="Alik'r Desert", Grp="Volenfell", Pub="Lost City"},	--9
-{ name="Bangkorai", Grp="Blackheart Haven", Pub="Razaks Wheel"},	--10
---AD
-{ name="Auridon", Grp="Banished Cells", Pub="Toothmall Gully"},	--11
-{ name="Grahtwood", Grp="Elden Hollow", Pub="Root Sunder Ruins"},	--12
-{ name="Greenshade", Grp="City of Ash", Pub="Rulanyil's Fall"},	--13
-{ name="Malabal-Tor", Grp="Tempest Island", Pub="Crimson Cove"},	--14
-{ name="Reaper's March", Grp="Selene's Web", Pub="The Vile Manse"},	--15
---Coldharbour
-{ name="Coldharbour", Grp="Vaults of Madness", Pub="Village of the Lost"},	--16
-{ name="Dark Brotherhood"},	--17
-{ name="Thieves Guild"},	--18
-{ name="Imperial City"},	--19
-{ name="VVardenfell"},	--20
-
-{ name="Orsinium"},--21
-{ name="Clockwork City"},	--22
-{ name="Summerset"},	--23
-
-}
---]]
-
---Quests that have skill points
-SQ_dat = {
---["11"] = StoneFalls
-[201] = {Location=1, ["link1"] ="http://www.uesp.net/wiki/Online:The_Death_of_Balreth" },
-[204] = {Location=1, ["link1"] = "http://www.uesp.net/wiki/Online:The_General%27s_Demise"},
-[209] = {Location=1, ["link1"] = "http://www.uesp.net/wiki/Online:Sadal%27s_Final_Defeat"},
-
---Deshaan
-[363] = {Location=2, ["link1"] = "http://www.uesp.net/wiki/Online:Plague_Bringer"},
-[365] = {Location=2, ["link1"] = "http://www.uesp.net/wiki/Online:The_Judgment_of_Veloth"},
-[364] = {Location=2, ["link1"] = "http://www.uesp.net/wiki/Online:The_Seal_of_Three"},
-
---Shadowfen
-[950] = {Location=3, ["link1"] = "http://www.uesp.net/wiki/Online:The_Dream_of_the_Hist"},
-[185] = {Location=3, ["link1"] = "http://www.uesp.net/wiki/Online:Keepers_of_the_Shell" },
-[184] = {Location=3, ["link1"] ="http://www.uesp.net/wiki/Online:The_Skin-Stealer%27s_Lair"},
-
---["41"] = "Eastmarch",
-[599] = {Location=4, ["link1"] = "http://www.uesp.net/wiki/Online:Songs_of_Sovngarde"},
-[597] = {Location=4, ["link1"] = "http://www.uesp.net/wiki/Online:The_Siege_of_Cradlecrush"},
-[598] = {Location=4, ["link1"] = "http://www.uesp.net/wiki/Online:One_Victor,_One_King" },
-
---["51"] the Rift
-[336] = {Location=5, ["link1"] = "http://www.uesp.net/wiki/Online:Shattered_Hopes"},
-[337] = {Location=5, ["link1"] = "http://www.uesp.net/wiki/Online:Stomping_Sinmur" },
-[335] = {Location=5, ["link1"] = "http://www.uesp.net/wiki/Online:Through_the_Shroud"},
-
---["12"]Glenumbra
-[31] = {Location=6, ["link1"] = "http://www.uesp.net/wiki/Online:Angof_the_Gravesinger_%28quest%29"},   --v
-[28] = {Location=6, ["link1"] = "http://www.uesp.net/wiki/Online:The_Fall_of_Faolchu"},
-[30] = {Location=6, ["link1"] = "http://www.uesp.net/wiki/Online:Purifying_the_Wyrd_Tree"},
-
---["22"] = "Stormhaven"
-
-[155] = {Location=7,["link1"] = "http://www.uesp.net/wiki/Online:The_Return_of_the_Dream_Shard"};
-[154] = {Location=7,["link1"] = "http://www.uesp.net/wiki/Online:Sir_Hughes%27_Fate"},
-[156] = {Location=7,["link1"] = "http://www.uesp.net/wiki/Online:Vaermina%27s_Gambit"},
-
---Rivenspire
-[589] = {Location=8, ["link1"] = "http://www.uesp.net/wiki/Online:The_Blood-Splattered_Shield" },
-[590] = {Location=8, ["link1"] = "http://www.uesp.net/wiki/Online:The_Liberation_of_Northpoint" },
-[591] = {Location=8, ["link1"] = "http://www.uesp.net/wiki/Online:The_Lightless_Remnant"},
-
---Alik'r Desert
-[517]	={Location=9, ["link1"] = "http://www.uesp.net/wiki/Online:Alasan%27s_Plot" },
-[518]	={Location=9, ["link1"] = "http://www.uesp.net/wiki/Online:Amputating_the_Hand"},
-[516]	={Location=9, ["link1"] = "http://www.uesp.net/wiki/Online:A_Reckoning_with_Uwafa"},
-
---["52"] = "Bangkorai",
-[145]	={Location=10,	["link1"] = "http://www.uesp.net/wiki/Online:The_Parley"},
-[146]	={Location=10,	["link1"] = "http://www.uesp.net/wiki/Online:Storming_the_Garrison" },
-[147]	={Location=10,	["link1"] = "http://www.uesp.net/wiki/Online:To_Walk_on_Far_Shores"},
-
-
---["13"] = "Auridon",
-[360]	={Location=11, ["link1"] = "http://www.uesp.net/wiki/Online:Rites_of_the_Queen"},
-[362]	={Location=11, ["link1"] = "http://www.uesp.net/wiki/Online:Sever_All_Ties"},
-[361]	={Location=11, ["link1"] = "http://www.uesp.net/wiki/Online:The_Veil_Falls"},
-
---["23"] = "Grahtwood",
-[605] = {Location=12, ["link1"] = "http://www.uesp.net/wiki/Online:The_Grip_of_Madness"},
-[606] = {Location=12, ["link1"] = "http://www.uesp.net/wiki/Online:Heart_of_the_Matter" },
-[607] = {Location=12, ["link1"] = "http://www.uesp.net/wiki/Online:A_Lasting_Winter" },
-
---["33"] = "Greenshade",
-[511] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Pelidil%27s_End"},
---[945] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Striking_at_the_Heart"},   -- Striking is a composite of 3 quests
-[512] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Striking_at_the_Heart"},      -- Achievement granting skill pt is Valenwood Protector
-[510] = {Location=13, ["link1"] = "http://www.uesp.net/wiki/Online:Throne_of_the_Wilderking"},
-
--- Malabal-Tor
-[284] = {Location=14, ["link1"] = "http://www.uesp.net/wiki/Online:The_Prisoner_of_Jathsogur"},
-[283] = {Location=14, ["link1"] = "http://www.uesp.net/wiki/Online:Reap_What_Is_Sown"},
----- Has no Achievement
-[99999999] = {Location=14, ["link1"] = "http://www.uesp.net/wiki/Online:Buyer_Beware"},
-
---Reapers march
-[538] = {Location=15, ["link1"] = "http://www.uesp.net/wiki/Online:The_Den_of_Lorkhaj"},
-[536] = {Location=15,["link1"] = "http://www.uesp.net/wiki/Online:Stonefire_Machinations"},
-[537] = {Location=15,["link1"] = "http://www.uesp.net/wiki/Online:Motes_in_the_Moonlight" },
-
---Coldharbour
-[613] = {Location=16, ["link1"] = "http://www.uesp.net/wiki/Online:Breaking_the_Shackle"},
-[614] = {Location=16, ["link1"] = "http://www.uesp.net/wiki/Online:The_Final_Assault"},
-[612] = {Location=16, ["link1"] = "http://www.uesp.net/wiki/Online:Light_from_the_Darkness"},
-
---Brotherhood
-[1436] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Dark_Initiate"},	-- Signed in Blood  "Dark Initiate", "Complete the \"Signed in Blood\" Dark Brotherhood quest in the Gold Coast.",
-[1438] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Sermonizer_Subduer"},	-- A Lesson in Silence	 "Sermonizer Subduer","Complete the \"A Lesson in Silence\" Dark Brotherhood quest in the Gold Coast.",
-[1439] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Brethren_Benefactor"},	-- Questions of Faith	"Brethren Benefactor", "Complete the \"Questions of Faith\" Dark Brotherhood quest in the Gold Coast.",
-[1440] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Assassin_(achievement)"},	-- A Special Request"Assassin", "Complete the \"A Special Request\" Dark Brotherhood quest in the Gold Coast.",
-[1441] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Dark_Discovery"},	--	Dark Revelations  "Dark Discovery", "Complete the \"Dark Revelations\" Dark Brotherhood quest in the Gold Coast.",
-[1442] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Dark_Investigator"},	-- A Ghost from the Past  "Dark Investigator","Complete the \"A Ghost from the Past\" Dark Brotherhood quest in the Gold Coast.",
---[1443] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Wrath_of_Sithis"},		-- The Wrath of Sithis "Wrath of Sithis", "Complete \"The Wrath of Sithis\" Dark Brotherhood quest in the Gold Coast.",
-[1444] = {Location=17, ["link1"] = "http://en.uesp.net/wiki/Online:Silencer"},	--	"Silencer", Filling the Void "Complete the \"Filling the Void\" Dark Brotherhood quest in the Gold Coast.",
-
--- TG
-[1360] = {Location=18, ["link1"] =	 "http://en.uesp.net/wiki/Online:Always_Travel_Separately"}, 	--Cleaning House	 "Always Travel Separately",  "Complete quest \"Cleaning House\" in Hew's Bane.",
-[1370] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Iron_Wheel_Infiltration"},	--The Long Game	 "Iron Wheel Infiltration", "Complete quest \"The Long Game\" in Hew's Bane.",
-[1361] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Never,_Ever_Steal_From_the_Guild"},	--	"Never, Ever Steal From the Guild", "Complete quest \"A Flawless Plan\" in Hew's Bane.",
---[1362] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Wedding_Crashers"},	--"Wedding Crashers", "Complete quest \"Forever Hold Your Peace\" in Hew's Bane.",
-[1363] = {Location=18, ["link1"] = "http://en.uesp.net/wiki/Online:Broken_Wheel"},	-- "Broken Wheel",  "Complete quest \"Prison Break\" in Hew's Bane.",
-
-
-
-
--- IC
-[1175] = {Location=19, ["link1"] = "http://en.uesp.net/wiki/Online:The_Sublime_Brazier"},	--"The Sublime Protector",
-
---Vvardenfell
-[1870] = {Location=20, ["link1"] = "http://en.uesp.net/wiki/Online:Naryu%27s_Confidant"},	--"Naryu's Confidant"  Family Reunion			http://en.uesp.net/wiki/Online:Family_Reunion
-[1869] = {Location=20, ["link1"] = "http://en.uesp.net/wiki/Online:Rising_Sun"},	-- The Heart of a Telvanni	http://en.uesp.net/wiki/Online:The_Heart_of_a_Telvanni
-[1852] = {Location=20, ["link1"] = "http://en.uesp.net/wiki/Online:Champion_of_Vivec"},	--Champion of Vivec
-
-
---next Column
--- Orsinium
-[1325] = {Location=21, ["link1"] = "http://en.uesp.net/wiki/Online:A_King-Sized_Problem"},	--	A King-Sized Problem  "Orc King's Councilor","Complete quest \"A King-Sized Problem\" in Wrothgar.",
-[1326] = {Location=21, ["link1"] = "http://en.uesp.net/wiki/Online:The_Anger_of_a_King"},	--	The Anger of a King "Orc King's Marshal","Complete quest \"The Anger of a King\" in Wrothgar.",
-[1327] = {Location=21, ["link1"] = "http://en.uesp.net/wiki/Online:Blood_on_a_King%27s_Hands"},	--Blood on a King's Hands	 "Orc King's Conqueror",  "Complete quest \"Blood on a King's Hands\" in Wrothgar.",
-
---Clockwork
-[2050] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:To_The_Clockwork_City"},	--To The Clockwork City	 "Land of Gears and Cogs","Complete the \"To the Clockwork City\" quest.",
-[2058] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:In_Search_of_a_Sponsor"},	-- In Search of a Sponsor	"Clockwork Citizen","Complete the \"In Search of a Sponsor\" quest.",
-[2059] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:The_Strangeness_of_Seht"},	-- The Strangeness of Seht	"Smoke and Mirrors","Complete the \"The Strangeness of Seht\" quest.",
-[2060] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Deepening_Shadows"},	-- Deepening Shadows "Middle-Man", "Complete the \"Deepening Shadows\" quest.",
-[2061] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Lost_in_the_Gloam"},	-- Lost in the Gloam "Birds of a Feather","Complete the \"Lost in the Gloam\" quest.",
-[2062] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Unto_the_Dark"},	-- Unto the Dark	"Shadow Boxing", "Complete the \"Unto the Dark\" quest.",
-[2063] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:Where_Shadows_Lie"},	--Where Shadows Lie		The Real Sotha Sil" "Complete the \"Where Shadows Lie\" quest.",
-[2064] = {Location=22, ["link1"] = "http://en.uesp.net/wiki/Online:The_Light_of_Knowledge"},	--  The Light of Knowledge "The Burden of Knowledge", "Complete the \"The Light of Knowledge\" quest.",
-
---Summerset
-[2203] = {Location=23, ["link1"] = "http://en.uesp.net/wiki/Online:Buried_Memories"},	-- Buried Memories   "Mind Games", "Complete the \"Buried Memories\" quest.",
-[2206] = {Location=23, ["link1"] = "http://en.uesp.net/wiki/Online:Lost_in_Translation"},	-- Lost in Translation "Unreliable Narrator", "Complete the \"Lost in Translation\" quest.",
-[2208] = {Location=23, ["link1"] = "http://en.uesp.net/wiki/Online:The_Crystal_Tower"},	-- The Crystal Tower What Must Be Done", "Complete the \"The Crystal Tower\" quest.",
-
---Murkmire None
-[2333] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Sunken_Treasure"},	--	"Complete the \"Sunken Treasure\" quest.",
-[2334] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Missing_in_Murkmire"},	--	"Complete the \"Missing in Murkmire\" quest.",
-[2335] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Whispers_in_the_Wood"},	--	"Complete the \"Whispers in the Wood\" quest.",
-[2336] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:Death_and_Dreaming"},		--
-[2337] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:The_Swamp_and_the_Serpent"},
-[2338] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:The_Remnant_of_Argon_(quest)"},
-[2338] = {Location=24, ["link1"] =	"https://en.uesp.net/wiki/Online:By_River_and_Root"},
-
-}
diff --git a/data/Trials-old.lua b/data/Trials-old.lua
deleted file mode 100644
index ea8d6b5..0000000
--- a/data/Trials-old.lua
+++ /dev/null
@@ -1,95 +0,0 @@
-Craglorn_Conqueror = "" -- [1139] = "Craglorn Trials Conqueror" "Complete Hel Ra Citadel, Aetherian Archive, and Sanctum Ophidia at their highest difficulties.",
-
-Trials_Dat["N"].id = {
-[991] = {L=1, C=1, key ="11"},		-- "Hel Ra Citadel Completed",  "Defeat the Celestial Warrior, freeing him from the Serpent's control."
-[990] = {L=2, C=1, key ="21"},		-- "Aetherian Archive Completed", "Defeat the Celestial Mage, freeing her from the Serpent's control."
-[1123] = {L=3, C=1, key ="31"},		-- "Sanctum Ophidia Completed", "Defeat the Celestial Serpent."
-[992] = {L=4, C=1, key ="41"},		-- "Dragonstar Arena Champion",  "Conquer all challengers and earn the title of Dragonstar Arena Champion!",
-[1808] ={L=5, C=1, key ="51"},		-- (Halls of Fabrication) Halls of Fabrication Completed,  Defeat the Assembly General and assist Divayth Fyr in stopping the flood of animunculi coming from the Halls of Fabrication.
-[1835] = {L=6, C=1, key ="61"},		-- (Halls of Fabrication) Accept No Substitute,  Defeat 5 of each of the Tactical Facsimiles that the Assembly General creates, on any difficulty.
-[1343] = {L=7, C=1, key ="71"},		-- "Thieves Guild","Drive the dro-m'Athra back to the void and close the Maw of Lorkhaj in Normal Mode.",
-[2131] = {L=8, C=1, key ="81"},		-- (Cloudrest)"Defeat Z'Maja, Siroria, Relequen, and Galenwe in Cloudrest.",
-
-[2076] ={L=15, C=1, key ="151"},	-- (Asylum Sanctorium)"Asylum Sanctorium Completed""Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Asylum Sanctorium.",
-[2078] ={L=16, C=1, key ="161"},	-- (Asylum Sanctorium) "Asylum Sanctorium Contender","Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in the same fight in Asylum Sanctorium.",
-}
-Trials_Dat["N"].vet = false
-Trials_Dat["N"].key = Trials2key["N"]
-
-Trials_Dat["V"].id = {
-[1474] = {L=1, C=1, key ="11"},	-- "Hel Ra Citadel Conqueror", "Defeat the Celestial Warrior in Veteran Hel Ra Citadel, while the Trial is scaled to Champion 160."
-[1503] = {L=2, C=1, key ="21"},	-- "Aetherian Archive Conqueror" Defeat the Celestial Mage in Veteran Aetherian Archive, while the Trial is scaled to Champion 160.",
-[1462] = {L=3, C=1, key ="31"},	-- "Sanctum Ophidia Conqueror",
-[870] =  {L=4, C=1, key ="41"},	-- "Hel Ra Citadel: The War Horn", "Sound the war horn in Veteran Hel Ra Citadel and defeat the ancient warriors who answer.",
-[1080] = {L=5, C=1, key ="51"},	-- "Time Trial: Hel Ra Citadel", "Completed the Hel Ra Citadel within a time limit of 33 minutes.",
-[1081] = {L=6, C=1, key ="61"},	-- "Time Trial: Aetherian Archive", "Completed the Aetherian Archive within a time limit of 33 minutes.",
-[1124] = {L=7, C=1, key ="71"},	-- "Time Trial: Sanctum Ophidia", "Completed the Sanctum Ophidia within a time limit of 33 minutes.",
-[1140] = {L=8, C=1, key ="81"},	-- "Dragonstar Arena Conqueror", "Conquer all challengers on the increased difficulty version of Dragonstar Arena.",
-[1809] = {L=9, C=1, key ="91"},	-- (Halls of Fabrication) Time Trial: Halls of Fabrication,  Complete Veteran Halls of Fabrication within a time limit of 40 minutes. Your trial begins when you enter Abanabi Cave beneath Tel Fyr.
-[1810] = {L=10, C=1, key ="101"}, -- (Halls of Fabrication) Halls of Fabrication Conqueror,  Defeat the Assembly General in Veteran Halls of Fabrication.
-[1811] = {L=11, C=1, key ="111"},	--(Halls of Fabrication) "Well-Oiled Machine", "Complete Veteran Halls of Fabrication without suffering a group member death.",
-[1829] = {L=12, C=1, key ="121"},	-- (Halls of Fabrication) Halls of Fabrication Vanquisher,  Defeat the Assembly General after empowering it by resetting the circuit breaker in Veteran Halls of Fabrication.
-[1831] = {L=13, C=1, key ="131"},	-- (Halls of Fabrication)Power House", "Defeat the Pinnacle Factotum without ever using energy from the generator to break a Refabricated Sphere's shield, in Veteran Halls of Fabrication.",
-[1832] = {L=14, C=1, key ="141"},	-- (Halls of Fabrication)Planned Obsolescence", ,"Defeat the Refabrication Committee in Veteran Halls of Fabrication without ever allowing the Reclaimer to overcharge a Ruined Factotum.",
-[1833] = {L=15, C=1, key ="151"},	-- (Halls of Fabrication)Environmentally Conscious", "Defeat the Assembly General in Veteran Halls of Fabrication without any group member dying to traps and hazards.",
-[1834] = {L=16, C=1, key ="161"}, 	-- (Halls of Fabrication)Terminal Terminator", "Defeat the Assembly General in Veteran Halls of Fabrication without letting any Terminals complete their activation sequence.",
-[1837] = {L=17, C=1, key ="171"},	-- (Halls of Fabrication)Stress Tested","Complete Veteran Halls of Fabrication after resetting the circuit breaker and empowering the Assembly General, all without suffering a group member death.",
-[1838] = {L=18, C=1, key ="181"}, 	-- (Halls of Fabrication)Like Clockwork""Complete Veteran Halls of Fabrication after resetting the circuit breaker and empowering the Assembly General, all within 40 minutes of entering Abanabi Cave and without suffering a group member death.",
-[1839] = {L=19, C=1, key ="191"},	-- (Halls of Fabrication)Kill Process", "Defeat one Hunter-Killer Fabricant while the other still has at least half of its health remaining, before defeating the remaining Fabricant in Veteran Halls of Fabrication.",
-[1840] = {L=20, C=1, key ="201"},	-- (Halls of Fabrication)Arc-Custodian",, "In Veteran Halls of Fabrication, defeat the Archcustodian using six or fewer Shock Pylons without ever missing an opportunity to disable it with one.",
-
-
-
-
-[1368] = {L=21, C=1, key ="211"},	-- "Maw of Lorkhaj Conqueror", "Defeat Rakkhat, Fang of Lorkhaj and his legions of dro-m'Athra in Veteran Maw of Lorkhaj.",
-[1367] = {L=22, C=1, key ="221"},	-- "Time Trial: Maw of Lorkhaj", "Complete Veteran Maw of Lorkhaj within a time limit of 40 minutes. Your trial begins when you cross the threshold of the Temple of Seven Riddles.",
-[1369] = {L=23, C=1, key ="231"},	-- "Maw of Lorkhaj: Unchained Ambush", "Use both chain switches within ten seconds in Veteran Maw of Lorkhaj, then defeat the dro-m'Athra invaders.",
-[1386] = {L=24, C=1, key ="241"},	-- "Maw of Lorkhaj: Stainless Souls", "Defeat Rakkhat without anyone dying while afflicted by the Breath of Lorkhaj.",
-[1388] = {L=25, C=1, key ="251"},	-- "Maw of Lorkhaj: Two-Moons Dance", "In Veteran Maw of Lorkhaj, force Rakkhat into his final phase within two lunar cycles, then defeat him.",
-[1389] = {L=26, C=1, key ="261"},	-- "Maw of Lorkhaj: Void Avoided", "Defeat Rakkhat in Veteran Maw of Lorkhaj, with a maximum of two players ever being afflicted by the Breath of Lorkhaj.",
-[1390] = {L=27, C=1, key ="271"},	-- "Maw of Lorkhaj: Fang Focused", "Defeat Rakkhat in Veteran Maw of Lorkhaj, with at least three dro-m'Athra Dreadstalkers still alive.",
-[1391] = {L=28, C=1, key ="281"},	-- "Maw of Lorkhaj: Moons' Champion", "Complete all achievements related to defeating Rakkhat, Fang of Lorkhaj in Veteran Maw of Lorkhaj.",
-[1392] = {L=29, C=1, key ="291"},	-- "Maw of Lorkhaj: Spotless Triumph",, "Complete Veteran Maw of Lorkhaj without suffering a group member death.",
-[2133] = {L=30, C=1, key ="301"},	-- (Cloudrest)"Cloudrest Conqueror", "Defeat Z'Maja, Siroria, Relequen, and Galenwe in Veteran Cloudrest.",
-[2137] = {L=31, C=1, key ="311"},   -- (Cloudrest)"Speedy Sload Slayer","Defeat Z'Maja, Siroria, Relequen, and Galenwe within a time limit of 15 minutes in Veteran Cloudrest. Timer starts when players enter the Cloudrest Aerie.",
-
-[2134] = {L=32, C=1, key ="321"},   -- (Cloudrest)"A Sload and Her Shadow", "Defeat Z'Maja with one Welkynar shadow fighting by her side in Veteran Cloudrest.",
-[2135] = {L=33, C=1, key ="331"},	-- (Cloudrest) Three's Deadly Company,  Defeat Z'Maja with two Welkynar shades fighting by her side in Veteran Cloudrest.
-[2136] = {L=34, C=1, key ="341"},	-- (Cloudrest)"Cloudrest Vanquisher", "Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same fight in Veteran Cloudrest.",
-[2137] = {L=35, C=1, key ="351"},	-- (Cloudrest) Speedy Sload Slayer,  Defeat Z'Maja, Siroria, Relequen, and Galenwe within a time limit of 15 minutes in Veteran Cloudrest. Timer starts when players enter the Cloudrest Aerie.
-[2138] = {L=36, C=1, key ="361"},	-- (Cloudrest)"Surviving the Shadows","Defeat Z'Maja, Siroria, Relequen, and Galenwe without suffering a group member death in Veteran Cloudrest.",
-[2139] = {L=37, C=1, key ="371"},	-- (Cloudrest)"The Path to Alaxon", "Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same battle without suffering a group member death within 15 minutes of entering the Cloudrest Aerie in Veteran Cloudrest.",
-[2231] = {L=38, C=1, key ="381"},	-- (Cloudrest)"One Core, No More", "Defeat Z'Maja with each group member picking up and destroying only one Malevolent Core in Veteran Cloudrest.",
-[2232] = {L=39, C=1, key ="391"},	-- (Cloudrest)"Misery Loves Company", "While battling Z'Maja with all three of the Welkynars' shadows by her side, a player with the Hoarfrost affliction and two other players with the Voltaic Overload affliction share the damage of the Roaring Flare eruption in Veteran Cloudrest.",
-[2233] = {L=40, C=1, key ="401"},	-- (Cloudrest)"Flares and Deadly Shadows", "While battling Z'Maja with Siroria's shadow by her side, utilize a Roaring Flare attack and achieve 20 killing blows against Shadow's of the Fallen in Cloudrest.",
-[2234] = {L=41, C=1, key ="411"},	-- (Cloudrest) Core Coordination,  While battling Z'Maja, after activating a single Welkynar's Light, activate two more Welkynar's Lights and destroy three Malevolent Cores within the next 6 seconds in Veteran Cloudrest.
-[2236] = {L=42, C=1, key ="421"},	-- "The Mystic's Ice" "Have Galenwe's shadow destroy 20 roaming Hoarfrost cyclones with his Spiked Ice attack in Cloudrest.",
-
-
-[2077] = {L=43, C=1, key ="431"},	-- (Asylum Sanctorium)"Asylum Sanctorium Conqueror", "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Veteran Asylum Sanctorium.",
-[2079] = {L=44, C=1, key ="441"},	-- (Asylum Sanctorium)"Asylum Sanctorium Vanquisher", "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in the same fight in Veteran Asylum Sanctorium.",
-[2080] = {L=45, C=1, key ="451"},	-- (Asylum Sanctorium)"Sanctified" "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold without suffering a group member death in Veteran Asylum Sanctorium.",
-[2081] = {L=46, C=1, key ="461"},	-- (Asylum Sanctorium)"Swift Mercy" "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold within a time limit of 15 minutes in Veteran Asylum Sanctorium. Timer starts when players enter the Sanctuary Atrium.",
-[2082] = {L=47, C=1, key ="471"},	-- (Asylum Sanctorium)"Beatific Beatdown", "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold at the same time without allowing Saint Felms or Saint Llothis to enrage during the fight in Veteran Asylum Sanctorium.",
-[2083] = {L=48, C=1, key ="481"},	-- (Asylum Sanctorium)"Placid Projections", "Defeat Saint Felms the Bold without allowing either of his Pneuma Projections to enrage in Veteran Asylum Sanctorium.",
-[2084] = {L=49, C=1, key ="491"},	-- (Asylum Sanctorium)"Imperfect Attendance,"Defeat Saint Llothis the Pious without dismantling his Imperfect Attendants in Veteran Asylum Sanctorium.",
-[2085] = {L=50, C=1, key ="501"},	-- (Asylum Sanctorium)"Righteous Condemnation""Defeat Saint Olms the Just and Saint Llothis the Pious in the same battle in Veteran Asylum Sanctorium.",
-[2086] = {L=51, C=1, key ="511"},	-- (Asylum Sanctorium)"Executioners' Judgement""Defeat Saint Olms the Just and Saint Felms the Bold in the same battle in Veteran Asylum Sanctorium.",
-[2087] = {L=52, C=1, key ="521"},	-- (Asylum Sanctorium)"Perfect Purification" Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in the same battle without suffering a group member death within 15 minutes of entering the Sanctuary Atrium in Veteran Asylum Sanctorium.",
-
-}
-Trials_Dat["V"].vet = true
-Trials_Dat["V"].key = Trials2key["V"]
-
-Trials_Dat["VH"].id = {
-[1136] = {L=1, C=1, key ="11"},		-- "Hel Ra Citadel Difficult Mode","Defeat the Celestial Warrior after enraging him through the destruction of his statue army.",
-[1137] = {L=2, C=1, key ="21"},		-- "Aetherian Archive Difficult Mode" "Defeat the Celestial Mage after taunting her by smashing the Aetherial Orbs."
-[1138] = {L=3, C=1, key ="31"},		-- "Sanctum Ophidia Difficult Mode", Defeat the Celestial Serpent after desecrating the sacred banners of the Scaled Court",
-[1829] = {L=4, C=1, key ="41"},		-- "Halls of Fabrication Vanquisher", "Defeat the Assembly General after empowering it by resetting the circuit breaker in Veteran Halls of Fabrication.",
-[1344] = {L=5, C=1, key ="51"},		-- "Thieves Guild:"Maw of Lorkhaj Difficult Mode""Defeat Rakkhat after empowering him at the lunar shrines in Veteran Maw of Lorkhaj.",
-[1139] = {L=6, C=1, key ="61"},		-- "Craglorn Trials Conqueror",,"Complete Hel Ra Citadel, Aetherian Archive, and Sanctum Ophidia at their highest difficulties.",
-
-}
-
-Trials_Dat["VH"].vet = true
-Trials_Dat["VH"].key = Trials2key["VH"]
diff --git a/data/Trials.lua b/data/Trials.lua
index 5b3988c..2bb0840 100644
--- a/data/Trials.lua
+++ b/data/Trials.lua
@@ -1,40 +1,62 @@
-Craglorn_Conqueror = "" -- [1139] = "Craglorn Trials Conqueror" "Complete Hel Ra Citadel, Aetherian Archive, and Sanctum Ophidia at their highest difficulties.",
-
-Trials_Dat["N"].id = {
-[991] = {L=1, C=1, key ="11"},		-- "Hel Ra Citadel Completed",  "Defeat the Celestial Warrior, freeing him from the Serpent's control."
-[990] = {L=2, C=1, key ="21"},		-- "Aetherian Archive Completed", "Defeat the Celestial Mage, freeing her from the Serpent's control."
-[1123] = {L=3, C=1, key ="31"},		-- "Sanctum Ophidia Completed", "Defeat the Celestial Serpent."
-[992] = {L=4, C=1, key ="41"},		-- "Dragonstar Arena Champion",  "Conquer all challengers and earn the title of Dragonstar Arena Champion!",
-[1808] ={L=5, C=1, key ="51"},		-- (Halls of Fabrication) Halls of Fabrication Completed,  Defeat the Assembly General and assist Divayth Fyr in stopping the flood of animunculi coming from the Halls of Fabrication.
-[1343] = {L=6, C=1, key ="61"},		-- "Thieves Guild","Drive the dro-m'Athra back to the void and close the Maw of Lorkhaj in Normal Mode.",
-[2132] = {L=7, C=1, key ="71"},		-- (Cloudrest) Cloudrest Contender,  Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same fight in Cloudrest.
-[2076] ={L=8, C=1, key ="81"},		-- (Asylum Sanctorium)"Asylum Sanctorium Completed""Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Asylum Sanctorium.",
-}
-
-Trials_Dat["N"].vet = false
-Trials_Dat["N"].key = Trials2key["N"]
-
-Trials_Dat["V"].id = {
-[1474] = {L=1, C=1, key ="11"},	-- "Hel Ra Citadel Conqueror", "Defeat the Celestial Warrior in Veteran Hel Ra Citadel, while the Trial is scaled to Champion 160."
-[1503] = {L=2, C=1, key ="21"},	-- "Aetherian Archive Conqueror" Defeat the Celestial Mage in Veteran Aetherian Archive, while the Trial is scaled to Champion 160.",
-[1462] = {L=3, C=1, key ="31"},	-- 1462,	-- (Trials) Sanctum Ophidia Conqueror,  Defeat the Celestial Serpent in Veteran Sanctum Ophidia.
-[1810] = {L=4, C=1, key ="41"}, -- (Halls of Fabrication) Halls of Fabrication Conqueror,  Defeat the Assembly General in Veteran Halls of Fabrication.
-[1368] = {L=5, C=1, key ="51"},	-- "Maw of Lorkhaj Conqueror", "Defeat Rakkhat, Fang of Lorkhaj and his legions of dro-m'Athra in Veteran Maw of Lorkhaj.",
-[2133] = {L=6, C=1, key ="61"},	-- (Cloudrest)"Cloudrest Conqueror", "Defeat Z'Maja, Siroria, Relequen, and Galenwe in Veteran Cloudrest.",
-[2077] = {L=7, C=1, key ="71"},	-- (Asylum Sanctorium)"Asylum Sanctorium Conqueror", "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Veteran Asylum Sanctorium.",
-}
-Trials_Dat["V"].vet = true
-Trials_Dat["V"].key = Trials2key["V"]
-
-Trials_Dat["VH"].id = {
-[1136] = {L=1, C=1, key ="11"},		-- "Hel Ra Citadel Difficult Mode","Defeat the Celestial Warrior after enraging him through the destruction of his statue army.",
-[1137] = {L=2, C=1, key ="21"},		-- "Aetherian Archive Difficult Mode" "Defeat the Celestial Mage after taunting her by smashing the Aetherial Orbs."
-[1138] = {L=3, C=1, key ="31"},		-- "Sanctum Ophidia Difficult Mode", Defeat the Celestial Serpent after desecrating the sacred banners of the Scaled Court",
-[1829] = {L=4, C=1, key ="41"},		-- "Halls of Fabrication Vanquisher", "Defeat the Assembly General after empowering it by resetting the circuit breaker in Veteran Halls of Fabrication.",
-[1344] = {L=5, C=1, key ="51"},		-- "Thieves Guild:"Maw of Lorkhaj Difficult Mode""Defeat Rakkhat after empowering him at the lunar shrines in Veteran Maw of Lorkhaj.",
-[1139] = {L=6, C=1, key ="61"},		-- "Craglorn Trials Conqueror",,"Complete Hel Ra Citadel, Aetherian Archive, and Sanctum Ophidia at their highest difficulties.",
-
-}
-
-Trials_Dat["VH"].vet = true
-Trials_Dat["VH"].key = Trials2key["VH"]
+
+Trials_Dat={}
+for _,i in ipairs(Trials_Order) do
+	Trials_Dat[i]={}
+	Trials_Dat[i].id={}
+end
+
+
+append(Trials_Dat["Trials Norm"].id,
+
+{
+991,	-- "Hel Ra Citadel Completed",  "Defeat the Celestial Warrior, freeing him from the Serpent's control."
+990,	-- "Aetherian Archive Completed", "Defeat the Celestial Mage, freeing her from the Serpent's control."
+1123,	-- "Sanctum Ophidia Completed", "Defeat the Celestial Serpent."
+992,	-- "Dragonstar Arena Champion",  "Conquer all challengers and earn the title of Dragonstar Arena Champion!",
+
+1808,	-- (Halls of Fabrication) Halls of Fabrication Completed,  Defeat the Assembly General and assist Divayth Fyr in stopping the flood of animunculi coming from the Halls of Fabrication.
+1343,	-- "Thieves Guild","Drive the dro-m'Athra back to the void and close the Maw of Lorkhaj in Normal Mode.",
+2132,	-- (Cloudrest) Cloudrest Contender,  Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same fight in Cloudrest.
+2076,	-- (Asylum Sanctorium)"Asylum Sanctorium Completed""Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Asylum Sanctorium.",
+})
+
+Trials_Dat["Trials Norm"].vet = false
+
+
+append(Trials_Dat["Trials Vet"].id,
+{
+1474,	-- "Hel Ra Citadel Conqueror", "Defeat the Celestial Warrior in Veteran Hel Ra Citadel, while the Trial is scaled to Champion 160."
+870,	--	Sound the war horn in Veteran Hel Ra Citadel
+1080,	--	 "Completed the Hel Ra Citadel within a time limit of 33 minutes.",
+
+1503,	-- "Aetherian Archive Conqueror" Defeat the Celestial Mage in Veteran Aetherian Archive, while the Trial is scaled to Champion 160.",
+1081,	-- "Completed the Aetherian Archive within a time limit of 33 minutes.",
+
+1462,	--  Sanctum Ophidia Conqueror,  Defeat the Celestial Serpent in Veteran Sanctum Ophidia.
+1113,	-- "Use the feed pile in Sanctum Ophidia and survive the ensuing battle.",
+1124,	-- "Completed the Sanctum Ophidia within a time limit of 33 minutes.",
+
+
+
+1810, 	-- (Halls of Fabrication) Halls of Fabrication Conqueror,  Defeat the Assembly General in Veteran Halls of Fabrication.
+1368,	-- "Maw of Lorkhaj Conqueror", "Defeat Rakkhat, Fang of Lorkhaj and his legions of dro-m'Athra in Veteran Maw of Lorkhaj.",
+2133,	-- (Cloudrest)"Cloudrest Conqueror", "Defeat Z'Maja, Siroria, Relequen, and Galenwe in Veteran Cloudrest.",
+2077,	-- (Asylum Sanctorium)"Asylum Sanctorium Conqueror", "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Veteran Asylum Sanctorium.",
+})
+
+Trials_Dat["Trials Vet"].vet = true
+
+
+append(Trials_Dat["Trials Hard"].id,
+{
+1139,		-- "Craglorn Trials Conqueror"  "Complete Hel Ra Citadel, Aetherian Archive, and Sanctum Ophidia at their highest difficulties.",
+1136,		-- "Hel Ra Citadel Difficult Mode","Defeat the Celestial Warrior after enraging him through the destruction of his statue army.",
+1137,		-- "Aetherian Archive Difficult Mode" "Defeat the Celestial Mage after taunting her by smashing the Aetherial Orbs."
+1138,		-- "Sanctum Ophidia Difficult Mode", Defeat the Celestial Serpent after desecrating the sacred banners of the Scaled Court",
+1140,		-- "Conquer all challengers on the increased difficulty version of Dragonstar Arena.",
+1829,		-- "Halls of Fabrication Vanquisher", "Defeat the Assembly General after empowering it by resetting the circuit breaker in Veteran Halls of Fabrication.",
+1344,		-- "Thieves Guild:"Maw of Lorkhaj Difficult Mode""Defeat Rakkhat after empowering him at the lunar shrines in Veteran Maw of Lorkhaj.",
+})
+
+Trials_Dat["Trials Hard"].vet = true
+
diff --git a/data/WB.lua b/data/WB.lua
new file mode 100644
index 0000000..0c0d72f
--- /dev/null
+++ b/data/WB.lua
@@ -0,0 +1,201 @@
+--[[  Taken from Locations2 (en)   for reference
+--EP
+{ name="Stonefalls",Grp="Fungal Grotto", Pub="Crow's Wood"},	--1
+{ name="Deshaan", Grp="Darkshade Caverns", Pub="Forgotten Crypts"},	--2
+{ name="Shadowfen", Grp="Arx Corinum", Pub="Sanguine's Demesne"},	--3
+{ name="Eastmarch", Grp="Direfrost Keep", Pub="Hall of the Dead"},	--4
+{ name="The Rift", Grp="Blessed Crucible", Pub="Lion's Den"},	--5
+--DC
+{ name="Glenumbra", Grp="Spindleclutch", Pub="Bad Man's Hallows"},	--6
+{ name="Stormhaven", Grp="Wayrest Sewers", Pub="Bonesnap Ruins"},	--7
+{ name="Rivenspire", Grp="Crypt of Hearts", Pub="Obsidian Scar"},	--8
+{ name="Alik'r Desert", Grp="Volenfell", Pub="Lost City"},	--9
+{ name="Bangkorai", Grp="Blackheart Haven", Pub="Razaks Wheel"},	--10
+--AD
+{ name="Auridon", Grp="Banished Cells", Pub="Toothmall Gully"},	--11
+{ name="Grahtwood", Grp="Elden Hollow", Pub="Root Sunder Ruins"},	--12
+{ name="Greenshade", Grp="City of Ash", Pub="Rulanyil's Fall"},	--13
+{ name="Malabal-Tor", Grp="Tempest Island", Pub="Crimson Cove"},	--14
+{ name="Reaper's March", Grp="Selene's Web", Pub="The Vile Manse"},	--15
+--Coldharbour
+{ name="Coldharbour", Grp="Vaults of Madness", Pub="Village of the Lost"},	--16
+{ name="Dark Brotherhood"},	--17
+{ name="Thieves Guild"},	--18
+{ name="Imperial City"},	--19
+{ name="VVardenfell"},	--20
+
+{ name="Orsinium"},--21
+{ name="Clockwork City"},	--22
+{ name="Summerset"},	--23
+
+}
+--]]
+
+
+
+
+WB_dat = {		--World Boss Achievements
+--]These index Locations2  (en)  and Locations2key
+-- StoneFalls
+[197] = {Location=1},		--Shipwreck Strand
+[199] = {Location=1},		--Shivering Shrine
+[196] = {Location=1},		--Cave of Memories
+[200] = {Location=1},		--Brahma's Grove
+[198] = {Location=1},		--Matron's Clutch
+[195] = {Location=1},		--Strifeswarm Hive
+--Deshaan
+[277] = {Location=2},		--Sharpfang
+[276] = {Location=2},		--Grove of the Abomination
+[275] = {Location=2},		--Short-Tusk
+[278] = {Location=2},		--Mabrigash Burial Circle
+[280] = {Location=2},		--Caravan Crest
+[279] = {Location=2},		--Druitularg's Ritual Altar
+
+--Shadowfen
+[189] = {Location=3},		--Nen Ria
+[187] = {Location=3}, 	--Haynekhtnamet
+[192] = {Location=3},		--Slaver Camp
+[191] = {Location=3},		--Bitterroot Cave
+[188] = {Location=3},		--Xal Thak
+[190] = {Location=3},		--Captain Bones
+--Eastmarch
+[210] = {Location=4},		--RageClaw
+[211] = {Location=4},		--Dragon Mound
+[212] = {Location=4},		--Ratmaster
+[213] = {Location=4},		--Dragon's Hallow
+[257] = {Location=4},		--Swiftblade
+[214] = {Location=4},		--Ammabani's Pride
+--The Rift
+[345] = {Location=5},		--Hunter Camp
+[346] = {Location=5},		--Troll Cave
+[347] = {Location=5},		--Frozen Ruins
+[348] = {Location=5},		--Abandoned Camp
+[350] = {Location=5},		--Wisplight Glen
+[349] = {Location=5},		--Giant Camp
+--Glenumbra
+[387] = {Location=6},		--Balefire Island
+[382] = {Location=6},		--Seaview Point
+[385] = {Location=6},		--North Shore Point
+[384] = {Location=6},		--Wolf's Camp
+[383] = {Location=6},		--Western Overlook
+[386] = {Location=6},		--Trapjaw's Cove
+--Stormhaven
+[400] = {Location=7},		--Spider Nest
+[399] = {Location=7},		--Mudcrab Beach
+[401] = {Location=7},		--Dreugh Waters
+[402] = {Location=7},		--Abandoned Farm
+[403] = {Location=7},		--Scrag's Larder
+[404] = {Location=7},		--Ancient Altar
+--Rivenspire
+[158] = {Location=8},		--Aesar's Web
+[159] = {Location=8},		--Valeguard Tower
+[161] = {Location=8},		--Magdelena's Haunt
+[160] = {Location=8},		--Old Kalgon's Keep
+[162] = {Location=8},		--East-Rock Landing
+[163] = {Location=8},		--Siren's Cove
+--Alik'r Desert
+[500] = {Location=9},		--Lesser Circle
+[495] = {Location=9},		--Lost Caravan
+[498] = {Location=9},		--Forsaken Hearts Cave
+[496] = {Location=9},		--Giant Camp
+[497] = {Location=9},		--Hag Camp
+[499] = {Location=9},		--King's Rest
+--Bangkorai
+[151] = {Location=10},		--Telesubi Ruins
+[150] = {Location=10},		--Nilata Falls
+[152] = {Location=10},		--Summoner's Camp
+[149] = {Location=10},		--Arlimahera's Sanctum
+[153] = {Location=10},		--Lakewatch Tower
+[148] = {Location=10},		--Blighted Isle
+--Auridon
+[352] = {Location=11},		--Seaside Scarp
+[351] = {Location=11},		--Soulfire Plateau
+[353] = {Location=11},		--Wreck of the Raptor
+[354] = {Location=11},		--Heretic's Summons
+[355] = {Location=11},		--Nestmother's Den
+[356] = {Location=11},		--Heritance Proving Ground
+--Grahtwood
+[700] = {Location=12},		--Thugrub's Cave
+[699] = {Location=12},		--Poacher Camp
+[701] = {Location=12},		--Valanir's Rest
+[698] = {Location=12},		--Lady Solace's Fen
+[696] = {Location=12},		--Hircine's Henge
+[697] = {Location=12},		--Nindaeril's Perch
+--Greenshade
+[562] = {Location=13},		--Maormer Camp
+[561] = {Location=13},		--Thodundor's View
+[563] = {Location=13},		--Rootwater Spring
+[564] = {Location=13},		--Reconnaissance Camp
+[560] = {Location=13},		--Gathongor's Mire
+[565] = {Location=13},		--Pelda Tarn
+--Malabal-Tor
+[258] = {Location=14},		--Bitterpoint Strand
+[259] = {Location=14},		--Dugan
+[261] = {Location=14},		--Jagged Grotto
+[260] = {Location=14},		--Bone Grappler
+[263] = {Location=14},		--River Edge
+[262] = {Location=14},		--Windshriek Strand
+--Reaper's March
+[427] = {Location=15},		--Waterdancer Falls
+[425] = {Location=15},		--Deathsong Cleft
+[428] = {Location=15},		--Reaper's Henge
+[429] = {Location=15},		--Old S'ren-ja Docks
+[426] = {Location=15},		--Big Ozur's Valley
+[430] = {Location=15},		--Ushmal's Rest
+--Coldharbour
+[440] = {Location=16},		--Duriatundur's Killing Field
+[439] = {Location=16},		--Aba-Darre
+[443] = {Location=16},		--Risen Court
+[444] = {Location=16},		--Cynhamoth's Grove
+[442] = {Location=16},		--Daedroth Larder
+[441] = {Location=16},		--Zemarek's Hollow
+
+--Dark Brotherhood Gold Coast
+[1419] = {Location=17},	-- "Defeat Limenauruus" "Defeat Limenauruus the possessed minotaur and the shadow spirits at Tribune's Folly.",
+[1420] = {Location=17}, 	-- "Conquer the Kvatch Arena" "Enter the Kvatch Arena and defeat all challengers.",
+
+-- Thieves Guild. Hews Bane
+[1352] = {Location=18},	-- "Deepest Shallows" "Kill Syvarra of the Deep at Ko Estaran.",
+[1353] = {Location=18},	-- "Cutting the Keel" "Kill Captain Virindi Slave-Taker at Thrall Cove.",
+
+--No Wb in Imperial City 19
+
+
+
+--Vvardenfell
+[1847] = {Location=20},	--Loop Eradicator  ,"Save Dubdil Alar from the consequences of his temporal experiments.",
+[1802] = {Location=20},	--Songbird Silencer
+[1803] = {Location=20},	--Salothan's Cursebreaker
+[1805] = {Location=20},	--Breaker of the Unbroken, Defeat the nix-ox Nilthog the Unbroken at Nilthog's Hollow.
+[1807] = {Location=20},	--Cheater Defeater, Defeat the Skaafin, Mehz the Cozener, at Dubdil Alar Tower and seal the rift to Oblivion.
+[1804] = {Location=20},	-- "Consort Killer""Defeat the Queen's Consort at Missir-Dadalit Egg Mine.",
+
+
+
+--Orsinium
+[1286] = {Location=21},	-- Kill Zandadunoz the Reborn,  Defeat Zandadunoz the Reborn at the Unfinished Dolmen.
+[1285] = {Location=21},	-- Kill Old Snagara,  Kill Old Snagara the echatere in the Poacher's Encampment.
+[1290] = {Location=21},	-- Kill Nyzchaleft,  Kill Nyzchaleft the Dwarven Centurion at Nyzchaleft Falls.
+[1289] = {Location=21},	-- Kill Mad Urkazbur the Ogre,  Kill Mad Urkazbur at the Mad-Ogre's Altar.
+[1287] = {Location=21},	-- Kill King-Chief Edu,  Kill the Riekr regent King-Chief Edu at the King-Chief's Throne.
+[1288] = {Location=21},		-- Kill Corintthac the Abomination,  Kill the Winterborn Briarheart Warrior, Corintthac the Abomination, at the Accursed Nursery.
+
+
+--Clock
+[2046] = {Location=22},	-- "Murderer of Crows" "Defeat Ithoxis, Abathoth, and Ssatinot in Exarchs' Egress.",
+[2028] = {Location=22},	-- "Imperfection" "Defeat The Imperfect in the Sanctuary of Verification.",
+
+
+--Summerset
+[2036] = {Location=23},	-- "Reef Raider" "Defeat Queen of the Reef at The Queen's Hatchery.",
+[2037] = {Location=23},	-- "Bucking the Matriarchy" "Defeat Caanerin at Indrik Frolic.",
+[2038] = {Location=23},	-- "Sea Sload Slugger""Defeat the Sea Sload B'Korgen at Welenkin Cove.",
+[2039] = {Location=23},	-- "Talon Taker" "Defeat Haeliata and Nagravia at Gryphon Run.",
+[2040] = {Location=23},	-- "Amphibian Agitator""Defeat Graveld at Graveld's Hideaway.",
+[2041] = {Location=23},	-- "Keel Hauler" "Defeat Keelsplitter at Keelsplitter's Nest.",
+[2212] = {Location=23},	-- "Asp Awareness" "Defeat Keelsplitter without stepping on any of the snakes.",
+
+--Mirelurk
+[2293] = {Location=24},	-- Fiend of the Fens,  Defeat the necromancer Baxilt-Gah at Bok-Xul.
+[2294] = {Location=24},	-- Feller of Thunder,  Defeat the miregaunt Walks-Like-Thunder at the Echoing Hollow.
+}
diff --git a/data/WB2.lua b/data/WB2.lua
deleted file mode 100644
index 0c0d72f..0000000
--- a/data/WB2.lua
+++ /dev/null
@@ -1,201 +0,0 @@
---[[  Taken from Locations2 (en)   for reference
---EP
-{ name="Stonefalls",Grp="Fungal Grotto", Pub="Crow's Wood"},	--1
-{ name="Deshaan", Grp="Darkshade Caverns", Pub="Forgotten Crypts"},	--2
-{ name="Shadowfen", Grp="Arx Corinum", Pub="Sanguine's Demesne"},	--3
-{ name="Eastmarch", Grp="Direfrost Keep", Pub="Hall of the Dead"},	--4
-{ name="The Rift", Grp="Blessed Crucible", Pub="Lion's Den"},	--5
---DC
-{ name="Glenumbra", Grp="Spindleclutch", Pub="Bad Man's Hallows"},	--6
-{ name="Stormhaven", Grp="Wayrest Sewers", Pub="Bonesnap Ruins"},	--7
-{ name="Rivenspire", Grp="Crypt of Hearts", Pub="Obsidian Scar"},	--8
-{ name="Alik'r Desert", Grp="Volenfell", Pub="Lost City"},	--9
-{ name="Bangkorai", Grp="Blackheart Haven", Pub="Razaks Wheel"},	--10
---AD
-{ name="Auridon", Grp="Banished Cells", Pub="Toothmall Gully"},	--11
-{ name="Grahtwood", Grp="Elden Hollow", Pub="Root Sunder Ruins"},	--12
-{ name="Greenshade", Grp="City of Ash", Pub="Rulanyil's Fall"},	--13
-{ name="Malabal-Tor", Grp="Tempest Island", Pub="Crimson Cove"},	--14
-{ name="Reaper's March", Grp="Selene's Web", Pub="The Vile Manse"},	--15
---Coldharbour
-{ name="Coldharbour", Grp="Vaults of Madness", Pub="Village of the Lost"},	--16
-{ name="Dark Brotherhood"},	--17
-{ name="Thieves Guild"},	--18
-{ name="Imperial City"},	--19
-{ name="VVardenfell"},	--20
-
-{ name="Orsinium"},--21
-{ name="Clockwork City"},	--22
-{ name="Summerset"},	--23
-
-}
---]]
-
-
-
-
-WB_dat = {		--World Boss Achievements
---]These index Locations2  (en)  and Locations2key
--- StoneFalls
-[197] = {Location=1},		--Shipwreck Strand
-[199] = {Location=1},		--Shivering Shrine
-[196] = {Location=1},		--Cave of Memories
-[200] = {Location=1},		--Brahma's Grove
-[198] = {Location=1},		--Matron's Clutch
-[195] = {Location=1},		--Strifeswarm Hive
---Deshaan
-[277] = {Location=2},		--Sharpfang
-[276] = {Location=2},		--Grove of the Abomination
-[275] = {Location=2},		--Short-Tusk
-[278] = {Location=2},		--Mabrigash Burial Circle
-[280] = {Location=2},		--Caravan Crest
-[279] = {Location=2},		--Druitularg's Ritual Altar
-
---Shadowfen
-[189] = {Location=3},		--Nen Ria
-[187] = {Location=3}, 	--Haynekhtnamet
-[192] = {Location=3},		--Slaver Camp
-[191] = {Location=3},		--Bitterroot Cave
-[188] = {Location=3},		--Xal Thak
-[190] = {Location=3},		--Captain Bones
---Eastmarch
-[210] = {Location=4},		--RageClaw
-[211] = {Location=4},		--Dragon Mound
-[212] = {Location=4},		--Ratmaster
-[213] = {Location=4},		--Dragon's Hallow
-[257] = {Location=4},		--Swiftblade
-[214] = {Location=4},		--Ammabani's Pride
---The Rift
-[345] = {Location=5},		--Hunter Camp
-[346] = {Location=5},		--Troll Cave
-[347] = {Location=5},		--Frozen Ruins
-[348] = {Location=5},		--Abandoned Camp
-[350] = {Location=5},		--Wisplight Glen
-[349] = {Location=5},		--Giant Camp
---Glenumbra
-[387] = {Location=6},		--Balefire Island
-[382] = {Location=6},		--Seaview Point
-[385] = {Location=6},		--North Shore Point
-[384] = {Location=6},		--Wolf's Camp
-[383] = {Location=6},		--Western Overlook
-[386] = {Location=6},		--Trapjaw's Cove
---Stormhaven
-[400] = {Location=7},		--Spider Nest
-[399] = {Location=7},		--Mudcrab Beach
-[401] = {Location=7},		--Dreugh Waters
-[402] = {Location=7},		--Abandoned Farm
-[403] = {Location=7},		--Scrag's Larder
-[404] = {Location=7},		--Ancient Altar
---Rivenspire
-[158] = {Location=8},		--Aesar's Web
-[159] = {Location=8},		--Valeguard Tower
-[161] = {Location=8},		--Magdelena's Haunt
-[160] = {Location=8},		--Old Kalgon's Keep
-[162] = {Location=8},		--East-Rock Landing
-[163] = {Location=8},		--Siren's Cove
---Alik'r Desert
-[500] = {Location=9},		--Lesser Circle
-[495] = {Location=9},		--Lost Caravan
-[498] = {Location=9},		--Forsaken Hearts Cave
-[496] = {Location=9},		--Giant Camp
-[497] = {Location=9},		--Hag Camp
-[499] = {Location=9},		--King's Rest
---Bangkorai
-[151] = {Location=10},		--Telesubi Ruins
-[150] = {Location=10},		--Nilata Falls
-[152] = {Location=10},		--Summoner's Camp
-[149] = {Location=10},		--Arlimahera's Sanctum
-[153] = {Location=10},		--Lakewatch Tower
-[148] = {Location=10},		--Blighted Isle
---Auridon
-[352] = {Location=11},		--Seaside Scarp
-[351] = {Location=11},		--Soulfire Plateau
-[353] = {Location=11},		--Wreck of the Raptor
-[354] = {Location=11},		--Heretic's Summons
-[355] = {Location=11},		--Nestmother's Den
-[356] = {Location=11},		--Heritance Proving Ground
---Grahtwood
-[700] = {Location=12},		--Thugrub's Cave
-[699] = {Location=12},		--Poacher Camp
-[701] = {Location=12},		--Valanir's Rest
-[698] = {Location=12},		--Lady Solace's Fen
-[696] = {Location=12},		--Hircine's Henge
-[697] = {Location=12},		--Nindaeril's Perch
---Greenshade
-[562] = {Location=13},		--Maormer Camp
-[561] = {Location=13},		--Thodundor's View
-[563] = {Location=13},		--Rootwater Spring
-[564] = {Location=13},		--Reconnaissance Camp
-[560] = {Location=13},		--Gathongor's Mire
-[565] = {Location=13},		--Pelda Tarn
---Malabal-Tor
-[258] = {Location=14},		--Bitterpoint Strand
-[259] = {Location=14},		--Dugan
-[261] = {Location=14},		--Jagged Grotto
-[260] = {Location=14},		--Bone Grappler
-[263] = {Location=14},		--River Edge
-[262] = {Location=14},		--Windshriek Strand
---Reaper's March
-[427] = {Location=15},		--Waterdancer Falls
-[425] = {Location=15},		--Deathsong Cleft
-[428] = {Location=15},		--Reaper's Henge
-[429] = {Location=15},		--Old S'ren-ja Docks
-[426] = {Location=15},		--Big Ozur's Valley
-[430] = {Location=15},		--Ushmal's Rest
---Coldharbour
-[440] = {Location=16},		--Duriatundur's Killing Field
-[439] = {Location=16},		--Aba-Darre
-[443] = {Location=16},		--Risen Court
-[444] = {Location=16},		--Cynhamoth's Grove
-[442] = {Location=16},		--Daedroth Larder
-[441] = {Location=16},		--Zemarek's Hollow
-
---Dark Brotherhood Gold Coast
-[1419] = {Location=17},	-- "Defeat Limenauruus" "Defeat Limenauruus the possessed minotaur and the shadow spirits at Tribune's Folly.",
-[1420] = {Location=17}, 	-- "Conquer the Kvatch Arena" "Enter the Kvatch Arena and defeat all challengers.",
-
--- Thieves Guild. Hews Bane
-[1352] = {Location=18},	-- "Deepest Shallows" "Kill Syvarra of the Deep at Ko Estaran.",
-[1353] = {Location=18},	-- "Cutting the Keel" "Kill Captain Virindi Slave-Taker at Thrall Cove.",
-
---No Wb in Imperial City 19
-
-
-
---Vvardenfell
-[1847] = {Location=20},	--Loop Eradicator  ,"Save Dubdil Alar from the consequences of his temporal experiments.",
-[1802] = {Location=20},	--Songbird Silencer
-[1803] = {Location=20},	--Salothan's Cursebreaker
-[1805] = {Location=20},	--Breaker of the Unbroken, Defeat the nix-ox Nilthog the Unbroken at Nilthog's Hollow.
-[1807] = {Location=20},	--Cheater Defeater, Defeat the Skaafin, Mehz the Cozener, at Dubdil Alar Tower and seal the rift to Oblivion.
-[1804] = {Location=20},	-- "Consort Killer""Defeat the Queen's Consort at Missir-Dadalit Egg Mine.",
-
-
-
---Orsinium
-[1286] = {Location=21},	-- Kill Zandadunoz the Reborn,  Defeat Zandadunoz the Reborn at the Unfinished Dolmen.
-[1285] = {Location=21},	-- Kill Old Snagara,  Kill Old Snagara the echatere in the Poacher's Encampment.
-[1290] = {Location=21},	-- Kill Nyzchaleft,  Kill Nyzchaleft the Dwarven Centurion at Nyzchaleft Falls.
-[1289] = {Location=21},	-- Kill Mad Urkazbur the Ogre,  Kill Mad Urkazbur at the Mad-Ogre's Altar.
-[1287] = {Location=21},	-- Kill King-Chief Edu,  Kill the Riekr regent King-Chief Edu at the King-Chief's Throne.
-[1288] = {Location=21},		-- Kill Corintthac the Abomination,  Kill the Winterborn Briarheart Warrior, Corintthac the Abomination, at the Accursed Nursery.
-
-
---Clock
-[2046] = {Location=22},	-- "Murderer of Crows" "Defeat Ithoxis, Abathoth, and Ssatinot in Exarchs' Egress.",
-[2028] = {Location=22},	-- "Imperfection" "Defeat The Imperfect in the Sanctuary of Verification.",
-
-
---Summerset
-[2036] = {Location=23},	-- "Reef Raider" "Defeat Queen of the Reef at The Queen's Hatchery.",
-[2037] = {Location=23},	-- "Bucking the Matriarchy" "Defeat Caanerin at Indrik Frolic.",
-[2038] = {Location=23},	-- "Sea Sload Slugger""Defeat the Sea Sload B'Korgen at Welenkin Cove.",
-[2039] = {Location=23},	-- "Talon Taker" "Defeat Haeliata and Nagravia at Gryphon Run.",
-[2040] = {Location=23},	-- "Amphibian Agitator""Defeat Graveld at Graveld's Hideaway.",
-[2041] = {Location=23},	-- "Keel Hauler" "Defeat Keelsplitter at Keelsplitter's Nest.",
-[2212] = {Location=23},	-- "Asp Awareness" "Defeat Keelsplitter without stepping on any of the snakes.",
-
---Mirelurk
-[2293] = {Location=24},	-- Fiend of the Fens,  Defeat the necromancer Baxilt-Gah at Bok-Xul.
-[2294] = {Location=24},	-- Feller of Thunder,  Defeat the miregaunt Walks-Like-Thunder at the Echoing Hollow.
-}
diff --git a/data/de/de.lua b/data/de/de.lua
index f1eaf02..d8b1409 100644
--- a/data/de/de.lua
+++ b/data/de/de.lua
@@ -116,148 +116,26 @@ L = {
 	Version = "Version",
 	View_Toggle = "verberge Abgeschlossene",
 	Completed = "Completed on: ",		-- Mouseover achievement detail
-	Filter="Filter",
+	Filter="Show Characters",
 	Detail="Detail",
 }
-L.Grp_TabName["1N"] = "Mode 1N"
-L.Grp_TabName["1V"] = "Mode 1V"
-L.Grp_TabName["1VH"] = "Mode 1VH"
-L.Grp_TabName["2N"] = "Mode 2N"
-L.Grp_TabName["2V"] = "Mode 2V"
-L.Grp_TabName["2VH"] = "Mode 2VH"

-L.Trial_TabName["N"] = "Prüfungen Norm"
-L.Trial_TabName["V"] = "Prüfungen Vet"
-L.Trial_TabName["VH"] = "Prüfungen Hard"
+L.box = {}
+L.box["Public"] = "Offene"
+L.box["Trials Norm"] = "Prüfungen Norm"
+L.box["Trials Vet"] = "Prüfungen Vet"
+L.box["Trials Hard"] = "Prüfungen Hard"

-pub_names = {
---EP
-	["11"]= "Krähenwald",
-	["21"]= "Vergessene Krypten",
-	["31"]= "Sanguines Domäne",
-	["41"]= "Halle der Toten" ,
-	["51"]= "Löwengrube",
---DC
-	["12"]= "Weihegrund des Finsteren" ,
-	["22"]= "Knochenknacker-Ruinen" ,
-	["32"]= "Obsidiannarbe" ,
-	["42"]= "Na-Totambu",
-	["52"]= "Razaks Rad" ,
---AD
-	["13"]= "Zahnbrecherrinne" ,
-	["23"]= "Wurzelbruch" ,
-	["33"]= "Rulanyils Fall" ,
-	["43"]= "Die Blutgrotten" ,
-	["53"]= "Düsteres Herrenhaus" ,
---Coldharbour
-	["14"]= "Dorf der Verlorenen" ,
---Vvardenfell
-	["24"]= "Vergessenes Ödland",
-	["34"]= "Nchuleftingth",
-	["44"]= "Karnwasten",
-	["54"]= "Sonnenfeste",
-	}
+L.box["Group 1N"] = "Group 1N"
+L.box["Group 1V"] = "Group 1V"
+L.box["Group 1VH"] = "Group 1VH"
+L.box["Group 2N"] = "Group 2N"
+L.box["Group 2V"] = "Group 2V"
+L.box["Group 2VH"] = "Group 2VH"
+L.box["DLC Group"] = "DLC Group"

-grp_names = {
---EP
-	["11"]= "Pilzgrotte",
-	["21"]= "Dunkelschattenkavernen",
-	["31"]= "Arx Corinum",
-	["41"]= "Burg Grauenfrost" ,
-	["51"]= "Gesegnete Feuerprobe",
---DC
-	["12"]= "Spindeltiefen",
-	["22"]= "Kanalisation von Wegesruh",
-	["32"]= "Krypta der Herzen",
-	["42"]= "Volenfell",
-	["52"]= "Schwarzherz-Unterschlupf",
---AD
-	["13"]= "Verbannungszellen",
-	["23"]= "Eldengrund",
-	["33"]= "Stadt der Asche",
-	["43"]= "Orkaninsel",
-	["53"]= "Selenes Netz",
---Coldharbour
-	["14"]= "Kammern des Wahnsinns",
-}

-Trials_Names= {}
-Trials_Names["N"] = {
-	["11"] = "Kargstein: Zitadelle von Hel Ra abgeschlossen",
-	["21"] = "Kargstein: Ätherisches Archiv abgeschlossen",
-	["31"] = "Kargstein: Sanctum Ophidia abgeschlossen",
-	["41"] = "Kargstein: Champion der Drachenstern-Arena",
-	["51"] = "Vvardenfell: Abgefertigt",
-	["61"] = "Diebesgilde: Schlund von Lorkhaj abgeschlossen",
-	["71"] = "Sommersend: Ruhe in Wolkenruh",
-	["81"] = "Sommersend: Streiter von Wolkenruh",
-	["91"] = "Sommersend: Erlöser von Wolkenruh",
-	["101"] = "Stadt der Uhrwerke: Erlöser der Anstalt Sanctorium",
-	["111"] = "Stadt der Uhrwerke: Anstalt Sanctorium abgeschlossen",
-	["121"] = "Stadt der Uhrwerke: Streiter der Anstalt Sanctorium",
-}
-Trials_Names["V"] = {
-	["11"] = "Kargstein: Eroberer der Zitadelle von Hel Ra",
-	["21"] = "Kargstein: Eroberer des Ätherisches Archivs",
-	["31"] = "Kargstein: Eroberer von Sanctum Ophidia",
-	["41"] = "Kargstein: Zitadelle von Hel Ra: Das Kriegshorn",
-	["51"] = "Kargstein: Gegen die Uhr: Zitadelle von Hel Ra",
-	["61"] = "Kargstein: Gegen die Uhr: Ätherisches Archiv",
-	["71"] = "Kargstein: Gegen die Uhr: Sanctum Ophidia",
-	["81"] = "Kargstein: Eroberer der Drachenstern-Arena",
-	["91"] = "Vvardenfell: Sieger der Hallen der Fertigung",
-	["101"] = "Vvardenfell: Gegen die Uhr: Hallen der Fertigung",
-	["111"] = "Vvardenfell: Gut geölte Maschine",
-	["121"]	= "Vvardenfell: Kraftwerk",
-	["131"]	= "Vvardenfell: Geplante Überalterung",
-	["141"]	= "Vvardenfell: Umweltbewusst",
-	["151"] = "Vvardenfell: Schalttafel-Ausschalter",
-	["161"] = "VVardenfell: Belastungstest bestanden",
-	["171"] = "Vvardenfell: Wie ein Uhrwerk",
-	["181"]	= "Vvardenfell: Tötungsvorgang",
-	["191"]	= "Vvardenfell: Erzaufseher",
-	["201"] = "Diebesgilde: Eroberer des Schlunds von Lorkhaj",
-	["211"] = "Diebesgilde: Gegen die Uhr: Schlund von Lorkhaj",
-	["221"] = "Diebesgilde: Schlund von Lorkhaj: Von der Kette gelassen",
-	["231"] = "Diebesgilde: Schlund von Lorkhaj: Reine Seelen",
-	["241"] = "Diebesgilde: Schlund von Lorkhaj: Tanz der zwei Monde",
-	["251"] = "Diebesgilde: Schlund von Lorkhaj: Leere abgewendet",
-	["261"] = "Diebesgilde: Schlund von Lorkhaj: Reißzahns Helfer",
-	["271"] = "Diebesgilde: Schlund von Lorkhaj: Champion der Monde",
-	["281"] = "Diebesgilde: Schlund von Lorkhaj: Klarer Sieg",
-	["291"] = "Sommersend: Wolkenruh: Eroberer",
-	["301"] = "Sommersend: Wolkenruh: Im Kreckengalopp",
-	["311"] = "Sommersend: Wolkenruh: Eine Krecke und ihr Schatten",
-	["321"] = "Sommersend: Wolkenruh: Sieger von Wolkenruh",
-	["331"] = "Sommersend: Wolkenruh: Todlose Schatten",
-	["341"] = "Sommersend: Wolkenruh: Der Pfad nach Alaxon",
-	["351"] = "Sommersend: Wolkenruh: In der Schattenwelt",
-	["361"] = "Sommersend: Wolkenruh: Ein Unglück kommt selten allein",
-	["371"] = "Sommersend: Wolkenruh: Licht und tödliche Schatten",
-	["381"] = "Sommersend: Wolkenruh: Kernkoordination",
-	["391"] = "Sommersend: Wolkenruh: Eis des Mystikers",
-	["401"] = "Sommersend: Wolkenruh: Schockinstinkt",
-	["411"] = "Sommersend: Wolkenruh: Tapfere Verbrennung",
-	["421"] = "Stadt der Uhrwerke: Eroberer der Anstalt Sanctorium",
-	["431"] = "Stadt der Uhrwerke: Sieger der Anstalt Sanctorium",
-	["441"]	= "Stadt der Uhrwerke: Heilig",
-	["451"]	= "Stadt der Uhrwerke: Schnelles Erbarmen",
-	["461"] = "Stadt der Uhrwerke: Glückselige Schlägerei",
-	["471"] = "Stadt der Uhrwerke: Seelenruhige Projektionen",
-	["481"] = "Stadt der Uhrwerke: Unvollendete Anwesenheit",
-	["491"] = "Stadt der Uhrwerke: Gerechte Verdammung",
-	["501"] = "Stadt der Uhrwerke: Henkersspruch",
-	["511"] = "Stadt der Uhrwerke: Perfekte Läuterung",
-}

-Trials_Names["VH"] = {
-	["11"] = "Kargstein: Schwierigkeiten in der Zitadelle von Hel Ra",
-	["21"] = "Kargstein: Schwierigkeiten im Ätherischen Archiv",
-	["31"] = "Kargstein: Schwierigkeiten im Sanctum Ophidia",
-	["41"] = "Eroberer der Drachenstern-Arena",
-	["51"] = "Schwierigkeiten im Schlund von Lorkhaj",
-	["61"] = "Eroberer der Prüfungen von Kargstein",
-}


 Locations2 = {   -- Used for WB and SQ,
@@ -294,34 +172,6 @@ Locations2 = {   -- Used for WB and SQ,

 }

-DLC_Location_names = {
-["11"]	= "Rkindaleft",
-["21"]	= "Das alte Orsinium",
-["31"]  = "Mahlstrom",
-["41"]  = "Mahlstrom (Vet)",
-["12"]  = "Kaiserstadt",
-["22"]  = "Kaiserstadt (Vet)",
-["32"]	= "Weißgoldturm",
-["42"]	= "Weißgoldturm (Vet)",
-["13"]	= "Ruinen von Mazzatun",
-["23"]	= "Ruinen von Mazzatun (Vet)",
-["33"]	= "Wiege der Schatten",
-["43"]	= "Wiege der Schatten (Vet)",
-["14"]	= "Blutquellschmiede",
-["24"]	= "Blutquellschmiede (Vet)",
-["34"]	= "Falkenring",
-["44"]	= "Falkenring (Vet)",
-["15"]	= "Gipfel der Schuppenruferin",
-["25"]	= "Gipfel der Schuppenruferin (Vet)",
-["35"]	= "Krallenhort",
-["45"]	= "Krallenhort (Vet)",
-["16"]	= "Mondjägerfeste",
-["26"]	= "Mondjägerfeste (Vet)",
-["36"]	= "Marsch der Aufopferung",
-["46"]	= "Marsch der Aufopferung (Vet)",
-["17"]	= "Schwarzrosengefängnis",
-["27"]	= "Schwarzrosengefängnis (Vet)",
-}
 --With Dungeons  No thieves guild or dark brotherhood
 -- In DLC.lua, the canonical naming DLC_Category= {"Orsinium", "Imperial City", "Shadows of the Hist", "Horns of the Reach", "Dragon Bones","Clockwork City", "Morrowind", "Summerset", "Wolfhunter",  "Murkmire")

diff --git a/data/en/en.lua b/data/en/en.lua
index 8214351..70b2442 100644
--- a/data/en/en.lua
+++ b/data/en/en.lua
@@ -56,8 +56,8 @@ Area_names = {
 }

 L = {
-	GrpDungeon = "Grp Dungeon",
-	PubDungeon = "Pub Dungeon",
+--	GrpDungeon = "Grp Dungeon",
+--	PubDungeon = "Pub Dungeon",
 	VetDungeon = "Vet Dungeon",
 	Leveling  = "Leveling",
 	Male = "Male",
@@ -107,7 +107,7 @@ L = {
 	Mode = "Showing",
 	Grp_TabName={},
 	Trial_TabName={},
-	Pub = "Public",
+--	Pub = "Public",
 	Vet = "Veteran",
 	Vanquisher="Vanquisher",
 	Conqueror="Conqueror",
@@ -133,162 +133,25 @@ L = {
 	View_Toggle = "Hide Complete",
 	Completed = "Completed on: ",		-- Mouseover achievement detail
 	Achievement = "Achievement",
-	Filter="Filter",
+	Filter="Show Characters",
 	Detail="Detail",

 }

-L.Grp_TabName["1N"] = "Mode 1N"
-L.Grp_TabName["1V"] = "Mode 1V"
-L.Grp_TabName["1VH"] = "Mode 1VH"
-L.Grp_TabName["2N"] = "Mode 2N"
-L.Grp_TabName["2V"] = "Mode 2V"
-L.Grp_TabName["2VH"] = "Mode 2VH"

-L.Trial_TabName["N"] = "Trials Norm"
-L.Trial_TabName["V"] = "Trials Vet"
-L.Trial_TabName["VH"] = "Trials Hard"
+L.box = {}
+L.box["Public"] = "Public"
+L.box["Trials Norm"] = "Trials Norm"
+L.box["Trials Vet"] = "Trials Vet"
+L.box["Trials Hard"] = "Trials Hard"

-pub_names = {
---EP
-	["11"]= "Crow's Wood",
-
-	["21"]= "Forgotten Crypts",
-	["31"]= "Sanguine's Demesne",
-
-	["41"]= "Hall of the Dead" ,
-	["51"]= "Lion's Den",
---DC
-	["12"]= "Bad Man's Hallows" ,
-
-	["22"]= "Bonesnap Ruins" ,
-	["32"]= "Obsidian Scar" ,
-	["42"]= "Lost City" ,
-	["52"]= "Razaks Wheel" ,
---AD
-	["13"]= "Toothmall Gully" ,
-	["23"]= "Root Sunder Ruins" ,
-
-	["33"]= "Rulanyil's Fall" ,
-	["43"]= "Crimson Cove" ,
-
-	["53"]= "The Vile Manse" ,
---Coldharbour
-	["14"]= "Village of the Lost" ,
-
---Vvardenfell
-	["24"]= "Forgotten Wastes",
-	["34"]= "Nchuleftingth",
---Summerset
-	["44"]= "Karnwasten",
-	["54"]= "Sunhold",
-}
-
-grp_names = {
---EP
-	["11"]= "Fungal Grotto",
-	["21"]= "Darkshade Caverns",
-	["31"]= "Arx Corinum",
-	["41"]= "Direfrost Keep",
-
-	["51"]= "Blessed Crucible",
---DC
-	["12"]= "Spindleclutch",
-
-	["22"]= "Wayrest Sewers",
-	["32"]= "Crypt of Hearts",
-	["42"]= "Volenfell",
-	["52"]= "Blackheart Haven",
---AD
-	["13"]= "Banished Cells",
-	["23"]= "Elden Hollow",
-	["33"]= "City of Ash",
-	["43"]= "Tempest Island",
-	["53"]= "Selene's Web",
---Coldharbour
-	["14"]= "Vaults of Madness",
-}
-
-Trials_Names= {}
-Trials_Names["N"] = {
-	["11"] = "Craglorn: Hel Ra Citadel Completed",
-	["21"] = "Craglorn: Aetherian Archive Completed",
-
-	["31"] = "Craglorn: Sanctum Ophidia Completed",
-	["41"] = "Craglorn: Dragonstar Arena Champion",
-
-	["51"] = "Vvardenfell: Halls of Fabrication Completed",
-	["61"] = "Thieves Guild: Maw of Lorkhaj Completed",
-	["71"] = "Summerset: Cloudrest Completed",
-	["81"] = "Summerset: Cloudrest Contender",
-	["91"] = "Summerset: Cloudrest Savior",
-	["101"] = "Clockwork City: Asylum Sanctorium Redeemer",
-	["111"] = "Clockwork City: Asylum Sanctorium Completed",
-	["121"] = "Clockwork City: Asylum Sanctorium Contender",
-}
-
-Trials_Names["V"] = {
-	["11"] = "Craglorn: Hel Ra Citadel Conqueror",
-	["21"] = "Craglorn: Aetherian Archive Conqueror",
-	["31"] = "Craglorn: Sanctum Ophidia Conqueror",
-	["41"] = "Craglorn: Hel Ra Citadel: The War Horn",
-	["51"] = "Craglorn: Time Trial: Hel Ra Citadel",
-	["61"] = "Craglorn: Time Trial: Aetherian Archive",
-	["71"] = "Craglorn: Time Trial: Sanctum Ophidia",
-	["81"] = "Craglorn: Dragonstar Arena Conqueror",
-	["91"] = "Vvardenfell: Halls of Fabrication Conqueror",
-	["101"] = "Vvardenfell: Time Trial: Halls of Fabrication",
-	["111"] = "Vvardenfell: Well-Oiled Machine",
-	["121"]	= "Vvardenfell: Power House",
-	["131"]	= "Vvardenfell: Planned Obsolescence",
-	["141"]	= "Vvardenfell: Environmentally Conscious",
-	["151"] = "Vvardenfell: Terminal Terminator",
-	["161"] = "Vvardenfell: Stress Tested",
-	["171"] = "Vvardenfell: Like Clockwork",
-	["181"]	= "Vvardenfell: Kill Process",
-	["191"]	= "Vvardenfell: Arc-Custodian",
-	["201"] = "Thieves Guild: Maw of Lorkhaj Conqueror",
-	["211"] = "Thieves Guild: Time Trial: Maw of Lorkhaj",
-	["221"] = "Thieves Guild: Maw of Lorkhaj: Unchained Ambush",
-	["231"] = "Thieves Guild: Maw of Lorkhaj: Stainless Souls",
-	["241"] = "Thieves Guild: Maw of Lorkhaj: Two-Moons Dance",
-	["251"] = "Thieves Guild: Maw of Lorkhaj: Void Avoided",
-	["261"] = "Thieves Guild: Maw of Lorkhaj: Fang Focused",
-	["271"] = "Thieves Guild: Maw of Lorkhaj: Moons' Champion",
-	["281"] = "Thieves Guild: Maw of Lorkhaj: Spotless Triumph",
-	["291"] = "Summerset: Cloudrest: Conqueror",
-	["301"] = "Summerset: Cloudrest: Speedy Sload Slayer",
-	["311"] = "Summerset: Cloudrest: A Sload and Her Shadow",
-	["321"] = "Summerset: Cloudrest: Vanquisher",
-	["331"] = "Summerset: Cloudrest: Surviving the Shadows",
-	["341"] = "Summerset: Cloudrest: The Path to Alaxon",
-	["351"] = "Summerset: Cloudrest: One Core, No More",
-	["361"] = "Summerset: Cloudrest: Misery Loves Company",
-	["371"] = "Summerset: Cloudrest: Flares and Deadly Shadows",
-	["381"] = "Summerset: Cloudrest: Core Coordination",
-	["391"] = "Summerset: Cloudrest: The Mystic's Ice",
-	["401"] = "Summerset: Cloudrest: Shocking Instinct",
-	["411"] = "Summerset: Cloudrest: Valorous Combustion",
-	["421"] = "Clockwork City: Asylum Sanctorium Conqueror",
-	["431"] = "Clockwork City: Asylum Sanctorium Vanquisher",
-	["441"] = "Clockwork City: Sanctified",
-	["451"] = "Clockwork City: Swift Mercy",
-	["461"] = "Clockwork City: Beatific Beatdown",
-	["471"] = "Clockwork City: Placid Projections",
-	["481"] = "Clockwork City: Imperfect Attendance",
-	["491"] = "Clockwork City: Righteous Condemnation",
-	["501"] = "Clockwork City: Executioners' Judgement",
-	["511"] = "Clockwork City: Perfect Purification",
-}
-
-Trials_Names["VH"] = {
-	["11"] = "Craglorn: Hel Ra Citadel Difficult Mode",
-	["21"] = "Craglorn: Aetherian Archive Difficult Mode",
-	["31"] = "Craglorn: Sanctum Ophidia Difficult Mode",
-	["41"] = "Vvardenfell: Halls of Fabrication Vanquisher",
-	["51"] = "Thieves Guild: Maw of Lorkhaj Difficult Mode",
-	["61"] = "Craglorn Trials Conqueror",
-}
+L.box["Group 1N"] = "Group 1N"
+L.box["Group 1V"] = "Group 1V"
+L.box["Group 1VH"] = "Group 1VH"
+L.box["Group 2N"] = "Group 2N"
+L.box["Group 2V"] = "Group 2V"
+L.box["Group 2VH"] = "Group 2VH"
+L.box["DLC Group"] = "DLC Group"


 Locations2 = {   -- Used for WB and SQ,
@@ -323,34 +186,7 @@ Locations2 = {   -- Used for WB and SQ,
 { name="Murkmire"},	--24
 }

-DLC_Location_names = {
-["11"]	= "Rkindaleft",
-["21"]	= "Old Orsinum",
-["31"]  = "Maelstrom ",
-["41"]  = "Maelstrom (Vet)",
-["12"]  = "Imperial City",
-["22"]  = "Imperial City (Vet)",
-["32"]	= "White-Gold Tower",
-["42"]	= "White-Gold Tower (Vet)",
-["13"]	= "Ruins of Mazzatun",
-["23"]	= "Ruins of Mazzatun (Vet)",
-["33"]	= "Cradle of Shadows",
-["43"]	= "Cradle of Shadows (Vet)",
-["14"]	= "Bloodroot Forge",
-["24"]	= "Bloodroot Forge (Vet)",
-["34"]	= "Falkreath Hold",
-["44"]	= "Falkreath Hold (Vet)",
-["15"]	= "Scalecaller Peak",
-["25"]	= "Scalecaller Peak (Vet)",
-["35"]	= "Fang Lair",
-["45"]	= "Fang Lair (Vet)",
-["16"]	= "Moon Hunter Keep",
-["26"]	= "Moon Hunter Keep (Vet)",
-["36"]	= "March of Sacrifices",
-["46"]	= "March of Sacrifices (Vet)",
-["17"]	= "Blackrose Prison",
-["27"]	= "Blackrose Prison (Vet)",
-}
+

 --With Dungeons  No thieves guild or dark brotherhood
 -- In DLC.lua, the canonical naming DLC_Category= {"Orsinium", "Imperial City", "Shadows of the Hist", "Horns of the Reach", "Dragon Bones","Clockwork City", "Morrowind", "Summerset", "Wolfhunter",  "Murkmire")
diff --git a/data/fr/fr.lua b/data/fr/fr.lua
index b8bce30..a0f9f4a 100644
--- a/data/fr/fr.lua
+++ b/data/fr/fr.lua
@@ -119,177 +119,19 @@ L = {
 	Detail="Detail",
 }

-L.Grp_TabName["1N"] = "Mode 1N"
-L.Grp_TabName["1V"] = "Mode 1V"
-L.Grp_TabName["1VH"] = "Mode 1VH"
-L.Grp_TabName["2N"] = "Mode 2N"
-L.Grp_TabName["2V"] = "Mode 2V"
-L.Grp_TabName["2VH"] = "Mode 2VH"
+L.box = {}
+L.box["Public"] = "Public"
+L.box["Trials Norm"] = "Trials Norm"
+L.box["Trials Vet"] = "Trials Vet"
+L.box["Trials Hard"] = "Trials Hard"

-L.Trial_TabName["N"] = "Trials Norm"
-L.Trial_TabName["V"] = "Trials Vet"
-L.Trial_TabName["VH"] = "Trials Hard"
-
-pub_names = {
---EP
-	["11"]= "Bois du corbeau",
-	["21"]= "Cryptes oubliées",
-	["31"]= "Réaume de Sanghin",
-	["41"]= "Nécropole" ,
-	["51"]= "L'antre du lion",
---DC
-	["12"]= "Sanctuaire du Malandrin" ,
-	["22"]= "Ruines de l'Esquille" ,
-	["32"]= "Cicatrice obsidienne" ,
-	["42"]= "Cité perdue" ,
-	["52"]= "Roue de Razak" ,
---AD
-	["13"]= "Ravine du Chicot" ,
-	["23"]= "Scinderacine" ,
-	["33"]= "Chute des Rulanyil" ,
-	["43"]= "Crique écarlate" ,
-	["53"]= "Presbytère infâme" ,
---Coldharbour
-	["14"]= "Village des perdus" ,
---Vvardenfell
-	["24"]= "Landes oubliées",
-	["34"]= "Nchuleftingth",
-	["44"]= "Gastecairn",
-	["54"]= "Solandie",
-}
-
-grp_names = {
---EP
-	["11"]= "Fungal Grotto",
-	["21"]= "Cavernes d'Ombre-noire",
-	["31"]= "Arx Corinum",
-	["41"]= "Donjon d'Affregivre",
-	["51"]= "Creuset béni",
---DC
-	["12"]= "Tressefuseau",
-	["22"]= "Égouts d'Haltevoie",
-	["32"]= "Crypte des cœurs",
-	["42"]= "Volenfell",
-	["52"]= "Havre de Cœurnoir",
---AD
-	["13"]= "Cachot interdit",
-	["23"]= "Creuset des aînés",
-	["33"]= "Cité des cendres",
-	["43"]= "L'île des Tempêtes",
-	["53"]= "Toile de Sélène",
---Coldharbour
-	["14"]= "Chambres de la folie",
-}
-
-Trials_Names= {}
-Trials_Names["N"] = {
-	["11"] = "Citadelle d'Hel Ra Completed",
-	["21"] = "Archive æthérienne Completed",
-	["31"] = "Sanctum Ophidia Completed",
-	["41"] = "L'Étoile du dragon Champion",
-	["51"] = "Vvardenfell: Halls of Fabrication Completed",
-	["61"] = "Thieves Guild: Maw of Lorkhaj Completed",
-	["71"] = "Summerset: Cloudrest Completed",
-	["81"] = "Summerset: Cloudrest Contender",
-	["91"] = "Summerset: Cloudrest Savior",
-	["101"] = "Cité mécanique: Asylum Sanctorium Redeemer",
-	["111"] = "Cité mécanique: Asylum Sanctorium Completed",
-
-	["121"] = "Cité mécanique: Asylum Sanctorium Contender",
-}
-Trials_Names["V"] = {
-	["11"] = "Citadelle d'Hel Ra Conquérant",
-	["21"] = "Archive æthérienne Conquérant",
-	["31"] = "Sanctum Ophidia Conquérant",
-	["41"] = "Citadelle d'Hel Ra: The War Horn",
-	["51"] = "Time Trial: Citadelle d'Hel Ra",
-	["61"] = "Time Trial: Archive æthérienne",
-	["71"] = "Time Trial: Sanctum Ophidia",
-	["81"] = "L'Étoile du dragon Champion",
-	["91"] = "Vvardenfell: Halls of Fabrication Champion",
-	["101"] = "Vvardenfell: Time Trial: Halls of Fabrication",
-	["111"] = "Vvardenfell: Well-Oiled Machine",
-	["121"]	= "Vvardenfell: Power House",
-	["131"]	= "Vvardenfell: Planned Obsolescence",
-	["141"]	= "Vvardenfell: Environmentally Conscious",
-	["151"] = "Vvardenfell: Terminal Terminator",
-	["161"] = "Vvardenfell: Stress Tested",
-	["171"] = "Vvardenfell: Like Clockwork",
-	["181"]	= "Vvardenfell: Kill Process",
-	["191"]	= "Vvardenfell: Arc-Custodian",
-	["201"] = "Thieves Guild: Maw of Lorkhaj Conqueror",
-	["211"] = "Thieves Guild: Time Trial: Maw of Lorkhaj",
-	["221"] = "Thieves Guild: Maw of Lorkhaj: Unchained Ambush",
-	["231"] = "Thieves Guild: Maw of Lorkhaj: Stainless Souls",
-	["241"] = "Thieves Guild: Maw of Lorkhaj: Two-Moons Dance",
-	["251"] = "Thieves Guild: Maw of Lorkhaj: Void Avoided",
-	["261"] = "Thieves Guild: Maw of Lorkhaj: Fang Focused",
-	["271"] = "Thieves Guild: Maw of Lorkhaj: Moons' Champion",
-	["281"] = "Thieves Guild: Maw of Lorkhaj: Spotless Triumph",
-	["291"] = "Summerset: Cloudrest: Conqueror",
-	["301"] = "Summerset: Cloudrest: Speedy Sload Slayer",
-	["311"] = "Summerset: Cloudrest: A Sload and Her Shadow",
-	["321"] = "Summerset: Cloudrest: Vanquisher",
-	["331"] = "Summerset: Cloudrest: Surviving the Shadows",
-	["341"] = "Summerset: Cloudrest: The Path to Alaxon",
-	["351"] = "Summerset: Cloudrest: One Core, No More",
-	["361"] = "Summerset: Cloudrest: Misery Loves Company",
-	["371"] = "Summerset: Cloudrest: Flares and Deadly Shadows",
-	["381"] = "Summerset: Cloudrest: Core Coordination",
-	["391"] = "Summerset: Cloudrest: The Mystic's Ice",
-	["401"] = "Summerset: Cloudrest: Shocking Instinct",
-	["411"] = "Summerset: Cloudrest: Valorous Combustion",
-	["421"] = "Cité mécanique: Asylum Sanctorium Conqueror",
-	["431"] = "Cité mécanique: Asylum Sanctorium Vanquisher",
-	["441"] = "Cité mécanique: Sanctified",
-	["451"] = "Cité mécanique: Swift Mercy",
-	["461"] = "Cité mécanique: Beatific Beatdown",
-	["471"] = "Cité mécanique: Placid Projections",
-	["481"] = "Cité mécanique: Imperfect Attendance",
-	["491"] = "Cité mécanique: Righteous Condemnation",
-	["501"] = "Cité mécanique: Executioners' Judgement",
-	["511"] = "Cité mécanique: Perfect Purification",
-}
-
-Trials_Names["VH"] = {
-	["11"] = "Citadelle d'Hel Ra difficulté maximale",
-	["21"] = "Archive æthérienne difficulté maximale",
-	["31"] = "Sanctum Ophidia difficulté maximale",
-	["41"] = "Vvardenfell: Halls of Fabrication Vanquisher",
-	["51"] = "Thieves Guild: Maw of Lorkhaj Difficult Mode",
-	["61"] = "Craglorn Trials Conqueror",
-}
-
-Locations = {
---EP
-		["11"] = "Stonefalls",
-		["21"] = "Deshaan",
-		["31"] = "Shadowfen",
-		["41"] = "Eastmarch",
-		["51"] = "The Rift",
---DC
-		["12"] = "Glenumbra",
-		["22"] = "Stormhaven",
-		["32"] = "Rivenspire",
-		["42"] = "Alik'r Desert",
-		["52"] = "Bangkorai",
---AD
-		["13"] = "Auridon",
-		["23"] = "Grahtwood",
-		["33"] = "Greenshade",
-		["43"] = "Malabal-Tor",
-		["53"] = "Reaper's March",
---Coldharbour/ Other
-		["14"] = "Coldharbour",
-		["24"] = "Thieves Guild",
-		["34"] = "Dark Brotherhood",
-		["44"] = "La cité impériale",
-		["54"] = "VVardenfell",
---other
-		["15"] = "Orsinium",
-		["25"] = "Cité mécanique",
-		["35"] = "Summerset",
-}
+L.box["Group 1N"] = "Group 1N"
+L.box["Group 1V"] = "Group 1V"
+L.box["Group 1VH"] = "Group 1VH"
+L.box["Group 2N"] = "Group 2N"
+L.box["Group 2V"] = "Group 2V"
+L.box["Group 2VH"] = "Group 2VH"
+L.box["DLC Group"] = "DLC Group"

 Locations2 = {   -- Used for WB and SQ,

@@ -323,34 +165,6 @@ Locations2 = {   -- Used for WB and SQ,
 { name="Murkmire"},	--24
 }

-DLC_Location_names = {
-["11"]	= "Rkindaleft",
-["21"]	= "D'Orsinium-la-Vieille",
-["31"]  = "Maelström",
-["41"]  = "Maelström (Vét)",
-["12"]  = "Prison de la cité impériale",
-["22"]  = "Prison de la cité impériale (Vét)",
-["32"]	= "Tour d\'or blanc",
-["42"]	= "Tour d\'or blanc (Vét)",
-["13"]	= "Ruines de Mazzatun",
-["23"]	= "Ruines de Mazzatun (Vét)",
-["33"]	= "Berceau des ombres",
-["43"]	= "Berceau des ombres (Vét)",
-["14"]	= "Forge Sangracine",
-["24"]	= "Forge Sangracine (Vét)",
-["34"]	= "Forteresse d'Épervine",
-["44"]	= "Forteresse d'Épervine (Vét)",
-["15"]	= "Pic de la Mandécailles",
-["25"]	= "Pic de la Mandécailles (Vét)",
-["35"]	= "Repaire du croc",
-["45"]	= "Repaire du croc (Vét)",
-["16"]	= "Fort du Chasseur lunaire",
-["26"]	= "Fort du Chasseur lunaire (Vét)",
-["36"]	= "Procession des Sacrifiés",
-["46"]	= "Procession des Sacrifiés (Vét)",
-["17"]	= "La prison de la Rose noire",
-["27"]	= "La prison de la Rose noire (Vét)",
-}
 --With Dungeons  No thieves guild or dark brotherhood
 -- In DLC.lua, the canonical naming DLC_Category= {"Orsinium", "Imperial City", "Shadows of the Hist", "Horns of the Reach", "Dragon Bones","Clockwork City", "Morrowind", "Summerset", "Wolfhunter", "Murkmire")

diff --git a/data/ids.lua b/data/ids.lua
index 7abd86f..c174cd2 100644
--- a/data/ids.lua
+++ b/data/ids.lua
@@ -1,4 +1,4 @@
-hist.IDVersion="58-Beta-02"
+hist.IDVersion="58-Beta-03"
 hist.IDs = {
 --  Group 1N
 [1073] = true,
@@ -110,33 +110,32 @@ hist.IDs = {
 [1140] = true,
 [1829] = true,
 [1344] = true,
--- DLC
-[1120] = true,
-[1345] = true,
-[1346] = true,
-[1699] = true,
-[1959] = true,
-[1960] = true,
-[2153] = true,
-[2363] = true,
-[2362] = true,
-[2163] = true,
-[880] = true,
-[2162] = true,
-[1522] = true,
-[1523] = true,
-[1236] = true,
-[2152] = true,
-[1976] = true,
-[1239] = true,
-[1304] = true,
-[1305] = true,
-[1690] = true,
-[1691] = true,
-[1975] = true,
-[1698] = true,
-[1505] = true,
-[1504] = true,
+-- DLC Grp
+[1] = true,
+[2] = true,
+[3] = true,
+[4] = true,
+[5] = true,
+[6] = true,
+[7] = true,
+[8] = true,
+[9] = true,
+[10] = true,
+[12] = true,
+[13] = true,
+[14] = true,
+[15] = true,
+[16] = true,
+[17] = true,
+[18] = true,
+[19] = true,
+[20] = true,
+[21] = true,
+[22] = true,
+[23] = true,
+[24] = true,
+[25] = true,
+[26] = true,
 -- SQ
 [512] = true,
 [2050] = true,
@@ -265,7 +264,9 @@ hist.IDs = {
 [2096] = true,
 [2093] = true,
 [2095] = true,
+[1236] = true,
 [1235] = true,
+[1239] = true,
 [1238] = true,
 -- WB
 [384] = true,
@@ -394,291 +395,4 @@ hist.IDs = {
 -- Specials
 [1248] = true,
 -- DLC2
--- DLC2 Thieves Guild
-[1377] = true,
-[1371] = true,
-[1362] = true,
-[1367] = true,
-[1376] = true,
-[1389] = true,
-[1369] = true,
-[1388] = true,
-[1386] = true,
-[1392] = true,
-[1391] = true,
-[1390] = true,
-[1378] = true,
-[1365] = true,
-[1394] = true,
-[1354] = true,
-[1404] = true,
-[1349] = true,
-[1402] = true,
-[1375] = true,
--- DLC2 Dark Brotherhood
-[1437] = true,
-[1454] = true,
-[1410] = true,
-[1449] = true,
-[1421] = true,
-[1458] = true,
-[1463] = true,
-[1445] = true,
-[1459] = true,
-[1451] = true,
-[1435] = true,
-[1425] = true,
-[1457] = true,
-[1450] = true,
-[1434] = true,
--- DLC2 Orsinium
-[1324] = true,
-[1257] = true,
-[1331] = true,
-[1237] = true,
-[1247] = true,
-[1240] = true,
-[1330] = true,
-[1260] = true,
-[1249] = true,
--- DLC2 Imperial City
-[1261] = true,
-[1182] = true,
-[1276] = true,
-[1109] = true,
-[1185] = true,
-[1306] = true,
-[1133] = true,
-[1128] = true,
-[1303] = true,
-[1129] = true,
-[1279] = true,
-[1273] = true,
-[1132] = true,
-[1184] = true,
-[1174] = true,
-[1275] = true,
-[1280] = true,
-[1142] = true,
-[1268] = true,
-[1122] = true,
--- DLC2 Shadows of the Hist
-[1533] = true,
-[1536] = true,
-[1524] = true,
-[1508] = true,
-[1506] = true,
-[1519] = true,
-[1538] = true,
-[1531] = true,
-[1513] = true,
-[1514] = true,
-[1511] = true,
-[1507] = true,
-[1516] = true,
-[1535] = true,
-[1512] = true,
-[1515] = true,
-[1530] = true,
-[1525] = true,
-[1534] = true,
-[1532] = true,
-[1529] = true,
-[1517] = true,
-[1518] = true,
-[1526] = true,
--- DLC2 Horns of the Reach
-[1819] = true,
-[1949] = true,
-[1945] = true,
-[1703] = true,
-[1696] = true,
-[1704] = true,
-[1821] = true,
-[1694] = true,
-[1695] = true,
-[1947] = true,
-[1818] = true,
-[1817] = true,
-[1937] = true,
-[1822] = true,
-[1942] = true,
-[1948] = true,
-[1950] = true,
-[1946] = true,
-[1816] = true,
-[1951] = true,
-[1702] = true,
-[1820] = true,
-[1941] = true,
-[1697] = true,
-[1823] = true,
--- DLC2 Dragon Bones
-[1989] = true,
-[1987] = true,
-[1963] = true,
-[1986] = true,
-[1969] = true,
-[1990] = true,
-[1985] = true,
-[1982] = true,
-[1984] = true,
-[1979] = true,
-[1980] = true,
-[1970] = true,
-[1964] = true,
-[1972] = true,
-[1983] = true,
-[1967] = true,
-[1965] = true,
-[2102] = true,
-[1974] = true,
-[1968] = true,
-[1966] = true,
-[1971] = true,
-[2103] = true,
-[1988] = true,
-[1991] = true,
-[1973] = true,
-[1981] = true,
--- DLC2 Clockwork City
-[2074] = true,
-[2048] = true,
-[2081] = true,
-[2080] = true,
-[2085] = true,
-[1958] = true,
-[2083] = true,
-[2087] = true,
-[2084] = true,
-[2049] = true,
-[2086] = true,
-[2047] = true,
-[2082] = true,
-[2079] = true,
-[2075] = true,
-[2078] = true,
--- DLC2 Morrowind
-[1806] = true,
-[1811] = true,
-[1849] = true,
-[1809] = true,
-[1827] = true,
-[1834] = true,
-[1826] = true,
-[1837] = true,
-[1871] = true,
-[1868] = true,
-[1831] = true,
-[1832] = true,
-[1874] = true,
-[1853] = true,
-[1875] = true,
-[1838] = true,
-[1872] = true,
-[1839] = true,
-[1873] = true,
-[1851] = true,
-[1856] = true,
-[1833] = true,
-[1877] = true,
-[1836] = true,
-[1848] = true,
-[1850] = true,
-[1840] = true,
-[1876] = true,
-[1835] = true,
--- DLC2 Summerset
-[2235] = true,
-[2221] = true,
-[2238] = true,
-[2213] = true,
-[2243] = true,
-[2135] = true,
-[2139] = true,
-[2236] = true,
-[2194] = true,
-[2205] = true,
-[2138] = true,
-[2182] = true,
-[2137] = true,
-[2244] = true,
-[2237] = true,
-[2193] = true,
-[2204] = true,
-[2242] = true,
-[2100] = true,
-[2255] = true,
-[2256] = true,
-[2210] = true,
-[2249] = true,
-[2252] = true,
-[2251] = true,
-[2250] = true,
-[2254] = true,
-[2253] = true,
-[2257] = true,
-[2202] = true,
-[2231] = true,
-[2232] = true,
-[2211] = true,
-[2181] = true,
-[2222] = true,
-[2201] = true,
-[2233] = true,
-[2207] = true,
-[2042] = true,
-[2184] = true,
-[2241] = true,
-[2234] = true,
-[2136] = true,
-[2140] = true,
-[2131] = true,
-[2185] = true,
-[2220] = true,
-[2101] = true,
-[2134] = true,
-[2171] = true,
--- DLC2 Wolfhunter
-[2154] = true,
-[2155] = true,
-[2156] = true,
-[2158] = true,
-[2159] = true,
-[2164] = true,
-[2165] = true,
-[2166] = true,
-[2167] = true,
-[2168] = true,
-[2170] = true,
-[2297] = true,
-[2298] = true,
-[2299] = true,
-[2300] = true,
-[2301] = true,
-[2302] = true,
-[2303] = true,
-[2304] = true,
-[2305] = true,
-[2306] = true,
-[2307] = true,
-[2308] = true,
-[2309] = true,
-[2310] = true,
-[2311] = true,
-[2312] = true,
--- DLC2 Murkmire
-[2364] = true,
-[2365] = true,
-[2366] = true,
-[2367] = true,
-[2368] = true,
-[2369] = true,
-[2370] = true,
-[2371] = true,
-[2372] = true,
-[2373] = true,
-[2374] = true,
-[2375] = true,
-[2376] = true,
 }
diff --git a/data/keys.lua b/data/keys.lua
index f076fe1..3d586f0 100644
--- a/data/keys.lua
+++ b/data/keys.lua
@@ -1,68 +1,6 @@
 ---Keys  map what we put on a line. they are arrays (ipairs) line going down.
--- Sequence to key (Pub and grp)
-grp1tokey = {
---EP
-"11",
-"21",
-"31",
-"41",
-"51",
---DC
-"12",
-"22",
-"32",
-"42",
-"52",
---AD
-"13",
-"23",
-"33",
-"43",
-"53",
---Coldharbour
-"14",
---Morrowind
-}

---Some are missing
-grp2tokey = {
-"11",	--Fungal Grotto
-"21",	--Darkshade
-"12",	--Spindleclutch
-"22",	--Wayrest Sewers
-"32",	--Crypt of Hearts
-"13",	--Banished Cells
-"23",	--Elden Hollow
-"33",	--City of Ash
-}

-pubtokey = {
---EP
-"11",
-"21",
-"31",
-"41",
-"51",
---DC
-"12",
-"22",
-"32",
-"42",
-"52",
---AD
-"13",
-"23",
-"33",
-"43",
-"53",
---Coldharbour
-"14",
---Vvardendell
-"24",
-"34",
-"44",	-- "Karnwasten Conqueror"
-"54",	-- "Sunhold Conqueror""
-}
 DLC2key={
 --Orsinium
 "11",
@@ -101,39 +39,7 @@ DLC2key={
 "27",	-- (Blackrose Prison) Blackrose Prison Conqueror,  Defeat Battlemage Ennodius, Tames-the-Beast, Lady Minara, and Drakeeh the Unchained in Veteran Blackrose Prison.
 }

---Craglorn Trials
-
-Trials2key= {}
-Trials2key["N"] = {
-"11",	-- "Hel Ra Citadel",
-"21",	-- "Aetherian Archive"
-"31",	-- "Sanctum Ophidia",
-"41",	-- "992,	-- (Trials) Dragonstar Arena Champion,  Conquer all challengers and earn the title of Dragonstar Arena Champion!
-"51",	-- "Halls of Fabrication Conqueror"
-"61",	-- "Maw of Lorkhaj Completed"
-"71",	-- "Cloudrest Contender"
-"81",	-- (Asylum Sanctorium)"Asylum Sanctorium Completed""Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Asylum Sanctorium.",
-}

-Trials2key["V"] = {
-"11",	-- "Hel Ra Citadel",
-"21",	-- "Aetherian Archive"
-"31",	-- "Sanctum Ophidia",
-"41", 	-- 1140,	-- (Trials) Dragonstar Arena Conqueror,  Conquer all challengers on the increased difficulty version of Dragonstar Arena.
-"51",	-- 1462,	-- (Trials) Sanctum Ophidia Conqueror,  Defeat the Celestial Serpent in Veteran Sanctum Ophidia.
-"61",	-- "Halls of Fabrication Conqueror", "Defeat the Assembly General in Veteran Halls of Fabrication.",
-"71",	-- "Maw of Lorkhaj Conqueror", "Defeat Rakkhat, Fang of Lorkhaj and his legions of dro-m'Athra in Veteran Maw of Lorkhaj.",
-"81",	-- "Cloudrest Vanquisher", "Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same fight in Veteran Cloudrest.",
-"91",	-- "Asylum Sanctorium Conqueror", "Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Veteran Asylum Sanctorium.",
-}
-Trials2key["VH"] = {
-"11",	-- "Hel Ra Citadel",
-"21",	-- "Aetherian Archive"
-"31",	-- "Sanctum Ophidia",
-"41",	-- "Halls of Fabrication Vanquisher", "Defeat the Assembly General after empowering it by resetting the circuit breaker in Veteran Halls of Fabrication.",
-"51",	-- "Thieves Guild: "Maw of Lorkhaj Difficult Mode"
-"61",	-- "Craglorn Trials Conqueror",,"Complete Hel Ra Citadel, Aetherian Archive, and Sanctum Ophidia at their highest difficulties.",
-}

 --Generalised Location keys for square Grids

diff --git a/data/make_box.lua b/data/make_box.lua
new file mode 100644
index 0000000..35b34fd
--- /dev/null
+++ b/data/make_box.lua
@@ -0,0 +1,187 @@
+leavewindow_cb = function (self)
+	blank_detail()
+end
+
+mousemove_cb = 	function (self, l, c)
+-- this is passed the box (self)  for char mode.
+-- ignore c.
+-- if this is a dungeon self.box.ach == nil
+
+	if (self == nil) then
+		print ("box_mousemove_cb2: self == nil, WTF?")
+		return
+	end
+
+	if (l == 0) then
+		blank_detail()
+		return
+	end
+
+-- we have previously added .dat to the box, this is the data file that looks up to Ach
+
+	if self.dat == nil then
+		detail_name.title = "box.dat is nil"
+		return
+	end
+
+
+	if (self.dat.id == nil) then
+		print ("box_mousemove_cb2: self.dat.id == nil")
+		return
+	end
+
+	local ach = self.dat.id[l]
+
+	if (ach == nil) then
+		blank_detail()
+		detail_name.title = "box_mousemove_cb2: No Achievement Number for line: " .. tostring(l)		-- Normal on Group 2 and Pub panel with empty spaces
+		return
+	end
+
+	if (Ach_Detail[ach] == nil) then
+		detail_name.title = "No Achievement in Ach_Detail for: " .. ach
+		return
+	end
+
+
+	detail_desc.title = Ach_Detail[ach].description
+
+	if (self.ach == nil) then
+		-- Dungeon, no completion info
+		detail_name.title = "(ID: " .. ach .. ")  "  ..  Ach_Detail[ach].name
+		return
+	end
+
+	--character mode, but char hasn't completed it.
+	if (self.ach[ach] == nil) then
+		detail_name.title = "(ID: " .. ach .. ")  "  ..  Ach_Detail[ach].name
+		return
+	end
+
+
+	--by default, has completed it, add date.
+	detail_name.title = "(ID: " .. ach .. ")  "  .. L.Completed .. os.date(dateformat,self.ach[ach].time) .. "   " .. Ach_Detail[ach].name
+
+end
+
+
+
+make_a_tab = function(playerID, dung_t,Account_t, mebox_s,dat_t)	-- Called per char on me[" "]
+
+
+
+	me[mebox_s] = {}
+	me[mebox_s].box = iup.matrixex {READONLY="YES",numcol=1, numlin=#dat_t.id, widthdef=120}
+	-- We put a lot of stuff under box as that is what gets passed to the mouse callbacks
+	me[mebox_s].box.dat = dat_t
+	me[mebox_s].box.mousemove_cb = mousemove_cb
+	me[mebox_s].box.leavewindow_cb = leavewindow_cb
+
+
+
+	me[mebox_s].box.name= mebox_s
+	me[mebox_s].box.ach = thischar.ach		-- not on dung boxes
+
+	iup.SetAttribute(me[mebox_s].box,  "BGCOLOR" , BG_Colour_Not_Complete)
+
+	--set lines Heading
+	me[mebox_s].box:setcell(0,0, L.Achievements )
+	iup.SetAttribute(me[mebox_s].box,  "WIDTH0", 140)	-- Width of Achievement
+
+	--Load Lines
+	for line, Ach in ipairs (dat_t.id) do  -- Load text
+		me[mebox_s].box:setcell(line,0,Ach_Detail[Ach].name)
+	end
+
+	me[mebox_s].tab = iup.vbox {	["tabtitle"] =L.box[mebox_s],
+									--	iup.label{title=L.PubLab,expand="HORIZONTAL"},
+										me[mebox_s].box,
+										iup.fill{}
+									}
+
+	iup.Append(me.data_tabs,me[mebox_s].tab)
+
+
+	--Make Dungeon box, but only one
+	-- a table for each dungeon to which we add characters
+
+	if dung_t[mebox_s] == nil then
+		--create and initialise to none for all player_IDs
+		dung_t[mebox_s] = {}
+
+		dung_t[mebox_s].keys = {}
+
+	-- Set to none for all chars.
+
+
+		for line, _ in ipairs(dat_t.id) do
+			dung_t[mebox_s].keys[line] = {}
+			for _,playerID in ipairs(Account_t.AllplayerIDs) do
+			--print("Key: " .. key .. ", playerID: " .. playerID)
+			dung_t[mebox_s].keys[line][playerID] = false
+			end
+		end
+
+		---
+		dung_t[mebox_s].box = iup.matrixex {READONLY="YES", numcol=#Account_t.AllplayerIDs,  numlin=#dat_t.id, widthdef=120}
+		dung_t[mebox_s].box.dat = dat_t
+		dung_t[mebox_s].box.mousemove_cb = mousemove_cb
+		dung_t[mebox_s].box.leavewindow_cb = leavewindow_cb
+
+		dung_t[mebox_s].box.name= mebox_s		-- when we are in the box with the mouse CB its possible to see who we are.
+
+		iup.SetAttribute(dung_t[mebox_s].box,  "BGCOLOR" , BG_Colour_Not_Complete)
+
+		--set lines Heading
+		dung_t[mebox_s].box:setcell(0,0, L.Achievements )
+		iup.SetAttribute(dung_t[mebox_s].box,  "WIDTH0", 140)
+
+		--Load Lines (Dungeon Ach names)
+		for line,Ach in ipairs(dat_t.id) do
+			-- print("Dungeon Mode  Line: "..  line.. "  " .. "Ach: ".. Ach)
+			dung_t[mebox_s].box:setcell(line, 0, Ach_Detail[Ach].name)
+		end
+
+		--Create Columns for Chars
+		for col ,playerID in ipairs(Account_t.AllplayerIDs) do
+			dung_t[mebox_s].box:setcell(0, col, playerNames[playerID])
+		end
+
+		--record it
+		table.insert(Account_t.alldungeons,dung_t[mebox_s])
+
+		if L.box[mebox_s] == nil then
+			print("L.box[mebox_s] is nill")
+		end
+		-- how to display it
+		dung_t[mebox_s].tab = iup.vbox {
+				["tabtitle"] =L.box[mebox_s],
+				dung_t[mebox_s].box,
+				iup.fill{},
+			}
+		-- and record that
+		iup.Append(Account_t.dung_tabs, dung_t[mebox_s].tab)
+	end	-- unique dungeon creation
+--
+-- Ok that's the setup done, lets load the data for that "me"
+-- Goes in to the me and also the dungeon by character
+
+	for line, Ach in pairs (dat_t.id) do
+		local bgcolour = "BGCOLOR" .. tostring(line) .. ":*"
+		if thischar.ach[Ach] ~= nil then		-- yes I have it..
+			iup.SetAttribute(me[mebox_s].box, bgcolour, BG_Colour_Complete)
+			me[mebox_s].box:setcell(line,1, L.YesLabel)
+
+			-- Add char to dungeon
+			if dung_t[mebox_s].keys[line] == nil then	-- Add if needed
+				dung_t[mebox_s].keys[line]  = {}
+				print("Shouldn't be needed")
+			end
+			dung_t[mebox_s].keys[line][playerID] = true
+		else
+			iup.SetAttribute(me[mebox_s].box, bgcolour, BG_Colour_Not_Complete)
+			me[mebox_s].box:setcell(line,1, L.NoLabel)
+		end
+	end
+
+end
\ No newline at end of file
diff --git a/data/structure.txt b/data/structure.txt
new file mode 100644
index 0000000..83400ca
--- /dev/null
+++ b/data/structure.txt
@@ -0,0 +1,43 @@
+Character Mode Trials Example
+me.Trials[trials_order]
+			me.Trials[i] = {}						-- Dungeon data storage
+			me.Trials[i].vet = Trials_Dat[i].vet
+			me.Trials[i].box = iup.matrix {numcol=1, numcol_visible=1, numlin=_size(Trials_Dat[i].id), widthdef=110}
+
+			me.Trials[i].box.ach = thischar.ach		-- Put the Achievements here so the mouseover can get the users details
+			me.Trials[i].box.dat = Trials_Dat[i]		-- for mouseover
+			me.Trials[i].box.mousemove_cb = box_mousemove_cb2
+			me.Trials[i].box.leavewindow_cb = box_leavewindow_cb
+
+Trials_Dat["N"].id = {
+["1:1"] = {L=1, C=1, Ach=991},	-- "Hel Ra Citadel Completed",  "Defeat the Celestial Warrior, freeing him from the Serpent's control."
+
+Trials_Names2["N"] = {
+	["1:1"] = "Craglorn: Hel Ra Citadel Completed",
+
+
+Dungeon Mode
+
+Line is Achievement Name
+Column is Player ID
+Data is Y/N
+
+dung.Trials[i]= {}
+dung.Trials[i].name = L.Trial_TabName[i]
+dung.Trials[i].keys ={}   -- key lookup By playe ID
+dung.Trials[i].keys[key][PlayerID]= boolean   key is "L:C"
+
+
+
+
+dung.Trials[i].box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=_size(Trials_Dat[i].id), widthdef=100}
+iup.SetAttribute(dung.Trials[i].box, "READONLY", "YES")
+
+dung.Trials[i].tab = iup.vbox {
+					["tabtitle"] =L.Trial_TabName[i],
+					dung.Trials[i].box,
+					iup.fill{},
+				}
+dung.Trials[i].box.dat = Trials_Dat[i]
+--	dung.Trials[i].box.mousemove_cb = box_mousemove_cb2
+dung.Trials[i].box.leavewindow_cb = box_leavewindow_cb
\ No newline at end of file
diff --git a/data/utility.lua b/data/utility.lua
index 1d1d77d..0091154 100644
--- a/data/utility.lua
+++ b/data/utility.lua
@@ -55,99 +55,81 @@ _size = function (t)		-- return number of elements in table
 	return i
 end

-reverse_id = function (Adata)	-- given a grp-id table like this
-	--[[
-
-	Grp_Dat["1N"].id = {
-	[294]= {L=1, C=1},		-- "Fungal Grotto I Vanquisher",
-	[78]= {L=2, C=1},		-- "Darkshade Caverns I Vanquisher"
-	[272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
-	[357]= {L=4, C=1},		-- "Direfrost Keep Vanquisher"
-	[393]= {L=5, C=1},		-- "Blessed Crucible Vanquisher"
-
-	return a table like this
-	["11"] = 294
-	["21"] = 78
-	]]
-	local rev = {}
-	for ach, lc in pairs (Adata) do
-		local key
-		key = lc.L .. lc.C
-		if rev[key] == nil then
-			rev[key] = ach
-		else
-			print ("Reverse_id, error dup key: " .. key)
-		end
-	end
-	return rev
-end

 blank_detail = function()
 			detail_name.title = ""
 			detail_desc.title = ""
 end

-box_mousemove_cb = 	function (self, l, c)	-- For Char Mode Only
--- we have previously added .dat to the box
-		if self.dat == nil then
-			detail_name.title = "box.dat is nil"
-			return
-		end
+load_visibility=function()

-		if l == 0 or c == 0 then
-			blank_detail()
-			return
-		end
+	local infile = io.open(Settings_s, "r")

-		local key = l .. c
+	if infile == nil then
+		print (Settings_s .. "  not there")

-		local ach = self.dat.reverse_id[key]
+		return false
+	end
+	io.close(infile)

-		if ach == nil then
-			blank_detail()
-		--    detail_name.title = "No reverse lookup on " .. key	-- Normal on Group 2 and Pub panel with empty spaces
-			return
-		end
+	local acc, playerID, visible
+	for line in io.lines(Settings_s) do
+		acc,  playerID, visible =  string.match(line, "(%S+) (%S+) (%S+)")

-		if Ach_Detail[ach] == nil then
-			detail_name.title = "No Achievement for " .. ach
-			return
+		-- char might have been deleted.
+		if(accounts[acc].player[playerID] ~= nil) then
+			if visible == "true" then
+				accounts[acc].player[playerID].visible= true
+			else
+				accounts[acc].player[playerID].visible= false
+			end
 		end

-		if (self.ach == nil) then
-			print("box_mousemove_cb: self.ach is nil")
-			return
-		end

-		if (self.ach[ach] ~= nil) then  -- completed (not on dungeon modes) This Mouseover shouldn't be on Dungeon Modes
+	end

-			detail_name.title = "(ID: " .. ach .. ")  "  .. L.Completed .. os.date(dateformat,self.ach[ach].time) .. "   " .. Ach_Detail[ach].name
-		else
-			detail_name.title = "(ID: " .. ach .. ")  "  ..  Ach_Detail[ach].name
-		end
-		detail_desc.title = Ach_Detail[ach].description

-	end
+end
+
+
+save_visibility=function()
+	local outfile = io.open(Settings_s, "w")
+	for acc,Account_t in pairs (accounts) do
+		for playerID, player_t in pairs (Account_t.player) do
+
+			if outfile == nil then
+				print ("Couldn't open " .. Settings_s .. "  file for writing.")
+				return false
+			end

+			outfile:write(acc .. " " .. playerID)

-box_leavewindow_cb = function (self)
-	blank_detail()
+			if (player_t.visible) then
+				outfile:write(" true\n")
+			else
+				outfile:write(" false\n")
+			end
+		end	 --player
+	end --ac
+	io.close(outfile)
 end

 generate_id=function()
 --write a combined list of achievement id we look for to add to the in-game part (cut and paste) for filtering
     local unique_id= {}   -- (id,true}

-	outfile=io.open("data/ids.lua", "w")
+	local outfile=io.open("data/ids.lua", "w")

 	if outfile == nil then
-		print ("Couldn't open id.lua file for writing.")
+		print ("Couldn't open ids.lua file for writing.")
 	end
+	outfile:write("hist.IDVersion=" .. quote(version) .. "\n")
+
 	outfile:write("hist.IDs = {" .. "\n")

-	for _,i in ipairs(Grp_Order) do
-		outfile:write("-- GRP " .. i ..  "\n")
-		for j,_ in pairs (Grp_Dat[i].id) do
+	for _,i in ipairs(Group_Order) do
+		outfile:write("--  " .. i ..  "\n")
+		for _,j in ipairs (Group_Dat[i].id) do
 		    if unique_id[j] == nil then
 				unique_id[j] = true
 				outfile:write("[" .. j .. "] = true,\n")
@@ -158,7 +140,7 @@ generate_id=function()

 	for _,i in ipairs(Trials_Order) do
 		outfile:write("-- Trial " .. i .. "\n")
-		for j,_ in pairs (Trials_Dat[i].id) do
+		for _,j in ipairs (Trials_Dat[i].id) do
 		    if unique_id[j] == nil then
 				unique_id[j] = true
 				outfile:write("[" .. j .. "] = true,\n")
@@ -166,8 +148,8 @@ generate_id=function()
 		end
 	end

-	outfile:write("-- DLC " .. "\n")
-	for j,_ in pairs (DLC_Dat.id) do
+	outfile:write("-- DLC Grp" .. "\n")
+	for j,_ in pairs (DLC_Grp_Dat.id) do
 		    if unique_id[j] == nil then
 				unique_id[j] = true
 				outfile:write("[" .. j .. "] = true,\n")
@@ -183,7 +165,7 @@ generate_id=function()
 	end

 	outfile:write("-- Pub " .. "\n")
-	for j,_ in pairs (Pub_Dat_Char.id) do
+	for _,j in ipairs (Pub_Dat_Char.id) do
 		    if unique_id[j] == nil then
 				unique_id[j] = true
 				outfile:write("[" .. j .. "] = true,\n")
@@ -208,6 +190,7 @@ generate_id=function()

 	outfile:write("-- DLC2 " .. "\n")

+	--[[
 	for _,dlc in ipairs (DLC_Order) do
 		outfile:write("-- DLC2 " .. dlc .."\n")
 		for _,j in pairs (DLC_Dat2[dlc].line) do
@@ -217,7 +200,7 @@ generate_id=function()
 			end
 		end
 	end
-
+--]]
 	outfile:write("}" .. "\n")
 	outfile:close()
 end
@@ -318,7 +301,7 @@ Populate_Dat = function(matrix, dat_t,ids_t)

 		for i,key_t  in ipairs (Locations2Key) do		--	{ key="1:1",L=1,C=1,Area=1},		--	name="Stonefalls"}
 			local name = Locations2[i].name
-			if name == nil then
+			if name == nil then
 				print("Populate_Dat: Locations2[i].name returns nil for i: " .. i)
 				return
 			end
@@ -386,3 +369,79 @@ Populate_Dat = function(matrix, dat_t,ids_t)
 			matrix.Detail_zbox.value = detail_box[tostring(L) ..":" .. tostring(C)]
 		end
 end
+
+append=function (destination_t,source_t)
+--takes 2 arrays. source_t is appended to destination_t
+	if type(destination_t) ~= "table" then
+		print("error (append), destination_t is not a table")
+		return
+	end
+
+	if type(source_t) ~= "table" then
+		print("error (append), source_t is not a table")
+		return
+	end
+
+	for line, Ach in ipairs (source_t) do
+		table.insert(destination_t,Ach)
+	end
+end
+
+
+--for filtering
+select_box=function (account_t)
+
+-- account_t   is accounts[acc]
+
+local marks_t = {}
+local names_t = {}
+for _,playerID in  ipairs(account_t.AllplayerIDs) do
+
+	if account_t.player[playerID].visible then
+		table.insert(marks_t,1)
+	else
+		table.insert(marks_t,0)
+	end
+	table.insert(names_t,account_t.player[playerID].name)
+
+end
+
+local size = #names_t
+
+local error = iup.ListDialog(2,"Show Characters",size, names_t,0,1,size, marks_t)
+
+
+if error == -1 then
+	return false
+end
+
+
+for i,playerID in  ipairs(account_t.AllplayerIDs) do
+
+	if (marks_t[i] == 0) then
+		account_t.player[playerID].visible = false
+	else
+		account_t.player[playerID].visible = true
+	end
+
+end
+
+
+
+
+for _, ADung in pairs (account_t.alldungeons) do	-- for each dungeon
+
+	for col,playerID in  ipairs(account_t.AllplayerIDs) do
+
+		if account_t.player[playerID].visible then
+			iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"100")
+		else
+			iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"0")
+		end
+	end
+end
+
+save_visibility()
+
+return true
+end
diff --git a/history.txt b/history.txt
index 63f116b..50e20b5 100644
--- a/history.txt
+++ b/history.txt
@@ -1,6 +1,6 @@
 ## Title: Dad's History
-## APIVersion: 100025 100026
-## Version: 57
+## APIVersion: 100027 100026
+## Version: 58-Beta-02
 ## Author: HisDad
 ## Description: Record progress of all characters for offline viewing.
 ## SavedVariables: History_SV