Index: /trunk/src/trinityrealm/AuthCodes.h
===================================================================
--- /trunk/src/trinityrealm/AuthCodes.h (revision 2)
+++ /trunk/src/trinityrealm/AuthCodes.h (revision 34)
@@ -69,5 +69,5 @@
 // will only support WoW and WoW:TBC 2.4.3 client build 8606...
 
-#define EXPECTED_MANGOS_CLIENT_BUILD        {8606, 0}
+//#define EXPECTED_MANGOS_CLIENT_BUILD        {8606, 0} // - commented as builds are set in config
 
 #endif
Index: /trunk/src/trinityrealm/trinityrealm.conf.dist
===================================================================
--- /trunk/src/trinityrealm/trinityrealm.conf.dist (revision 33)
+++ /trunk/src/trinityrealm/trinityrealm.conf.dist (revision 34)
@@ -115,2 +115,18 @@
 WrongPass.BanTime = 600
 WrongPass.BanType = 0
+
+###################################################################################################################
+# CLIENT BUILD OPTIONS
+#
+#	Client Builds:
+#
+#	MinBuild
+#		The minium client build allowed to connect
+#
+#	MaxBuild
+#		The maximum client build allowed to connect
+#
+###################################################################################################################
+
+MinBuild = 8606
+MaxBuild = 8606
Index: /trunk/src/trinityrealm/AuthSocket.cpp
===================================================================
--- /trunk/src/trinityrealm/AuthSocket.cpp (revision 2)
+++ /trunk/src/trinityrealm/AuthSocket.cpp (revision 34)
@@ -370,11 +370,13 @@
     ///- Check if the client has one of the expected version numbers
     bool valid_version=false;
-    int accepted_versions[]=EXPECTED_MANGOS_CLIENT_BUILD;
-    for(int i=0;accepted_versions[i];i++)
-        if(ch->build==accepted_versions[i])
-    {
+	int MinBuild = sConfig.GetIntDefault("MinBuild", 8606);
+	int MaxBuild = sConfig.GetIntDefault("MaxBuild", 8606);
+
+	if(ch->build >= MinBuild && ch->build <= MaxBuild)
         valid_version=true;
         break;
     }
+    else
+	valid_version=false;
 
     /// <ul><li> if this is a valid version
Index: /trunk/src/game/Player.h
===================================================================
--- /trunk/src/game/Player.h (revision 28)
+++ /trunk/src/game/Player.h (revision 34)
@@ -1723,5 +1723,5 @@
         void UpdateArenaFields();
         void UpdateHonorFields();
-        bool RewardHonor(Unit *pVictim, uint32 groupsize, float honor = -1);
+        bool RewardHonor(Unit *pVictim, uint32 groupsize, float honor = -1, bool pvptoken = false);
         uint32 GetHonorPoints() { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); }
         uint32 GetArenaPoints() { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); }
Index: /trunk/src/game/BattleGroundAB.cpp
===================================================================
--- /trunk/src/game/BattleGroundAB.cpp (revision 9)
+++ /trunk/src/game/BattleGroundAB.cpp (revision 34)
@@ -26,4 +26,5 @@
 #include "MapManager.h"
 #include "Language.h"
+#include "World.h"
 #include "Util.h"
 
@@ -108,5 +109,11 @@
             DoorOpen(BG_AB_OBJECT_GATE_H);
 
-            PlaySoundToAll(SOUND_BG_START);
+            if(sWorld.getConfig(CONFIG_BG_START_MUSIC))
+			{
+				PlaySoundToAll(SOUND_BG_START);
+				PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC
+			}
+			else
+				PlaySoundToAll(SOUND_BG_START);
             SetStatus(STATUS_IN_PROGRESS);
 
Index: /trunk/src/game/BattleGroundEY.cpp
===================================================================
--- /trunk/src/game/BattleGroundEY.cpp (revision 9)
+++ /trunk/src/game/BattleGroundEY.cpp (revision 34)
@@ -26,4 +26,5 @@
 #include "MapManager.h"
 #include "Language.h"
+#include "World.h"
 #include "Util.h"
 
@@ -100,5 +101,11 @@
             SendMessageToAll(GetMangosString(LANG_BG_EY_BEGIN));
 
-            PlaySoundToAll(SOUND_BG_START);
+            if(sWorld.getConfig(CONFIG_BG_START_MUSIC))
+            {
+                PlaySoundToAll(SOUND_BG_START);
+                PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC
+            }
+            else
+                PlaySoundToAll(SOUND_BG_START);
             SetStatus(STATUS_IN_PROGRESS);
 
Index: /trunk/src/game/MiscHandler.cpp
===================================================================
--- /trunk/src/game/MiscHandler.cpp (revision 28)
+++ /trunk/src/game/MiscHandler.cpp (revision 34)
@@ -296,6 +296,6 @@
     }
 
-    //instant logout in taverns/cities or on taxi
-    if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) || GetPlayer()->isInFlight())
+    //instant logout in taverns/cities or on taxi or if its enabled in mangosd.conf
+    if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) || GetPlayer()->isInFlight() || sWorld.getConfig(CONFIG_INSTANT_LOGOUT))
     {
         LogoutPlayer(true);
@@ -575,4 +575,11 @@
     if(newZone != _player->GetZoneId())
         GetPlayer()->SendInitWorldStates();                 // only if really enters to new zone, not just area change, works strange...
+
+	// AntiCheat.GMIsland
+	if(sWorld.getConfig(CONFIG_KICK_FROM_GMISLAND))
+	{
+		if(newZone == 876 && GetPlayer()->GetSession()->GetSecurity() == SEC_PLAYER)
+			_player->TeleportTo(13,0,0,0,0);
+	}
 
     GetPlayer()->UpdateZone(newZone);
Index: /trunk/src/game/World.h
===================================================================
--- /trunk/src/game/World.h (revision 28)
+++ /trunk/src/game/World.h (revision 34)
@@ -154,4 +154,26 @@
     CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP,
     CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE,
+
+	CONFIG_PLAYER_START_HONOR,
+	CONFIG_PLAYER_START_ARENAPTS,
+	CONFIG_GM_START_LEVEL,
+	CONFIG_INSTANT_LOGOUT,
+	CONFIG_BG_START_MUSIC,
+	CONFIG_START_ALL_SPELLS,
+	CONFIG_QUEUE_FOR_GM,
+	CONFIG_HONOR_AFTER_DUEL,
+	CONFIG_KICK_FROM_GMISLAND,
+	CONFIG_START_ALL_EXPLORED,
+	CONFIG_DISABLE_BREATHING,
+	CONFIG_DISABLE_RES_SICKNESS,
+	CONFIG_START_ALL_REP,
+	CONFIG_ALWAYS_MAXSKILL,
+	CONFIG_START_ALL_TAXI,
+	CONFIG_PVP_TOKEN_ENABLE,
+	CONFIG_PVP_TOKEN_MAP_TYPE,
+	CONFIG_PVP_TOKEN_ID,
+	CONFIG_PVP_TOKEN_COUNT,
+	CONFIG_NO_RESET_TALENT_COST,
+
     CONFIG_THREAT_RADIUS,
     CONFIG_DECLINED_NAMES_USED,
@@ -458,4 +480,6 @@
         bool IsScriptScheduled() const { return !m_scriptSchedule.empty(); }
 
+	static float PlayerStartGold() { return m_PlayerStartGold; }
+
         // for max speed access
         static float GetMaxVisibleDistanceForCreature() { return m_MaxVisibleDistanceForCreature; }
@@ -513,4 +537,6 @@
         uint32 m_ShutdownMask;
 
+	static float m_PlayerStartGold;
+
         // for max speed access
         static float m_MaxVisibleDistanceForCreature;
Index: /trunk/src/game/World.cpp
===================================================================
--- /trunk/src/game/World.cpp (revision 28)
+++ /trunk/src/game/World.cpp (revision 34)
@@ -63,4 +63,5 @@
 volatile uint32 World::m_worldLoopCounter = 0;
 
+float World::m_PlayerStartGold = 0; // starting gold
 float World::m_MaxVisibleDistanceForCreature  = DEFAULT_VISIBILITY_DISTANCE;
 float World::m_MaxVisibleDistanceForPlayer    = DEFAULT_VISIBILITY_DISTANCE;
@@ -769,4 +770,45 @@
     m_configs[CONFIG_LISTEN_RANGE_YELL]      = sConfig.GetIntDefault("ListenRange.Yell", 300);
 
+	m_PlayerStartGold = sConfig.GetFloatDefault("PlayerStart.Gold", 0);
+	if(m_PlayerStartGold < 0)
+		m_PlayerStartGold = 0;
+
+	if(m_PlayerStartGold > MAX_MONEY_AMOUNT)
+		m_PlayerStartGold = MAX_MONEY_AMOUNT;
+
+	m_configs[CONFIG_PLAYER_START_HONOR] = sConfig.GetIntDefault("PlayerStart.HonorPoints", 0);
+	if(m_configs[CONFIG_PLAYER_START_HONOR] < 0)
+		m_configs[CONFIG_PLAYER_START_HONOR] = 0;
+
+	m_configs[CONFIG_PLAYER_START_ARENAPTS] = sConfig.GetIntDefault("PlayerStart.ArenaPoints", 0);
+	if(m_configs[CONFIG_PLAYER_START_ARENAPTS] < 0)
+		m_configs[CONFIG_PLAYER_START_ARENAPTS] = 0;
+
+	m_configs[CONFIG_GM_START_LEVEL] = sConfig.GetIntDefault("GamemasterStartLevel", 70);
+	if(m_configs[CONFIG_GM_START_LEVEL] < 1)
+		m_configs[CONFIG_GM_START_LEVEL] = 1;
+
+	m_configs[CONFIG_INSTANT_LOGOUT] = sConfig.GetBoolDefault("PlayerInstantLogout", false);
+	m_configs[CONFIG_BG_START_MUSIC] = sConfig.GetBoolDefault("MusicInBattleground", false);
+	m_configs[CONFIG_START_ALL_SPELLS] = sConfig.GetBoolDefault("PlayerStart.AllSpells", false);
+	// Leaving GM queue option out for now, it's not 100% functional with the ACE patch
+	//m_configs[CONFIG_QUEUE_FOR_GM] = sConfig.GetBoolDefault("EnableQueueForGMs", false);
+	m_configs[CONFIG_HONOR_AFTER_DUEL] = sConfig.GetIntDefault("HonorPointsAfterDuel", 0);
+	if(m_configs[CONFIG_HONOR_AFTER_DUEL] < 0)
+		m_configs[CONFIG_HONOR_AFTER_DUEL]= 0;
+	m_configs[CONFIG_KICK_FROM_GMISLAND] = sConfig.GetBoolDefault("AntiCheat.GMIsland", false);
+	m_configs[CONFIG_START_ALL_EXPLORED] = sConfig.GetBoolDefault("PlayerStart.MapsExplored", false);
+	m_configs[CONFIG_DISABLE_BREATHING] = sConfig.GetBoolDefault("DisableWaterBreath", false);
+	m_configs[CONFIG_DISABLE_RES_SICKNESS] = sConfig.GetBoolDefault("DisableResurrectSickness", false);
+	m_configs[CONFIG_START_ALL_REP] = sConfig.GetBoolDefault("PlayerStart.AllReputation", false);
+	m_configs[CONFIG_ALWAYS_MAXSKILL] = sConfig.GetBoolDefault("AlwaysMaxWeaponSkill", false);
+	m_configs[CONFIG_START_ALL_TAXI] = sConfig.GetBoolDefault("PlayerStart.AllFlightPaths", false);
+	m_configs[CONFIG_PVP_TOKEN_ENABLE] = sConfig.GetBoolDefault("PvPToken.Enable", false);
+	m_configs[CONFIG_PVP_TOKEN_MAP_TYPE] = sConfig.GetIntDefault("PvPToken.MapAllowType", 4);
+	m_configs[CONFIG_PVP_TOKEN_ID] = sConfig.GetIntDefault("PvPToken.ItemID", 29434);
+	m_configs[CONFIG_PVP_TOKEN_COUNT] = sConfig.GetIntDefault("PvPToken.ItemCount", 1);
+	if(m_configs[CONFIG_PVP_TOKEN_COUNT] < 1)
+		m_configs[CONFIG_PVP_TOKEN_COUNT] = 1;
+	m_configs[CONFIG_NO_RESET_TALENT_COST] = sConfig.GetBoolDefault("NoResetTalentsCost", false);
 
     m_configs[CONFIG_ARENA_MAX_RATING_DIFFERENCE] = sConfig.GetIntDefault("Arena.MaxRatingDifference", 0);
Index: /trunk/src/game/CharacterHandler.cpp
===================================================================
--- /trunk/src/game/CharacterHandler.cpp (revision 28)
+++ /trunk/src/game/CharacterHandler.cpp (revision 34)
@@ -733,4 +733,62 @@
         sWorld.ShutdownMsg(true,pCurrChar);
 
+	if(sWorld.getConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when logging in
+		pCurrChar->UpdateSkillsToMaxSkillsForLevel();
+
+	//ImpConfig - Check if player has logged in before
+	QueryResult *result = CharacterDatabase.PQuery("SELECT guid FROM has_logged_in_before WHERE guid = %u",pCurrChar->GetGUIDLow());
+	if(!result)
+	{
+	sLog.outBasic("Character '%s' logging in for first time, applying skills and stuff",pCurrChar->GetName());
+	CharacterDatabase.PExecute("INSERT INTO has_logged_in_before VALUES (%u)",pCurrChar->GetGUIDLow());
+
+	//Reputations if "StartAllReputation" is enabled, -- TODO: Fix this in a better way
+	if(sWorld.getConfig(CONFIG_START_ALL_REP))
+	{
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(942),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(935),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(936),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(1011),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(970),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(967),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(989),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(932),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(934),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(1038),42999);
+		pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(1077),42999);
+
+		// Factions depending on team, like cities and some more stuff
+		switch(pCurrChar->GetTeam())
+		{
+		case ALLIANCE:
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(72),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(47),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(69),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(930),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(730),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(978),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(54),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(946),42999);
+			break;
+		case HORDE:
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(76),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(68),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(81),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(911),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(729),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(941),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(530),42999);
+			pCurrChar->SetFactionReputation(sFactionStore.LookupEntry(947),42999);
+			break;
+		}
+	}
+	}
+	else
+		sLog.outBasic("Character '%s' has logged in before",pCurrChar->GetName());
+
+	if(sWorld.getConfig(CONFIG_START_ALL_TAXI))
+		pCurrChar->SetTaxiCheater(true);
+
+
     if(pCurrChar->isGameMaster())
         SendNotification(LANG_GM_ON);
Index: /trunk/src/game/WorldSession.cpp
===================================================================
--- /trunk/src/game/WorldSession.cpp (revision 28)
+++ /trunk/src/game/WorldSession.cpp (revision 34)
@@ -280,5 +280,5 @@
             // give honor to all attackers from set like group case
             for(std::set<Player*>::const_iterator itr = aset.begin(); itr != aset.end(); ++itr)
-                (*itr)->RewardHonor(_player,aset.size());
+                (*itr)->RewardHonor(_player, aset.size(), -1, true);
 
             // give bg rewards and update counters like kill by first from attackers
Index: /trunk/src/game/Player.cpp
===================================================================
--- /trunk/src/game/Player.cpp (revision 28)
+++ /trunk/src/game/Player.cpp (revision 34)
@@ -579,5 +579,23 @@
 
     // set starting level
-    SetUInt32Value( UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL) );
+	if(GetSession()->GetSecurity() >= SEC_MODERATOR)
+		SetUInt32Value( UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_GM_START_LEVEL) ); //ImpConfig
+	else
+		SetUInt32Value( UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL) );
+	// set starting gold
+	SetUInt32Value( PLAYER_FIELD_COINAGE, sWorld.PlayerStartGold()*10000 );
+
+	// set starting honor
+	SetUInt32Value( PLAYER_FIELD_HONOR_CURRENCY, sWorld.getConfig(CONFIG_PLAYER_START_HONOR) );
+
+	// set starting arena pts
+	SetUInt32Value( PLAYER_FIELD_ARENA_CURRENCY, sWorld.getConfig(CONFIG_PLAYER_START_ARENAPTS) );
+
+	// start with every map explored
+	if(sWorld.getConfig(CONFIG_START_ALL_EXPLORED))
+	{
+		for (uint8 i=0; i<64; i++)
+			SetFlag(PLAYER_EXPLORED_ZONES_1+i,0xFFFFFFFF);
+	}
 
     // Played time
@@ -755,6 +773,6 @@
         return;
 
-    //if have water breath , then remove bar
-    if(waterbreath || isGameMaster() || !isAlive())
+    //if players is GM, have waterbreath, dead or breathing is disabled
+    if(sWorld.getConfig(CONFIG_DISABLE_BREATHING) || waterbreath || isGameMaster() || !isAlive())
     {
         StopMirrorTimer(BREATH_TIMER);
@@ -2128,4 +2146,7 @@
 
     UpdateAllStats();
+
+    if(sWorld.getConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up
+    UpdateSkillsToMaxSkillsForLevel();
 
     // set current level health and mana/energy to maximum after applying all mods.
@@ -3602,4 +3623,5 @@
     CharacterDatabase.PExecute("DELETE FROM character_pet WHERE owner = '%u'",guid);
     CharacterDatabase.PExecute("DELETE FROM character_pet_declinedname WHERE owner = '%u'",guid);
+    CharacterDatabase.PExecute("DELETE FROM has_logged_in_before WHERE guid = %u",guid);
     CharacterDatabase.CommitTransaction();
 
@@ -3726,5 +3748,5 @@
     DestroyZoneLimitedItem( true, GetZoneId());
 
-    if(!applySickness || getLevel() <= 10)
+    if(sWorld.getConfig(CONFIG_DISABLE_RES_SICKNESS) || !applySickness || getLevel() <= 10)
         return;
 
@@ -5898,5 +5920,5 @@
 ///and the size of the group for which the honor is divided
 ///An exact honor value can also be given (overriding the calcs)
-bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, float honor)
+bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, float honor, bool pvptoken)
 {
     // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
@@ -6017,4 +6039,40 @@
 
     ApplyModUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, uint32(honor), true);
+
+	if( sWorld.getConfig(CONFIG_PVP_TOKEN_ENABLE) && pvptoken )
+	{
+		if(!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT))
+			return true;
+
+		if(uVictim->GetTypeId() == TYPEID_PLAYER)
+		{
+			// Check if allowed to receive it in current map
+			uint8 MapType = sWorld.getConfig(CONFIG_PVP_TOKEN_MAP_TYPE);
+			if(MapType == 1 && !InBattleGround() && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP) || MapType == 2 && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_FFA_PVP) || MapType == 3 && !InBattleGround())
+				return true;
+
+			uint32 noSpaceForCount = 0;
+			uint32 itemId = sWorld.getConfig(CONFIG_PVP_TOKEN_ID);
+			int32 count = sWorld.getConfig(CONFIG_PVP_TOKEN_COUNT);
+
+			// check space and find places
+			ItemPosCountVec dest;
+			uint8 msg = CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount );
+			if( msg != EQUIP_ERR_OK )   // convert to possible store amount
+				count = noSpaceForCount;
+
+			if( count == 0 || dest.empty()) // can't add any
+			{
+				// -- TODO: Send to mailbox if no space
+				ChatHandler(this).PSendSysMessage("You don't have any space in your bags for a token.");
+				return true;
+			}
+
+			Item* item = StoreNewItem( dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId));
+			SendNewItem(item,count,true,false);
+			ChatHandler(this).PSendSysMessage("You have been awarded a token for slaying another player.");
+		}
+	}
+
     return true;
 }
@@ -6384,4 +6442,11 @@
     else if(duel->opponent->GetComboTarget()==GetPetGUID())
         duel->opponent->ClearComboPoints();
+
+	// Honor points after duel (the winner) - ImpConfig
+	if(sWorld.getConfig(CONFIG_HONOR_AFTER_DUEL > 0))
+	{
+		uint32 amount = sWorld.getConfig(CONFIG_HONOR_AFTER_DUEL);
+		duel->opponent->RewardHonor(NULL,1,amount);
+	}
 
     //cleanups
@@ -7807,4 +7872,8 @@
     data << uint64(guid);
     data << uint32(resetTalentsCost());
+	if(sWorld.getConfig(CONFIG_NO_RESET_TALENT_COST))
+		data << uint32(0);
+	else
+		data << uint32(resetTalentsCost());
     GetSession()->SendPacket( &data );
 }
@@ -17896,5 +17965,5 @@
 
                 // honor can be in PvP and !PvP (racial leader) cases (for alive)
-                if(pGroupGuy->isAlive() && pGroupGuy->RewardHonor(pVictim,count) && pGroupGuy==this)
+                if(pGroupGuy->isAlive() && pGroupGuy->RewardHonor(pVictim,count, -1, true) && pGroupGuy==this)
                     honored_kill = true;
 
@@ -17934,5 +18003,5 @@
 
         // honor can be in PvP and !PvP (racial leader) cases
-        if(RewardHonor(pVictim,1))
+        if(RewardHonor(pVictim,1, -1, true))
             honored_kill = true;
 
Index: /trunk/src/game/BattleGround.h
===================================================================
--- /trunk/src/game/BattleGround.h (revision 9)
+++ /trunk/src/game/BattleGround.h (revision 34)
@@ -32,5 +32,6 @@
     SOUND_HORDE_WINS                = 8454,
     SOUND_ALLIANCE_WINS             = 8455,
-    SOUND_BG_START                  = 3439
+    SOUND_BG_START                  = 3439,
+    SOUND_BG_START_L70ETC			= 11803,
 };
 
Index: /trunk/src/game/BattleGroundWS.cpp
===================================================================
--- /trunk/src/game/BattleGroundWS.cpp (revision 9)
+++ /trunk/src/game/BattleGroundWS.cpp (revision 34)
@@ -26,4 +26,5 @@
 #include "MapManager.h"
 #include "Language.h"
+#include "World.h"
 
 BattleGroundWS::BattleGroundWS()
@@ -98,5 +99,11 @@
             SendMessageToAll(GetMangosString(LANG_BG_WS_BEGIN));
 
-            PlaySoundToAll(SOUND_BG_START);
+            if(sWorld.getConfig(CONFIG_BG_START_MUSIC))
+            {
+                PlaySoundToAll(SOUND_BG_START);
+                PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC - Custom config
+            }
+            else
+                PlaySoundToAll(SOUND_BG_START);
             SetStatus(STATUS_IN_PROGRESS);
 
Index: /trunk/src/game/ObjectMgr.cpp
===================================================================
--- /trunk/src/game/ObjectMgr.cpp (revision 28)
+++ /trunk/src/game/ObjectMgr.cpp (revision 34)
@@ -2082,4 +2082,10 @@
         QueryResult *result = WorldDatabase.Query("SELECT race, class, Spell, Active FROM playercreateinfo_spell");
 
+	QueryResult *result = NULL;
+	if(sWorld.getConfig(CONFIG_START_ALL_SPELLS))
+		result = WorldDatabase.Query("SELECT race, class, Spell, Active FROM playercreateinfo_spell_custom");
+	else
+		result = WorldDatabase.Query("SELECT race, class, Spell, Active FROM playercreateinfo_spell");
+
         uint32 count = 0;
 
@@ -2090,5 +2096,5 @@
             sLog.outString();
             sLog.outString( ">> Loaded %u player create spells", count );
-            sLog.outErrorDb( "Error loading `playercreateinfo_spell` table or empty table.");
+            sLog.outErrorDb( "Error loading player starting spells or empty table.");
         }
         else
Index: /trunk/src/trinitycore/trinitycore.conf.dist
===================================================================
--- /trunk/src/trinitycore/trinitycore.conf.dist (revision 33)
+++ /trunk/src/trinitycore/trinitycore.conf.dist (revision 34)
@@ -1075,3 +1075,112 @@
 Network.TcpNodelay = 1
 
-
+###################################################################################################################
+# CUSTOM SERVER OPTIONS
+#
+#	PlayerStart.Gold
+#		Amount of gold that new players will start with.
+#		If you want to start with silver, use for example 0.1 (for 10s)
+#		Default: 0
+#
+#	PlayerStart.HonorPoints
+#		Amount of honor that new players will start with
+#		Default: 0
+#
+#	PlayerStart.ArenaPoints
+#		Amount of arena points that new players will start with
+#		Default: 0
+#
+#	PlayerStart.AllReputation
+#		Players will start with most of the high level reputations that are needed for items, mounts etc.
+#		If there are any reputation faction you want to be added, just tell me.
+#
+#	PlayerStart.AllSpells
+#		If enabled, players will start with all their class spells (not talents). Useful for instant 70 servers.
+#		You must import playercreateinfo_spell_custom.sql, it's included in the SQL folder.
+#		Default: 0 - off
+#				 1 - on
+#
+#	PlayerStart.MapsExplored
+#		Players will start with all maps explored if enabled
+#
+#	PlayerStart.AllFlightPaths
+#		Players will start with all flight paths (Note: ALL flight paths, not only player's team)
+#
+#	AntiCheat.GMIsland
+#		If a player enters GM island, he will get teleported away. This will prevent cheaters from buying GM stuff
+#		on servers with a GM mall. GM's will not get teleported away.
+#
+#	GamemasterStartLevel
+#		GM starting level
+#		Default: 70 Min,max: 1 - 255
+#
+#	PlayerInstantLogout
+#		Enable or disable instant logout for all players (NOT in combat/while dueling/while falling)
+#		Default: 0 - off
+#			 	1 - on
+#
+#	MusicInBattleground
+#		If enabled, "L70ETC - Power of the horde" will be played when BG starts ;)
+#
+#	EnableQueueForGMs
+#      NOTE: This option currently does not work due to ACE patch
+#		GMs will also be added to the login queue (not gmlvl 3+) if enabled. Useful for GM servers.
+#		Default: 0 - off
+#				 1 - on
+#
+#	HonorPointsAfterDuel
+#		The amount of honor points the duel winner will get after a duel.
+#		Default: 0 - disable
+#
+#	DisableWaterBreath
+#		Disable/enable waterbreathing for players
+#
+#	DisableResurrectSickness
+#		Players wont get any resurrect sickness when speaking with a spirit healer if this is enabled+
+#
+#	AlwaysMaxWeaponSkill
+#		Players will automatically gain max weapon/defense skill when logging in, leveling up etc.
+#
+#	PvPToken.Enable
+#		Enable/disable PvP Token System. Players will get a token after slaying another player that gives honor.
+#
+#	PvPToken.MapAllowType
+#		Where players can receive the pvp token
+#		4 - In all maps
+#		3 - In battlegrounds only
+#		2 - In FFA areas only (gurubashi arena etc)
+#		1 - In battlegrounds AND FFA areas only
+#
+#	PvPToken.ItemID
+#		The item players will get after killing someone if PvP Token system is enabled.
+#		Default: 29434 - Badge of justice
+#
+#	PvPToken.ItemCount
+#		Modify the item ID count - Default: 1
+#
+#	NoResetTalentsCost
+#		Enable or disable no cost when reseting talents
+#
+###################################################################################################################
+
+PlayerStart.Gold = 0
+PlayerStart.HonorPoints = 0
+PlayerStart.ArenaPoints = 0
+PlayerStart.AllReputation = 0
+PlayerStart.AllSpells = 0
+PlayerStart.MapsExplored = 0
+PlayerStart.AllFlightPaths = 0
+AntiCheat.GMIsland = 0
+GamemasterStartLevel = 70
+PlayerInstantLogout = 0
+MusicInBattleground = 0
+EnableQueueForGMs = 0
+HonorPointsAfterDuel = 0
+DisableWaterBreath = 0
+DisableResurrectSickness = 0
+AlwaysMaxWeaponSkill = 0
+PvPToken.Enable = 0
+PvPToken.MapAllowType = 4
+PvPToken.ItemID = 29434
+PvPToken.ItemCount = 1
+NoResetTalentsCost = 0
Index: /trunk/src/trinitycore/Master.cpp
===================================================================
--- /trunk/src/trinitycore/Master.cpp (revision 6)
+++ /trunk/src/trinitycore/Master.cpp (revision 34)
@@ -240,4 +240,9 @@
     loginDatabase.PExecute("UPDATE realmlist SET color = 0, population = 0 WHERE id = '%d'",realmID);
 
+	// Create table: has_logged_in_before - used for certain custom options
+	sLog.outBasic("ImpConfig: Creating/Checking table 'has_logged_in_before'...");
+	CharacterDatabase.PExecute("CREATE TABLE IF NOT EXISTS `has_logged_in_before` (`guid` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`guid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='ImpConfig check';");
+	sLog.outBasic("ImpConfig: Done...");
+
 #ifdef WIN32
     if (sConfig.GetBoolDefault("Console.Enable", true) && (m_ServiceStatus == -1)/* need disable console in service mode*/)
Index: /trunk/THANKS
===================================================================
--- /trunk/THANKS (revision 33)
+++ /trunk/THANKS (revision 34)
@@ -11,8 +11,13 @@
  Trinity Core is a derivation/rewrite of MaNGOS, which was originally written
  by Team Python and the WoW Daemon Team. Many people further helped Trinity Core
- by submitting bug reports, code patches, and suggestions.
+ by submitting bug reports, code patches, and suggestions. Thanks to the
+ community!
 
- Special thanks should also go out to the WowwoW team. We have gained help from
+ Special thanks should go out to the WowwoW team. We have gained help from
  them many times in the creation of this project. Keep up the good work guys.
+
+ Thanks to the ImpConfig developer (dythzer) for the custom configuration patch.
+
+ Thanks to the ScriptDev2 team (http://www.scriptdev2.com) for scripts.
 
 The easiest policy with this file is to thank everyone who contributes to the
