diff --git a/game/database.cc b/game/database.cc
index 3d4ee32..87b25b5 100644
--- a/game/database.cc
+++ b/game/database.cc
@@ -61,8 +61,8 @@ std::string Database::file() {
 	return m_filename.string();
 }
 
-void Database::addPlayer (std::string const& name, std::string const& picture, int id) {
-	m_players.addPlayer(name, picture, id);
+void Database::addPlayer (std::string const& name, std::string const& picture, int id, std::string const& instrument) {
+	m_players.addPlayer(name, picture, id, instrument);
 }
 
 void Database::addSong (boost::shared_ptr<Song> s) {
@@ -143,7 +143,8 @@ void Database::queryPerSongHiscore_HiscoreDisplay (std::ostream & os, boost::sha
 }
 
 void Database::queryPerPlayerHiscore (std::ostream & os, std::string const& track) const {
-	int playerid = m_players.lookup(m_players.current().name);
+//	int playerid = m_players.lookup(m_players.current().name);
+	int playerid = 0;
 	std::vector<HiscoreItem> hi = m_hiscores.queryHiscore(3, playerid, -1, track);
 	for (size_t i=0; i<hi.size(); ++i)
 	{
diff --git a/game/database.hh b/game/database.hh
index be98fe0..cb6cd3b 100644
--- a/game/database.hh
+++ b/game/database.hh
@@ -82,7 +82,7 @@ class Database
   public: // methods for database management
 
 	/**A facade for Players::addPlayer.*/
-	void addPlayer (std::string const& name, std::string const& picture = "", int id = -1);
+	void addPlayer (std::string const& name, std::string const& picture = "", int id = -1, std::string const& instrument = "");
 	/**A facade for SongItems::addSong.*/
 	void addSong (boost::shared_ptr<Song> s);
 	/**A facade for Hiscore::addHiscore.
diff --git a/game/player.hh b/game/player.hh
index 2d7ef01..1c547e8 100644
--- a/game/player.hh
+++ b/game/player.hh
@@ -73,6 +73,8 @@ struct PlayerItem {
 	std::string name; ///< name displayed and used for searching the player
 	std::string picture; ///< the filename which was passed from xml (and is written back)
 	std::string path; ///< a full path to a picture shown, generated from picture above
+	// TODO write back instrument value: if present. it's used, but it won't be saved back
+	std::string instrument; ///< last used user's instrument from xml (and should it br written back?)
 /* Future ideas
 	std::string displayedName; /// artist name, short name, nick (can be changed)
 	std::map<std::string, int> scores; /// map between a Song and the highest score the Player achieved
diff --git a/game/players.cc b/game/players.cc
index 1982bdf..e6f1874 100644
--- a/game/players.cc
+++ b/game/players.cc
@@ -40,7 +40,11 @@ void Players::load(xmlpp::NodeSet const& n) {
 			xmlpp::TextNode* tn = element2.get_child_text();
 			picture = tn->get_content();
 		}
-		addPlayer(a_name->get_value(), picture, id);
+		xmlpp::Attribute* a_instrument = element.get_attribute("instrument");
+		std::string instrument = "";
+		if (a_instrument != NULL)
+			instrument = a_instrument->get_value();
+		addPlayer(a_name->get_value(), picture, id, instrument);
 	}
 }
 
@@ -54,6 +58,7 @@ void Players::save(xmlpp::Element *players) {
 			xmlpp::Element* picture = player->add_child("picture");
 			picture->add_child_text(it->picture);
 		}
+		player->set_attribute("instrument", it->instrument);
 	}
 }
 
@@ -77,13 +82,13 @@ std::string Players::lookup(int id) const {
 	else return it->name;
 }
 
-void Players::addPlayer (std::string const& name, std::string const& picture, int id) {
+void Players::addPlayer (std::string const& name, std::string const& picture, int id, std::string const& instrument) {
 	PlayerItem pi;
 	pi.id = id;
 	pi.name = name;
 	pi.picture = picture;
 	pi.path = "";
-
+	pi.instrument = instrument;
 
 	if (pi.id == -1) pi.id = assign_id_internal();
 
@@ -109,6 +114,13 @@ void Players::addPlayer (std::string const& name, std::string const& picture, in
 void Players::setFilter(std::string const& val) {
 	if (m_filter == val) return;
 	m_filter = val;
+	m_instrument_filter = "";
+	filter_internal();
+}
+
+void Players::setInstrumentFilter(std::string const& val) {
+	if (m_instrument_filter == val) return;
+	m_instrument_filter = val;
 	filter_internal();
 }
 
@@ -133,12 +145,24 @@ void Players::filter_internal() {
 	}
 	math_cover.reset();
 
-	// Restore old selection
 	int pos = 0;
-	if (selection.name != "") {
-		fplayers_t::iterator it = std::find(m_filtered.begin(), m_filtered.end(), selection);
-		math_cover.setTarget(0, 0);
-		if (it != m_filtered.end()) pos = it - m_filtered.begin();
+	if (!m_instrument_filter.empty()) {
+		// lookup player by instrument
+		int i = 0;
+		for (players_t::const_iterator it = m_players.begin(); it != m_players.end(); ++it) {
+	 		if (m_instrument_filter == it->instrument) {
+				pos = i;
+				break;
+			}
+			i++;
+		}
+	} else {
+		// Restore old selection
+		if (!selection.name.empty()) {
+			fplayers_t::iterator it = std::find(m_filtered.begin(), m_filtered.end(), selection);
+			math_cover.setTarget(0, 0);
+			if (it != m_filtered.end()) pos = it - m_filtered.begin();
+		}
 	}
 	math_cover.setTarget(pos, size());
 }
diff --git a/game/players.hh b/game/players.hh
index 28f8044..d6156f4 100644
--- a/game/players.hh
+++ b/game/players.hh
@@ -44,6 +44,7 @@ class Players: boost::noncopyable {
 	fplayers_t m_filtered;
 
 	std::string m_filter;
+	std::string m_instrument_filter;
 	AnimAcceleration math_cover;
 
 	bool m_dirty;
@@ -66,7 +67,7 @@ class Players: boost::noncopyable {
 	std::string lookup(int id) const;
 
 	/// add a player with a displayed name and an optional picture; if no id is given one will be assigned
-	void addPlayer (std::string const& name, std::string const& picture = "", int id = -1);
+	void addPlayer (std::string const& name, std::string const& picture = "", int id = -1, std::string const& instrument = "");
 
 	/// const array access
 	PlayerItem operator[](std::size_t pos) const {
@@ -100,6 +101,8 @@ class Players: boost::noncopyable {
 	}
 	/// filters playerlist by regular expression
 	void setFilter(std::string const& regex);
+	/// filters playerlist by instrument
+	void setInstrumentFilter(std::string const& regex);
   private:
 	int assign_id_internal(); /// returns the next available id
 	void filter_internal();
diff --git a/game/screen_players.cc b/game/screen_players.cc
index b70df29..c7f9677 100644
--- a/game/screen_players.cc
+++ b/game/screen_players.cc
@@ -28,7 +28,8 @@ void ScreenPlayers::enter() {
 	theme.reset(new ThemeSongs());
 	m_emptyCover.reset(new Surface(getThemePath("no_player_image.svg")));
 	m_search.text.clear();
-	m_players.setFilter(m_search.text);
+	m_players.setFilter("");
+	m_players.setInstrumentFilter(m_database.scores.front().track);
 	m_audio.fadeout();
 }
 
@@ -60,6 +61,9 @@ void ScreenPlayers::manageEvent(SDL_Event event) {
 				m_players.update();
 				// the current player is the new created one
 			}
+			// TODO save current instrument to database.xml
+			// now it remains only in memory, until program exiting
+			m_players.current().instrument = m_database.scores.front().track;
 			m_database.addHiscore(m_song);
 			m_database.scores.pop_front();
 
@@ -69,6 +73,7 @@ void ScreenPlayers::manageEvent(SDL_Event event) {
 			} else {
 				m_search.text.clear();
 				m_players.setFilter("");
+				m_players.setInstrumentFilter(m_database.scores.front().track);
 				// add all players which reach highscore because if score is very near or same it might be
 				// frustrating for second one that he cannot enter, so better go for next one...
 			}
