[jajuk] 01/06: Imported Upstream version 1.10.9+dfsg1

Felix Natter fnatter-guest at moszumanska.debian.org
Sun Mar 20 03:18:09 UTC 2016


This is an automated email from the git hooks/post-receive script.

fnatter-guest pushed a commit to branch master
in repository jajuk.

commit a56977a69a5b65102de83194d455e7e0ccdfc53c
Author: Felix Natter <fnatter at gmx.net>
Date:   Sun Mar 20 04:05:09 2016 +0100

    Imported Upstream version 1.10.9+dfsg1
---
 .classpath                                         |   31 +-
 .gitignore                                         |    5 +
 .project                                           |    1 +
 .settings/net.sf.jautodoc.prefs                    |    9 -
 .settings/org.eclipse.jdt.core.prefs               |   25 +-
 .settings/org.eclipse.jdt.ui.prefs                 |   59 +-
 .settings/org.sonar.ide.eclipse.core.prefs         |    8 +
 README.txt                                         |   18 +-
 infinitest.args                                    |    2 +-
 infinitest.filters                                 |    2 -
 pom.xml                                            |  116 +-
 src/doc/README.html                                |   14 +-
 src/legals/AUTHORS.txt                             |    4 +
 src/legals/DEPENDENCIES.txt                        |   41 +-
 src/legals/DERIVATED.txt                           |    2 +-
 src/legals/LICENSE-LASTFM-JAVA.txt                 |   23 +
 src/main/java/ext/AutoCompleteDecorator.java       |   30 +-
 src/main/java/ext/AutoCompleteDocument.java        |   35 +-
 src/main/java/ext/DropDownButton.java              |   20 +-
 src/main/java/ext/FlowScrollPanel.java             |   24 +-
 src/main/java/ext/JScrollingText.java              |   40 +-
 src/main/java/ext/JSplash.java                     |   28 +-
 src/main/java/ext/JSplashLabel.java                |   10 +-
 src/main/java/ext/JVM.java                         |   40 +-
 src/main/java/ext/JXTrayIcon.java                  |   16 +-
 src/main/java/ext/MersenneTwister.java             |  319 +--
 src/main/java/ext/ProcessLauncher.java             |   28 +-
 .../ext/scrollablepopupmenu/XCheckedButton.java    |   53 +-
 .../java/ext/scrollablepopupmenu/XJPopupMenu.java  |   55 +-
 src/main/java/ext/scrollablepopupmenu/package.html |    2 +-
 src/main/java/ext/services/lastfm/AlbumInfo.java   |    7 +-
 .../java/ext/services/lastfm/AlbumListInfo.java    |    5 +-
 src/main/java/ext/services/lastfm/ArtistInfo.java  |    7 +-
 src/main/java/ext/services/lastfm/AudioObject.java |    2 -
 .../java/ext/services/lastfm/ContextListener.java  |    2 -
 .../ext/services/lastfm/FullSubmissionData.java    |   32 +-
 src/main/java/ext/services/lastfm/LastFmAlbum.java |   37 +-
 .../java/ext/services/lastfm/LastFmAlbumList.java  |   12 +-
 .../ext/services/lastfm/LastFmAlbumsRunnable.java  |   55 +-
 .../java/ext/services/lastfm/LastFmArtist.java     |   13 +-
 src/main/java/ext/services/lastfm/LastFmCache.java |   57 +-
 .../ext/services/lastfm/LastFmCoversRunnable.java  |   10 +-
 .../java/ext/services/lastfm/LastFmRunnable.java   |   15 +-
 .../java/ext/services/lastfm/LastFmService.java    |  204 +-
 .../ext/services/lastfm/LastFmSimilarArtists.java  |   16 +-
 .../lastfm/LastFmSimilarArtistsRunnable.java       |   10 -
 src/main/java/ext/services/lastfm/LastFmTrack.java |   10 +-
 .../ext/services/lastfm/ScrobblerException.java    |    7 +-
 .../ext/services/lastfm/SimilarArtistsInfo.java    |    5 +-
 src/main/java/ext/services/lastfm/TrackInfo.java   |    5 +-
 src/main/java/ext/services/lastfm/package.html     |    2 +-
 .../java/ext/services/network/NetworkUtils.java    |   36 +-
 src/main/java/ext/services/network/Proxy.java      |   25 +-
 src/main/java/ext/services/network/package.html    |    2 +-
 src/main/java/ext/services/xml/XMLBuilder.java     |    6 +-
 src/main/java/ext/services/xml/XMLUtils.java       |   16 +-
 src/main/java/ext/services/xml/package.html        |    2 +-
 src/main/java/org/jajuk/Main.java                  |   84 +-
 src/main/java/org/jajuk/base/Album.java            |  146 +-
 src/main/java/org/jajuk/base/AlbumArtist.java      |   15 +-
 .../java/org/jajuk/base/AlbumArtistManager.java    |   92 +-
 src/main/java/org/jajuk/base/AlbumComparator.java  |   12 +-
 src/main/java/org/jajuk/base/AlbumManager.java     |   55 +-
 src/main/java/org/jajuk/base/Artist.java           |   22 +-
 src/main/java/org/jajuk/base/ArtistManager.java    |   56 +-
 src/main/java/org/jajuk/base/Collection.java       |  401 ++--
 src/main/java/org/jajuk/base/Device.java           |  350 +--
 src/main/java/org/jajuk/base/DeviceManager.java    |  143 +-
 src/main/java/org/jajuk/base/Directory.java        |  319 +--
 src/main/java/org/jajuk/base/DirectoryManager.java |   36 +-
 src/main/java/org/jajuk/base/File.java             |  118 +-
 src/main/java/org/jajuk/base/FileManager.java      |  203 +-
 src/main/java/org/jajuk/base/Genre.java            |   22 +-
 src/main/java/org/jajuk/base/GenreManager.java     |   70 +-
 src/main/java/org/jajuk/base/Item.java             |  189 +-
 src/main/java/org/jajuk/base/ItemManager.java      |  209 +-
 src/main/java/org/jajuk/base/LogicalItem.java      |   11 +-
 src/main/java/org/jajuk/base/PhysicalItem.java     |   13 +-
 src/main/java/org/jajuk/base/Playlist.java         |  225 +-
 src/main/java/org/jajuk/base/PlaylistManager.java  |   42 +-
 .../org/jajuk/base/PropertyMetaInformation.java    |   51 +-
 src/main/java/org/jajuk/base/SearchResult.java     |   48 +-
 src/main/java/org/jajuk/base/SmartPlaylist.java    |   25 +-
 src/main/java/org/jajuk/base/Track.java            |  277 ++-
 src/main/java/org/jajuk/base/TrackComparator.java  |   60 +-
 src/main/java/org/jajuk/base/TrackManager.java     |  338 +--
 src/main/java/org/jajuk/base/Type.java             |   26 +-
 src/main/java/org/jajuk/base/TypeManager.java      |   82 +-
 src/main/java/org/jajuk/base/Year.java             |   23 +-
 src/main/java/org/jajuk/base/YearManager.java      |   19 +-
 .../org/jajuk/events/HighPriorityObserver.java     |    5 +-
 src/main/java/org/jajuk/events/JajukEvent.java     |   16 +-
 src/main/java/org/jajuk/events/JajukEvents.java    |   85 +-
 .../java/org/jajuk/events/ObservationManager.java  |   14 +-
 src/main/java/org/jajuk/events/Observer.java       |    6 +-
 .../java/org/jajuk/events/ObserverRegistry.java    |    9 +-
 src/main/java/org/jajuk/events/package.html        |    2 +-
 src/main/java/org/jajuk/i18n/jajuk_zh.properties   |  565 -----
 src/main/java/org/jajuk/i18n/package.html          |    5 -
 src/main/java/org/jajuk/services/alarm/Alarm.java  |   28 +-
 .../org/jajuk/services/alarm/AlarmManager.java     |   30 +-
 .../java/org/jajuk/services/alarm/package.html     |    2 +-
 .../org/jajuk/services/bookmark/Bookmarks.java     |   22 +-
 .../java/org/jajuk/services/bookmark/History.java  |  277 +--
 .../org/jajuk/services/bookmark/HistoryItem.java   |   14 +-
 .../java/org/jajuk/services/bookmark/package.html  |    2 +-
 .../java/org/jajuk/services/cddb/CDDBTrack.java    |   10 +-
 src/main/java/org/jajuk/services/cddb/package.html |    2 +-
 .../org/jajuk/services/core/CleanupService.java    |   74 +
 .../java/org/jajuk/services/core/ExitService.java  |  117 +-
 .../jajuk/services/core/PersistenceService.java    |  250 +++
 .../{RatingManager.java => RatingService.java}     |   44 +-
 .../org/jajuk/services/core/SessionService.java    |  202 +-
 src/main/java/org/jajuk/services/core/package.html |    2 +-
 src/main/java/org/jajuk/services/covers/Cover.java |   55 +-
 .../java/org/jajuk/services/covers/package.html    |    2 +-
 .../java/org/jajuk/services/dbus/DBusManager.java  |    9 +-
 .../org/jajuk/services/dbus/DBusSignalImpl.java    |   19 +-
 .../java/org/jajuk/services/dbus/DBusSupport.java  |   40 +-
 .../org/jajuk/services/dbus/DBusSupportImpl.java   |   25 +-
 src/main/java/org/jajuk/services/dbus/package.html |    2 +-
 src/main/java/org/jajuk/services/dj/Ambience.java  |   27 +-
 .../org/jajuk/services/dj/AmbienceDigitalDJ.java   |   11 +-
 .../org/jajuk/services/dj/AmbienceManager.java     |   10 +-
 src/main/java/org/jajuk/services/dj/DigitalDJ.java |   28 +-
 .../org/jajuk/services/dj/DigitalDJManager.java    |   44 +-
 .../java/org/jajuk/services/dj/Proportion.java     |   13 +-
 .../org/jajuk/services/dj/ProportionDigitalDJ.java |   10 +-
 .../java/org/jajuk/services/dj/Transition.java     |   22 +-
 .../org/jajuk/services/dj/TransitionDigitalDJ.java |   25 +-
 src/main/java/org/jajuk/services/dj/package.html   |    2 +-
 .../org/jajuk/services/lastfm/LastFmManager.java   |   19 +-
 .../java/org/jajuk/services/lastfm/package.html    |    2 +-
 .../org/jajuk/services/lyrics/LyricsService.java   |   30 +-
 .../java/org/jajuk/services/lyrics/package.html    |    2 +-
 .../lyrics/persisters/ILyricsPersister.java        |   11 +-
 .../services/lyrics/persisters/TagPersister.java   |    9 +-
 .../services/lyrics/persisters/TxtPersister.java   |   50 +-
 .../jajuk/services/lyrics/persisters/package.html  |    2 +-
 .../providers/AzLyricsWebLyricsProvider.java       |  155 ++
 .../lyrics/providers/GenericWebLyricsProvider.java |   90 +-
 .../services/lyrics/providers/ILyricsProvider.java |    7 +-
 .../lyrics/providers/JajukLyricsProvider.java      |   31 +-
 .../providers/LyricWikiWebLyricsProvider.java      |  187 --
 .../providers/LyricsManiaWebLyricsProvider.java    |  176 ++
 .../providers/LyricsWikiaWebLyricsProvider.java    |  151 ++
 .../lyrics/providers/TagLyricsProvider.java        |   20 +-
 .../lyrics/providers/TxtLyricsProvider.java        |   25 +-
 .../jajuk/services/lyrics/providers/package.html   |    2 +-
 .../jajuk/services/notification/INotificator.java  |   11 +-
 .../notification/JavaBalloonNotificator.java       |   10 +-
 .../services/notification/NotificatorFactory.java  |   14 +-
 .../services/notification/NotificatorTypes.java    |    9 +-
 .../notification/NotifySendBalloonNotificator.java |   35 +-
 .../services/notification/ToastNotificator.java    |   19 +-
 .../org/jajuk/services/notification/package.html   |    2 +-
 .../services/players/AbstractMPlayerImpl.java      |   78 +-
 .../org/jajuk/services/players/IPlayerImpl.java    |   24 +-
 .../services/players/JavaLayerPlayerImpl.java      |   69 +-
 .../jajuk/services/players/MPlayerPlayerImpl.java  |  158 +-
 .../java/org/jajuk/services/players/Player.java    |  119 +-
 .../jajuk/services/players/QueueController.java    |    8 +-
 .../java/org/jajuk/services/players/QueueList.java |   22 +-
 .../org/jajuk/services/players/QueueModel.java     |  645 +++---
 .../java/org/jajuk/services/players/StackItem.java |   25 +-
 .../jajuk/services/players/WebRadioPlayerImpl.java |   48 +-
 .../org/jajuk/services/reporting/Exporter.java     |   11 +-
 .../jajuk/services/reporting/ExporterFactory.java  |   10 +-
 .../org/jajuk/services/reporting/HTMLExporter.java |    9 +-
 .../org/jajuk/services/reporting/XMLExporter.java  |  130 +-
 .../jajuk/services/reporting/XMLTransformer.java   |   10 +-
 .../java/org/jajuk/services/reporting/package.html |    2 +-
 .../services/startup/StartupAsyncService.java      |   55 +-
 .../services/startup/StartupCollectionService.java |  267 +--
 .../services/startup/StartupControlsService.java   |   27 +-
 .../services/startup/StartupEngineService.java     |  131 +-
 .../jajuk/services/startup/StartupGUIService.java  |   72 +-
 .../java/org/jajuk/services/startup/package.html   |    2 +-
 .../java/org/jajuk/services/tags/ITagImpl.java     |   52 +-
 .../jajuk/services/tags/JAudioTaggerTagImpl.java   |  218 +-
 .../org/jajuk/services/tags/NoTagsTagImpl.java     |   23 +-
 src/main/java/org/jajuk/services/tags/Tag.java     |  168 +-
 .../webradio/CustomRadiosPersistenceHelper.java    |  140 ++
 .../webradio/PresetRadiosPersistenceHelper.java    |  224 ++
 .../java/org/jajuk/services/webradio/WebRadio.java |  130 +-
 .../jajuk/services/webradio/WebRadioHelper.java    |  190 ++
 .../jajuk/services/webradio/WebRadioManager.java   |  421 ++--
 .../services/webradio/WebRadioOrigin.java}         |   62 +-
 .../java/org/jajuk/services/webradio/package.html  |    2 +-
 .../java/org/jajuk/ui/actions/ActionManager.java   |   38 +-
 src/main/java/org/jajuk/ui/actions/ActionUtil.java |   10 +-
 .../org/jajuk/ui/actions/AdoreSelectionAction.java |    7 +-
 .../org/jajuk/ui/actions/AlarmClockAction.java     |    5 +-
 .../ui/actions/AmbienceConfigurationAction.java    |   11 +-
 .../jajuk/ui/actions/AverageSelectionAction.java   |    7 +-
 .../org/jajuk/ui/actions/BanCurrentAction.java     |    8 +-
 .../org/jajuk/ui/actions/BanSelectionAction.java   |    7 +-
 .../java/org/jajuk/ui/actions/BestOfAction.java    |   11 +-
 .../jajuk/ui/actions/BookmarkSelectionAction.java  |    5 +-
 .../org/jajuk/ui/actions/CDDBSelectionAction.java  |    8 +-
 .../ui/actions/ChangeTrackPreferenceAction.java    |    5 +-
 .../org/jajuk/ui/actions/CheckForUpdateAction.java |    7 +-
 .../java/org/jajuk/ui/actions/CommitAction.java    |   54 -
 .../ui/actions/ConfigurationRequiredAction.java    |    5 +-
 .../org/jajuk/ui/actions/ContinueModeAction.java   |   23 +-
 src/main/java/org/jajuk/ui/actions/CopyAction.java |    7 +-
 .../org/jajuk/ui/actions/CopyClipboardAction.java  |    8 +-
 src/main/java/org/jajuk/ui/actions/CutAction.java  |    8 +-
 src/main/java/org/jajuk/ui/actions/DJAction.java   |   13 +-
 .../jajuk/ui/actions/DJConfigurationAction.java    |    7 +-
 .../java/org/jajuk/ui/actions/DebugLogAction.java  |   77 +-
 .../org/jajuk/ui/actions/DecreaseVolumeAction.java |    5 +-
 .../jajuk/ui/actions/DeleteSelectionAction.java    |   34 +-
 src/main/java/org/jajuk/ui/actions/ExitAction.java |   54 +-
 .../org/jajuk/ui/actions/ExportRatingsAction.java  |  147 ++
 .../ui/actions/FindDuplicateTracksAction.java      |   32 +-
 .../org/jajuk/ui/actions/FinishAlbumAction.java    |   19 +-
 .../org/jajuk/ui/actions/ForwardTrackAction.java   |    8 +-
 .../org/jajuk/ui/actions/FullscreenAction.java     |    9 +-
 src/main/java/org/jajuk/ui/actions/GCAction.java   |    6 +-
 .../org/jajuk/ui/actions/GlobalRandomAction.java   |   11 +-
 .../org/jajuk/ui/actions/HateSelectionAction.java  |    7 +-
 .../org/jajuk/ui/actions/HelpRequiredAction.java   |    7 +-
 .../ui/actions/HideShowMountedDevicesAction.java   |    5 +-
 .../org/jajuk/ui/actions/ImportRatingsAction.java  |  158 ++
 .../org/jajuk/ui/actions/IncreaseVolumeAction.java |    5 +-
 .../java/org/jajuk/ui/actions/IntroModeAction.java |   21 +-
 .../java/org/jajuk/ui/actions/JajukAction.java     |   45 +-
 .../java/org/jajuk/ui/actions/JajukActions.java    |  135 +-
 .../org/jajuk/ui/actions/KaraokeModeAction.java    |   19 +-
 .../jajuk/ui/actions/LaunchInBrowserAction.java    |    5 +-
 .../org/jajuk/ui/actions/LikeSelectionAction.java  |    7 +-
 .../org/jajuk/ui/actions/LoveSelectionAction.java  |    7 +-
 src/main/java/org/jajuk/ui/actions/MuteAction.java |    7 +-
 .../java/org/jajuk/ui/actions/NewFolderAction.java |   13 +-
 .../org/jajuk/ui/actions/NewPropertyAction.java    |    7 +-
 .../{AlarmClockAction.java => NewRadioAction.java} |   20 +-
 .../java/org/jajuk/ui/actions/NextAlbumAction.java |    5 +-
 .../java/org/jajuk/ui/actions/NextTrackAction.java |    6 +-
 .../java/org/jajuk/ui/actions/NoveltiesAction.java |   12 +-
 .../org/jajuk/ui/actions/OpenExplorerAction.java   |   19 +-
 .../java/org/jajuk/ui/actions/PasteAction.java     |   32 +-
 .../jajuk/ui/actions/PlayAlbumSelectionAction.java |   10 +-
 .../ui/actions/PlayArtistSelectionAction.java      |   10 +-
 .../ui/actions/PlayDirectorySelectionAction.java   |   10 +-
 .../java/org/jajuk/ui/actions/PlayPauseAction.java |   10 +-
 .../ui/actions/PlayRepeatSelectionAction.java      |   16 +-
 .../org/jajuk/ui/actions/PlaySelectionAction.java  |   10 +-
 .../ui/actions/PlayShuffleSelectionAction.java     |   10 +-
 .../org/jajuk/ui/actions/PoorSelectionAction.java  |    7 +-
 .../org/jajuk/ui/actions/PreparePartyAction.java   |   20 +-
 .../org/jajuk/ui/actions/PreviousAlbumAction.java  |    5 +-
 .../org/jajuk/ui/actions/PreviousTrackAction.java  |    6 +-
 .../jajuk/ui/actions/PushFrontSelectionAction.java |   11 +-
 .../org/jajuk/ui/actions/PushSelectionAction.java  |   10 +-
 .../java/org/jajuk/ui/actions/QualityAction.java   |   15 +-
 .../java/org/jajuk/ui/actions/RefactorAction.java  |   37 +-
 .../java/org/jajuk/ui/actions/RefreshAction.java   |    7 +-
 .../org/jajuk/ui/actions/RemovePropertyAction.java |    7 +-
 .../java/org/jajuk/ui/actions/RenameAction.java    |   27 +-
 .../org/jajuk/ui/actions/RepeatAllModeAction.java  |   33 +-
 .../org/jajuk/ui/actions/RepeatModeAction.java     |   30 +-
 .../org/jajuk/ui/actions/ReplayAlbumAction.java    |    9 +-
 .../java/org/jajuk/ui/actions/ReportAction.java    |   10 +-
 .../jajuk/ui/actions/RestoreAllViewsAction.java    |   71 +-
 .../org/jajuk/ui/actions/RestoreViewsAction.java   |   23 +-
 .../org/jajuk/ui/actions/RewindTrackAction.java    |    9 +-
 .../java/org/jajuk/ui/actions/SaveAsAction.java    |    7 +-
 .../java/org/jajuk/ui/actions/SelectionAction.java |   32 +-
 .../java/org/jajuk/ui/actions/ShowAboutAction.java |    7 +-
 .../jajuk/ui/actions/ShowActivateTagsAction.java   |    7 +-
 .../jajuk/ui/actions/ShowAlbumDetailsAction.java   |   15 +-
 .../ui/actions/ShowCurrentlyPlayingAction.java     |   77 +
 .../org/jajuk/ui/actions/ShowDonateAction.java     |    7 +-
 .../org/jajuk/ui/actions/ShowPropertiesAction.java |    6 +-
 .../org/jajuk/ui/actions/ShuffleModeAction.java    |   32 +-
 .../jajuk/ui/actions/SimpleDeviceWizardAction.java |    7 +-
 .../org/jajuk/ui/actions/SlimBarQueueAction.java   |    7 +-
 .../java/org/jajuk/ui/actions/SlimbarAction.java   |   12 +-
 .../java/org/jajuk/ui/actions/StopTrackAction.java |    9 +-
 .../org/jajuk/ui/actions/SyncTreeTableAction.java  |   10 +-
 .../org/jajuk/ui/actions/TipOfTheDayAction.java    |    7 +-
 .../org/jajuk/ui/actions/UnBanSelectionAction.java |    7 +-
 .../ui/actions/UnsetPreferenceSelectionAction.java |    7 +-
 .../java/org/jajuk/ui/actions/WebRadioAction.java  |   16 +-
 .../ui/actions/WebRadioConfigurationAction.java    |   55 -
 .../org/jajuk/ui/actions/WindowsHotKeyManager.java |  154 ++
 src/main/java/org/jajuk/ui/actions/package.html    |    2 +-
 .../org/jajuk/ui/helpers/AlbumsTableModel.java     |   50 +-
 .../java/org/jajuk/ui/helpers/CDDBTableModel.java  |   20 +-
 .../ui/helpers/CatalogViewTransferHandler.java     |   20 +-
 .../ui/helpers/DefaultMouseWheelListener.java      |    8 +-
 src/main/java/org/jajuk/ui/helpers/Duration.java   |    8 +-
 .../java/org/jajuk/ui/helpers/FilesTableModel.java |   66 +-
 .../java/org/jajuk/ui/helpers/FontManager.java     |  129 +-
 .../java/org/jajuk/ui/helpers/ILaunchCommand.java  |    6 +-
 .../ui/helpers/IndexHighlighterPredicate.java      |    6 +-
 .../java/org/jajuk/ui/helpers/ItemMoveManager.java |   26 +-
 .../org/jajuk/ui/helpers/JajukCellRenderer.java    |   12 +-
 .../org/jajuk/ui/helpers/JajukMouseAdapter.java    |    8 +-
 .../java/org/jajuk/ui/helpers/JajukTableModel.java |   61 +-
 src/main/java/org/jajuk/ui/helpers/JajukTimer.java |   26 +-
 .../jajuk/ui/helpers/LazyLoadingTreeExpander.java  |   10 +-
 .../org/jajuk/ui/helpers/LazyLoadingTreeNode.java  |    7 +-
 .../ui/helpers/ManualDeviceRefreshReporter.java    |   26 +-
 .../ui/helpers/ManualDirectoryRefreshReporter.java |    7 +-
 .../org/jajuk/ui/helpers/PatternInputVerifier.java |    7 +-
 .../jajuk/ui/helpers/PlayHighlighterPredicate.java |   28 +-
 .../org/jajuk/ui/helpers/PlayerStateMediator.java  |   18 +-
 .../ui/helpers/PlaylistEditorTransferHandler.java  |   30 +-
 .../ui/helpers/PlaylistRepositoryTableModel.java   |   77 +-
 .../org/jajuk/ui/helpers/PlaylistTableModel.java   |   86 +-
 .../org/jajuk/ui/helpers/PreferencesJMenu.java     |   49 +-
 .../java/org/jajuk/ui/helpers/RefreshReporter.java |   44 +-
 .../java/org/jajuk/ui/helpers/StarsHelper.java     |   14 +-
 .../org/jajuk/ui/helpers/TableTransferHandler.java |   22 +-
 .../org/jajuk/ui/helpers/TracksTableModel.java     |   63 +-
 .../org/jajuk/ui/helpers/TransferableAlbum.java    |   14 +-
 .../jajuk/ui/helpers/TransferableTableRows.java    |   13 +-
 .../jajuk/ui/helpers/TransferableTreeNodes.java    |   13 +-
 .../java/org/jajuk/ui/helpers/TreeRootElement.java |    7 +-
 .../org/jajuk/ui/helpers/TreeTransferHandler.java  |   15 +-
 .../org/jajuk/ui/helpers/TwoStepsDisplayable.java  |    8 +-
 .../org/jajuk/ui/helpers/WebRadioTableModel.java   |  131 ++
 .../jajuk/ui/helpers/animations/AWTUtilities.java  |   30 +-
 .../ui/helpers/animations/AbstractAnimation.java   |   21 +-
 .../animations/AnimationCompletedEvent.java        |   13 +-
 .../animations/AnimationCompletedListener.java     |   10 +-
 .../jajuk/ui/helpers/animations/FadeAnimation.java |   23 +-
 .../jajuk/ui/helpers/animations/IAnimation.java    |    8 +-
 .../ui/helpers/animations/SlideAnimation.java      |  123 +-
 .../org/jajuk/ui/helpers/animations/package.html   |    2 +-
 .../jajuk/ui/perspectives/AlbumsPerspective.java   |    6 +-
 .../ui/perspectives/ConfigurationPerspective.java  |    6 +-
 .../jajuk/ui/perspectives/DisplayPerspective.java  |    6 +-
 .../jajuk/ui/perspectives/FilesPerspective.java    |    6 +-
 .../org/jajuk/ui/perspectives/IPerspective.java    |   12 +-
 .../org/jajuk/ui/perspectives/InfoPerspective.java |    6 +-
 .../jajuk/ui/perspectives/PerspectiveAdapter.java  |  299 ++-
 .../jajuk/ui/perspectives/PerspectiveManager.java  |  114 +-
 .../ui/perspectives/PlaylistsPerspective.java      |    6 +-
 .../jajuk/ui/perspectives/SimplePerspective.java   |    7 +-
 .../org/jajuk/ui/perspectives/StatPerspective.java |    6 +-
 .../jajuk/ui/perspectives/TracksPerspective.java   |    6 +-
 .../java/org/jajuk/ui/substance/ButtonShaper.java  |   19 +-
 .../org/jajuk/ui/substance/CircleButtonShaper.java |    9 +-
 .../ui/substance/LeftConcaveButtonShaper.java      |   13 +-
 .../ui/substance/RightConcaveButtonShaper.java     |   12 +-
 .../jajuk/ui/substance/RoundRectButtonShaper.java  |    9 +-
 .../org/jajuk/ui/thumbnails/AbstractThumbnail.java |   85 +-
 .../jajuk/ui/thumbnails/LastFmAlbumThumbnail.java  |   45 +-
 .../jajuk/ui/thumbnails/LastFmArtistThumbnail.java |   18 +-
 .../jajuk/ui/thumbnails/LocalAlbumThumbnail.java   |   39 +-
 .../org/jajuk/ui/thumbnails/ThumbnailManager.java  |   37 +-
 .../org/jajuk/ui/thumbnails/ThumbnailPopup.java    |  204 +-
 src/main/java/org/jajuk/ui/thumbnails/package.html |    2 +-
 .../java/org/jajuk/ui/views/AbstractTableView.java |  330 ++-
 .../java/org/jajuk/ui/views/AbstractTreeView.java  |  115 +-
 .../java/org/jajuk/ui/views/AlbumsTableView.java   |   25 +-
 .../java/org/jajuk/ui/views/AnimationView.java     |  120 +-
 src/main/java/org/jajuk/ui/views/ArtistView.java   |   45 +-
 src/main/java/org/jajuk/ui/views/CDScanView.java   |   33 +-
 src/main/java/org/jajuk/ui/views/CatalogView.java  |  138 +-
 src/main/java/org/jajuk/ui/views/CoverView.java    | 1067 ++++-----
 src/main/java/org/jajuk/ui/views/DeviceView.java   |  166 +-
 .../java/org/jajuk/ui/views/FilesTableView.java    |   33 +-
 .../java/org/jajuk/ui/views/FilesTreeView.java     |  261 +--
 src/main/java/org/jajuk/ui/views/IView.java        |   13 +-
 src/main/java/org/jajuk/ui/views/LyricsView.java   |   80 +-
 .../java/org/jajuk/ui/views/ParameterView.java     | 1566 ++++---------
 .../org/jajuk/ui/views/ParameterViewGUIHelper.java |  892 ++++++++
 src/main/java/org/jajuk/ui/views/PlaylistView.java |  354 +--
 src/main/java/org/jajuk/ui/views/QueueView.java    |  336 +--
 src/main/java/org/jajuk/ui/views/StatView.java     |   55 +-
 .../java/org/jajuk/ui/views/SuggestionView.java    |  318 +--
 .../java/org/jajuk/ui/views/TracksTableView.java   |   26 +-
 .../java/org/jajuk/ui/views/TracksTreeView.java    |  296 +--
 src/main/java/org/jajuk/ui/views/ViewAdapter.java  |   85 +-
 src/main/java/org/jajuk/ui/views/ViewFactory.java  |   15 +-
 src/main/java/org/jajuk/ui/views/WebRadioView.java |  211 ++
 .../java/org/jajuk/ui/views/WikipediaView.java     |   56 +-
 .../org/jajuk/ui/widgets/AmbienceComboBox.java     |   12 +-
 .../java/org/jajuk/ui/widgets/CommandJPanel.java   |  236 +-
 .../java/org/jajuk/ui/widgets/CopyableLabel.java   |   19 +-
 src/main/java/org/jajuk/ui/widgets/IconLabel.java  |   61 +-
 .../org/jajuk/ui/widgets/InformationJPanel.java    |   76 +-
 .../java/org/jajuk/ui/widgets/JPressButton.java    |   44 +-
 .../org/jajuk/ui/widgets/JajukBasicComboPopup.java |    9 +-
 .../java/org/jajuk/ui/widgets/JajukButton.java     |   14 +-
 .../org/jajuk/ui/widgets/JajukFileChooser.java     |   19 +-
 .../java/org/jajuk/ui/widgets/JajukHtmlPanel.java  |   50 +-
 .../jajuk/ui/widgets/JajukInformationDialog.java   |   31 +-
 .../java/org/jajuk/ui/widgets/JajukJDialog.java    |   12 +-
 .../java/org/jajuk/ui/widgets/JajukJMenuBar.java   |  226 +-
 .../java/org/jajuk/ui/widgets/JajukJSplitPane.java |   13 +-
 .../java/org/jajuk/ui/widgets/JajukJToolbar.java   |    8 +-
 src/main/java/org/jajuk/ui/widgets/JajukTable.java |  199 +-
 src/main/java/org/jajuk/ui/widgets/JajukToast.java |   14 +-
 .../org/jajuk/ui/widgets/JajukToggleButton.java    |   42 +-
 .../java/org/jajuk/ui/widgets/OKCancelPanel.java   |   20 +-
 .../java/org/jajuk/ui/widgets/PasswordDialog.java  |   19 +-
 .../java/org/jajuk/ui/widgets/PathSelector.java    |   19 +-
 .../org/jajuk/ui/widgets/PerspectiveBarJPanel.java |   12 +-
 .../org/jajuk/ui/widgets/PreferenceToolbar.java    |   24 +-
 src/main/java/org/jajuk/ui/widgets/SearchBox.java  |   88 +-
 .../java/org/jajuk/ui/widgets/SearchJPanel.java    |   23 +-
 .../java/org/jajuk/ui/widgets/SizedButton.java     |   14 +-
 .../java/org/jajuk/ui/widgets/SizedJMenuItem.java  |    9 +-
 .../org/jajuk/ui/widgets/SmartPlaylistView.java    |   12 +-
 .../java/org/jajuk/ui/widgets/StarIconLabel.java   |   30 +-
 .../java/org/jajuk/ui/widgets/SteppedComboBox.java |   21 +-
 src/main/java/org/jajuk/ui/widgets/ToggleLink.java |    7 +-
 .../ui/widgets/TrackPositionSliderToolbar.java     |   37 +-
 .../java/org/jajuk/ui/widgets/WebRadioButton.java  |  124 ++
 .../java/org/jajuk/ui/windows/IJajukWindow.java    |    6 +-
 .../jajuk/ui/windows/JajukFullScreenWindow.java    |   65 +-
 .../java/org/jajuk/ui/windows/JajukMainWindow.java |  326 +--
 .../java/org/jajuk/ui/windows/JajukSlimbar.java    |  191 +-
 .../java/org/jajuk/ui/windows/JajukSystray.java    |  150 +-
 .../ui/windows/WindowGlobalKeystrokeManager.java   |   18 +-
 .../java/org/jajuk/ui/windows/WindowState.java     |   11 +-
 .../org/jajuk/ui/windows/WindowStateDecorator.java |   75 +-
 src/main/java/org/jajuk/ui/wizard/AboutWindow.java |   34 +-
 .../java/org/jajuk/ui/wizard/AlarmClockDialog.java |   57 +-
 .../java/org/jajuk/ui/wizard/AmbienceWizard.java   |  417 ----
 src/main/java/org/jajuk/ui/wizard/CDDBWizard.java  |   46 +-
 .../org/jajuk/ui/wizard/CustomPropertyWizard.java  |   21 +-
 .../java/org/jajuk/ui/wizard/DeviceWizard.java     |  173 +-
 .../java/org/jajuk/ui/wizard/DigitalDJWizard.java  | 1556 -------------
 .../java/org/jajuk/ui/wizard/DonateWindow.java     |   44 +-
 .../org/jajuk/ui/wizard/DuplicateTracksDialog.java |   90 +-
 .../ui/wizard/ExtraTagsConfigurationWizard.java    |   39 +-
 .../java/org/jajuk/ui/wizard/FirstTimeWizard.java  |  132 +-
 .../org/jajuk/ui/wizard/GenresSelectionDialog.java |   38 +-
 .../org/jajuk/ui/wizard/NewPropertyWizard.java     |   32 +-
 .../org/jajuk/ui/wizard/PreparePartyWizard.java    | 1510 -------------
 .../java/org/jajuk/ui/wizard/PropertiesDialog.java |  474 ++--
 .../java/org/jajuk/ui/wizard/RefreshDialog.java    |   84 +-
 .../org/jajuk/ui/wizard/RemovePropertyWizard.java  |   11 +-
 .../org/jajuk/ui/wizard/SimpleDeviceWizard.java    |   59 +-
 .../org/jajuk/ui/wizard/TipOfTheDayWizard.java     |   36 +-
 .../java/org/jajuk/ui/wizard/WebRadioWizard.java   |  391 ----
 .../jajuk/ui/wizard/ambience/AmbienceScreen.java   |  320 +++
 .../jajuk/ui/wizard/ambience/AmbienceWizard.java   |   78 +
 .../wizard/digital_dj/ActionSelectionScreen.java   |  101 +
 .../ui/wizard/digital_dj/AmbiencesScreen.java      |  136 ++
 .../jajuk/ui/wizard/digital_dj/ChangeScreen.java   |  114 +
 .../ui/wizard/digital_dj/DigitalDJWizard.java      |  243 ++
 .../ui/wizard/digital_dj/GeneralOptionsScreen.java |  250 +++
 .../ui/wizard/digital_dj/ProportionsScreen.java    |  309 +++
 .../jajuk/ui/wizard/digital_dj/RemoveScreen.java   |  112 +
 .../ui/wizard/digital_dj/TransitionsScreen.java    |  308 +++
 .../ui/wizard/digital_dj/TypeSelectionScreen.java  |   96 +
 .../PreparePartyConvertSettings.java               |   25 +-
 .../wizard/prepare_party/PreparePartyWizard.java   |  421 ++++
 .../PreparePartyWizardActionSelectionScreen.java   |  296 +++
 .../PreparePartyWizardGeneralOptionsScreen.java    |  557 +++++
 .../PreparePartyWizardPathSelectionScreen.java     |  130 ++
 src/main/java/org/jajuk/util/Conf.java             |  201 +-
 src/main/java/org/jajuk/util/Const.java            |  890 +-------
 src/main/java/org/jajuk/util/DownloadManager.java  |  132 +-
 src/main/java/org/jajuk/util/Filter.java           |   50 +-
 src/main/java/org/jajuk/util/IconLoader.java       |  845 ++-----
 src/main/java/org/jajuk/util/JajukFileFilter.java  |   23 +-
 src/main/java/org/jajuk/util/JajukIcons.java       |  621 +-----
 src/main/java/org/jajuk/util/LocaleManager.java    |   13 +-
 src/main/java/org/jajuk/util/MD5Processor.java     |   10 +-
 src/main/java/org/jajuk/util/Messages.java         |  110 +-
 src/main/java/org/jajuk/util/ReadOnlyIterator.java |    8 +-
 src/main/java/org/jajuk/util/UpgradeManager.java   |  162 +-
 src/main/java/org/jajuk/util/UtilFeatures.java     |  151 +-
 src/main/java/org/jajuk/util/UtilGUI.java          |  403 ++--
 src/main/java/org/jajuk/util/UtilPrepareParty.java |  193 +-
 src/main/java/org/jajuk/util/UtilString.java       |  419 ++--
 src/main/java/org/jajuk/util/UtilSystem.java       |  307 +--
 .../jajuk/util/error/CannotRenameException.java    |   10 +-
 .../java/org/jajuk/util/error/JajukException.java  |   13 +-
 .../jajuk/util/error/JajukRuntimeException.java    |   18 +-
 .../util/error/LyricsPersistenceException.java     |    8 +-
 .../util/error/NoneAccessibleFileException.java    |    8 +-
 .../org/jajuk/util/error/TimeOutException.java     |   10 +-
 .../java/org/jajuk/util/filters/AnyFileFilter.java |    5 +-
 .../java/org/jajuk/util/filters/AudioFilter.java   |    9 +-
 .../org/jajuk/util/filters/DirectoryFilter.java    |    6 +-
 .../java/org/jajuk/util/filters/GIFFilter.java     |    5 +-
 .../java/org/jajuk/util/filters/HTMLFilter.java    |    6 +-
 .../java/org/jajuk/util/filters/ImageFilter.java   |    5 +-
 .../java/org/jajuk/util/filters/JPGFilter.java     |    6 +-
 .../org/jajuk/util/filters/JajukPredicates.java    |   74 +-
 .../java/org/jajuk/util/filters/JarFilter.java     |    6 +-
 .../org/jajuk/util/filters/KnownTypeFilter.java    |   17 +-
 .../org/jajuk/util/filters/NotAudioFilter.java     |    5 +-
 .../java/org/jajuk/util/filters/PNGFilter.java     |    6 +-
 .../org/jajuk/util/filters/PlaylistFilter.java     |    6 +-
 .../java/org/jajuk/util/filters/ReportFilter.java  |    6 +-
 .../java/org/jajuk/util/filters/XMLFilter.java     |    6 +-
 src/main/java/org/jajuk/util/filters/package.html  |    2 +-
 src/main/java/org/jajuk/util/log/Log.java          |  137 +-
 src/main/java/org/qdwizard/ActionsPanel.java       |  212 --
 src/main/java/org/qdwizard/Header.java             |  142 --
 src/main/java/org/qdwizard/Langpack.java           |   94 -
 src/main/java/org/qdwizard/Screen.java             |  258 ---
 src/main/java/org/qdwizard/ScreenState.java        |  165 --
 src/main/java/org/qdwizard/Wizard.java             |  674 ------
 src/main/java/org/qdwizard/package.html            |    7 -
 src/main/resources/icons/16x16/webradio_16x16.png  |  Bin 1166 -> 1179 bytes
 .../util/log => resources}/jajuk-log4j-conf.xml    |    0
 .../org/jajuk/i18n/jajuk.properties                |  245 +-
 .../org/jajuk/i18n/jajuk_ca.properties             |  114 +-
 .../org/jajuk/i18n/jajuk_cs.properties             |  112 +-
 .../org/jajuk/i18n/jajuk_de.properties             |  218 +-
 .../org/jajuk/i18n/jajuk_el.properties             | 2335 +++++++++----------
 .../org/jajuk/i18n/jajuk_es.properties             | 2337 ++++++++++----------
 .../org/jajuk/i18n/jajuk_fr.properties             |  208 +-
 .../org/jajuk/i18n/jajuk_gl.properties             |  107 +-
 .../org/jajuk/i18n/jajuk_it.properties             |   48 +-
 .../org/jajuk/i18n/jajuk_ko.properties             |   77 +-
 .../org/jajuk/i18n/jajuk_nl.properties             |   79 +-
 .../org/jajuk/i18n/jajuk_pt.properties             |  116 +-
 .../org/jajuk/i18n/jajuk_ru.properties             |  124 +-
 .../org/jajuk/i18n/jajuk_sv.properties             |   48 +-
 .../resources/org/jajuk/i18n/jajuk_zh.properties   | 1182 ++++++++++
 .../resources/perspectives/FilesPerspective.xml    |   22 +-
 .../perspectives/PlaylistsPerspective.xml          |   13 +-
 .../resources/perspectives/TracksPerspective.xml   |   22 +-
 src/packaging/IzPack/installDirectory.unix.txt     |    1 -
 src/packaging/IzPack/jajuk.izpack                  |  128 --
 src/packaging/IzPack/shortcutSpec.xml              |   43 -
 src/packaging/MANIFEST.MF                          |    2 +-
 src/packaging/NSIS/jajuk.nsis                      |  269 +++
 src/packaging/RPMS/jajuk.spec                      |    1 +
 src/packaging/jnlp/animation.jnlp                  |   14 -
 src/packaging/jnlp/apache_commons.jnlp             |   26 -
 src/packaging/jnlp/basic_player.jnlp               |   14 -
 src/packaging/jnlp/bindings.jnlp                   |   14 -
 src/packaging/jnlp/cobra.jnlp                      |   15 -
 src/packaging/jnlp/dbus.jnlp                       |   16 -
 src/packaging/jnlp/entagged_freedb.jnlp            |   14 -
 src/packaging/jnlp/guava.jnlp                      |   14 -
 src/packaging/jnlp/jajuk-icon_64x64.gif            |  Bin 4536 -> 0 bytes
 src/packaging/jnlp/jfreechart.jnlp                 |   17 -
 src/packaging/jnlp/jintellitype.jnlp               |   14 -
 src/packaging/jnlp/jlayer.jnlp                     |   20 -
 src/packaging/jnlp/jnlp-servlet.jar                |  Bin 61731 -> 0 bytes
 src/packaging/jnlp/launch.jnlp                     |   49 -
 src/packaging/jnlp/layout.jnlp                     |   15 -
 src/packaging/jnlp/log4j.jnlp                      |   17 -
 src/packaging/jnlp/substance.jnlp                  |   14 -
 src/packaging/jnlp/swingx.jnlp                     |   20 -
 src/packaging/jnlp/tags.jnlp                       |   14 -
 src/packaging/jnlp/vldocking.jnlp                  |   14 -
 src/packaging/jnlp/web.xml                         |   22 -
 src/packaging/jnlp/windows/jintellitype-native.jar |  Bin 14802 -> 0 bytes
 src/packaging/jnlp/xml.jnlp                        |   14 -
 src/packaging/native_launcher/installer.launch4j   |    4 +-
 src/packaging/native_launcher/jajuk.launch4j       |    6 +-
 src/packaging/pad/jajuk-icon_32x32.gif             |  Bin 1742 -> 0 bytes
 src/packaging/pad/jajuk_pad.xml                    |  158 --
 src/scripts/build.xml                              |  287 +--
 src/scripts/jajuk                                  |   45 +-
 src/scripts/nsisant-1.3.jar                        |  Bin 0 -> 4402 bytes
 src/test/java/ext/TestAutoCompleteDecorator.java   |   27 +-
 src/test/java/ext/TestAutoCompleteDocument.java    |   34 +-
 src/test/java/ext/TestJScrollingText.java          |   96 +-
 src/test/java/ext/TestJSplash.java                 |   19 +-
 src/test/java/ext/TestJSplashLabel.java            |   90 +-
 .../scrollablepopupmenu/TestXCheckedButton.java    |   29 +-
 .../ext/scrollablepopupmenu/TestXJPopupMenu.java   |   12 +-
 .../services/lastfm/TestFullSubmissionData.java    |   11 +-
 .../java/ext/services/lastfm/TestLastFmAlbum.java  |   53 +-
 .../ext/services/lastfm/TestLastFmAlbumList.java   |   29 +-
 .../services/lastfm/TestLastFmAlbumsRunnable.java  |  146 +-
 .../java/ext/services/lastfm/TestLastFmCache.java  |   61 +-
 .../ext/services/network/TestNetworkUtils.java     |   56 +-
 src/test/java/ext/services/network/TestProxy.java  |   29 +-
 src/test/java/ext/services/xml/TestXMLBuilder.java |   21 +-
 src/test/java/ext/services/xml/TestXMLUtils.java   |   63 +-
 src/test/java/org/jajuk/ConstTest.java             |   24 +-
 src/test/java/org/jajuk/JUnitHelpers.java          |  697 ------
 src/test/java/org/jajuk/JajukTestCase.java         |  127 +-
 src/test/java/org/jajuk/LogChecker.java            |   28 +-
 src/test/java/org/jajuk/MockPlayer.java            |  124 ++
 src/test/java/org/jajuk/TestHelpers.java           |  878 +++++++-
 src/test/java/org/jajuk/ThreadTestHelper.java      |   79 +-
 src/test/java/org/jajuk/base/TestAlbum.java        |  230 +-
 .../java/org/jajuk/base/TestAlbumComparator.java   |   84 +-
 src/test/java/org/jajuk/base/TestAlbumManager.java |  267 +--
 src/test/java/org/jajuk/base/TestArtist.java       |   50 +-
 .../java/org/jajuk/base/TestArtistManager.java     |  156 +-
 src/test/java/org/jajuk/base/TestCollection.java   |   74 +-
 src/test/java/org/jajuk/base/TestDevice.java       |  538 ++---
 .../java/org/jajuk/base/TestDeviceManager.java     |  260 +--
 src/test/java/org/jajuk/base/TestDirectory.java    |  278 +--
 src/test/java/org/jajuk/base/TestFileManager.java  |  102 +-
 .../java/org/jajuk/base/TestFileManagerTest.java   |    4 +
 src/test/java/org/jajuk/base/TestItemManager.java  |  178 +-
 src/test/java/org/jajuk/base/TestPlaylist.java     |  625 ++----
 src/test/java/org/jajuk/base/TestSearchResult.java |   62 +-
 src/test/java/org/jajuk/base/TestTrack.java        |   29 +-
 src/test/java/org/jajuk/base/TestTrackManager.java |   28 +-
 src/test/java/org/jajuk/base/TestTypeManager.java  |   56 +-
 src/test/java/org/jajuk/base/TestYear.java         |   37 +-
 src/test/java/org/jajuk/events/TestJajukEvent.java |   33 +-
 .../org/jajuk/events/TestObservationManager.java   |   30 +-
 .../org/jajuk/events/TestObserverRegistry.java     |   91 +-
 .../java/org/jajuk/services/alarm/TestAlarm.java   |   13 +-
 .../org/jajuk/services/alarm/TestAlarmManager.java |   37 +-
 .../org/jajuk/services/bookmark/TestBookmarks.java |   96 +-
 .../org/jajuk/services/bookmark/TestHistory.java   |  350 +--
 .../jajuk/services/bookmark/TestHistoryItem.java   |   63 +-
 .../org/jajuk/services/cddb/TestCDDBTrack.java     |   29 +-
 .../org/jajuk/services/core/TestExitService.java   |   19 +-
 .../org/jajuk/services/core/TestRatingManager.java |   98 +-
 .../jajuk/services/core/TestSessionService.java    |  283 ---
 .../java/org/jajuk/services/covers/TestCover.java  |   47 +-
 .../org/jajuk/services/dbus/TestDBusManager.java   |   11 +-
 .../jajuk/services/dbus/TestDBusSignalImpl.java    |   12 +-
 .../jajuk/services/dbus/TestDBusSupportImpl.java   |   62 +-
 .../java/org/jajuk/services/dj/TestAmbience.java   |  101 +-
 .../jajuk/services/dj/TestAmbienceDigitalDJ.java   |   54 +-
 .../org/jajuk/services/dj/TestAmbienceManager.java |   49 +-
 .../java/org/jajuk/services/dj/TestDigitalDJ.java  |   71 +-
 .../jajuk/services/lastfm/TestLastFmManager.java   |   13 +-
 .../java/org/jajuk/services/lyrics/TestLyrics.java |  149 +-
 .../notification/TestJavaBalloonNotificator.java   |   12 +-
 .../notification/TestNotificatorFactory.java       |   12 +-
 .../TestNotifySendBalloonNotificator.java          |   16 +-
 .../notification/TestToastNotificator.java         |   12 +-
 .../jajuk/services/players/DummyMPlayerImpl.java   |   16 +-
 .../org/jajuk/services/players/TestQueueList.java  |  152 +-
 .../org/jajuk/services/players/TestQueueModel.java |  796 ++++---
 .../org/jajuk/services/players/TestStackItem.java  |   47 +-
 .../services/startup/TestStartupEngineService.java |  146 +-
 src/test/java/org/jajuk/services/tags/TestTag.java |  364 +++
 .../webradio/TestCustomPersistenceHelper.java      |  124 ++
 .../webradio/TestPresetPersistenceHelper.java      |  172 ++
 .../services/webradio/TestWebRadioManager.java     |   51 +
 .../org/jajuk/ui/actions/TestDebugLogAction.java   |    9 +-
 .../ui/actions/TestFindDuplicateTracksAction.java  |   64 +-
 .../jajuk/ui/actions/TestPreparePartyAction.java   |   37 +-
 .../jajuk/ui/actions/TestRatingsImportExport.java  |   95 +
 .../java/org/jajuk/ui/helpers/TestDuration.java    |   28 +-
 .../jajuk/ui/helpers/TestPlayerStateMediator.java  |   92 +-
 .../jajuk/ui/helpers/TestWebRadioTableModel.java   |   72 +
 .../java/org/jajuk/ui/views/TestCoverView.java     |   66 +-
 .../java/org/jajuk/ui/views/TestParameterView.java |   57 +-
 .../org/jajuk/ui/views/TestTracksTreeView.java     |   96 +-
 .../org/jajuk/ui/wizard/TestDigitalDJWizard.java   |   87 +-
 .../TestDownloadManager.java}                      |   38 +-
 src/test/java/org/jajuk/util/TestFilter.java       |   25 +-
 .../java/org/jajuk/util/TestJajukFileFilter.java   |   64 +-
 .../java/org/jajuk/util/TestUpgradeManager.java    |   46 +-
 src/test/java/org/jajuk/util/TestUtilFeatures.java |   27 +-
 src/test/java/org/jajuk/util/TestUtilString.java   |  324 ++-
 src/test/java/org/jajuk/util/TestUtilSystem.java   |  302 +--
 .../util/error/TestCannotRenameException.java      |    9 +-
 .../org/jajuk/util/error/TestJajukException.java   |   11 +-
 .../error/TestNoneAccessibleFileException.java     |    8 +-
 .../org/jajuk/util/error/TestTimeOutException.java |    8 +-
 .../org/jajuk/util/filters/TestAnyFileFilter.java  |    7 +-
 .../org/jajuk/util/filters/TestAudioFilter.java    |   44 +-
 .../jajuk/util/filters/TestDirectoryFilter.java    |   17 +-
 .../java/org/jajuk/util/filters/TestGIFFilter.java |    9 +-
 .../org/jajuk/util/filters/TestHTMLFilter.java     |   10 +-
 src/test/java/org/jajuk/util/log/TestLog.java      |   68 +-
 src/tools/clean_dead_labels.sh                     |   15 +
 src/tools/detect_dead_labels.sh                    |   17 +
 src/tools/jautodoc_templates.xml                   |  193 --
 668 files changed, 25857 insertions(+), 35065 deletions(-)

diff --git a/.classpath b/.classpath
index a140a32..428c988 100644
--- a/.classpath
+++ b/.classpath
@@ -4,14 +4,13 @@
 	<classpathentry kind="src" path="src/test/java"/>
 	<classpathentry kind="src" path="src/main/resources"/>
 	<classpathentry kind="lib" path="lib/vorbisspi-1.0.1.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="lib" path="lib/jlayer-1.0.jar"/>
 	<classpathentry kind="lib" path="lib/commons-codec-1.3.jar"/>
 	<classpathentry kind="lib" path="lib/jogg-0.0.7.jar"/>
 	<classpathentry kind="lib" path="lib/jorbis-0.0.13.jar"/>
 	<classpathentry kind="lib" path="lib/jspeex-0.9.3.jar"/>
 	<classpathentry kind="lib" path="lib/tritonus_share-release.jar"/>
-	<classpathentry kind="lib" path="lib/mp3spi-1.9.4.jar"/>
+	<classpathentry kind="lib" path="lib/mp3spi-1.9.5.jar"/>
 	<classpathentry kind="lib" path="lib/jcommon-1.0.0.jar"/>
 	<classpathentry kind="lib" path="lib/log4j_reduced-1.2.6.jar"/>
 	<classpathentry kind="lib" path="lib/entagged-freedb-0.04.jar"/>
@@ -26,7 +25,6 @@
 	<classpathentry kind="lib" path="lib/jintellitype-1.3.jar"/>
 	<classpathentry kind="lib" path="lib/vldocking-2.1.5.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="lib" path="lib/qdwizard-2.1.jar"/>
 	<classpathentry kind="lib" path="lib/libdbus-java-2.6.jar">
 		<attributes>
 			<attribute name="javadoc_location" value="http://dbus.freedesktop.org/doc/dbus-java/api/"/>
@@ -35,22 +33,31 @@
 	<classpathentry kind="lib" path="lib/miglayout-swing-3.7.jar"/>
 	<classpathentry kind="lib" path="lib/unix-0.5.jar"/>
 	<classpathentry kind="lib" path="lib/hexdump-0.2.jar"/>
-	<classpathentry kind="lib" path="lib/commons-lang-2.4.jar"/>
+	<classpathentry kind="lib" path="lib/commons-lang-2.4.jar">
+		<attributes>
+			<attribute name="javadoc_location" value="http://commons.apache.org/lang/api-2.4/"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="lib" path="lib/commons-io-1.4.jar"/>
 	<classpathentry kind="lib" path="lib/xstream-1.3.1.jar"/>
 	<classpathentry kind="lib" path="lib/last.fm-bindings-7.3.jar"/>
 	<classpathentry kind="lib" path="lib/jfreechart-1.0.13.jar"/>
-	<classpathentry kind="lib" path="lib/cobra-0.98.4.jar"/>
 	<classpathentry kind="lib" path="lib/js-0.98.4.jar"/>
-	<classpathentry kind="lib" path="lib/simple_validation-0.4.jar">
-		<attributes>
-			<attribute name="javadoc_location" value="jar:file:/prog/api/validation-javadoc.zip!/"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry kind="lib" path="lib/swingx-1.6.jar"/>
+	<classpathentry kind="lib" path="lib/substance-7.3.1-SNAPSHOT.jar"/>
+	<classpathentry kind="lib" path="lib/laf-widget-7.3.1-SNAPSHOT.jar"/>
+	<classpathentry kind="lib" path="lib/trident-7.3.1-SNAPSHOT.jar"/>
+	<classpathentry kind="lib" path="lib/laf-plugin-7.3.1-SNAPSHOT.jar"/>
 	<classpathentry kind="lib" path="lib/animation-1.2.0.jar"/>
-	<classpathentry kind="lib" path="lib/substance-5.3.jar"/>
-	<classpathentry kind="lib" path="lib/jaudiotagger-2.0.2.jar"/>
 	<classpathentry kind="lib" path="lib/guava-11.0.1.jar"/>
+	<classpathentry kind="lib" path="lib/jaudiotagger-2.2.0-20130420.jar" sourcepath="/prog/api/jaudiotagger/trunk/src">
+		<attributes>
+			<attribute name="javadoc_location" value="file:/prog/api/jaudiotagger/trunk/target/apidocs/"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="lib/cobra_jajuk-0.98.5.jar"/>
+	<classpathentry kind="lib" path="lib/qdwizard-5.0.0.jar"/>
+	<classpathentry kind="lib" path="lib/json-20140107.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/.gitignore b/.gitignore
index d89f5d8..ac1b0ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+infinitest.filters
 
 # Ignore classes
 bin/
@@ -5,3 +6,7 @@ bin/
 # maven built directories
 target/
 
+/_CurrentlySelectedTest.launch
+
+.idea/
+jajuk.iml
diff --git a/.project b/.project
index 8465f6d..6171419 100644
--- a/.project
+++ b/.project
@@ -12,6 +12,7 @@
 		</buildCommand>
 	</buildSpec>
 	<natures>
+		<nature>org.sonar.ide.eclipse.core.sonarNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
 </projectDescription>
diff --git a/.settings/net.sf.jautodoc.prefs b/.settings/net.sf.jautodoc.prefs
deleted file mode 100644
index 299234e..0000000
--- a/.settings/net.sf.jautodoc.prefs
+++ /dev/null
@@ -1,9 +0,0 @@
-#Sun Nov 15 23:16:31 CET 2009
-add_header=true
-add_todo=false
-eclipse.preferences.version=1
-header_text=/*\n *  Jajuk\n *  Copyright (C) 2003-${year} The Jajuk Team\n *  http\://jajuk.info\n *\n *  This program is free software; you can redistribute it and/or\n *  modify it under the terms of the GNU General Public License\n *  as published by the Free Software Foundation; either version 2\n *  of the License, or any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  ME [...]
-package_doc_text=<\!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n<html>\n<head></head>\n<body>\n  DOCUMENT_ME\n</body>\n</html>
-project_specific_settings=true
-replace_header=true
-replacements=<?xml version\="1.0" standalone\="yes"?>\n\n<replacements>\n<replacement key\="get" scope\="1" mode\="0">Gets the</replacement>\n<replacement key\="set" scope\="1" mode\="0">Sets the</replacement>\n<replacement key\="add" scope\="1" mode\="0">Adds the</replacement>\n<replacement key\="edit" scope\="1" mode\="0">Edits the</replacement>\n<replacement key\="remove" scope\="1" mode\="0">Removes the</replacement>\n<replacement key\="init" scope\="1" mode\="0">Inits the</replaceme [...]
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index ef32fb8..7cad4e8 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Tue Jul 12 22:14:17 CEST 2011
+#Thu Sep 29 21:19:19 CEST 2011
 eclipse.preferences.version=1
 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
@@ -12,15 +12,15 @@ org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
 org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.compliance=1.7
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.7
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
@@ -38,12 +38,14 @@ org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
 org.eclipse.jdt.core.formatter.blank_lines_after_package=1
 org.eclipse.jdt.core.formatter.blank_lines_before_field=0
@@ -81,6 +83,7 @@ org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not inse
 org.eclipse.jdt.core.formatter.comment.line_length=100
 org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
 org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
 org.eclipse.jdt.core.formatter.compact_else_if=true
 org.eclipse.jdt.core.formatter.continuation_indentation=2
 org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
@@ -100,9 +103,13 @@ org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
 org.eclipse.jdt.core.formatter.indentation.size=4
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
@@ -170,12 +177,14 @@ org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invoca
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
 org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
 org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
 org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
@@ -199,6 +208,7 @@ org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invoc
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
 org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
@@ -254,6 +264,7 @@ org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invoc
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
 org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
 org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
@@ -263,6 +274,7 @@ org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=inser
 org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
 org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -282,11 +294,12 @@ org.eclipse.jdt.core.formatter.lineSplit=100
 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
 org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
 org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=0
 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
 org.eclipse.jdt.core.formatter.tabulation.char=space
 org.eclipse.jdt.core.formatter.tabulation.size=2
 org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
 org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
index 8bdceaf..a81687f 100644
--- a/.settings/org.eclipse.jdt.ui.prefs
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -1,6 +1,7 @@
-#Fri Aug 13 17:23:14 CEST 2010
+#Thu Sep 29 21:19:20 CEST 2011
 eclipse.preferences.version=1
-formatter_settings_version=11
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_settings_version=12
 instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
 org.eclipse.jdt.ui.exception.name=e
 org.eclipse.jdt.ui.gettersetter.use.is=true
@@ -11,4 +12,56 @@ org.eclipse.jdt.ui.keywordthis=true
 org.eclipse.jdt.ui.ondemandthreshold=99
 org.eclipse.jdt.ui.overrideannotation=true
 org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for [...]
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for [...]
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/.settings/org.sonar.ide.eclipse.core.prefs b/.settings/org.sonar.ide.eclipse.core.prefs
new file mode 100644
index 0000000..affdebb
--- /dev/null
+++ b/.settings/org.sonar.ide.eclipse.core.prefs
@@ -0,0 +1,8 @@
+#Tue May 10 23:03:39 CEST 2011
+analyseLocally=true
+eclipse.preferences.version=1
+projectArtifactId=jajuk
+projectBranch=
+projectGroupId=org.jajuk
+serverUrl=http\://nemo.sonarsource.org
+version=1
diff --git a/README.txt b/README.txt
index 4e41207..1d485c7 100644
--- a/README.txt
+++ b/README.txt
@@ -1,22 +1,14 @@
-This is the full Jajuk SVN repository 
+This is the full Jajuk repository 
 
---- USING MAVEN ---
-
-To build Jajuk (Maven2 is required, download it from http://maven.apache.org/)
-, from the source folder containing the pom.xml file:           
-
-$ mvn jar:jar
-
---- USING ANT ---
+The project website is hosted at http://jajuk.info
 
 To compile Jajuk :
 (Ant is required, download it on http://ant.apache.org/ )  
          
 $ cd src/scripts
-$ ant
+$ ant -lib . package_jar
 
-----------------
-
--> jajuk.jar is built in target directory
+-> jajuk.jar is built in the /tmp/jajuk-dist/jajuk/bin directory
 
 All legals information are in the 'src/legals' directory
+
diff --git a/infinitest.args b/infinitest.args
index ed9f41d..2a2667e 100644
--- a/infinitest.args
+++ b/infinitest.args
@@ -1 +1 @@
--Djava.awt.headless=true
\ No newline at end of file
+-Djava.awt.headless=true
diff --git a/infinitest.filters b/infinitest.filters
deleted file mode 100644
index a8fb143..0000000
--- a/infinitest.filters
+++ /dev/null
@@ -1,2 +0,0 @@
-# Disable Infinitest globally in 1.9.x 
-.*
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 7f60a8c..b2bb620 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,14 +4,13 @@
 	<groupId>org.jajuk</groupId>
 	<artifactId>jajuk</artifactId>
 	<name>Jajuk</name>
-	<version>1.9.6</version>
+	<version>1.10.9</version>
 	<description>Jajuk is a Java music organizer for all platforms. The
-		main goal
-		of this project is to provide a fully-featured application to
+		main goal of this project is to provide a fully-featured application to
 		advanced users with large or scattered music collections.</description>
 	<url>http://jajuk.info</url>
 	<issueManagement>
-		<url>http://trac.jajuk.info</url>
+		<url>http://github.com/jajuk-team/jajuk/issues</url>
 	</issueManagement>
 	<inceptionYear>2003</inceptionYear>
 	<mailingLists>
@@ -21,12 +20,6 @@
 			<unsubscribe>http://lists.sourceforge.net/lists/listinfo/jajuk-developers</unsubscribe>
 			<archive>http://sourceforge.net/mailarchive/forum.php?forum=jajuk-developers</archive>
 		</mailingList>
-		<mailingList>
-			<name>Jajuk Internalionalization</name>
-			<subscribe>http://lists.sourceforge.net/lists/listinfo/jajuk-i18n</subscribe>
-			<unsubscribe>http://lists.sourceforge.net/lists/listinfo/jajuk-i18n</unsubscribe>
-			<archive>http://sourceforge.net/mailarchive/forum.php?forum=jajuk-i18n</archive>
-		</mailingList>
 	</mailingLists>
 	<licenses>
 		<license>
@@ -36,8 +29,8 @@
 		</license>
 	</licenses>
 	<scm>
-		<connection>scm:git:git://gitorious.org/jajuk/jajuk.git</connection>
-		<url>http://gitorious.org/jajuk/jajuk/</url>
+		<connection>scm:git:https://github.com/jajuk-team/jajuk.git</connection>
+		<url>https://github.com/jajuk-team/jajuk</url>
 	</scm>
 	<organization>
 		<name>Jajuk team</name>
@@ -48,16 +41,26 @@
 			<plugin>
 				<artifactId>maven-compiler-plugin</artifactId>
 				<configuration>
-					<source>1.6</source>
-					<target>1.6</target>
+					<source>1.7</source>
+					<target>1.7</target>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+            		<artifactId>maven-javadoc-plugin</artifactId>
+				<configuration>
+					<source>1.7</source>
 					<encoding>UTF-8</encoding>
+					<docencoding>UTF-8</docencoding>
 				</configuration>
 			</plugin>
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-surefire-plugin</artifactId>
-				<version>2.4.2</version>
+				<version>2.12.3</version>
 				<configuration>
+					<forkedProcessTimeoutInSeconds>3600</forkedProcessTimeoutInSeconds>
 					<additionalClasspathElements>
 						<additionalClasspathElement>src/main/resources</additionalClasspathElement>
 						<additionalClasspathElement>src/main/java</additionalClasspathElement>
@@ -67,6 +70,11 @@
 							<name>java.awt.headless</name>
 							<value>true</value>
 						</property>
+						<property>
+							<!-- set java.library.path so that the DBus-tests find the libunix-java.so library -->
+							<name>java.library.path</name>
+							<value>${basedir}/lib/lib32:${basedir}/lib/lib64:/usr/lib/jni</value>
+						</property>
 					</systemProperties>
 				</configuration>
 			</plugin>
@@ -75,14 +83,19 @@
 	</build>
 	<dependencies>
 		<dependency>
+    			<groupId>com.google.guava</groupId>
+    			<artifactId>guava</artifactId>
+    			<version>11.0.1</version>
+		</dependency>
+		<dependency>
 			<groupId>jfree</groupId>
 			<artifactId>jcommon</artifactId>
 			<version>1.0.2</version>
 		</dependency>
 		<dependency>
-    			<groupId>com.google.guava</groupId>
-    			<artifactId>guava</artifactId>
-    			<version>11.0.1</version>
+			<groupId>net.sf.qdwizard</groupId>
+			<artifactId>qdwizard</artifactId>
+			<version>5.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>commons-collections</groupId>
@@ -106,10 +119,35 @@
 		<dependency>
 			<groupId>Substance</groupId>
 			<artifactId>substance</artifactId>
-			<version>4.2dev</version>
+			<version>7.3</version>
 			<scope>system</scope>
-			<systemPath>${basedir}/lib/substance-5.3.jar</systemPath>
+			<systemPath>${basedir}/lib/substance-7.3.jar</systemPath>
 		</dependency>
+
+		<dependency>
+			<groupId>trident</groupId>
+			<artifactId>trident</artifactId>
+			<version>7.3</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/lib/trident-7.3.jar</systemPath>
+		</dependency>
+
+		<dependency>
+			<groupId>laf-plugin</groupId>
+			<artifactId>laf-plugin</artifactId>
+			<version>7.3</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/lib/laf-plugin-7.3.jar</systemPath>
+		</dependency>
+
+		<dependency>
+			<groupId>laf-widget</groupId>
+			<artifactId>laf-widget</artifactId>
+			<version>7.3</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/lib/laf-widget-7.3.jar</systemPath>
+		</dependency>
+
 		<dependency>
 			<groupId>Swingx</groupId>
 			<artifactId>swingx</artifactId>
@@ -155,7 +193,7 @@
 			<artifactId>cobra</artifactId>
 			<version>0.96.5R2</version>
 			<scope>system</scope>
-			<systemPath>${basedir}/lib/cobra-0.98.4.jar</systemPath>
+			<systemPath>${basedir}/lib/cobra_jajuk-0.98.5.jar</systemPath>
 		</dependency>
 		<dependency>
 			<groupId>JS</groupId>
@@ -184,9 +222,9 @@
 		<dependency>
 			<groupId>org.jaudiotagger</groupId>
 			<artifactId>jaudiotagger</artifactId>
-			<version>2.0.2</version>
+			<version>2.2.0-20130420</version>
 			<scope>system</scope>
-			<systemPath>${basedir}/lib/jaudiotagger-2.0.2.jar</systemPath>
+			<systemPath>${basedir}/lib/jaudiotagger-2.2.0-20130420.jar</systemPath>
 		</dependency>
 		<dependency>
 			<groupId>junit</groupId>
@@ -256,38 +294,24 @@
 		</dependency>
 
 		<dependency>
-			<groupId>last.fm-bindings</groupId>
-			<artifactId>last.fm-bindings</artifactId>
-			<version>7.3</version>
+			<groupId>lastfm-java</groupId>
+			<artifactId>lastfm-java</artifactId>
+			<version>0.1.2</version>
 			<scope>system</scope>
-			<systemPath>${basedir}/lib/last.fm-bindings-7.3.jar</systemPath>
+			<systemPath>${basedir}/lib/lastfm-java-0.1.2.jar</systemPath>
 		</dependency>
-
+		
 		<dependency>
-			<groupId>netbeans</groupId>
-			<artifactId>simple_validation</artifactId>
-			<version>0.4</version>
-			<scope>system</scope>
-			<systemPath>${basedir}/lib/simple_validation-0.4.jar</systemPath>
+			<groupId>com.googlecode.soundlibs</groupId>
+			<artifactId>mp3spi</artifactId>
+			<version>1.9.5-1</version>
+			<scope>runtime</scope>
 		</dependency>
-
 	</dependencies>
 
 	<reporting>
 		<plugins>
 			<plugin>
-				<artifactId>maven-pmd-plugin</artifactId>
-				<configuration>
-					<sourceEncoding>UTF-8</sourceEncoding>
-					<minimumTokens>100</minimumTokens>
-					<targetJdk>1.6</targetJdk>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.codehaus.mojo</groupId>
-				<artifactId>taglist-maven-plugin</artifactId>
-			</plugin>
-			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-surefire-plugin</artifactId>
 				<configuration>
diff --git a/src/doc/README.html b/src/doc/README.html
index 562424a..0cd0cd8 100644
--- a/src/doc/README.html
+++ b/src/doc/README.html
@@ -7,34 +7,34 @@
 
 <h1><b><a href="http://jajuk.info">Jajuk</a>
 Release Notes</b></h1>
-Please have a look at <a href='http://jajuk.info/index.php/Release_notes_1.9'> these important notes</a>
+Please have a look at <a href='http://jajuk.info/release_notes_1.10.html'> these important notes</a>
 
 <h1><a name="Requirements"><b>Requirements</b></a></h1>
 <ul>
   <li>
-    <p>Java : JRE 1.6 and above. Can be <a href="http://www.java.com">downloaded
+    <p>Java : JRE 1.7 and above. Can be <a href="http://www.java.com">downloaded
 for free</a> if required.</p>
   </li>
   <li>
     <p>Screen resolution : 1024x768 and above recommended</p>
   </li>
   <li>
-    <p>Minimum configuration : Intel Pentium 3, 600 Mhz, 256MB RAM and equivalents</p>
+    <p>Minimum configuration : 256MB RAM</p>
   </li>
 </ul>
 
 <h1><b>Legals</b></h1>
-Jajuk, Copyright 2003-2011 Jajuk team. License :
+Jajuk, Copyright 2003-2012 Jajuk team. License :
 GPL V2 (Free Software).
 See License provided with the program.
 
 <h2><b>FAQ</b></h2>
-<a href="http://jajuk.info/index.php/FAQ">Faq</a>
+<a href="http://jajuk.info/jajuk_faq.html">Faq</a>
 
 <h2><b>Issues/bugs</b></h2>
-Report bugs or wishes <a href='http://jajuk.info/index.php/Bug_Report_Wishes'>here</a>
+Report bugs or wishes <a href='https://github.com/jajuk-team/jajuk/issues'>here</a>
 
 <h2><b>Contact us</b></h2>
-Contact us and discussion Forum: <a href="https://jajuk.info/index.php/Contact_Us">here</a>
+Contact us and discussion Forum: <a href="http://jajuk.info/jajuk_team.html">here</a>
 </body>
 </html>
diff --git a/src/legals/AUTHORS.txt b/src/legals/AUTHORS.txt
index a6a8387..7736ee3 100644
--- a/src/legals/AUTHORS.txt
+++ b/src/legals/AUTHORS.txt
@@ -5,6 +5,7 @@ Dominik Stadler <jajuk-developers at lists.sourceforge.net>
 Fsck222 <jajuk-developers at lists.sourceforge.net>
 Florian Strienz <jajuk-developers at lists.sourceforge.net>
 Varun Hiremath <jajuk-developers at lists.sourceforge.net>
+Dominik Stadler <dominik.stadler at gmx.at>
 Gerhard Dietrichsteiner <jajuk-developers at lists.sourceforge.net>
 Josep Carles Collazos <jajuk-developers at lists.sourceforge.net>
 Erwan Richard <jajuk-developers at lists.sourceforge.net>
@@ -12,10 +13,13 @@ Vitaliy Tamm <jajuk-developers at lists.sourceforge.net>
 Ronak Patel <jajuk-developers at lists.sourceforge.net>
 Sebastien Gringoire <toto at toto.fr>
 Eleftherios Spyromitros <jajuk-developers at lists.sourceforge.net>
+Gwen Kerdal <gkerdal at gmail.com>
 Laurent "haylem" Malvert <jajuk-developers at lists.sourceforge.net>
 Riccardo Capecchi <jajuk-developers at lists.sourceforge.net>
 Bart Cremers <jajuk-developers at lists.sourceforge.net>
+Michael Kebede <kochiiiiii at gmail.com>
 Antonis Thomas <jajuk-developers at lists.sourceforge.net>
 David Hadley <jajuk-developers at lists.sourceforge.net>
+ntls <stelios.ntilis at gmail.com>
 Masiar Farahani <jajuk-developers at lists.sourceforge.net>
 Fabrice Dutron <jajuk-developers at lists.sourceforge.net>
diff --git a/src/legals/DEPENDENCIES.txt b/src/legals/DEPENDENCIES.txt
index 62aed56..7cadadd 100644
--- a/src/legals/DEPENDENCIES.txt
+++ b/src/legals/DEPENDENCIES.txt
@@ -1,22 +1,4 @@
-Jajuk Dependencies
-==================
-This list is an extract from http://jajuk.info/index.php/jajuk_dependencies 
-NOTE FOR MAINTENERS : edit first the wiki page, then update this file.
-
-This is the list of API, frameworks or packaging tools (jars) included in this 
-directory. We would like to thank their teams for making Jajuk possible.
-
-These third party softwares used by Jajuk come with their own licenses as listed 
-out below. A copy of the following licenses is include in this directory.
-
--------------------------------------------------------------------------------
-GPL    				=> LICENSE-GPL.txt
-LGPL   				=> LICENSE-LGPL.txt
-BSD   				=> LICENSE-BSD.txt
-Apache				=> LICENSE-Apache.txt
-Creative Commons 	=> LICENSE-CREATIVE-COMMONS.txt
-CeCILL              => LICENSE_CeCILL_V2-en.txt
--------------------------------------------------------------------------------
+Jajuk Dependencies :
 
 --- Sound ---
 Project  : Javalayer, BasicPlayer, Tritonus, mp3spi
@@ -45,10 +27,10 @@ URL      : http://www.jthink.net/jaudiotagger/index.jsp
 License  : GLPL
 
 --- Look and feel ---
-Project  : Substance
-By       : Kirill Grouchnikov
+Project  : Insubstantial
+By       : Insubstantial team, fork of Substance look and feel by Kirill Grouchnikov
 Used for : A cross-platform look & feel for Swing applications
-URL      : https://substance.dev.java.net/
+URL      : https://github.com/Insubstantial/insubstantial
 License  : BSD
 
 --- GUI helpers ---
@@ -88,12 +70,6 @@ Used for : Docking framework
 URL      : http://www.vlsolutions.com/en/products/docking/index.php
 License  : CeCILL
 
-Project  : JHlabs Filters
-By       : JHLabs
-Used for : Images filters
-URL      : http://www.jhlabs.com/ip/filters
-License  : Apache 2.0
-
 Project  : Cobra
 By       : Cobra team
 Used for : Web Browser library
@@ -144,3 +120,12 @@ By       : Common-jukebox team
 Used for : Various shared code between several jukebox projects
 URL      : http://www.assembla.com/wiki/show/common-jukebox
 License  : LGPL
+
+--- Web 2.0 ----
+Project  : lastfm.java
+By       : Johann Kovacs
+Used for : Getting Last.fm data
+URL      : https://github.com/jkovacs/lastfm-java
+License  : Custom Open source, https://github.com/jkovacs/lastfm-java/blob/master/license.txt (provided in the bundle as LICENSE-LASTFM-JAVA.txt)
+Copyright (c) 2012, the Last.fm Java Project and Committers
+All rights reserved.
\ No newline at end of file
diff --git a/src/legals/DERIVATED.txt b/src/legals/DERIVATED.txt
index 9341899..f7fc521 100644
--- a/src/legals/DERIVATED.txt
+++ b/src/legals/DERIVATED.txt
@@ -111,4 +111,4 @@ This code is located in the 'ext' Java package.
  -------------------------------------------------------
  Util class (org.jajuk.util package)
  This class contains various code extracts found on the web, the URL 
- is given in the method javadoc comment when it is the case.
+ is given in the method javadoc comment when it is the case.
\ No newline at end of file
diff --git a/src/legals/LICENSE-LASTFM-JAVA.txt b/src/legals/LICENSE-LASTFM-JAVA.txt
new file mode 100644
index 0000000..1af546b
--- /dev/null
+++ b/src/legals/LICENSE-LASTFM-JAVA.txt
@@ -0,0 +1,23 @@
+Copyright (c) 2012, the Last.fm Java Project and Committers
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms, with or without modification, are
+permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src/main/java/ext/AutoCompleteDecorator.java b/src/main/java/ext/AutoCompleteDecorator.java
index 7948473..87a8085 100644
--- a/src/main/java/ext/AutoCompleteDecorator.java
+++ b/src/main/java/ext/AutoCompleteDecorator.java
@@ -24,7 +24,6 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
-
 package ext;
 
 import java.awt.event.ActionEvent;
@@ -82,7 +81,6 @@ import org.jdesktop.swingx.autocomplete.TextComponentAdaptor;
  * @author Thomas Bierhance
  */
 public final class AutoCompleteDecorator {
-
   /**
    * private constructor to avoid instantiating utility class.
    */
@@ -179,7 +177,6 @@ public final class AutoCompleteDecorator {
     final AutoCompleteDocument document = new AutoCompleteDocument(adaptor, strictMatching,
         stringConverter);
     decorate(editorComponent, document, adaptor);
-
     // show the popup list when the user presses a key
     final KeyListener keyListener = new KeyAdapter() {
       @Override
@@ -188,7 +185,6 @@ public final class AutoCompleteDecorator {
         if (keyEvent.isActionKey()) {
           return;
         }
-
         // don't popup if the combobox isn't visible anyway
         if (comboBox.isDisplayable() && !comboBox.isPopupVisible()) {
           int keyCode = keyEvent.getKeyCode();
@@ -201,17 +197,14 @@ public final class AutoCompleteDecorator {
           if (keyCode == KeyEvent.VK_ESCAPE) {
             return;
           }
-
           comboBox.setPopupVisible(true);
         }
       }
     };
     editorComponent.addKeyListener(keyListener);
-
     if (stringConverter != ObjectToStringConverter.DEFAULT_IMPLEMENTATION) {
       comboBox.setEditor(new AutoCompleteComboBoxEditor(comboBox.getEditor(), stringConverter));
     }
-
     // Changing the l&f can change the combobox' editor which in turn
     // would not be autocompletion-enabled. The new editor needs to be
     // set-up.
@@ -249,7 +242,6 @@ public final class AutoCompleteDecorator {
       final AbstractAutoCompleteAdaptor adaptor) {
     // install the document on the text component
     textComponent.setDocument(document);
-
     // mark entire text when the text component gains focus
     // otherwise the last mark would have been retained which is quiet
     // confusing
@@ -259,7 +251,6 @@ public final class AutoCompleteDecorator {
         adaptor.markEntireText();
       }
     });
-
     // Tweak some key bindings
     InputMap editorInputMap = textComponent.getInputMap();
     if (document.isStrictMatching()) {
@@ -280,35 +271,28 @@ public final class AutoCompleteDecorator {
       // it will delete the previous character otherwise
       editorInputMap.put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_BACK_SPACE, 0),
           "nonstrict-backspace");
-      editorActionMap.put("nonstrict-backspace", new NonStrictBackspaceAction(editorActionMap
-          .get(DefaultEditorKit.deletePrevCharAction), editorActionMap
-          .get(DefaultEditorKit.selectionBackwardAction), adaptor));
+      editorActionMap.put("nonstrict-backspace",
+          new NonStrictBackspaceAction(editorActionMap.get(DefaultEditorKit.deletePrevCharAction),
+              editorActionMap.get(DefaultEditorKit.selectionBackwardAction), adaptor));
     }
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   static class NonStrictBackspaceAction extends TextAction {
-
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = -5508607690462561673L;
-
-    /** DOCUMENT_ME. */
     private Action backspace;
-
-    /** DOCUMENT_ME. */
     private Action selectionBackward;
-
-    /** DOCUMENT_ME. */
     private AbstractAutoCompleteAdaptor adaptor;
 
     /**
      * Instantiates a new non strict backspace action.
      * 
-     * @param backspace DOCUMENT_ME
-     * @param selectionBackward DOCUMENT_ME
-     * @param adaptor DOCUMENT_ME
+     * @param backspace 
+     * @param selectionBackward 
+     * @param adaptor 
      */
     public NonStrictBackspaceAction(Action backspace, Action selectionBackward,
         AbstractAutoCompleteAdaptor adaptor) {
diff --git a/src/main/java/ext/AutoCompleteDocument.java b/src/main/java/ext/AutoCompleteDocument.java
index f49f8cd..45af5a2 100644
--- a/src/main/java/ext/AutoCompleteDocument.java
+++ b/src/main/java/ext/AutoCompleteDocument.java
@@ -40,20 +40,14 @@ import org.jdesktop.swingx.autocomplete.ObjectToStringConverter;
  * the AbstractAutoCompleteAdaptor.
  */
 public class AutoCompleteDocument extends PlainDocument {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -4353609211147483101L;
-
   /** Flag to indicate if adaptor.setSelectedItem has been called. Subsequent calls to remove/insertString should be ignored as they are likely have been caused by the adapted Component that is trying to set the text for the selected component. */
   boolean selecting = false;
-
   /** true, if only items from the adaptors's list can be entered false, otherwise (selected item might not be in the adaptors's list). */
   boolean strictMatching;
-
   /** The adaptor that is used to find and select items. */
   AbstractAutoCompleteAdaptor adaptor;
-
-  /** DOCUMENT_ME. */
   ObjectToStringConverter stringConverter;
 
   /**
@@ -81,10 +75,10 @@ public class AutoCompleteDocument extends PlainDocument {
   /**
    * Creates a new AutoCompleteDocument for the given
    * AbstractAutoCompleteAdaptor.
-   * 
+   *
+   * @param adaptor The adaptor that will be used to find and select matching items.
    * @param strictMatching true, if only items from the adaptor's list should be allowed to
    * be entered
-   * @param adaptor The adaptor that will be used to find and select matching items.
    */
   public AutoCompleteDocument(AbstractAutoCompleteAdaptor adaptor, boolean strictMatching) {
     this(adaptor, strictMatching, ObjectToStringConverter.DEFAULT_IMPLEMENTATION);
@@ -110,7 +104,6 @@ public class AutoCompleteDocument extends PlainDocument {
     if (selecting) {
       return;
     }
-
     super.remove(offs, len);
     if (!strictMatching) {
       setSelectedItem(getText(0, getLength()), getText(0, getLength()));
@@ -128,7 +121,6 @@ public class AutoCompleteDocument extends PlainDocument {
     if (selecting) {
       return;
     }
-
     // insert the string into the document
     super.insertString(offs, str, a);
     // lookup and select a matching item
@@ -173,9 +165,9 @@ public class AutoCompleteDocument extends PlainDocument {
 
   /**
    * Selects the given item using the AbstractAutoCompleteAdaptor.
-   * 
-   * @param itemAsString string representation of the item to be selected
+   *
    * @param item the item that is to be selected
+   * @param itemAsString string representation of the item to be selected
    */
   private void setSelectedItem(Object item, String itemAsString) {
     selecting = true;
@@ -201,7 +193,6 @@ public class AutoCompleteDocument extends PlainDocument {
     if (ret != null) {
       return ret;
     }
-
     // check if the currently selected item matches
     Object selectedItem = adaptor.getSelectedItem();
     String[] possibleStrings = stringConverter.getPossibleStringsForItem(selectedItem);
@@ -217,7 +208,6 @@ public class AutoCompleteDocument extends PlainDocument {
     if (ret != null) {
       return ret;
     }
-
     // no item starts with the pattern => return null
     return new LookupResult(null, "");
   }
@@ -225,8 +215,8 @@ public class AutoCompleteDocument extends PlainDocument {
   /**
    * Find match.
    * 
-   * @param pattern DOCUMENT_ME
-   * @param exactMatch DOCUMENT_ME
+   * @param pattern 
+   * @param exactMatch 
    * 
    * @return the lookup result
    */
@@ -246,26 +236,21 @@ public class AutoCompleteDocument extends PlainDocument {
         }
       }
     }
-
     return null;
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private static class LookupResult {
-
-    /** DOCUMENT_ME. */
     Object matchingItem;
-
-    /** DOCUMENT_ME. */
     String matchingString;
 
     /**
      * Instantiates a new lookup result.
      * 
-     * @param matchingItem DOCUMENT_ME
-     * @param matchingString DOCUMENT_ME
+     * @param matchingItem 
+     * @param matchingString 
      */
     public LookupResult(Object matchingItem, String matchingString) {
       this.matchingItem = matchingItem;
@@ -287,8 +272,6 @@ public class AutoCompleteDocument extends PlainDocument {
     if (base.length() < prefix.length()) {
       return false;
     }
-
     return base.regionMatches(false, 0, prefix, 0, prefix.length());
   }
-
 }
diff --git a/src/main/java/ext/DropDownButton.java b/src/main/java/ext/DropDownButton.java
index 874c07b..e2d781b 100644
--- a/src/main/java/ext/DropDownButton.java
+++ b/src/main/java/ext/DropDownButton.java
@@ -8,7 +8,6 @@
  * 
  * @author santhosh kumar - santhosh at in.fiorano.com Drop down button
  */
-
 package ext;
 
 import java.awt.Insets;
@@ -33,24 +32,19 @@ import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public abstract class DropDownButton extends JajukButton implements ChangeListener,
     PopupMenuListener, ActionListener, PropertyChangeListener, Const {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 9126200472940409277L;
-
-  /** DOCUMENT_ME. */
   private final JButton arrowButton;
-
-  /** DOCUMENT_ME. */
   private boolean popupVisible = false;
 
   /**
    * Instantiates a new drop down button.
    * 
-   * @param icon DOCUMENT_ME
+   * @param icon 
    */
   public DropDownButton(ImageIcon icon) {
     super(icon);
@@ -68,7 +62,6 @@ public abstract class DropDownButton extends JajukButton implements ChangeListen
   }
 
   /*------------------------------[ PropertyChangeListener ]---------------------------------------------------*/
-
   /* (non-Javadoc)
    * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
    */
@@ -78,7 +71,6 @@ public abstract class DropDownButton extends JajukButton implements ChangeListen
   }
 
   /*------------------------------[ ChangeListener ]---------------------------------------------------*/
-
   /* (non-Javadoc)
    * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
    */
@@ -101,7 +93,6 @@ public abstract class DropDownButton extends JajukButton implements ChangeListen
   }
 
   /*------------------------------[ ActionListener ]---------------------------------------------------*/
-
   /* (non-Javadoc)
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
    */
@@ -113,7 +104,6 @@ public abstract class DropDownButton extends JajukButton implements ChangeListen
   }
 
   /*------------------------------[ PopupMenuListener ]---------------------------------------------------*/
-
   /* (non-Javadoc)
    * @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent)
    */
@@ -130,7 +120,6 @@ public abstract class DropDownButton extends JajukButton implements ChangeListen
   @Override
   public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
     popupVisible = false;
-
     getModel().setRollover(false);
     arrowButton.getModel().setSelected(false);
     ((JPopupMenu) e.getSource()).removePopupMenuListener(this);
@@ -146,7 +135,6 @@ public abstract class DropDownButton extends JajukButton implements ChangeListen
   }
 
   /*------------------------------[ Other Methods ]---------------------------------------------------*/
-
   /**
    * Gets the popup menu.
    * 
@@ -156,9 +144,9 @@ public abstract class DropDownButton extends JajukButton implements ChangeListen
 
   /**
    * Adds the to tool bar.
-   * DOCUMENT_ME
    * 
-   * @param toolbar DOCUMENT_ME
+   * 
+   * @param toolbar 
    * 
    * @return the j button
    */
diff --git a/src/main/java/ext/FlowScrollPanel.java b/src/main/java/ext/FlowScrollPanel.java
index 04195b9..69947e3 100644
--- a/src/main/java/ext/FlowScrollPanel.java
+++ b/src/main/java/ext/FlowScrollPanel.java
@@ -23,17 +23,12 @@ import javax.swing.JScrollPane;
 import org.jdesktop.swingx.JXPanel;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class FlowScrollPanel extends JXPanel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private FlowLayout layout = new FlowLayout();
-
-  /** DOCUMENT_ME. */
   private JScrollPane scroller;
 
   /**
@@ -46,7 +41,7 @@ public class FlowScrollPanel extends JXPanel {
   /**
    * Instantiates a new flow scroll panel.
    * 
-   * @param scrollPane DOCUMENT_ME
+   * @param scrollPane 
    */
   public FlowScrollPanel(JScrollPane scrollPane) {
     super();
@@ -103,7 +98,6 @@ public class FlowScrollPanel extends JXPanel {
     int x = 0, y = insets.top + vgap;
     int rowh = 0;
     int maxRowWidth = scrollerWidth;
-
     for (int i = 0; i < nmembers; i++) {
       Component m = getComponent(i);
       if (m.isVisible()) {
@@ -147,7 +141,6 @@ public class FlowScrollPanel extends JXPanel {
   //
   // Scrollable methods
   //
-
   /* (non-Javadoc)
    * @see org.jdesktop.swingx.JXPanel#getPreferredScrollableViewportSize()
    */
@@ -159,9 +152,9 @@ public class FlowScrollPanel extends JXPanel {
   /**
    * Returns height of a row.
    * 
-   * @param visibleRect DOCUMENT_ME
-   * @param orientation DOCUMENT_ME
-   * @param direction DOCUMENT_ME
+   * @param visibleRect 
+   * @param orientation 
+   * @param direction 
    * 
    * @return the scrollable unit increment
    */
@@ -174,9 +167,9 @@ public class FlowScrollPanel extends JXPanel {
   /**
    * returns the height of the visible rect (so it scrolls by one screenfull).
    * 
-   * @param visibleRect DOCUMENT_ME
-   * @param orientation DOCUMENT_ME
-   * @param direction DOCUMENT_ME
+   * @param visibleRect 
+   * @param orientation 
+   * @param direction 
    * 
    * @return the scrollable block increment
    */
@@ -200,5 +193,4 @@ public class FlowScrollPanel extends JXPanel {
   public boolean getScrollableTracksViewportHeight() {
     return false;
   }
-
 }
diff --git a/src/main/java/ext/JScrollingText.java b/src/main/java/ext/JScrollingText.java
index e7a9cc9..5d5ebfa 100644
--- a/src/main/java/ext/JScrollingText.java
+++ b/src/main/java/ext/JScrollingText.java
@@ -14,29 +14,20 @@ import java.util.TimerTask;
 import javax.swing.JLabel;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class JScrollingText extends JLabel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 3068213731703270035L;
-
-  /** DOCUMENT_ME. */
   private final int speed;
-
-  /** DOCUMENT_ME. */
   private final int period;
-
-  /** DOCUMENT_ME. */
   private final int offset;
-
-  /** DOCUMENT_ME. */
   private int x = 300;
 
   /**
    * Instantiates a new j scrolling text.
    * 
-   * @param text DOCUMENT_ME
+   * @param text 
    */
   public JScrollingText(String text) {
     this(text, 1);
@@ -45,8 +36,8 @@ public class JScrollingText extends JLabel {
   /**
    * Instantiates a new j scrolling text.
    * 
-   * @param text DOCUMENT_ME
-   * @param speed DOCUMENT_ME
+   * @param text 
+   * @param speed 
    */
   public JScrollingText(String text, int speed) {
     this(text, speed, 100);
@@ -55,9 +46,9 @@ public class JScrollingText extends JLabel {
   /**
    * Instantiates a new j scrolling text.
    * 
-   * @param text DOCUMENT_ME
-   * @param speed DOCUMENT_ME
-   * @param period DOCUMENT_ME
+   * @param text 
+   * @param speed 
+   * @param period 
    */
   public JScrollingText(String text, int speed, int period) {
     this(text, speed, period, 0);
@@ -66,10 +57,10 @@ public class JScrollingText extends JLabel {
   /**
    * Instantiates a new j scrolling text.
    * 
-   * @param text DOCUMENT_ME
-   * @param speed DOCUMENT_ME
-   * @param period DOCUMENT_ME
-   * @param offset DOCUMENT_ME
+   * @param text 
+   * @param speed 
+   * @param period 
+   * @param offset 
    */
   public JScrollingText(String text, int speed, int period, int offset) {
     super(text);
@@ -88,32 +79,26 @@ public class JScrollingText extends JLabel {
       g.fillRect(0, 0, getWidth(), getHeight());
     }
     g.setColor(getForeground());
-
     FontMetrics fm = g.getFontMetrics();
     Insets insets = getInsets();
-
     int width = getWidth() - (insets.left + insets.right);
     int height = getHeight() - (insets.top + insets.bottom);
-
     int textWidth = fm.stringWidth(getText());
     if (width < textWidth) {
       width = textWidth + offset;
     }
     x %= width;
-
     int textX = insets.left + x;
     int textY = insets.top + (height - fm.getHeight()) / 2 + fm.getAscent();
-
     g.drawString(getText(), textX, textY);
     g.drawString(getText(), textX + (speed > 0 ? -width : width), textY);
   }
 
-  /** DOCUMENT_ME. */
   Timer timer;
 
   /**
    * Start.
-   * DOCUMENT_ME
+   * 
    */
   public void start() {
     timer = new Timer("Scrolling Text Timer");
@@ -137,7 +122,6 @@ public class JScrollingText extends JLabel {
       timer.cancel();
       timer = null;
     }
-
     super.removeNotify();
   }
 }
diff --git a/src/main/java/ext/JSplash.java b/src/main/java/ext/JSplash.java
index f6df555..f7f30a8 100644
--- a/src/main/java/ext/JSplash.java
+++ b/src/main/java/ext/JSplash.java
@@ -22,6 +22,8 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * 
+ * 
  */
 package ext;
 
@@ -63,22 +65,16 @@ import org.jajuk.util.UtilSystem;
  * Adapted to Jajuk by The Jajuk Team
  */
 public final class JSplash extends JFrame {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant JAJUK_ICON.  DOCUMENT_ME */
+  /** The Constant JAJUK_ICON.   */
   private static final String JAJUK_ICON = "icons/64x64/jajuk-icon_64x64.png";
-
   /** Progress bar to use in the splash screen. */
   private JProgressBar mProgress = null;
-
   /** Check for whether to use the progress bar or not. */
   private boolean mProgressBar = false;
-
   /** Check for whether to use progress bar messages or not. */
   private boolean mProgressBarMessages = false;
-
   /** Check for whether to use percentage values or not. */
   private boolean mProgressBarPercent = false;
 
@@ -103,36 +99,30 @@ public final class JSplash extends JFrame {
       String copyrightString, String versionString, Font versionStringFont) {
     super();
     setTitle(Messages.getString("JajukWindow.17"));
-
     // check if we can load the icon
     URL icon = UtilSystem.getResource(JAJUK_ICON);
     if (null == icon) {
       throw new IllegalArgumentException(
           "Resource not found in Classpath. Can not load icon from location: " + JAJUK_ICON);
     }
-
     // Do not use IconLoader class here to avoid loading all icons now
     setIconImage(new ImageIcon(icon).getImage());
     setUndecorated(true);
     getRootPane().setWindowDecorationStyle(JRootPane.NONE);
-
     mProgressBar = progress;
     mProgressBarMessages = messages;
     mProgressBarPercent = percent;
-
     // build a panel with a black line for border,
     // and set it as the content pane
     JPanel panel = new JPanel();
     panel.setLayout(new BorderLayout());
     panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
     setContentPane(panel);
-
     if (url == null) {
       throw new IllegalArgumentException("Invalid URL specified for Splashscreen");
     }
     // build a label and set it's icon
     JSplashLabel label = new JSplashLabel(url, copyrightString, versionString, versionStringFont);
-
     // build a progress bar and a tips of the day scrolling text
     String totd = Messages.getShuffleTipOfTheDay();
     // Remove pictures urls
@@ -149,39 +139,30 @@ public final class JSplash extends JFrame {
     scrollingText.start();
     if (mProgressBar) {
       mProgress = new JProgressBar();
-
       if (mProgressBarMessages || mProgressBarPercent) {
         mProgress.setStringPainted(true);
       } else {
         mProgress.setStringPainted(false);
       }
-
       if (mProgressBarMessages && !mProgressBarPercent) {
         mProgress.setString("");
       }
-
       mProgress.setMaximum(100);
       mProgress.setMinimum(0);
       mProgress.setValue(0);
       mProgress.setFont(FontManager.getInstance().getFont(JajukFont.SPLASH_PROGRESS));
       jpTotdAndProgress.add(mProgress);
       jpTotdAndProgress.add(scrollingText);
-
     }
-
     // add the components to the panel
     getContentPane().add(label, BorderLayout.CENTER);
-
     if (mProgressBar) {
       getContentPane().add(jpTotdAndProgress, BorderLayout.SOUTH);
     }
-
     // validate, and display the components
     pack();
-
     // center on screen
     setLocationRelativeTo(this);
-
   }
 
   /**
@@ -189,7 +170,6 @@ public final class JSplash extends JFrame {
    */
   public void splashOn() {
     setVisible(true);
-
   }
 
   /**
@@ -223,10 +203,8 @@ public final class JSplash extends JFrame {
   public void setProgress(int value, String msg) {
     setProgress(value);
     repaint();
-
     if (mProgressBarMessages && !mProgressBarPercent && msg != null) {
       mProgress.setString(msg);
     }
   }
-
 }
diff --git a/src/main/java/ext/JSplashLabel.java b/src/main/java/ext/JSplashLabel.java
index 46e00bf..2a83ea4 100644
--- a/src/main/java/ext/JSplashLabel.java
+++ b/src/main/java/ext/JSplashLabel.java
@@ -45,16 +45,12 @@ import javax.swing.JLabel;
  * @since 1.06
  */
 public final class JSplashLabel extends JLabel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Used to draw the text string. */
   private String mText = null;
-
   /** Used to draw the copyright notice. */
   private String mCopyright = null;
-
   /** Font to use when drawing the text. */
   private Font mFont = null;
 
@@ -63,13 +59,12 @@ public final class JSplashLabel extends JLabel {
    * <p>
    *
    * @param url The location of the image (<b>it cannot be null</b>).
-   * @param copyright DOCUMENT_ME
+   * @param copyright 
    * @param text The string to draw (can be null).
    * @param font The font to use (can be null).
    */
   public JSplashLabel(URL url, String copyright, String text, Font font) {
     super();
-
     ImageIcon icon = new ImageIcon(url);
     if (icon.getImageLoadStatus() != MediaTracker.COMPLETE) {
       System.err.println("Cannot load splash screen: " + url);
@@ -94,7 +89,6 @@ public final class JSplashLabel extends JLabel {
   @Override
   public void paint(Graphics g) {
     super.paint(g);
-
     if (mText != null) {
       g.setColor(Color.BLACK);
       // Draw copyright notice
@@ -102,10 +96,8 @@ public final class JSplashLabel extends JLabel {
       int width = fm.stringWidth(mCopyright) + 50;
       int height = fm.getHeight();
       g.drawString(mCopyright, getWidth() - width, (getHeight() - height) - 20);
-
       // Draw release
       g.drawString(mText, getWidth() - width, (getHeight() - height));
     }
   }
-
 }
diff --git a/src/main/java/ext/JVM.java b/src/main/java/ext/JVM.java
index 32a05e4..1f6ed9a 100644
--- a/src/main/java/ext/JVM.java
+++ b/src/main/java/ext/JVM.java
@@ -20,7 +20,7 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  * 
- * $Revision$
+ * 
  */
 package ext;
 
@@ -28,38 +28,26 @@ package ext;
  * Deals with the different version of the Java Virtual Machine. <br>
  */
 public class JVM {
-
-  /** The Constant JDK1_0.  DOCUMENT_ME */
+  /** The Constant JDK1_0.   */
   public static final int JDK1_0 = 10;
-
-  /** The Constant JDK1_1.  DOCUMENT_ME */
+  /** The Constant JDK1_1.   */
   public static final int JDK1_1 = 11;
-
-  /** The Constant JDK1_2.  DOCUMENT_ME */
+  /** The Constant JDK1_2.   */
   public static final int JDK1_2 = 12;
-
-  /** The Constant JDK1_3.  DOCUMENT_ME */
+  /** The Constant JDK1_3.   */
   public static final int JDK1_3 = 13;
-
-  /** The Constant JDK1_4.  DOCUMENT_ME */
+  /** The Constant JDK1_4.   */
   public static final int JDK1_4 = 14;
-
-  /** The Constant JDK1_5.  DOCUMENT_ME */
+  /** The Constant JDK1_5.   */
   public static final int JDK1_5 = 15;
-
-  /** The Constant JDK1_6.  DOCUMENT_ME */
+  /** The Constant JDK1_6.   */
   public static final int JDK1_6 = 16;
-
-  /** The Constant JDK1_7.  DOCUMENT_ME */
+  /** The Constant JDK1_7.   */
   public static final int JDK1_7 = 17;
-
-  /** The Constant JDK1_8.  DOCUMENT_ME */
+  /** The Constant JDK1_8.   */
   public static final int JDK1_8 = 18;
-
-  /** The Constant JDK1_9.  DOCUMENT_ME */
+  /** The Constant JDK1_9.   */
   public static final int JDK1_9 = 19;
-
-  /** DOCUMENT_ME. */
   private static JVM current;
   static {
     current = new JVM();
@@ -74,7 +62,6 @@ public class JVM {
     return current;
   }
 
-  /** DOCUMENT_ME. */
   private int jdkVersion;
 
   /**
@@ -87,7 +74,7 @@ public class JVM {
   /**
    * Constructor for the OS object.
    * 
-   * @param pJavaVersion DOCUMENT_ME
+   * @param pJavaVersion 
    */
   public JVM(String pJavaVersion) {
     if (pJavaVersion.startsWith("1.9.")) {
@@ -119,7 +106,7 @@ public class JVM {
   /**
    * Checks if is or later.
    * 
-   * @param pVersion DOCUMENT_ME
+   * @param pVersion 
    * 
    * @return true, if is or later
    */
@@ -207,5 +194,4 @@ public class JVM {
   public boolean isOneDotNine() {
     return jdkVersion == JDK1_9;
   }
-
 }
diff --git a/src/main/java/ext/JXTrayIcon.java b/src/main/java/ext/JXTrayIcon.java
index 81a8aa2..425698e 100644
--- a/src/main/java/ext/JXTrayIcon.java
+++ b/src/main/java/ext/JXTrayIcon.java
@@ -17,9 +17,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package ext;
 
 import java.awt.Frame;
@@ -38,19 +37,13 @@ import javax.swing.event.PopupMenuListener;
  * See http://weblogs.java.net/blog/alexfromsun/archive/2008/02/jtrayicon_updat.html
  */
 public class JXTrayIcon extends TrayIcon {
-
-  /** DOCUMENT_ME. */
   private JPopupMenu menu;
-
-  /** DOCUMENT_ME. */
   private static JDialog dialog;
   static {
     dialog = new JDialog((Frame) null, "TrayDialog");
     dialog.setUndecorated(true);
     dialog.setAlwaysOnTop(true);
   }
-
-  /** DOCUMENT_ME. */
   private static PopupMenuListener popupListener = new PopupMenuListener() {
     @Override
     public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
@@ -71,7 +64,7 @@ public class JXTrayIcon extends TrayIcon {
   /**
    * Instantiates a new jX tray icon.
    * 
-   * @param image DOCUMENT_ME
+   * @param image 
    */
   public JXTrayIcon(Image image) {
     super(image);
@@ -79,9 +72,9 @@ public class JXTrayIcon extends TrayIcon {
 
   /**
    * Show j popup menu.
-   * DOCUMENT_ME
    * 
-   * @param e DOCUMENT_ME
+   * 
+   * @param e 
    */
   public void showJPopupMenu(MouseEvent e) {
     if (menu != null) {
@@ -114,5 +107,4 @@ public class JXTrayIcon extends TrayIcon {
     this.menu = menu;
     menu.addPopupMenuListener(popupListener);
   }
-
 }
diff --git a/src/main/java/ext/MersenneTwister.java b/src/main/java/ext/MersenneTwister.java
index eaab890..e277f07 100644
--- a/src/main/java/ext/MersenneTwister.java
+++ b/src/main/java/ext/MersenneTwister.java
@@ -15,17 +15,10 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext;
 
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-
 /**
  * <h3>MersenneTwister and MersenneTwisterFast</h3>
  * <p><b>Version 13</b>, based on version MT199937(99/10/29)
@@ -166,141 +159,44 @@ import java.io.Serializable;
  * 
  * @version 13
  */
-
-public class MersenneTwister extends java.util.Random implements Serializable, Cloneable {
-
+public final class MersenneTwister extends java.util.Random {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
   // Period parameters
-  /** The Constant N.  DOCUMENT_ME */
+  /** The Constant N.   */
   private static final int N = 624;
-  
-  /** The Constant M.  DOCUMENT_ME */
+  /** The Constant M.   */
   private static final int M = 397;
-  
-  /** The Constant MATRIX_A.  DOCUMENT_ME */
+  /** The Constant MATRIX_A.   */
   private static final int MATRIX_A = 0x9908b0df; // private static final * constant vector a
-  
-  /** The Constant UPPER_MASK.  DOCUMENT_ME */
+  /** The Constant UPPER_MASK.   */
   private static final int UPPER_MASK = 0x80000000; // most significant w-r bits
-  
-  /** The Constant LOWER_MASK.  DOCUMENT_ME */
+  /** The Constant LOWER_MASK.   */
   private static final int LOWER_MASK = 0x7fffffff; // least significant r bits
-
   // Tempering parameters
-  /** The Constant TEMPERING_MASK_B.  DOCUMENT_ME */
+  /** The Constant TEMPERING_MASK_B.   */
   private static final int TEMPERING_MASK_B = 0x9d2c5680;
-  
-  /** The Constant TEMPERING_MASK_C.  DOCUMENT_ME */
+  /** The Constant TEMPERING_MASK_C.   */
   private static final int TEMPERING_MASK_C = 0xefc60000;
-
-  /** DOCUMENT_ME. */
   private int mt[]; // the array for the state vector
-  
-  /** DOCUMENT_ME. */
   private int mti; // mti==N+1 means mt[N] is not initialized
-  
-  /** DOCUMENT_ME. */
   private int mag01[];
-
-  // a good initial seed (of int size, though stored in a long)
-  // private static final long GOOD_SEED = 4357;
-
-  /*
-   * implemented here because there's a bug in Random's implementation of the Gaussian code (divide
-   * by zero, and log(0), ugh!), yet its gaussian variables are private so we can't access them
-   * here. :-(
-   */
-
-  /** DOCUMENT_ME. */
-  private double __nextNextGaussian;
-  
-  /** DOCUMENT_ME. */
-  private boolean __haveNextNextGaussian;
-
-  /* We're overriding all internal data, to my knowledge, so this should be okay */
-  /* (non-Javadoc)
-   * @see java.lang.Object#clone()
-   */
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    MersenneTwister f = (MersenneTwister) (super.clone());
-    f.mt = mt.clone();
-    f.mag01 = mag01.clone();
-    return f;
-  }
+  /** Singleton. */
+  private static MersenneTwister self = new MersenneTwister();
 
   /**
-   * State equals.
-   * DOCUMENT_ME
-   * 
-   * @param o DOCUMENT_ME
-   * 
-   * @return true if...
+   * Return the singleton.
+   *
+   * @return the singleton
    */
-  public boolean stateEquals(Object o) {
-    if (o == this)
-      return true;
-    if (o == null || !(o instanceof MersenneTwister))
-      return false;
-    MersenneTwister other = (MersenneTwister) o;
-    if (mti != other.mti)
-      return false;
-    for (int x = 0; x < mag01.length; x++)
-      if (mag01[x] != other.mag01[x])
-        return false;
-    for (int x = 0; x < mt.length; x++)
-      if (mt[x] != other.mt[x])
-        return false;
-    return true;
-  }
-
-  /**
-   * Reads the entire state of the MersenneTwister RNG from the stream.
-   * 
-   * @param stream DOCUMENT_ME
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
-   */
-  public void readState(DataInputStream stream) throws IOException {
-    int len = mt.length;
-    for (int x = 0; x < len; x++)
-      mt[x] = stream.readInt();
-
-    len = mag01.length;
-    for (int x = 0; x < len; x++)
-      mag01[x] = stream.readInt();
-
-    mti = stream.readInt();
-    __nextNextGaussian = stream.readDouble();
-    __haveNextNextGaussian = stream.readBoolean();
-  }
-
-  /**
-   * Writes the entire state of the MersenneTwister RNG to the stream.
-   * 
-   * @param stream DOCUMENT_ME
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
-   */
-  public void writeState(DataOutputStream stream) throws IOException {
-    int len = mt.length;
-    for (int x = 0; x < len; x++)
-      stream.writeInt(mt[x]);
-
-    len = mag01.length;
-    for (int x = 0; x < len; x++)
-      stream.writeInt(mag01[x]);
-
-    stream.writeInt(mti);
-    stream.writeDouble(__nextNextGaussian);
-    stream.writeBoolean(__haveNextNextGaussian);
+  public static MersenneTwister getInstance() {
+    return self;
   }
 
   /**
    * Constructor using the default seed.
    */
-  public MersenneTwister() {
+  private MersenneTwister() {
     this(System.currentTimeMillis());
   }
 
@@ -308,49 +204,28 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * Constructor using a given seed.  Though you pass this seed in
    * as a long, it's best to make sure it's actually an integer.
    * 
-   * @param seed DOCUMENT_ME
+   * @param seed 
    */
-  public MersenneTwister(final long seed) {
+  private MersenneTwister(final long seed) {
     super(seed); /* just in case */
     setSeed(seed);
   }
 
   /**
-   * Constructor using an array of integers as seed.
-   * Your array must have a non-zero length.  Only the first 624 integers
-   * in the array are used; if the array is shorter than this then
-   * integers are repeatedly used in a wrap-around fashion.
-   * 
-   * @param array DOCUMENT_ME
-   */
-  public MersenneTwister(final int[] array) {
-    super(System.currentTimeMillis()); /* pick something at random just in case */
-    setSeed(array);
-  }
-
-  /**
-   * Initalize the pseudo random number generator.  Don't
+   * Initialize the pseudo random number generator.  Don't
    * pass in a long that's bigger than an int (Mersenne Twister
    * only uses the first 32 bits for its seed).
    * 
-   * @param seed DOCUMENT_ME
+   * @param seed 
    */
-
   @Override
-  synchronized public void setSeed(final long seed) {
+  public final void setSeed(final long seed) {
     // it's always good style to call super
     super.setSeed(seed);
-
-    // Due to a bug in java.util.Random clear up to 1.2, we're
-    // doing our own Gaussian variable.
-    __haveNextNextGaussian = false;
-
     mt = new int[N];
-
     mag01 = new int[2];
     mag01[0] = 0x0;
     mag01[1] = MATRIX_A;
-
     mt[0] = (int) (seed & 0xffffffff);
     for (mti = 1; mti < N; mti++) {
       mt[mti] = (1812433253 * (mt[mti - 1] ^ (mt[mti - 1] >>> 30)) + mti);
@@ -364,63 +239,20 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
   }
 
   /**
-   * Sets the seed of the MersenneTwister using an array of integers.
-   * Your array must have a non-zero length.  Only the first 624 integers
-   * in the array are used; if the array is shorter than this then
-   * integers are repeatedly used in a wrap-around fashion.
-   * 
-   * @param array DOCUMENT_ME
-   */
-
-  synchronized public void setSeed(final int[] array) {
-    if (array.length == 0)
-      throw new IllegalArgumentException("Array length must be greater than zero");
-    int i, j, k;
-    setSeed(19650218);
-    i = 1;
-    j = 0;
-    k = (N > array.length ? N : array.length);
-    for (; k != 0; k--) {
-      mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >>> 30)) * 1664525)) + array[j] + j; /* non linear */
-      mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */
-      i++;
-      j++;
-      if (i >= N) {
-        mt[0] = mt[N - 1];
-        i = 1;
-      }
-      if (j >= array.length)
-        j = 0;
-    }
-    for (k = N - 1; k != 0; k--) {
-      mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >>> 30)) * 1566083941)) - i; /* non linear */
-      mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */
-      i++;
-      if (i >= N) {
-        mt[0] = mt[N - 1];
-        i = 1;
-      }
-    }
-    mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */
-  }
-
-  /**
-   * Returns an integer with <i>bits</i> bits filled with a random number.
-   * 
-   * @param bits DOCUMENT_ME
-   * 
-   * @return the int
-   */
+  * Returns an integer with <i>bits</i> bits filled with a random number.
+  * 
+  * @param bits 
+  * 
+  * @return the int
+  */
   @Override
   synchronized protected int next(final int bits) {
     int y;
-
     if (mti >= N) // generate N words at one time
     {
       int kk;
       final int[] mt = this.mt; // locals are slightly faster
       final int[] mag01 = this.mag01; // locals are slightly faster
-
       for (kk = 0; kk < N - M; kk++) {
         y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
         mt[kk] = mt[kk + M] ^ (y >>> 1) ^ mag01[y & 0x1];
@@ -431,51 +263,19 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
       }
       y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
       mt[N - 1] = mt[M - 1] ^ (y >>> 1) ^ mag01[y & 0x1];
-
       mti = 0;
     }
-
     y = mt[mti++];
     y ^= y >>> 11; // TEMPERING_SHIFT_U(y)
     y ^= (y << 7) & TEMPERING_MASK_B; // TEMPERING_SHIFT_S(y)
     y ^= (y << 15) & TEMPERING_MASK_C; // TEMPERING_SHIFT_T(y)
     y ^= (y >>> 18); // TEMPERING_SHIFT_L(y)
-
     return y >>> (32 - bits); // hope that's right!
   }
 
   /*
    * If you've got a truly old version of Java, you can omit these two next methods.
    */
-
-  /**
-   * Write object.
-   * DOCUMENT_ME
-   * 
-   * @param out DOCUMENT_ME
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
-   */
-  private synchronized void writeObject(final ObjectOutputStream out) throws IOException {
-    // just so we're synchronized.
-    out.defaultWriteObject();
-  }
-
-  /**
-   * Read object.
-   * DOCUMENT_ME
-   * 
-   * @param in DOCUMENT_ME
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
-   * @throws ClassNotFoundException the class not found exception
-   */
-  private synchronized void readObject(final ObjectInputStream in) throws IOException,
-      ClassNotFoundException {
-    // just so we're synchronized.
-    in.defaultReadObject();
-  }
-
   /**
    * This method is missing from jdk 1.0.x and below.  JDK 1.1
    * includes this for us, but what the heck.
@@ -494,11 +294,10 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * event as nextBoolean(double), but twice as fast. To explicitly
    * use this, remember you may need to cast to float first.
    * 
-   * @param probability DOCUMENT_ME
+   * @param probability 
    * 
    * @return true, if next boolean
    */
-
   public boolean nextBoolean(final float probability) {
     if (probability < 0.0f || probability > 1.0f)
       throw new IllegalArgumentException("probability must be between 0.0 and 1.0 inclusive.");
@@ -514,11 +313,10 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * of returning true, else returning false. <tt>probability</tt> must
    * be between 0.0 and 1.0, inclusive.
    * 
-   * @param probability DOCUMENT_ME
+   * @param probability 
    * 
    * @return true, if next boolean
    */
-
   public boolean nextBoolean(final double probability) {
     if (probability < 0.0 || probability > 1.0)
       throw new IllegalArgumentException("probability must be between 0.0 and 1.0 inclusive.");
@@ -533,19 +331,16 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * This method is missing from JDK 1.1 and below.  JDK 1.2
    * includes this for us, but what the heck.
    * 
-   * @param n DOCUMENT_ME
+   * @param n 
    * 
    * @return the int
    */
-
   @Override
   public int nextInt(final int n) {
     if (n <= 0)
       throw new IllegalArgumentException("n must be > 0");
-
     if ((n & -n) == n)
       return (int) ((n * (long) next(31)) >> 31);
-
     int bits, val;
     do {
       bits = next(31);
@@ -559,15 +354,13 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * Returns a long drawn uniformly from 0 to n-1.  Suffice it to say,
    * n must be > 0, or an IllegalArgumentException is raised.
    * 
-   * @param n DOCUMENT_ME
+   * @param n 
    * 
    * @return the long
    */
-
   public long nextLong(final long n) {
     if (n <= 0)
       throw new IllegalArgumentException("n must be > 0");
-
     long bits, val;
     do {
       bits = (nextLong() >>> 1);
@@ -593,7 +386,6 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * 
    * @return the float
    */
-
   @Override
   public float nextFloat() {
     return next(24) / ((float) (1 << 24));
@@ -604,13 +396,13 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * use all four bytes in an integer as independent byte values!
    * Totally wrong. I've submitted a bug report.
    * 
-   * @param bytes DOCUMENT_ME
+   * @param bytes 
    */
-
   @Override
   public void nextBytes(final byte[] bytes) {
-    for (int x = 0; x < bytes.length; x++)
+    for (int x = 0; x < bytes.length; x++) {
       bytes[x] = (byte) next(8);
+    }
   }
 
   /**
@@ -618,7 +410,6 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
    * 
    * @return the char
    */
-
   public char nextChar() {
     // chars are 16-bit UniCode values
     return (char) (next(16));
@@ -627,49 +418,9 @@ public class MersenneTwister extends java.util.Random implements Serializable, C
   /**
    * For completeness' sake, though it's not in java.util.Random.
    * 
-   * @return the short
-   */
-
-  public short nextShort() {
-    return (short) (next(16));
-  }
-
-  /**
-   * For completeness' sake, though it's not in java.util.Random.
-   * 
    * @return the byte
    */
-
   public byte nextByte() {
     return (byte) (next(8));
   }
-
-  /**
-   * A bug fix for all JDK code including 1.2.  nextGaussian can theoretically
-   * ask for the log of 0 and divide it by 0! See Java bug
-   * <a href="http://developer.java.sun.com/developer/bugParade/bugs/4254501.html">
-   * http://developer.java.sun.com/developer/bugParade/bugs/4254501.html</a>
-   * 
-   * @return the double
-   */
-
-  @Override
-  synchronized public double nextGaussian() {
-    if (__haveNextNextGaussian) {
-      __haveNextNextGaussian = false;
-      return __nextNextGaussian;
-    } else {
-      double v1, v2, s;
-      do {
-        v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
-        v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
-        s = v1 * v1 + v2 * v2;
-      } while (s >= 1 || s == 0);
-      double multiplier = /* Strict */Math.sqrt(-2 * /* Strict */Math.log(s) / s);
-      __nextNextGaussian = v2 * multiplier;
-      __haveNextNextGaussian = true;
-      return v1 * multiplier;
-    }
-  }
- 
 }
diff --git a/src/main/java/ext/ProcessLauncher.java b/src/main/java/ext/ProcessLauncher.java
index 3e06b33..d4afad7 100644
--- a/src/main/java/ext/ProcessLauncher.java
+++ b/src/main/java/ext/ProcessLauncher.java
@@ -18,7 +18,6 @@
  *  License along with this library; if not, write to the Free Software
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
-
 package ext;
 
 import java.io.BufferedInputStream;
@@ -39,23 +38,11 @@ import org.jajuk.util.log.Log;
  * @author Yann D'ISANTO
  */
 public class ProcessLauncher {
-
-  /** DOCUMENT_ME. */
   private OutputStream out = null;
-
-  /** DOCUMENT_ME. */
   private OutputStream err = null;
-
-  /** DOCUMENT_ME. */
   private InputStream in = null;
-
-  /** DOCUMENT_ME. */
   private Process process;
-
-  /** DOCUMENT_ME. */
   private long timeout = 0L;
-
-  /** DOCUMENT_ME. */
   private boolean finished = false;
 
   /**
@@ -220,13 +207,12 @@ public class ProcessLauncher {
 
   /**
    * Execute.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the int
    */
   private int execute() {
     int status = -1;
-
     // Consommation des fluxs de sortie standard et d'erreur dans des
     // threads separes.
     if (err == null) {
@@ -247,12 +233,10 @@ public class ProcessLauncher {
     } else {
       createStreamThread(process.getInputStream(), out);
     }
-
     // Mapping de l'entree standard de l'application si besoin est.
     if (in != null) {
       createStreamThread(in, process.getOutputStream());
     }
-
     if (timeout > 0L) {
       Thread processThread = createProcessThread(process);
       processThread.start();
@@ -280,10 +264,10 @@ public class ProcessLauncher {
 
   /**
    * Creates the stream thread.
-   * DOCUMENT_ME
    * 
-   * @param is DOCUMENT_ME
-   * @param os DOCUMENT_ME
+   * 
+   * @param is 
+   * @param os 
    */
   private void createStreamThread(final InputStream is, final OutputStream os) {
     new Thread(new Runnable() {
@@ -315,9 +299,9 @@ public class ProcessLauncher {
 
   /**
    * Creates the process thread.
-   * DOCUMENT_ME
    * 
-   * @param process DOCUMENT_ME
+   * 
+   * @param process 
    * 
    * @return the thread
    */
diff --git a/src/main/java/ext/scrollablepopupmenu/XCheckedButton.java b/src/main/java/ext/scrollablepopupmenu/XCheckedButton.java
index efdaf6f..6f99259 100644
--- a/src/main/java/ext/scrollablepopupmenu/XCheckedButton.java
+++ b/src/main/java/ext/scrollablepopupmenu/XCheckedButton.java
@@ -32,36 +32,25 @@ import org.jajuk.util.JajukIcons;
  * http://www.beginner-java-tutorial.com/scrollable-jpopupmenu.html
  */
 public class XCheckedButton extends JButton {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 6665536733427576873L;
-
   // Icon to be used to for the Checked Icon of the Button
-  /** DOCUMENT_ME. */
   private ImageIcon checkedIcon;
-
   /** Requires the icon to be always displayed, even when the item is unselected. */
   private boolean iconAlwaysVisible = false;
-
   /** These colors are required in order to simulate the JMenuItem's L&F. */
   public static final Color MENU_HIGHLIGHT_BG_COLOR = UIManager
       .getColor("MenuItem.selectionBackground");
-
-  /** The Constant MENU_HIGHLIGHT_FG_COLOR.  DOCUMENT_ME */
+  /** The Constant MENU_HIGHLIGHT_FG_COLOR.   */
   public static final Color MENU_HIGHLIGHT_FG_COLOR = UIManager
       .getColor("MenuItem.selectionForeground");
-
-  /** The Constant MENUITEM_BG_COLOR.  DOCUMENT_ME */
+  /** The Constant MENUITEM_BG_COLOR.   */
   public static final Color MENUITEM_BG_COLOR = UIManager.getColor("MenuItem.background");
-
-  /** The Constant MENUITEM_FG_COLOR.  DOCUMENT_ME */
+  /** The Constant MENUITEM_FG_COLOR.   */
   public static final Color MENUITEM_FG_COLOR = UIManager.getColor("MenuItem.foreground");
-
   // This property if set to false, will result in the checked Icon not being
   // displayed
-
   // when the button is selected
-  /** DOCUMENT_ME. */
   private boolean displayCheck = true;
 
   /**
@@ -70,13 +59,12 @@ public class XCheckedButton extends JButton {
   public XCheckedButton() {
     super();
     init();
-
   }
 
   /**
    * Instantiates a new x checked button.
    * 
-   * @param a DOCUMENT_ME
+   * @param a 
    */
   public XCheckedButton(Action a) {
     super(a);
@@ -86,7 +74,7 @@ public class XCheckedButton extends JButton {
   /**
    * Instantiates a new x checked button.
    * 
-   * @param icon DOCUMENT_ME
+   * @param icon 
    */
   public XCheckedButton(Icon icon) {
     super(icon);
@@ -96,8 +84,8 @@ public class XCheckedButton extends JButton {
   /**
    * Instantiates a new x checked button.
    * 
-   * @param text DOCUMENT_ME
-   * @param icon DOCUMENT_ME
+   * @param text 
+   * @param icon 
    */
   public XCheckedButton(String text, Icon icon) {
     super(text, icon);
@@ -107,7 +95,7 @@ public class XCheckedButton extends JButton {
   /**
    * Instantiates a new x checked button.
    * 
-   * @param text DOCUMENT_ME
+   * @param text 
    */
   public XCheckedButton(String text) {
     super(text);
@@ -119,7 +107,6 @@ public class XCheckedButton extends JButton {
    */
   private void init() {
     MouseAdapter mouseAdapter = getMouseAdapter();
-
     // Basically JGoodies LAF UI for JButton does not allow Background color
     // to be set.
     // So we need to set the default UI,
@@ -134,12 +121,11 @@ public class XCheckedButton extends JButton {
     setModel(new XCheckedButtonModel());
     setSelected(false);
     this.addMouseListener(mouseAdapter);
-
   }
 
   /**
    * Sets the menu item default colors.
-   * DOCUMENT_ME
+   * 
    */
   private void setMenuItemDefaultColors() {
     XCheckedButton.this.setBackground(MENUITEM_BG_COLOR);
@@ -170,14 +156,13 @@ public class XCheckedButton extends JButton {
       public void mouseExited(MouseEvent e) {
         setMenuItemDefaultColors();
       }
-
     };
   }
 
   /**
    * Display icon.
    * 
-   * @param checkedFlag DOCUMENT_ME
+   * @param checkedFlag 
    */
   public void displayIcon(boolean checkedFlag) {
     if (checkedFlag && isDisplayCheck()) {
@@ -192,10 +177,9 @@ public class XCheckedButton extends JButton {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private class XCheckedButtonModel extends JToggleButton.ToggleButtonModel {
-
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = 4628990599914525833L;
 
@@ -214,33 +198,25 @@ public class XCheckedButton extends JButton {
         group.setSelected(this, set);
         set = group.isSelected(this);
       }
-
       if (isSelected() == set) {
         return;
       }
-
       if (set) {
         stateMask |= SELECTED;
       } else {
         stateMask &= ~SELECTED;
       }
-
       // Send ChangeEvent
       fireStateChanged();
-
       // Send ItemEvent
-      fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, this, this
-          .isSelected() ? ItemEvent.SELECTED : ItemEvent.DESELECTED));
-
+      fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, this,
+          this.isSelected() ? ItemEvent.SELECTED : ItemEvent.DESELECTED));
       XCheckedButton.this.displayIcon(set | iconAlwaysVisible);
-
     }
-
   }
 
   // Returns true if Button will display Checked Icon on Click. Default
   // Behaviour is to display a Checked Icon
-
   /**
    * Checks if is display check.
    * 
@@ -255,7 +231,7 @@ public class XCheckedButton extends JButton {
    * displayed or not Setting to false, makes this button display like a normal
    * button.
    * 
-   * @param displayCheck DOCUMENT_ME
+   * @param displayCheck 
    */
   public void setDisplayCheck(boolean displayCheck) {
     this.displayCheck = displayCheck;
@@ -278,5 +254,4 @@ public class XCheckedButton extends JButton {
   public void setIconAlwaysVisible(boolean iconAlwaysVisible) {
     this.iconAlwaysVisible = iconAlwaysVisible;
   }
-
 }
diff --git a/src/main/java/ext/scrollablepopupmenu/XJPopupMenu.java b/src/main/java/ext/scrollablepopupmenu/XJPopupMenu.java
index 3711671..244f394 100644
--- a/src/main/java/ext/scrollablepopupmenu/XJPopupMenu.java
+++ b/src/main/java/ext/scrollablepopupmenu/XJPopupMenu.java
@@ -37,26 +37,18 @@ import javax.swing.plaf.basic.BasicSeparatorUI;
  * http://www.beginner-java-tutorial.com/scrollable-jpopupmenu.html
  */
 public class XJPopupMenu extends JPopupMenu implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1;
-
-  /** DOCUMENT_ME. */
   private final JPanel panelMenus = new JPanel();
-
-  /** DOCUMENT_ME. */
   private JScrollPane scroll = null;
-
-  /** DOCUMENT_ME. */
   private JFrame jframe = null;
-
-  /** The Constant EMPTY_IMAGE_ICON.  DOCUMENT_ME */
+  /** The Constant EMPTY_IMAGE_ICON.   */
   public static final Icon EMPTY_IMAGE_ICON = new ImageIcon("menu_spacer.gif");
 
   /**
    * Instantiates a new xJ popup menu.
    * 
-   * @param jframe DOCUMENT_ME
+   * @param jframe 
    */
   public XJPopupMenu(JFrame jframe) {
     super();
@@ -66,27 +58,23 @@ public class XJPopupMenu extends JPopupMenu implements ActionListener {
     panelMenus.setBackground(UIManager.getColor("MenuItem.background"));
     // panelMenus.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
     init();
-
   }
 
   /**
    * Inits the.
-   * DOCUMENT_ME
+   * 
    */
-  private void init() {
+  public void init() {
     super.removeAll();
     scroll = new JScrollPane();
     scroll.setViewportView(panelMenus);
     scroll.setBorder(null);
     scroll.setMinimumSize(new Dimension(240, 40));
-
-    scroll.setMaximumSize(new Dimension(scroll.getMaximumSize().width,
-
-    this.getToolkit().getScreenSize().height
+    scroll.setMaximumSize(new Dimension(scroll.getMaximumSize().width, this.getToolkit()
+        .getScreenSize().height
         - this.getToolkit().getScreenInsets(jframe.getGraphicsConfiguration()).top
         - this.getToolkit().getScreenInsets(jframe.getGraphicsConfiguration()).bottom - 4));
     super.add(scroll, BorderLayout.CENTER);
-    // super.add(scroll);
   }
 
   /* (non-Javadoc)
@@ -95,26 +83,21 @@ public class XJPopupMenu extends JPopupMenu implements ActionListener {
   @Override
   public void show(Component invoker, int x, int y) {
     init();
-    // this.pack();
     panelMenus.validate();
     int maxsize = scroll.getMaximumSize().height;
     int realsize = panelMenus.getPreferredSize().height;
-
     int sizescroll = 0;
-
     if (maxsize < realsize) {
       sizescroll = scroll.getVerticalScrollBar().getPreferredSize().width;
     }
-    scroll.setPreferredSize(new Dimension(scroll.getPreferredSize().width + sizescroll + 20,
-
-    scroll.getPreferredSize().height));
+    scroll.setPreferredSize(new Dimension(scroll.getPreferredSize().width + sizescroll + 20, scroll
+        .getPreferredSize().height));
     this.pack();
     this.setInvoker(invoker);
     if (sizescroll != 0) {
       // Set popup size only if scrollbar is visible
       this.setPopupSize(new Dimension(scroll.getPreferredSize().width + 20,
-
-      scroll.getMaximumSize().height - 20));
+          scroll.getMaximumSize().height - 20));
     }
     // this.setMaximumSize(scroll.getMaximumSize());
     Point invokerOrigin = invoker.getLocationOnScreen();
@@ -124,7 +107,7 @@ public class XJPopupMenu extends JPopupMenu implements ActionListener {
 
   /**
    * Hidemenu.
-   * DOCUMENT_ME
+   * 
    */
   public void hidemenu() {
     if (this.isVisible()) {
@@ -134,9 +117,9 @@ public class XJPopupMenu extends JPopupMenu implements ActionListener {
 
   /**
    * Adds the.
-   * DOCUMENT_ME
    * 
-   * @param menuItem DOCUMENT_ME
+   * 
+   * @param menuItem 
    */
   public void add(AbstractButton menuItem) {
     // menuItem.setMargin(new Insets(0, 20, 0 , 0));
@@ -184,10 +167,9 @@ public class XJPopupMenu extends JPopupMenu implements ActionListener {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private static class XSeperator extends JSeparator {
-
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = -6249719411021239596L;
 
@@ -200,15 +182,14 @@ public class XJPopupMenu extends JPopupMenu implements ActionListener {
     }
 
     /**
-     * DOCUMENT_ME.
+     * .
      */
     private static class XBasicSeparatorUI extends BasicSeparatorUI {
-
       /**
        * Creates the ui.
-       * DOCUMENT_ME
        * 
-       * @param c DOCUMENT_ME
+       * 
+       * @param c 
        * 
        * @return the component ui
        */
@@ -222,23 +203,19 @@ public class XJPopupMenu extends JPopupMenu implements ActionListener {
       @Override
       public void paint(Graphics g, JComponent c) {
         Dimension s = c.getSize();
-
         if (((JSeparator) c).getOrientation() == SwingConstants.VERTICAL) {
           g.setColor(c.getForeground());
           g.drawLine(0, 0, 0, s.height);
-
           g.setColor(c.getBackground());
           g.drawLine(1, 0, 1, s.height);
         } else // HORIZONTAL
         {
           g.setColor(c.getForeground());
           g.drawLine(0, 7, s.width, 7);
-
           g.setColor(c.getBackground());
           g.drawLine(0, 8, s.width, 8);
         }
       }
     }
   }
-
 }
diff --git a/src/main/java/ext/scrollablepopupmenu/package.html b/src/main/java/ext/scrollablepopupmenu/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/ext/scrollablepopupmenu/package.html
+++ b/src/main/java/ext/scrollablepopupmenu/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/ext/services/lastfm/AlbumInfo.java b/src/main/java/ext/services/lastfm/AlbumInfo.java
index 66c2b75..9008675 100644
--- a/src/main/java/ext/services/lastfm/AlbumInfo.java
+++ b/src/main/java/ext/services/lastfm/AlbumInfo.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.util.Date;
@@ -29,10 +28,9 @@ import java.util.List;
 import javax.swing.ImageIcon;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public interface AlbumInfo {
-
   /**
    * Gets the artist.
    * 
@@ -187,11 +185,10 @@ public interface AlbumInfo {
    */
   /**
    * To string.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the string
    */
   @Override
   public String toString();
-
 }
diff --git a/src/main/java/ext/services/lastfm/AlbumListInfo.java b/src/main/java/ext/services/lastfm/AlbumListInfo.java
index 759422b..2f7fedb 100644
--- a/src/main/java/ext/services/lastfm/AlbumListInfo.java
+++ b/src/main/java/ext/services/lastfm/AlbumListInfo.java
@@ -20,16 +20,14 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.util.List;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public interface AlbumListInfo {
-
   /**
    * Gets the albums.
    * 
@@ -57,5 +55,4 @@ public interface AlbumListInfo {
    * @param artist the artist to set
    */
   public void setArtist(String artist);
-
 }
diff --git a/src/main/java/ext/services/lastfm/ArtistInfo.java b/src/main/java/ext/services/lastfm/ArtistInfo.java
index bfa53a5..2de1889 100644
--- a/src/main/java/ext/services/lastfm/ArtistInfo.java
+++ b/src/main/java/ext/services/lastfm/ArtistInfo.java
@@ -20,16 +20,14 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import javax.swing.ImageIcon;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public interface ArtistInfo {
-
   /**
    * Gets the image.
    * 
@@ -103,7 +101,7 @@ public interface ArtistInfo {
   /**
    * Sets the available property.
    * 
-   * @param available DOCUMENT_ME
+   * @param available 
    */
   public void setAvailable(boolean available);
 
@@ -113,5 +111,4 @@ public interface ArtistInfo {
    * @return true if the available property is set
    */
   public boolean isAvailable();
-
 }
diff --git a/src/main/java/ext/services/lastfm/AudioObject.java b/src/main/java/ext/services/lastfm/AudioObject.java
index fe0095a..0e3306f 100644
--- a/src/main/java/ext/services/lastfm/AudioObject.java
+++ b/src/main/java/ext/services/lastfm/AudioObject.java
@@ -20,14 +20,12 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 /**
  * Interface for all audio objects (e.g. AudioFile, Radio, PodcastFeedEntry)
  */
 public interface AudioObject {
-
   /**
    * Gets the album.
    * 
diff --git a/src/main/java/ext/services/lastfm/ContextListener.java b/src/main/java/ext/services/lastfm/ContextListener.java
index 9eb4374..441337a 100644
--- a/src/main/java/ext/services/lastfm/ContextListener.java
+++ b/src/main/java/ext/services/lastfm/ContextListener.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.awt.Image;
@@ -30,7 +29,6 @@ import java.util.List;
  * The listener interface for receiving context events.
  */
 public interface ContextListener {
-
   /**
    * Gets the albums.
    * 
diff --git a/src/main/java/ext/services/lastfm/FullSubmissionData.java b/src/main/java/ext/services/lastfm/FullSubmissionData.java
index 74ccd44..0839034 100644
--- a/src/main/java/ext/services/lastfm/FullSubmissionData.java
+++ b/src/main/java/ext/services/lastfm/FullSubmissionData.java
@@ -20,45 +20,30 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class FullSubmissionData {
-
-  /** DOCUMENT_ME. */
   private String artist;
-
-  /** DOCUMENT_ME. */
   private String title;
-
-  /** DOCUMENT_ME. */
   private String album;
-
-  /** DOCUMENT_ME. */
   private int duration;
-
-  /** DOCUMENT_ME. */
   private int trackNumber;
-
-  /** DOCUMENT_ME. */
   private String source;
-
-  /** DOCUMENT_ME. */
   private int startTime;
 
   /**
    * Instantiates a new full submission data.
    * 
-   * @param artist DOCUMENT_ME
-   * @param title DOCUMENT_ME
-   * @param album DOCUMENT_ME
-   * @param duration DOCUMENT_ME
-   * @param trackNumber DOCUMENT_ME
-   * @param source DOCUMENT_ME
-   * @param startTime DOCUMENT_ME
+   * @param artist 
+   * @param title 
+   * @param album 
+   * @param duration 
+   * @param trackNumber 
+   * @param source 
+   * @param startTime 
    */
   public FullSubmissionData(String artist, String title, String album, int duration,
       int trackNumber, String source, int startTime) {
@@ -196,5 +181,4 @@ public class FullSubmissionData {
   public void setStartTime(int startTime) {
     this.startTime = startTime;
   }
-
 }
diff --git a/src/main/java/ext/services/lastfm/LastFmAlbum.java b/src/main/java/ext/services/lastfm/LastFmAlbum.java
index 33d0409..249d556 100644
--- a/src/main/java/ext/services/lastfm/LastFmAlbum.java
+++ b/src/main/java/ext/services/lastfm/LastFmAlbum.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.text.ParseException;
@@ -33,10 +32,10 @@ import java.util.Locale;
 
 import javax.swing.ImageIcon;
 
-import net.roarsoftware.lastfm.Album;
-import net.roarsoftware.lastfm.ImageSize;
-import net.roarsoftware.lastfm.Playlist;
-import net.roarsoftware.lastfm.Track;
+import de.umass.lastfm.Album;
+import de.umass.lastfm.ImageSize;
+import de.umass.lastfm.Playlist;
+import de.umass.lastfm.Track;
 
 import org.jajuk.util.UtilString;
 
@@ -44,7 +43,6 @@ import org.jajuk.util.UtilString;
  * The Class LastFmAlbum.
  */
 public class LastFmAlbum implements AlbumInfo {
-
   /** The Constant DF. */
   private static final ThreadLocal<SimpleDateFormat> DF = new ThreadLocal<SimpleDateFormat>() {
     @Override
@@ -52,31 +50,22 @@ public class LastFmAlbum implements AlbumInfo {
       return new SimpleDateFormat("d MMM yyyy, HH:mm", Locale.US);
     }
   };
-
   /** The artist. */
   private String artist;
-
   /** The title. */
   private String title;
-
   /** The url. */
   private String url;
-
   /** The release date string. */
   private String releaseDateString;
-
   /** The big cover url. */
   private String bigCoverURL;
-
   /** The cover url. */
   private String coverURL;
-
   /** The small cover url. */
   private String smallCoverURL;
-
   /** The tracks. */
   private List<TrackInfo> tracks;
-
   // Used by renderers
   /** The cover. */
   private ImageIcon cover;
@@ -84,14 +73,13 @@ public class LastFmAlbum implements AlbumInfo {
   /**
    * Gets the album.
    * 
-   * @param a DOCUMENT_ME
-   * @param pl DOCUMENT_ME
+   * @param a 
+   * @param pl 
    * 
    * @return the album
    */
   public static AlbumInfo getAlbum(Album a, Playlist pl) {
     LastFmAlbum album = new LastFmAlbum();
-
     album.artist = a.getArtist();
     album.title = a.getName();
     album.url = a.getUrl();
@@ -99,31 +87,27 @@ public class LastFmAlbum implements AlbumInfo {
     album.bigCoverURL = a.getImageURL(ImageSize.LARGE);
     album.coverURL = a.getImageURL(ImageSize.ORIGINAL);
     album.smallCoverURL = a.getImageURL(ImageSize.SMALL);
-
     if (pl != null) {
       List<TrackInfo> ts = new ArrayList<TrackInfo>();
       for (Track t : pl.getTracks()) {
         ts.add(LastFmTrack.getTrack(t));
       }
-
       // Process track list: if all tracks have a common string between (), [],
       // {} as "(Live)" then it's removed from all of them
       // In this way track names are more accurate
       if (!ts.isEmpty()) {
         handleTracks(ts);
       }
-
       album.tracks = ts;
     }
-
     return album;
   }
 
   /**
    * Handle tracks.
-   * DOCUMENT_ME
    * 
-   * @param ts DOCUMENT_ME
+   * 
+   * @param ts 
    */
   private static void handleTracks(List<TrackInfo> ts) {
     String firstTrackTitle = ts.get(0).getTitle();
@@ -132,7 +116,6 @@ public class LastFmAlbum implements AlbumInfo {
         .getTextBetweenChars(firstTrackTitle, '(', ')');
     tokensOfFirstTrackTitle.addAll(UtilString.getTextBetweenChars(firstTrackTitle, '[', ']'));
     tokensOfFirstTrackTitle.addAll(UtilString.getTextBetweenChars(firstTrackTitle, '{', '}'));
-
     // Check what tokens are present in all track titles
     List<String> commonTokens = new ArrayList<String>();
     for (String token : tokensOfFirstTrackTitle) {
@@ -142,12 +125,10 @@ public class LastFmAlbum implements AlbumInfo {
           common = false;
         }
       }
-
       if (common) {
         commonTokens.add(token);
       }
     }
-
     // Then remove common tokens from all titles
     for (TrackInfo ti : ts) {
       for (String token : commonTokens) {
@@ -180,7 +161,6 @@ public class LastFmAlbum implements AlbumInfo {
     if (!url.contains("/")) {
       return url;
     }
-
     return url.substring(0, url.lastIndexOf('/'));
   }
 
@@ -224,7 +204,6 @@ public class LastFmAlbum implements AlbumInfo {
     if (releaseDateString == null) {
       return null;
     }
-
     try {
       return DF.get().parse(releaseDateString);
     } catch (ParseException e) {
diff --git a/src/main/java/ext/services/lastfm/LastFmAlbumList.java b/src/main/java/ext/services/lastfm/LastFmAlbumList.java
index 0b245e0..a0a9568 100644
--- a/src/main/java/ext/services/lastfm/LastFmAlbumList.java
+++ b/src/main/java/ext/services/lastfm/LastFmAlbumList.java
@@ -20,43 +20,38 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import net.roarsoftware.lastfm.Album;
+import de.umass.lastfm.Album;
 
 /**
  * The Class LastFmAlbumList.
  */
 public class LastFmAlbumList implements AlbumListInfo {
-
   /** The artist. */
   private String artist;
-
   /** The albums. */
   private List<AlbumInfo> albums;
 
   /**
    * Gets the album list.
    * 
-   * @param as DOCUMENT_ME
-   * @param artist DOCUMENT_ME
+   * @param as 
+   * @param artist 
    * 
    * @return the album list
    */
   public static AlbumListInfo getAlbumList(Collection<Album> as, String artist) {
     List<AlbumInfo> albums = new ArrayList<AlbumInfo>();
     AlbumListInfo albumList = new LastFmAlbumList();
-
     for (Album a : as) {
       AlbumInfo album = LastFmAlbum.getAlbum(a, null);
       albums.add(album);
     }
-
     albumList.setAlbums(albums);
     return albumList;
   }
@@ -100,5 +95,4 @@ public class LastFmAlbumList implements AlbumListInfo {
   public void setArtist(String artist) {
     this.artist = artist;
   }
-
 }
diff --git a/src/main/java/ext/services/lastfm/LastFmAlbumsRunnable.java b/src/main/java/ext/services/lastfm/LastFmAlbumsRunnable.java
index 5ae812e..1a98834 100644
--- a/src/main/java/ext/services/lastfm/LastFmAlbumsRunnable.java
+++ b/src/main/java/ext/services/lastfm/LastFmAlbumsRunnable.java
@@ -20,44 +20,33 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.awt.Image;
-import java.io.File;
 import java.util.List;
 import java.util.Locale;
 import java.util.StringTokenizer;
 
-import javax.swing.ImageIcon;
 import javax.swing.SwingUtilities;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.base.Track;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
 import org.jajuk.util.log.Log;
 
 /**
  * The Class LastFmAlbumsRunnable.
  */
 public class LastFmAlbumsRunnable implements Runnable {
-
   /** The listener. */
   ContextListener listener;
-
   /** The service. */
   private LastFmService service;
-
   /** The audio object. */
   AudioObject audioObject;
-
   /** The interrupted. */
   private volatile boolean interrupted;
-
   /** The retrieve artist info. */
   private boolean retrieveArtistInfo = true;
-
   /** The id. */
   long id;
 
@@ -93,12 +82,10 @@ public class LastFmAlbumsRunnable implements Runnable {
   public void run() {
     if (!interrupted) {
       listener.setLastAlbumRetrieved(null, id);
-
       if (retrieveArtistInfo) {
         listener.setLastArtistRetrieved(null, id);
       }
     }
-
     // Get wiki start for artist
     final String wikiText = service.getWikiText(audioObject.getArtist());
     final String wikiURL = service.getWikiURL(audioObject.getArtist());
@@ -108,7 +95,6 @@ public class LastFmAlbumsRunnable implements Runnable {
         listener.notifyWikiInfoRetrieved(wikiText, wikiURL, id);
       }
     });
-
     Image image = null;
     AlbumInfo album = null;
     List<AlbumInfo> albums = null;
@@ -118,7 +104,6 @@ public class LastFmAlbumsRunnable implements Runnable {
           : audioObject.getAlbumArtist();
       album = service.getAlbum(artist, audioObject.getAlbum());
       final AlbumInfo albumHelp = album;
-
       listener.setAlbum(albumHelp, id);
       if (album != null) {
         image = service.getImage(album);
@@ -133,13 +118,11 @@ public class LastFmAlbumsRunnable implements Runnable {
         }
       });
     }
-
     try {
       Thread.sleep(1000); // Wait a second to prevent IP banning
     } catch (InterruptedException e) {
       Log.debug("albums runnable interrupted");
     }
-
     // If we have to retrieve artist info do it. If not, get previous retrieved
     // albums list
     if (retrieveArtistInfo) {
@@ -148,7 +131,7 @@ public class LastFmAlbumsRunnable implements Runnable {
         if (StringUtils.isNotBlank(sArtist)
             && !sArtist.equalsIgnoreCase(Messages.getString("unknown_artist"))) {
           AlbumListInfo albumList = service.getAlbumList(sArtist, true, 0);
-          if (albumList != null) {
+          if (albumList != null) { //NOSONAR
             albums = albumList.getAlbums();
           }
         }
@@ -160,7 +143,6 @@ public class LastFmAlbumsRunnable implements Runnable {
     } else {
       albums = listener.getAlbums();
     }
-
     if (album == null && albums != null && !interrupted) {
       // Try to find an album which fits
       AlbumInfo auxAlbum = null;
@@ -183,8 +165,8 @@ public class LastFmAlbumsRunnable implements Runnable {
               continue;
             }
           }
-          if (!audioObject.getAlbum().toLowerCase(Locale.getDefault()).contains(
-              t.toLowerCase(Locale.getDefault()))) {
+          if (!audioObject.getAlbum().toLowerCase(Locale.getDefault())
+              .contains(t.toLowerCase(Locale.getDefault()))) {
             matches = false;
           }
           tokensAnalyzed++;
@@ -211,7 +193,6 @@ public class LastFmAlbumsRunnable implements Runnable {
         });
       }
     }
-
   }
 
   /**
@@ -245,34 +226,4 @@ public class LastFmAlbumsRunnable implements Runnable {
   private boolean forbiddenToken(String t) {
     return t.contains("/");
   }
-
-  /**
-   * Returns an image associated to an audio file, with following order: - If a
-   * image saved by aTunes exists, then return it. - If not, find an internal
-   * image - If not, find an external image - If not, return null
-   *
-   * @param track DOCUMENT_ME
-   * @param width Width in pixels or -1 to keep original width
-   * @param height Height in pixels or -1 to keep original height
-   * @return the image for audio file
-   */
-  public static ImageIcon getImageForAudioFile(Track track, int width, int height) {
-    ImageIcon result = null;
-
-    File fileCover = track.getAlbum().findCover();
-    if (fileCover != null) {
-      if (fileCover.exists()) {
-        ImageIcon image = new ImageIcon(fileCover.getAbsolutePath());
-        if (width == -1 || height == -1) {
-          return image;
-        }
-        int maxSize = (image.getIconWidth() > image.getIconHeight()) ? image.getIconWidth() : image
-            .getIconHeight();
-        int newWidth = (int) ((float) image.getIconWidth() / (float) maxSize * width);
-        int newHeight = (int) ((float) image.getIconHeight() / (float) maxSize * height);
-        return UtilGUI.getResizedImage(image, newWidth, newHeight);
-      }
-    }
-    return result;
-  }
 }
diff --git a/src/main/java/ext/services/lastfm/LastFmArtist.java b/src/main/java/ext/services/lastfm/LastFmArtist.java
index 79d0d17..5c9ba73 100644
--- a/src/main/java/ext/services/lastfm/LastFmArtist.java
+++ b/src/main/java/ext/services/lastfm/LastFmArtist.java
@@ -20,42 +20,35 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import javax.swing.ImageIcon;
 
-import net.roarsoftware.lastfm.Artist;
-import net.roarsoftware.lastfm.ImageSize;
+import de.umass.lastfm.Artist;
+import de.umass.lastfm.ImageSize;
 
 /**
  * The Class LastFmArtist.
  */
 public class LastFmArtist implements ArtistInfo {
-
   /** The name. */
   private String name;
-
   /** The match. */
   private String match;
-
   /** The url. */
   private String url;
-
   /** The image url. */
   private String imageUrl;
-
   // Used by renderers
   /** The image. */
   private ImageIcon image;
-
   /** <Code>true</code> if this artist is available at repository. */
   private transient boolean available;
 
   /**
    * Gets the artist.
    * 
-   * @param a DOCUMENT_ME
+   * @param a 
    * 
    * @return the artist
    */
diff --git a/src/main/java/ext/services/lastfm/LastFmCache.java b/src/main/java/ext/services/lastfm/LastFmCache.java
index 4fdbb29..376afc1 100644
--- a/src/main/java/ext/services/lastfm/LastFmCache.java
+++ b/src/main/java/ext/services/lastfm/LastFmCache.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import ext.services.xml.XMLUtils;
@@ -35,7 +34,7 @@ import java.util.List;
 
 import javax.swing.ImageIcon;
 
-import net.roarsoftware.lastfm.scrobble.SubmissionData;
+import de.umass.lastfm.scrobble.SubmissionData;
 
 import org.apache.commons.io.FileUtils;
 import org.jajuk.services.core.SessionService;
@@ -49,40 +48,29 @@ import org.jajuk.util.log.Log;
  * The Class LastFmCache.
  */
 public class LastFmCache {
-
   /** Album Cover Cache dir. */
   private static File albumCoverCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ALBUM_COVER_CACHE_DIR);
-
   /** Album Cover Cache dir. */
   private static File albumInfoCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ALBUM_INFO_CACHE_DIR);
-
-  /** DOCUMENT_ME. */
   private static File artistInfoCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ARTIST_INFO_CACHE_DIR);
-
   /** Artist thumbs cache dir. */
   private static File artistThumbCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ARTIST_THUMB_CACHE_DIR);
-
   /** Artist image cache dir. */
   private static File artistImageCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ARTIST_IMAGE_CACHE_DIR);
-
   /** Artist image cache dir. */
   private static File artistSimilarCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE
       + '/' + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ARTIST_SIMILAR_CACHE_DIR);
-
   /** Album list cache dir. */
   private static File albumListCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ALBUM_LIST_CACHE_DIR);
-
   /** Artist info cache dir. */
   private static File artistWikiCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_ARTIST_WIKI_CACHE_DIR);
-
-  /** DOCUMENT_ME. */
   private static File submissionCacheDir = SessionService.getConfFileByPath(Const.FILE_CACHE + '/'
       + Const.LASTFM_CACHE + '/' + Const.LAST_FM_SUBMISSION_CACHE_DIR);
 
@@ -147,7 +135,6 @@ public class LastFmCache {
       Log.info("Could not delete all files from submission data cache");
       exception = true;
     }
-
     return exception;
   }
 
@@ -285,7 +272,6 @@ public class LastFmCache {
    * 
    * @return the file name for album cover
    */
-
   private String getFileNameForAlbumCover(AlbumInfo album) {
     return UtilString.concat(MD5Processor.hash(album.getBigCoverURL()), ".png");
   }
@@ -301,11 +287,9 @@ public class LastFmCache {
    */
   private String getFileNameForAlbumCoverAtCache(AlbumInfo album) throws IOException {
     File albumCoverCacheDirFile = getAlbumCoverCacheDir();
-
     if (albumCoverCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(albumCoverCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForAlbumCover(album));
   }
@@ -317,7 +301,6 @@ public class LastFmCache {
    * @param album the album
    * @return the file name for album info
    */
-
   private String getFileNameForAlbumInfo(String artist, String album) {
     return UtilString.concat(MD5Processor.hash(artist), MD5Processor.hash(album), ".xml");
   }
@@ -332,11 +315,9 @@ public class LastFmCache {
    */
   private String getFileNameForAlbumInfoAtCache(String artist, String album) throws IOException {
     File albumInfoCacheDirFile = getAlbumInfoCacheDir();
-
     if (albumInfoCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(albumInfoCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForAlbumInfo(artist, album));
   }
@@ -352,11 +333,9 @@ public class LastFmCache {
    */
   private String getFileNameForArtistInfoAtCache(String artist) throws IOException {
     File artistInfoCacheDirFile = getArtistInfoCacheDir();
-
     if (artistInfoCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(artistInfoCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForArtistInfo(artist));
   }
@@ -368,7 +347,6 @@ public class LastFmCache {
    * 
    * @return the file name for artist image
    */
-
   private String getFileNameForArtistImage(SimilarArtistsInfo artist) {
     return UtilString.concat(MD5Processor.hash(artist.getArtistName()), ".png");
   }
@@ -384,11 +362,9 @@ public class LastFmCache {
    */
   private String getFileNameForArtistImageAtCache(SimilarArtistsInfo artist) throws IOException {
     File artistImageCacheDirFile = getArtistImageCacheDir();
-
     if (artistImageCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(artistImageCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForArtistImage(artist));
   }
@@ -400,7 +376,6 @@ public class LastFmCache {
    * 
    * @return the file name for artist info
    */
-
   private String getFileNameForArtistInfo(String artist) {
     return UtilString.concat(MD5Processor.hash(artist), ".xml");
   }
@@ -416,11 +391,9 @@ public class LastFmCache {
    */
   private String getFileNameForAlbumListAtCache(String artist) throws IOException {
     File albumListCacheDirFile = getAlbumListCacheDir();
-
     if (albumListCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(albumListCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForArtistInfo(artist));
   }
@@ -432,7 +405,6 @@ public class LastFmCache {
    * 
    * @return the file name for artist similar
    */
-
   private String getFileNameForArtistSimilar(String artist) {
     return UtilString.concat(MD5Processor.hash(artist), ".xml");
   }
@@ -448,11 +420,9 @@ public class LastFmCache {
    */
   private String getFileNameForArtistSimilarAtCache(String artist) throws IOException {
     File artistSimilarCacheDirFile = getArtistSimilarCacheDir();
-
     if (artistSimilarCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(artistSimilarCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForArtistSimilar(artist));
   }
@@ -464,7 +434,6 @@ public class LastFmCache {
    * 
    * @return the file name for artist thumb
    */
-
   private String getFileNameForArtistThumb(ArtistInfo artist) {
     return UtilString.concat(MD5Processor.hash(artist.getName()), ".png");
   }
@@ -480,11 +449,9 @@ public class LastFmCache {
    */
   private String getFileNameForArtistThumbAtCache(ArtistInfo artist) throws IOException {
     File artistThumbCacheDirFile = getArtistThumbsCacheDir();
-
     if (artistThumbCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(artistThumbCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForArtistThumb(artist));
   }
@@ -496,7 +463,6 @@ public class LastFmCache {
    * 
    * @return the file name for artist wiki
    */
-
   private String getFileNameForArtistWiki(String artist) {
     return UtilString.concat(MD5Processor.hash(artist), ".xml");
   }
@@ -512,11 +478,9 @@ public class LastFmCache {
    */
   private String getFileNameForArtistWikiAtCache(String artist) throws IOException {
     File artistWikiCacheDirFile = getArtistWikiCacheDir();
-
     if (artistWikiCacheDirFile == null) {
       return null;
     }
-
     return UtilString.concat(artistWikiCacheDirFile.getAbsolutePath(), File.separator,
         getFileNameForArtistWiki(artist));
   }
@@ -530,11 +494,9 @@ public class LastFmCache {
    */
   private String getFileNameForSubmissionCache() throws IOException {
     File submissionDataDirFile = getSubmissionDataDir();
-
     if (submissionDataDirFile == null) {
       return null;
     }
-
     return UtilString.concat(submissionDataDirFile.getAbsolutePath(), File.separator,
         "submissionDataCache.xml");
   }
@@ -701,7 +663,6 @@ public class LastFmCache {
     if (cover == null || album == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForAlbumCoverAtCache(album);
       if (fileAbsPath != null) {
@@ -724,7 +685,6 @@ public class LastFmCache {
     if (artist == null || album == null || albumObject == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForAlbumInfoAtCache(artist, album);
       if (fileAbsPath != null) {
@@ -740,13 +700,12 @@ public class LastFmCache {
    * Stores an artist info at cache.
    * 
    * @param artist the artist
-   * @param artistObject DOCUMENT_ME
+   * @param artistObject 
    */
   public synchronized void storeArtistInfo(String artist, ArtistInfo artistObject) {
     if (artist == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForArtistInfoAtCache(artist);
       if (fileAbsPath != null) {
@@ -768,7 +727,6 @@ public class LastFmCache {
     if (image == null || artist == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForArtistImageAtCache(artist);
       if (fileAbsPath != null) {
@@ -790,7 +748,6 @@ public class LastFmCache {
     if (artist == null || list == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForAlbumListAtCache(artist);
       if (fileAbsPath != null) {
@@ -812,7 +769,6 @@ public class LastFmCache {
     if (artist == null || similar == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForArtistSimilarAtCache(artist);
       if (fileAbsPath != null) {
@@ -834,7 +790,6 @@ public class LastFmCache {
     if (image == null || artist == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForArtistThumbAtCache(artist);
       if (fileAbsPath != null) {
@@ -856,7 +811,6 @@ public class LastFmCache {
     if (artist == null || wikiText == null) {
       return;
     }
-
     try {
       String fileAbsPath = getFileNameForArtistWikiAtCache(artist);
       if (fileAbsPath != null) {
@@ -870,9 +824,9 @@ public class LastFmCache {
 
   /**
    * Adds the submission data.
-   * DOCUMENT_ME
    * 
-   * @param submissionData DOCUMENT_ME
+   * 
+   * @param submissionData 
    */
   public synchronized void addSubmissionData(FullSubmissionData submissionData) {
     List<FullSubmissionData> submissionDataList = getSubmissionData();
@@ -892,7 +846,6 @@ public class LastFmCache {
     } catch (IOException e) {
       Log.error(e);
     }
-
   }
 
   /**
@@ -915,7 +868,7 @@ public class LastFmCache {
 
   /**
    * Removes the submission data.
-   * DOCUMENT_ME
+   * 
    */
   public synchronized void removeSubmissionData() {
     try {
diff --git a/src/main/java/ext/services/lastfm/LastFmCoversRunnable.java b/src/main/java/ext/services/lastfm/LastFmCoversRunnable.java
index 569533b..6d3d1e6 100644
--- a/src/main/java/ext/services/lastfm/LastFmCoversRunnable.java
+++ b/src/main/java/ext/services/lastfm/LastFmCoversRunnable.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.awt.Image;
@@ -32,22 +31,16 @@ import javax.swing.SwingUtilities;
  * The Class LastFmCoversRunnable.
  */
 public class LastFmCoversRunnable implements Runnable {
-
   /** The listener. */
   ContextListener listener;
-
   /** The service. */
   private LastFmService service;
-
   /** The albums. */
   private List<? extends AlbumInfo> albums;
-
   /** The interrupted. */
   private volatile boolean interrupted;
-
   /** The id. */
   long id;
-
   /** The audio file. */
   AudioObject audioObject;
 
@@ -58,7 +51,7 @@ public class LastFmCoversRunnable implements Runnable {
    * @param service the service
    * @param albums the albums
    * @param id the id
-   * @param audioObject DOCUMENT_ME
+   * @param audioObject 
    */
   public LastFmCoversRunnable(ContextListener listener, LastFmService service,
       List<? extends AlbumInfo> albums, long id, AudioObject audioObject) {
@@ -98,7 +91,6 @@ public class LastFmCoversRunnable implements Runnable {
         } else {
           img = null;
         }
-
         if (!interrupted) {
           SwingUtilities.invokeLater(new Runnable() {
             @Override
diff --git a/src/main/java/ext/services/lastfm/LastFmRunnable.java b/src/main/java/ext/services/lastfm/LastFmRunnable.java
index dc596fa..8d28b15 100644
--- a/src/main/java/ext/services/lastfm/LastFmRunnable.java
+++ b/src/main/java/ext/services/lastfm/LastFmRunnable.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.util.concurrent.ExecutionException;
@@ -33,34 +32,24 @@ import org.jajuk.util.log.Log;
  * The Class LastFmRunnable.
  */
 public class LastFmRunnable implements Runnable {
-
   /** The interrupted. */
   private volatile boolean interrupted;
-
   /** The albums runnable. */
   private LastFmAlbumsRunnable albumsRunnable;
-
   /** The covers runnable. */
   private LastFmCoversRunnable coversRunnable;
-
   /** The artists runnable. */
   private LastFmSimilarArtistsRunnable artistsRunnable;
-
   /** The listener. */
   private ContextListener listener;
-
   /** The service. */
   private LastFmService service;
-
   /** The audio object. */
   private AudioObject audioObject;
-
   /** The retrieve artist info. */
   private boolean retrieveArtistInfo = true;
-
   /** The id. */
   private long id;
-
   /** The executor service. */
   private ExecutorService executorService;
 
@@ -71,7 +60,7 @@ public class LastFmRunnable implements Runnable {
    * @param service the service
    * @param audioObject the audio object
    * @param id the id
-   * @param executorService DOCUMENT_ME
+   * @param executorService 
    */
   public LastFmRunnable(ContextListener listener, LastFmService service, AudioObject audioObject,
       long id, ExecutorService executorService) {
@@ -116,13 +105,11 @@ public class LastFmRunnable implements Runnable {
     } catch (InterruptedException e) {
       Log.debug("albums runnable interrupted");
     }
-
     if (retrieveArtistInfo && !interrupted) {
       coversRunnable = new LastFmCoversRunnable(listener, service, listener.getAlbums(), id,
           audioObject);
       executorService.submit(coversRunnable);
       Log.debug("LastFmCoversRunnable started with id " + id);
-
       artistsRunnable = new LastFmSimilarArtistsRunnable(listener, service,
           audioObject.getArtist(), id);
       executorService.submit(artistsRunnable);
diff --git a/src/main/java/ext/services/lastfm/LastFmService.java b/src/main/java/ext/services/lastfm/LastFmService.java
index dcbf965..9c5955d 100644
--- a/src/main/java/ext/services/lastfm/LastFmService.java
+++ b/src/main/java/ext/services/lastfm/LastFmService.java
@@ -20,9 +20,9 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
+import de.umass.lastfm.*;
 import ext.services.network.Proxy;
 
 import java.awt.Image;
@@ -33,16 +33,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 
-import net.roarsoftware.lastfm.Album;
-import net.roarsoftware.lastfm.Artist;
-import net.roarsoftware.lastfm.Caller;
-import net.roarsoftware.lastfm.ImageSize;
-import net.roarsoftware.lastfm.PaginatedResult;
-import net.roarsoftware.lastfm.Playlist;
-import net.roarsoftware.lastfm.scrobble.ResponseStatus;
-import net.roarsoftware.lastfm.scrobble.Scrobbler;
-import net.roarsoftware.lastfm.scrobble.Source;
-import net.roarsoftware.lastfm.scrobble.SubmissionData;
+import de.umass.lastfm.scrobble.ResponseStatus;
+import de.umass.lastfm.scrobble.Scrobbler;
+import de.umass.lastfm.scrobble.Source;
+import de.umass.lastfm.scrobble.SubmissionData;
 
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
@@ -57,70 +51,51 @@ import org.jajuk.util.log.Log;
 
 /**
  * The Class LastFmService.
- * 
+ *
  * This class is responsible of retrieve information from Last.fm web services.
  * <singleton>
  */
 public class LastFmService {
-
   /*
    * DO NOT USE THESE KEYS FOR OTHER APPLICATIONS THAN Jajuk!
    */
-  /** The Constant API_KEY.  DOCUMENT_ME */
+  /** The Constant API_KEY.   */
   private static final String API_KEY = "711591ss6q695ps349o6681pr1oq1467";
-
-  /** The Constant CLIENT_ID.  DOCUMENT_ME */
+  /** The Constant CLIENT_ID.   */
   private static final String CLIENT_ID = "jaj";
-
-  /** The Constant CLIENT_VERSION.  DOCUMENT_ME */
+  /** The Constant CLIENT_VERSION.   */
   private static final String CLIENT_VERSION = "0.2"; // Assigned by Last.FM
   // team
-
-  /** The Constant ARTIST_WILDCARD.  DOCUMENT_ME */
+  /** The Constant ARTIST_WILDCARD.   */
   private static final String ARTIST_WILDCARD = "(%ARTIST%)";
-
-  /** The Constant LANGUAGE_PARAM.  DOCUMENT_ME */
+  /** The Constant LANGUAGE_PARAM.   */
   private static final String LANGUAGE_PARAM = "?setlang=";
-
-  /** The Constant LANGUAGE_WILDCARD.  DOCUMENT_ME */
+  /** The Constant LANGUAGE_WILDCARD.   */
   private static final String LANGUAGE_WILDCARD = "(%LANGUAGE%)";
-
-  /** The Constant ARTIST_WIKI_URL.  DOCUMENT_ME */
+  /** The Constant ARTIST_WIKI_URL.   */
   private static final String ARTIST_WIKI_URL = UtilString.concat("http://www.lastfm.com/music/",
       ARTIST_WILDCARD, "/+wiki", LANGUAGE_PARAM, LANGUAGE_WILDCARD);
-
-  /** The Constant VARIOUS_ARTISTS.  DOCUMENT_ME */
+  /** The Constant VARIOUS_ARTISTS.   */
   private static final String VARIOUS_ARTISTS = "Various Artists";
-
-  /** The Constant MIN_DURATION_TO_SUBMIT.  DOCUMENT_ME */
+  /** The Constant MIN_DURATION_TO_SUBMIT.   */
   private static final int MIN_DURATION_TO_SUBMIT = 30;
-
-  /** The Constant MAX_SUBMISSIONS.  DOCUMENT_ME */
+  /** The Constant MAX_SUBMISSIONS.   */
   private static final int MAX_SUBMISSIONS = 50;
-
-  /** DOCUMENT_ME. */
   private Scrobbler scrobbler;
-
-  /** DOCUMENT_ME. */
   private boolean handshakePerformed;
-
-  /** DOCUMENT_ME. */
   private Locale locale;
-
-  /** DOCUMENT_ME. */
   private LastFmCache lastFmCache;
-
   /** The singleton. */
   private static LastFmService self;
 
   /**
    * Instantiates a new Last.fm service
-   * 
+   *
    * @param proxy the proxy
    * @param user the Last.fm username
    * @param password the Last.fm password
-   * @param locale DOCUMENT_ME
-   * @param lastFmCache DOCUMENT_ME
+   * @param locale
+   * @param lastFmCache
    */
   private LastFmService(Locale locale, LastFmCache lastFmCache) {
     Proxy proxy = DownloadManager.getProxy();
@@ -138,7 +113,7 @@ public class LastFmService {
 
   /**
    * Return the LastFMService singleton.
-   * 
+   *
    * @return the LastFMService singleton
    */
   static public LastFmService getInstance() {
@@ -152,9 +127,9 @@ public class LastFmService {
 
   /**
    * Gets the artist.
-   * 
-   * @param artist DOCUMENT_ME
-   * 
+   *
+   * @param artist
+   *
    * @return the artist
    */
   public ArtistInfo getArtist(String artist) {
@@ -177,10 +152,10 @@ public class LastFmService {
 
   /**
    * Gets the album.
-   * 
+   *
    * @param artist the artist
    * @param album the album
-   * 
+   *
    * @return the album
    */
   public AlbumInfo getAlbum(String artist, String album) {
@@ -204,12 +179,12 @@ public class LastFmService {
 
   /**
    * Gets the album list.
-   * 
+   *
    * @param artist the artist
    * @param hideVariousArtists if <code>true</code> albums with artist name "Various Artists"
    * are nor returned
    * @param minimumSongNumber albums with less songs than this argument won't be returned
-   * 
+   *
    * @return the album list
    */
   public AlbumListInfo getAlbumList(String artist, boolean hideVariousArtists, int minimumSongNumber) {
@@ -220,47 +195,41 @@ public class LastFmService {
         Collection<Album> as = Artist.getTopAlbums(artist, UtilString.rot13(API_KEY));
         if (as != null) {
           AlbumListInfo albums = LastFmAlbumList.getAlbumList(as, artist);
-
           List<AlbumInfo> result = new ArrayList<AlbumInfo>();
           for (AlbumInfo a : albums.getAlbums()) {
-            if (a.getBigCoverURL() != null && !a.getBigCoverURL().isEmpty()) {
+            if (a.getBigCoverURL() != null && !a.getBigCoverURL().isEmpty()) { //NOSONAR
               result.add(a);
             }
           }
-
           albumList = new LastFmAlbumList();
           albumList.setArtist(artist);
           albumList.setAlbums(result);
           lastFmCache.storeAlbumList(artist, albumList);
         }
       }
-
       if (albumList != null) {
         List<AlbumInfo> albumsFiltered = null;
-
         // Apply filter to hide "Various Artists" albums
         if (hideVariousArtists) {
           albumsFiltered = new ArrayList<AlbumInfo>();
           for (AlbumInfo albumInfo : albumList.getAlbums()) {
-            if (!albumInfo.getArtist().equals(VARIOUS_ARTISTS)) {
+            if (!albumInfo.getArtist().equals(VARIOUS_ARTISTS)) { //NOSONAR
               albumsFiltered.add(albumInfo);
             }
           }
           albumList.setAlbums(albumsFiltered);
         }
-
         // Apply filter to hide albums with less than X songs
         if (minimumSongNumber > 0) {
           albumsFiltered = new ArrayList<AlbumInfo>();
           for (AlbumInfo albumInfo : albumList.getAlbums()) {
             AlbumInfo extendedAlbumInfo = getAlbum(artist, albumInfo.getTitle());
-            if (extendedAlbumInfo != null && extendedAlbumInfo.getTracks() != null
+            if (extendedAlbumInfo != null && extendedAlbumInfo.getTracks() != null //NOSONAR
                 && extendedAlbumInfo.getTracks().size() >= minimumSongNumber) {
               albumsFiltered.add(albumInfo);
             }
           }
         }
-
         if (albumsFiltered != null) {
           albumList.setAlbums(albumsFiltered);
         }
@@ -272,29 +241,11 @@ public class LastFmService {
     return null;
   }
 
-  /**
-   * Gets the artist top tag.
-   * 
-   * @param artist the artist
-   * 
-   * @return the artist top tag
-   */
-  public String getArtistTopTag(String artist) {
-    try {
-      Collection<String> topTags = Artist.getTopTags(artist, UtilString.rot13(API_KEY));
-      List<String> tags = new ArrayList<String>(topTags);
-      return tags.isEmpty() ? "" : tags.get(0);
-    } catch (Exception e) {
-      Log.error(e);
-    }
-    return null;
-  }
-
-  /**
+   /**
    * Gets the image.
-   * 
+   *
    * @param album the album
-   * 
+   *
    * @return the image
    */
   public Image getImage(AlbumInfo album) {
@@ -308,7 +259,6 @@ public class LastFmService {
             .getConnection(album.getBigCoverURL(), proxy));
         lastFmCache.storeAlbumCover(album, img);
       }
-
       return img;
     } catch (IOException e) {
       Log.error(e);
@@ -318,9 +268,9 @@ public class LastFmService {
 
   /**
    * Gets the image of an artist.
-   * 
+   *
    * @param artist the artist
-   * 
+   *
    * @return the image
    */
   public Image getImage(ArtistInfo artist) {
@@ -331,13 +281,11 @@ public class LastFmService {
       if (img == null && artist.getImageUrl() != null && !artist.getImageUrl().isEmpty()) {
         // Try to get from Artist.getImages() method
         img = getArtistImageFromLastFM(artist.getName());
-
         // if not then get from artist info
         if (img == null) {
           img = ext.services.network.NetworkUtils.getImage(ext.services.network.NetworkUtils
               .getConnection(artist.getImageUrl(), proxy));
         }
-
         lastFmCache.storeArtistThumbImage(artist, img);
       }
       return img;
@@ -349,9 +297,9 @@ public class LastFmService {
 
   /**
    * Gets the image of the artist.
-   * 
+   *
    * @param similar the similar
-   * 
+   *
    * @return the image
    */
   public Image getImage(SimilarArtistsInfo similar) {
@@ -359,14 +307,11 @@ public class LastFmService {
       // Try to retrieve from cache
       Image img = lastFmCache.retrieveArtistImage(similar);
       Proxy proxy = DownloadManager.getProxy();
-
       if (img != null) {
         return img;
       }
-
       // Try to get from LastFM
       img = getArtistImageFromLastFM(similar.getArtistName());
-
       // Get from similar artist info
       if (img == null) {
         String similarUrl = similar.getPicture();
@@ -375,11 +320,9 @@ public class LastFmService {
               .getConnection(similarUrl, proxy));
         }
       }
-
       if (img != null) {
         lastFmCache.storeArtistImage(similar, img);
       }
-
       return img;
     } catch (Exception e) {
       Log.error(e);
@@ -389,18 +332,18 @@ public class LastFmService {
 
   /**
    * Returns current artist image at LastFM.
-   * 
-   * @param artistName DOCUMENT_ME
-   * 
+   *
+   * @param artistName
+   *
    * @return the artist image from last fm
    */
   private Image getArtistImageFromLastFM(String artistName) {
     try {
       Proxy proxy = DownloadManager.getProxy();
       // Try to get from Artist.getImages() method
-      PaginatedResult<net.roarsoftware.lastfm.Image> images = Artist.getImages(artistName, 1, 1,
+      PaginatedResult<de.umass.lastfm.Image> images = Artist.getImages(artistName, 1, 1,
           UtilString.rot13(API_KEY));
-      List<net.roarsoftware.lastfm.Image> imageList = new ArrayList<net.roarsoftware.lastfm.Image>(
+      List<de.umass.lastfm.Image> imageList = new ArrayList<de.umass.lastfm.Image>(
           images.getPageResults());
       if (!imageList.isEmpty()) {
         Set<ImageSize> sizes = imageList.get(0).availableSizes();
@@ -418,9 +361,9 @@ public class LastFmService {
 
   /**
    * Gets the similar artists.
-   * 
+   *
    * @param artist the artist
-   * 
+   *
    * @return the similar artists
    */
   public SimilarArtistsInfo getSimilarArtists(String artist) {
@@ -444,9 +387,9 @@ public class LastFmService {
 
   /**
    * Gets the wiki text.
-   * 
+   *
    * @param artist the artist
-   * 
+   *
    * @return the wiki text
    */
   public String getWikiText(String artist) {
@@ -454,14 +397,13 @@ public class LastFmService {
       // Try to get from cache
       String wikiText = lastFmCache.retrieveArtistWiki(artist);
       if (wikiText == null) {
-
-        Artist a = Artist.getInfo(artist, locale, UtilString.rot13(API_KEY));
+        String userName = null;
+        Artist a = Artist.getInfo(artist, locale, userName, UtilString.rot13(API_KEY));
         wikiText = a != null ? a.getWikiSummary() : "";
         if (wikiText != null) {
           wikiText = wikiText.replaceAll("<.*?>", "");
           wikiText = StringEscapeUtils.unescapeHtml(wikiText);
         }
-
         lastFmCache.storeArtistWiki(artist, wikiText);
       }
       return wikiText;
@@ -473,9 +415,9 @@ public class LastFmService {
 
   /**
    * Gets the wiki url.
-   * 
+   *
    * @param artist the artist
-   * 
+   *
    * @return the wiki url
    */
   public String getWikiURL(String artist) {
@@ -487,7 +429,7 @@ public class LastFmService {
   /**
    * Submits song to Last.fm
    *
-   * @param track DOCUMENT_ME
+   * @param track
    * @param millisPlayed ms the audio file has already played
    * @throws ScrobblerException the scrobbler exception
    */
@@ -497,10 +439,8 @@ public class LastFmService {
         || !checkDuration(track)) {
       return;
     }
-
     // Get started to play in secs UTC and not in MS (lastfm-bindings API was unclear about it)
     long startedToPlay = (System.currentTimeMillis() - millisPlayed) / 1000;
-
     Log.info("Trying to submit song to Last.fm, play time=" + millisPlayed / 1000 + " secs");
     try {
       performHandshakeIfNeeded();
@@ -515,10 +455,8 @@ public class LastFmService {
         lastFmCache.addSubmissionData(new FullSubmissionData(track.getArtist().getName2(), track
             .getName(), track.getAlbum().getName2(), (int) track.getDuration(), (int) track
             .getOrder(), Source.USER.toString(), (int) startedToPlay));
-
         throw new ScrobblerException(status.getStatus());
       }
-
     } catch (IOException e) {
       Log.error(e);
       handshakePerformed = false;
@@ -531,7 +469,7 @@ public class LastFmService {
 
   /**
    * Submits cache data to Last.fm
-   * 
+   *
    * @throws ScrobblerException the scrobbler exception
    */
   public void submitCache() throws ScrobblerException {
@@ -539,7 +477,6 @@ public class LastFmService {
     if (!checkUser() || !checkPassword()) {
       return;
     }
-
     List<FullSubmissionData> collectionWithSubmissionData = lastFmCache.getSubmissionData();
     if (!collectionWithSubmissionData.isEmpty()) {
       // More than MAX_SUBMISSIONS submissions at once are not allowed
@@ -548,11 +485,9 @@ public class LastFmService {
         collectionWithSubmissionData = collectionWithSubmissionData.subList(size - MAX_SUBMISSIONS,
             size);
       }
-
       Log.info("Trying to submit cache to Last.fm");
       try {
         performHandshakeIfNeeded();
-
         List<SubmissionData> submissionDataList = new ArrayList<SubmissionData>();
         for (ext.services.lastfm.FullSubmissionData submissionData : collectionWithSubmissionData) {
           SubmissionData sd = new SubmissionData(submissionData.getArtist(),
@@ -561,7 +496,6 @@ public class LastFmService {
               submissionData.getStartTime());
           submissionDataList.add(sd);
         }
-
         ResponseStatus status = scrobbler.submit(submissionDataList);
         if (status.ok()) {
           lastFmCache.removeSubmissionData();
@@ -570,21 +504,19 @@ public class LastFmService {
           handshakePerformed = false;
           throw new ScrobblerException(status.getStatus());
         }
-
       } catch (IOException e) {
         Log.error(e);
         handshakePerformed = false;
         throw new ScrobblerException(e.getMessage());
       }
     }
-
   }
 
   /**
    * Submits now playing info to Last.fm
-   * 
-   * @param track DOCUMENT_ME
-   * 
+   *
+   * @param track
+   *
    * @throws ScrobblerException the scrobbler exception
    */
   public void submitNowPlayingInfo(Track track) throws ScrobblerException {
@@ -592,7 +524,6 @@ public class LastFmService {
     if (!checkUser() || !checkPassword() || !checkArtist(track) || !checkTitle(track)) {
       return;
     }
-
     Log.info("Trying to submit now playing info to Last.fm");
     try {
       performHandshakeIfNeeded();
@@ -613,7 +544,7 @@ public class LastFmService {
 
   /**
    * Performs handshake for submissions if needed.
-   * 
+   *
    * @throws IOException Signals that an I/O exception has occurred.
    * @throws ScrobblerException the scrobbler exception
    */
@@ -630,7 +561,7 @@ public class LastFmService {
 
   /**
    * Checks user.
-   * 
+   *
    * @return true, if check user
    */
   private boolean checkUser() {
@@ -644,7 +575,7 @@ public class LastFmService {
 
   /**
    * Check password.
-   * 
+   *
    * @return true, if check password
    */
   private boolean checkPassword() {
@@ -658,9 +589,9 @@ public class LastFmService {
 
   /**
    * Check artist.
-   * 
-   * @param track DOCUMENT_ME
-   * 
+   *
+   * @param track
+   *
    * @return true, if check artist
    */
   private boolean checkArtist(Track track) {
@@ -675,9 +606,9 @@ public class LastFmService {
 
   /**
    * Check title.
-   * 
-   * @param track DOCUMENT_ME
-   * 
+   *
+   * @param track
+   *
    * @return true, if check title
    */
   private boolean checkTitle(Track track) {
@@ -690,9 +621,9 @@ public class LastFmService {
 
   /**
    * Check duration.
-   * 
-   * @param track DOCUMENT_ME
-   * 
+   *
+   * @param track
+   *
    * @return true, if check duration
    */
   private boolean checkDuration(Track track) {
@@ -702,5 +633,4 @@ public class LastFmService {
     }
     return true;
   }
-  
 }
diff --git a/src/main/java/ext/services/lastfm/LastFmSimilarArtists.java b/src/main/java/ext/services/lastfm/LastFmSimilarArtists.java
index a21134e..d86b63b 100644
--- a/src/main/java/ext/services/lastfm/LastFmSimilarArtists.java
+++ b/src/main/java/ext/services/lastfm/LastFmSimilarArtists.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.util.ArrayList;
@@ -29,41 +28,35 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
-import net.roarsoftware.lastfm.Artist;
-import net.roarsoftware.lastfm.ImageSize;
+import de.umass.lastfm.Artist;
+import de.umass.lastfm.ImageSize;
 
 /**
  * The Class LastFmSimilarArtists.
  */
 public class LastFmSimilarArtists implements SimilarArtistsInfo {
-
   /** The Constant MAX_SIMILAR_ARTISTS. */
   private static final int MAX_SIMILAR_ARTISTS = 15;
-
   /** The artist name. */
   private String artistName;
-
   /** The picture. */
   private String picture;
-
   /** The artists. */
   private List<ArtistInfo> artists;
 
   /**
    * Gets the similar artists.
    * 
-   * @param as DOCUMENT_ME
-   * @param a DOCUMENT_ME
+   * @param as 
+   * @param a 
    * 
    * @return the similar artists
    */
   public static SimilarArtistsInfo getSimilarArtists(Collection<Artist> as, Artist a) {
     List<Artist> list = new ArrayList<Artist>(as);
     LastFmSimilarArtists similar = new LastFmSimilarArtists();
-
     similar.setArtistName(a.getName());
     similar.setPicture(a.getImageURL(ImageSize.LARGE));
-
     List<ArtistInfo> artists = new ArrayList<ArtistInfo>();
     for (int i = 0; i < list.size(); i++) {
       if (i == MAX_SIMILAR_ARTISTS) {
@@ -144,5 +137,4 @@ public class LastFmSimilarArtists implements SimilarArtistsInfo {
   public void setPicture(String picture) {
     this.picture = picture;
   }
-
 }
diff --git a/src/main/java/ext/services/lastfm/LastFmSimilarArtistsRunnable.java b/src/main/java/ext/services/lastfm/LastFmSimilarArtistsRunnable.java
index 5be7842..43afbe4 100644
--- a/src/main/java/ext/services/lastfm/LastFmSimilarArtistsRunnable.java
+++ b/src/main/java/ext/services/lastfm/LastFmSimilarArtistsRunnable.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.awt.Image;
@@ -34,19 +33,14 @@ import org.jajuk.util.Messages;
  * The Class LastFmSimilarArtistsRunnable.
  */
 public class LastFmSimilarArtistsRunnable implements Runnable {
-
   /** The listener. */
   ContextListener listener;
-
   /** The service. */
   private LastFmService service;
-
   /** The artist. */
   private String artist;
-
   /** The interrupted. */
   private volatile boolean interrupted;
-
   /** The id. */
   long id;
 
@@ -83,7 +77,6 @@ public class LastFmSimilarArtistsRunnable implements Runnable {
     if (!interrupted && StringUtils.isNotBlank(artist)
         && !artist.equalsIgnoreCase(Messages.getString("unknown_artist"))) {
       SimilarArtistsInfo artists = service.getSimilarArtists(artist);
-
       if (!interrupted && artists != null) {
         SwingUtilities.invokeLater(new Runnable() {
           @Override
@@ -100,7 +93,6 @@ public class LastFmSimilarArtistsRunnable implements Runnable {
             }
           });
         }
-
         for (int i = 0; i < artists.getArtists().size(); i++) {
           final Image img;
           final ArtistInfo a = artists.getArtists().get(i);
@@ -109,7 +101,6 @@ public class LastFmSimilarArtistsRunnable implements Runnable {
           } else {
             img = null;
           }
-
           if (!interrupted) {
             SwingUtilities.invokeLater(new Runnable() {
               @Override
@@ -122,5 +113,4 @@ public class LastFmSimilarArtistsRunnable implements Runnable {
       }
     }
   }
-
 }
diff --git a/src/main/java/ext/services/lastfm/LastFmTrack.java b/src/main/java/ext/services/lastfm/LastFmTrack.java
index de1466c..bf356d8 100644
--- a/src/main/java/ext/services/lastfm/LastFmTrack.java
+++ b/src/main/java/ext/services/lastfm/LastFmTrack.java
@@ -20,35 +20,30 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
-import net.roarsoftware.lastfm.Track;
+import de.umass.lastfm.Track;
 
 /**
  * The Class LastFmTrack.
  */
 public class LastFmTrack implements TrackInfo {
-
   /** The title. */
   private String title;
-
   /** The url. */
   private String url;
 
   /**
    * Gets the track.
    * 
-   * @param t DOCUMENT_ME
+   * @param t 
    * 
    * @return the track
    */
   protected static LastFmTrack getTrack(Track t) {
     LastFmTrack track = new LastFmTrack();
-
     track.title = t.getName();
     track.url = t.getUrl();
-
     return track;
   }
 
@@ -91,5 +86,4 @@ public class LastFmTrack implements TrackInfo {
   public void setUrl(String url) {
     this.url = url;
   }
-
 }
diff --git a/src/main/java/ext/services/lastfm/ScrobblerException.java b/src/main/java/ext/services/lastfm/ScrobblerException.java
index be0574c..e85e184 100644
--- a/src/main/java/ext/services/lastfm/ScrobblerException.java
+++ b/src/main/java/ext/services/lastfm/ScrobblerException.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import org.jajuk.util.UtilString;
@@ -29,11 +28,8 @@ import org.jajuk.util.UtilString;
  * The Class ScrobblerException.
  */
 public class ScrobblerException extends Exception {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -7383228060002549115L;
-
-  /** DOCUMENT_ME. */
   private int status = -1;
 
   /**
@@ -48,7 +44,7 @@ public class ScrobblerException extends Exception {
   /**
    * Instantiates a new scrobbler exception.
    * 
-   * @param status DOCUMENT_ME
+   * @param status 
    */
   public ScrobblerException(int status) {
     super(UtilString.concat("Error submitting to Last.fm. Status: ", Integer.valueOf(status)));
@@ -63,5 +59,4 @@ public class ScrobblerException extends Exception {
   public int getStatus() {
     return status;
   }
-
 }
diff --git a/src/main/java/ext/services/lastfm/SimilarArtistsInfo.java b/src/main/java/ext/services/lastfm/SimilarArtistsInfo.java
index bfb6745..b194ed2 100644
--- a/src/main/java/ext/services/lastfm/SimilarArtistsInfo.java
+++ b/src/main/java/ext/services/lastfm/SimilarArtistsInfo.java
@@ -20,16 +20,14 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 import java.util.List;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public interface SimilarArtistsInfo {
-
   /**
    * Gets the artist name.
    * 
@@ -71,5 +69,4 @@ public interface SimilarArtistsInfo {
    * @param picture the picture to set
    */
   public void setPicture(String picture);
-
 }
diff --git a/src/main/java/ext/services/lastfm/TrackInfo.java b/src/main/java/ext/services/lastfm/TrackInfo.java
index 9e20a6b..f4cd5c6 100644
--- a/src/main/java/ext/services/lastfm/TrackInfo.java
+++ b/src/main/java/ext/services/lastfm/TrackInfo.java
@@ -20,14 +20,12 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.lastfm;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public interface TrackInfo {
-
   /**
    * Gets the title.
    * 
@@ -55,5 +53,4 @@ public interface TrackInfo {
    * @param url the url to set
    */
   public void setUrl(String url);
-
 }
diff --git a/src/main/java/ext/services/lastfm/package.html b/src/main/java/ext/services/lastfm/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/ext/services/lastfm/package.html
+++ b/src/main/java/ext/services/lastfm/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/ext/services/network/NetworkUtils.java b/src/main/java/ext/services/network/NetworkUtils.java
index 13b3b0c..c77ed42 100644
--- a/src/main/java/ext/services/network/NetworkUtils.java
+++ b/src/main/java/ext/services/network/NetworkUtils.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.network;
 
 import java.awt.Image;
@@ -41,10 +40,9 @@ import org.jajuk.util.Const;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public final class NetworkUtils {
-
   /**
    * Instantiates a new network utils.
    */
@@ -55,8 +53,8 @@ public final class NetworkUtils {
   /**
    * Gets the connection.
    * 
-   * @param urlString DOCUMENT_ME
-   * @param proxy DOCUMENT_ME
+   * @param urlString 
+   * @param proxy 
    * 
    * @return the connection
    * 
@@ -78,8 +76,8 @@ public final class NetworkUtils {
   /**
    * Gets the connection.
    * 
-   * @param url DOCUMENT_ME
-   * @param proxy DOCUMENT_ME
+   * @param url 
+   * @param proxy 
    * 
    * @return the connection
    * 
@@ -126,10 +124,10 @@ public final class NetworkUtils {
 
   /**
    * Read url.
-   * DOCUMENT_ME
    * 
-   * @param connection DOCUMENT_ME
-   * @param charset DOCUMENT_ME
+   * 
+   * @param connection 
+   * @param charset 
    * 
    * @return the string
    * 
@@ -158,9 +156,9 @@ public final class NetworkUtils {
 
   /**
    * Read url.
-   * DOCUMENT_ME
    * 
-   * @param connection DOCUMENT_ME
+   * 
+   * @param connection 
    * 
    * @return the string
    * 
@@ -172,10 +170,10 @@ public final class NetworkUtils {
 
   /**
    * Read post url.
-   * DOCUMENT_ME
    * 
-   * @param connection DOCUMENT_ME
-   * @param post DOCUMENT_ME
+   * 
+   * @param connection 
+   * @param post 
    * 
    * @return the string
    * 
@@ -196,11 +194,9 @@ public final class NetworkUtils {
     } finally {
       writer.close();
     }
-
     if (connection.getResponseCode() != 200) {
       throw new IllegalArgumentException("Invalid HTTP return code");
     }
-
     StringBuilder builder = new StringBuilder();
     InputStream input = connection.getInputStream();
     try {
@@ -212,14 +208,13 @@ public final class NetworkUtils {
     } finally {
       input.close();
     }
-
     return builder.toString();
   }
 
   /**
    * Gets the image.
    * 
-   * @param connection DOCUMENT_ME
+   * @param connection 
    * 
    * @return the image
    * 
@@ -239,7 +234,7 @@ public final class NetworkUtils {
   /**
    * Encodes a string in a format suitable to send a http request.
    * 
-   * @param s DOCUMENT_ME
+   * @param s 
    * 
    * @return the string
    */
@@ -250,5 +245,4 @@ public final class NetworkUtils {
       return s;
     }
   }
-
 }
diff --git a/src/main/java/ext/services/network/Proxy.java b/src/main/java/ext/services/network/Proxy.java
index ea606d6..2c959d5 100644
--- a/src/main/java/ext/services/network/Proxy.java
+++ b/src/main/java/ext/services/network/Proxy.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.network;
 
 import java.io.IOException;
@@ -32,33 +31,24 @@ import java.net.UnknownHostException;
 import org.apache.commons.codec.binary.Base64;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class Proxy extends java.net.Proxy {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 7495084217081194366L;
-
-  /** DOCUMENT_ME. */
   private final String url;
-
-  /** DOCUMENT_ME. */
   private final int port;
-
-  /** DOCUMENT_ME. */
   private final String user;
-
-  /** DOCUMENT_ME. */
   private final String password;
 
   /**
    * Instantiates a new proxy.
    * 
-   * @param type DOCUMENT_ME
-   * @param url DOCUMENT_ME
-   * @param port DOCUMENT_ME
-   * @param user DOCUMENT_ME
-   * @param password DOCUMENT_ME
+   * @param type 
+   * @param url 
+   * @param port 
+   * @param user 
+   * @param password 
    * 
    * @throws UnknownHostException the unknown host exception
    * @throws IOException Signals that an I/O exception has occurred.
@@ -75,7 +65,7 @@ public class Proxy extends java.net.Proxy {
   /**
    * Gets the connection.
    * 
-   * @param u DOCUMENT_ME
+   * @param u 
    * 
    * @return the connection
    * 
@@ -123,5 +113,4 @@ public class Proxy extends java.net.Proxy {
   public String getUser() {
     return user;
   }
-
 }
diff --git a/src/main/java/ext/services/network/package.html b/src/main/java/ext/services/network/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/ext/services/network/package.html
+++ b/src/main/java/ext/services/network/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/ext/services/xml/XMLBuilder.java b/src/main/java/ext/services/xml/XMLBuilder.java
index 0371d13..fc91e1f 100644
--- a/src/main/java/ext/services/xml/XMLBuilder.java
+++ b/src/main/java/ext/services/xml/XMLBuilder.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.xml;
 
 import java.io.IOException;
@@ -35,10 +34,9 @@ import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public final class XMLBuilder {
-
   /**
    * private constructor to avoid instantiating utility class.
    */
@@ -48,7 +46,7 @@ public final class XMLBuilder {
   /**
    * Gets the xML document.
    * 
-   * @param xml DOCUMENT_ME
+   * @param xml 
    * 
    * @return the xML document
    */
diff --git a/src/main/java/ext/services/xml/XMLUtils.java b/src/main/java/ext/services/xml/XMLUtils.java
index c85e881..4648626 100644
--- a/src/main/java/ext/services/xml/XMLUtils.java
+++ b/src/main/java/ext/services/xml/XMLUtils.java
@@ -20,7 +20,6 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
 package ext.services.xml;
 
 import com.thoughtworks.xstream.XStream;
@@ -49,10 +48,9 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public final class XMLUtils {
-
   /** The x stream. */
   private static XStream xStream = new XStream(new DomDriver());
 
@@ -65,8 +63,8 @@ public final class XMLUtils {
   /**
    * Gets the child element.
    * 
-   * @param el DOCUMENT_ME
-   * @param tagName DOCUMENT_ME
+   * @param el 
+   * @param tagName 
    * 
    * @return the child element
    */
@@ -84,8 +82,8 @@ public final class XMLUtils {
   /**
    * Gets the attribute value.
    * 
-   * @param el DOCUMENT_ME
-   * @param attributeName DOCUMENT_ME
+   * @param el 
+   * @param attributeName 
    * 
    * @return the attribute value
    */
@@ -96,8 +94,8 @@ public final class XMLUtils {
   /**
    * Gets the child element content.
    * 
-   * @param el DOCUMENT_ME
-   * @param tagName DOCUMENT_ME
+   * @param el 
+   * @param tagName 
    * 
    * @return the child element content
    */
diff --git a/src/main/java/ext/services/xml/package.html b/src/main/java/ext/services/xml/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/ext/services/xml/package.html
+++ b/src/main/java/ext/services/xml/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/Main.java b/src/main/java/org/jajuk/Main.java
index 783410f..83c1757 100644
--- a/src/main/java/org/jajuk/Main.java
+++ b/src/main/java/org/jajuk/Main.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk;
 
@@ -24,6 +24,8 @@ import ext.JVM;
 
 import java.util.Locale;
 
+import javax.swing.JDialog;
+import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
 import javax.swing.UnsupportedLookAndFeelException;
@@ -40,6 +42,7 @@ import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.services.startup.StartupControlsService;
 import org.jajuk.services.startup.StartupEngineService;
 import org.jajuk.services.startup.StartupGUIService;
+import org.jajuk.services.webradio.WebRadioHelper;
 import org.jajuk.ui.helpers.FontManager;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -50,13 +53,12 @@ import org.jajuk.util.UtilGUI;
 import org.jajuk.util.UtilString;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
-import org.jvnet.substance.skin.SubstanceBusinessLookAndFeel;
+import org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel;
 
 /**
  * Jajuk launching class.
  */
 public final class Main {
-
   /**
    * private constructor to avoid instantiating utility class.
    */
@@ -72,50 +74,42 @@ public final class Main {
     // non ui init
     try {
       // check JVM version
-      if (!JVM.current().isOrLater(JVM.JDK1_6)) {
-        System.out.println("[BOOT] Java Runtime Environment 1.6 minimum required."
+      if (!JVM.current().isOrLater(JVM.JDK1_7)) {
+        System.out.println("[BOOT] Java Runtime Environment 1.7 minimum required."
             + " You use a JVM " + JVM.current());
         System.exit(2); // error code 2 : wrong JVM
       }
-
       // set flags from command line options
       SessionService.handleCommandline(args);
-
       // Set System properties
       setSystemProperties();
-
       // set flags from system properties
       SessionService.handleSystemProperties();
-
       // Set substance theme (for raw error windows displayed by initial
-      // checkups only)
-      // (must be done in the EDT)
+      // checkups only), must be done in the EDT.
       SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
           try {
             UIManager.setLookAndFeel(new SubstanceBusinessLookAndFeel());
+            JFrame.setDefaultLookAndFeelDecorated(true);
+            JDialog.setDefaultLookAndFeelDecorated(true);
           } catch (UnsupportedLookAndFeelException e) {
             // No Log here, logs are not yet initialized
             e.printStackTrace();
           }
         }
       });
-
       // perform initial checkups and create needed files
       StartupControlsService.initialCheckups();
-
       // log startup depends on : initialCheckups
       Log.init();
       Log.setVerbosity(Log.DEBUG);
-
       // Load user configuration. Depends on: initialCheckups
       Conf.load();
-
       Log.debug("----------------------------------------------------------------------------");
       Log.debug("Starting Jajuk " + Const.JAJUK_VERSION + " <" + Const.JAJUK_CODENAME + ">" + " "
           + Const.JAJUK_VERSION_DATE);
-
       // Full substance configuration now
       // (must be done in the EDT)
       SwingUtilities.invokeLater(new Runnable() {
@@ -124,13 +118,10 @@ public final class Main {
           UtilGUI.setupSubstanceLookAndFeel(Conf.getString(Const.CONF_OPTIONS_LNF));
         }
       });
-
       // Set default fonts
       FontManager.getInstance().setDefaultFont();
-
       // Detect current release
       UpgradeManager.detectRelease();
-
       // Set actual log verbosity. Depends on:
       // Conf.load
       if (!SessionService.isTestMode()) {
@@ -139,72 +130,48 @@ public final class Main {
       }
       // Set locale. setSystemLocal
       LocaleManager.setLocale(new Locale(Conf.getString(Const.CONF_OPTIONS_LANGUAGE)));
-
       // Display the splash screen through a invokeAndWait
-      StartupGUIService.launchSplashScreen();
-
+      if (Conf.getBoolean(Const.CONF_SPLASH_SCREEN)) {
+        StartupGUIService.launchSplashScreen();
+      }
       // Apply any proxy (requires load conf)
       DownloadManager.setDefaultProxySettings();
-
       // Registers ItemManager managers
       StartupCollectionService.registerItemManagers();
-
       // Upgrade configuration from previous releases
       UpgradeManager.upgradeStep1();
-
       // Display user system configuration
-      Log.debug("Workspace used: " + SessionService.getWorkspace());
+      Log.debug("Collection used: " + SessionService.getConfFileByPath(Const.FILE_COLLECTION));
       Log.debug(UtilString.getAnonymizedSystemProperties().toString());
-
       // Display user Jajuk configuration
       Log.debug(UtilString.getAnonymizedJajukProperties().toString());
-
-      // check for another session (needs setLocal)
-      SessionService.checkOtherSession();
-
-      // Create a session file
-      SessionService.createSessionFile();
-
-      // Register device types
-      StartupCollectionService.registerDevicesTypes();
-
       // registers supported audio supports and default properties. Display a
       // "Downloading mplayer" message by default in the splash screen in case
       // of it is downloaded
       StartupGUIService.fireStepOneOver();
       StartupCollectionService.registerTypes();
-
       // Display progress
       StartupGUIService.fireStepTwoOver();
-
       // Load collection
       StartupCollectionService.loadCollection();
-
+      // Load webradios (should be done synchronously now because of the new WebRadioView)
+      WebRadioHelper.loadWebRadios();
       // Upgrade step2 (after collection load)
       UpgradeManager.upgradeStep2();
-
       // Clean the collection up
       Collection.cleanupLogical();
-
       // Display progress
       StartupGUIService.fireStepThreeOver();
-
       // Load history
       History.load();
-
       // Load ambiences
       AmbienceManager.getInstance().load();
-
       // Start LastFM support
       LastFmManager.getInstance();
-
       // Load djs
       DigitalDJManager.getInstance().loadAllDJs();
-
       // Various asynchronous startup actions that needs collection load
-      boolean bCollectionLoadRecover = StartupCollectionService.isCollectionLoadRecover();
-      StartupAsyncService.startupAsyncAfterCollectionLoad(bCollectionLoadRecover);
-
+      StartupAsyncService.startupAsyncAfterCollectionLoad();
       // Auto mount devices, freeze for SMB drives
       // if network is not reachable
       // Do not start this if first session, it is causes concurrency with
@@ -212,22 +179,16 @@ public final class Main {
       if (!UpgradeManager.isFirstSession()) {
         StartupEngineService.autoMount();
       }
-
       // Launch startup track if any (but don't start it if first session
       // because the first refresh is probably still running)
       if (!UpgradeManager.isFirstSession()) {
         StartupEngineService.launchInitialTrack();
       }
-
       // Launch the right jajuk window
       StartupGUIService.launchUI();
-
       // Late collection upgrade actions
       UpgradeManager.upgradeStep3();
-
-    } catch (final Exception e) { // last chance to catch any error for
-      // logging
-      // purpose
+    } catch (final Exception e) { // last chance to catch any error for logging purpose
       e.printStackTrace();
       Log.error(106, e);
       ExitService.exit(1);
@@ -248,9 +209,13 @@ public final class Main {
    */
   /**
    * Sets the system properties.
-   * DOCUMENT_ME
+   * 
    */
   public static void setSystemProperties() {
+    // -- Global properties
+    // Workaround for #1928 (Random "Comparison method violates its general contract!" errors)
+    System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
+    // -- OSX-specific
     if (UtilSystem.isUnderOSX()) {
       String title = "Jajuk" + (SessionService.isTestMode() ? " (test)" : "");
       System.setProperty("com.apple.mrj.application.apple.menu.about.name", title);
@@ -262,5 +227,4 @@ public final class Main {
       System.setProperty("apple.awt.fullscreencapturealldisplays", "false");
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/Album.java b/src/main/java/org/jajuk/base/Album.java
index 6e4fd01..9fe43e6 100644
--- a/src/main/java/org/jajuk/base/Album.java
+++ b/src/main/java/org/jajuk/base/Album.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -28,8 +28,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
-import java.util.Locale;
 import java.util.Set;
 
 import javax.imageio.ImageIO;
@@ -57,19 +57,17 @@ import org.jajuk.util.log.Log;
  * Logical item.
  */
 public class Album extends LogicalItem implements Comparable<Album> {
-
   /** For perfs, we cache the associated tracks. This cache is filled by the TrackManager using the getTracksCache() method */
   private final List<Track> cache = new ArrayList<Track>(15);
-
   /** This array stores thumbnail presence for all the available size (performance) By default all booleans are false. */
   private boolean[] availableTumbs;
 
   /**
    * Album constructor.
-   * 
-   * @param sName DOCUMENT_ME
-   * @param sId DOCUMENT_ME
-   * @param discID DOCUMENT_ME
+   *
+   * @param sId 
+   * @param sName 
+   * @param discID 
    */
   Album(String sId, String sName, long discID) {
     super(sId, sName);
@@ -114,7 +112,7 @@ public class Album extends LogicalItem implements Comparable<Album> {
    * <p>
    * Used to display ordered lists.
    * 
-   * @param otherAlbum DOCUMENT_ME
+   * @param otherAlbum 
    * 
    * @return comparison result
    */
@@ -123,7 +121,6 @@ public class Album extends LogicalItem implements Comparable<Album> {
     if (otherAlbum == null) {
       return -1;
     }
-
     // compare using name and id to differentiate unknown items
     StringBuilder current = new StringBuilder(getName2());
     current.append(getID());
@@ -133,8 +130,8 @@ public class Album extends LogicalItem implements Comparable<Album> {
   }
 
   /**
-   * Return whether this item is strictly unknown : contains no tag
-   * 
+   * Return whether this item is strictly unknown : contains no tag.
+   *
    * @return whether this item is Unknown or not
    */
   public boolean isUnknown() {
@@ -142,10 +139,10 @@ public class Album extends LogicalItem implements Comparable<Album> {
   }
 
   /**
-  * Return whether this item seems unknown (fuzzy search)
-  * 
-  * @return whether this item seems unknown
-  */
+   * Return whether this item seems unknown (fuzzy search).
+   *
+   * @return whether this item seems unknown
+   */
   public boolean seemsUnknown() {
     return isUnknown() || "unknown".equalsIgnoreCase(getName())
         || Messages.getString(UNKNOWN_ALBUM).equalsIgnoreCase(getName());
@@ -157,7 +154,7 @@ public class Album extends LogicalItem implements Comparable<Album> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return XML_ALBUM;
   }
 
@@ -165,7 +162,7 @@ public class Album extends LogicalItem implements Comparable<Album> {
     * @see org.jajuk.base.Item#getTitle()
     */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_Album") + " : " + getName2();
   }
 
@@ -205,7 +202,7 @@ public class Album extends LogicalItem implements Comparable<Album> {
 
   /**
    * Handle artist.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the string
    */
@@ -221,7 +218,7 @@ public class Album extends LogicalItem implements Comparable<Album> {
 
   /**
    * Handle genre.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the string
    */
@@ -237,7 +234,7 @@ public class Album extends LogicalItem implements Comparable<Album> {
 
   /**
    * Handle year.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the string
    */
@@ -275,7 +272,6 @@ public class Album extends LogicalItem implements Comparable<Album> {
     if (first.getAlbumArtist() != null) {
       sb.append(first.getAlbumArtist().getName2());
     }
-
     Genre genre = getGenre();
     if (genre != null) {
       sb.append(genre.getName2());
@@ -300,14 +296,19 @@ public class Album extends LogicalItem implements Comparable<Album> {
    * file is not guarantee to exist, so use a try/catch around a future access to this method.
    */
   public File findCover() {
-    String discoveredCoverPath = getStringValue(XML_ALBUM_DISCOVERED_COVER);
+    // first check if we have a selected cover that still exists
     String selectedCoverPath = getStringValue(XML_ALBUM_SELECTED_COVER);
     if (StringUtils.isNotBlank(selectedCoverPath) && new File(selectedCoverPath).exists()) {
       // If user-selected cover is available, just return its path
       return new File(selectedCoverPath);
-    } else if (StringUtils.isNotBlank(discoveredCoverPath) && COVER_NONE.equals(discoveredCoverPath)) {
+    }
+    // otherwise check if the "discovered cover" is set to "none"
+    String discoveredCoverPath = getStringValue(XML_ALBUM_DISCOVERED_COVER);
+    if (StringUtils.isNotBlank(discoveredCoverPath) && COVER_NONE.equals(discoveredCoverPath)) {
       return null;
-    } else if (StringUtils.isNotBlank(discoveredCoverPath)) {
+    }
+    // now check if the "discovered cover" is available
+    if (StringUtils.isNotBlank(discoveredCoverPath)) {
       // Check if discovered cover still exist. There is an overhead
       // drawback but otherwise, the album's cover
       // property may be stuck to an old device's cover url.
@@ -315,11 +316,15 @@ public class Album extends LogicalItem implements Comparable<Album> {
       // Regularly dropped.
       Device device = DeviceManager.getInstance().getDeviceByPath(new File(discoveredCoverPath));
       // If the device is not mounted, do not perform this existence check up
-      if (device != null && device.isMounted()) {
-        if (new File(discoveredCoverPath).exists()) {
+      if (device != null) {
+        if (device.isMounted()) {
+          if (new File(discoveredCoverPath).exists()) {
+            return new File(discoveredCoverPath);
+          }
+        } else {
           return new File(discoveredCoverPath);
         }
-      } else {
+      } else if (new File(discoveredCoverPath).exists()) {
         return new File(discoveredCoverPath);
       }
     }
@@ -328,7 +333,6 @@ public class Album extends LogicalItem implements Comparable<Album> {
     // to reach other devices covers and display them together
     List<Track> lTracks = cache;
     if (lTracks.size() == 0) {
-      setProperty(XML_ALBUM_DISCOVERED_COVER, COVER_NONE);
       return null;
     }
     // List at directories we have to look in
@@ -344,20 +348,16 @@ public class Album extends LogicalItem implements Comparable<Album> {
     if (dirs.size() == 0) {
       return null;
     }
-
     // look for tag cover if tag supported for this type
     File cover = findTagCover();
-
     // none ? look for standard cover in collection
     if (cover == null) {
       cover = findCoverFile(dirs, true);
     }
-
     // none ? OK, return first cover file we find
     if (cover == null) {
       cover = findCoverFile(dirs, false);
     }
-
     // [PERF] Still nothing ? ok, set no cover to avoid further searches 
     if (cover == null) {
       setProperty(XML_ALBUM_DISCOVERED_COVER, COVER_NONE);
@@ -388,7 +388,6 @@ public class Album extends LogicalItem implements Comparable<Album> {
     //Make sure to sort the cache
     List<Track> sortedTracks = new ArrayList<Track>(cache);
     Collections.sort(sortedTracks, new TrackComparator(TrackComparatorType.ALBUM));
-
     for (Track track : sortedTracks) {
       for (org.jajuk.base.File file : track.getReadyFiles()) {
         try {
@@ -431,7 +430,6 @@ public class Album extends LogicalItem implements Comparable<Album> {
           if (onlyStandardCovers && !UtilFeatures.isStandardCover(files[i])) {
             continue;
           }
-
           // Test the image is not corrupted
           try {
             ImageIcon ii = new ImageIcon(files[i].getAbsolutePath());
@@ -499,11 +497,9 @@ public class Album extends LogicalItem implements Comparable<Album> {
     if (img == null) {
       return null;
     }
-
     ImageIcon icon = new ImageIcon(img);
     // Free thumb memory (DO IT AFTER FULL ImageIcon loading)
     img.flush();
-
     return icon;
   }
 
@@ -562,7 +558,6 @@ public class Album extends LogicalItem implements Comparable<Album> {
     if (cache.size() == 0) {
       return Const.UNKNOWN_ARTIST;
     }
-
     Artist artist = getArtist();
     if (artist != null && !artist.isUnknown()) {
       return artist.getName();
@@ -659,51 +654,6 @@ public class Album extends LogicalItem implements Comparable<Album> {
   }
 
   /**
-   * Returns true, if the pattern matches the specified property.
-   * 
-   * Currently only Const.XML_ALBUM and Const.XML_GENRE are supported
-   * properties. The pattern is used for a case-insensitive sub-string match,
-   * no regular expression is used!
-   * 
-   * @param property The property to use for the match, currently either Cosnt.XML_ALBUM
-   * or Const.XML_GENRE
-   * @param pattern The string to search for as case-insensitive sub-string
-   * 
-   * @return true if either parameter is null or if the pattern matches, false otherwise.
-   */
-  public boolean matches(String property, String pattern) {
-    if (StringUtils.isBlank(property) || StringUtils.isBlank(pattern)) {
-      return true;
-    }
-
-    String sValue = null;
-    if (Const.XML_ALBUM.equals(property)) {
-      sValue = getName2();
-    } else if (Const.XML_GENRE.equals(property)) {
-      Genre genre = getGenre();
-      if (genre == null) {
-        return false;
-      }
-      sValue = genre.getName2();
-    }
-    if (sValue == null) {
-      return false;
-    }
-
-    // do not use regexp matches(<string>) because the string may contain
-    // characters to be escaped
-    return (sValue.toLowerCase(Locale.getDefault()).indexOf(
-        pattern.toLowerCase(Locale.getDefault())) != -1);
-  }
-
-  /**
-   * Reset tracks cache.
-   */
-  protected void resetTracks() {
-    cache.clear();
-  }
-
-  /**
    * Gets the tracks cache.
    * 
    * @return ordered tracks cache for this album (perf)
@@ -729,7 +679,7 @@ public class Album extends LogicalItem implements Comparable<Album> {
    * Set that the thumb for given size is available.
    * 
    * @param size (thumb size like 50)
-   * @param available DOCUMENT_ME
+   * @param available 
    */
   public void setAvailableThumb(int size, boolean available) {
     if (availableTumbs == null) {
@@ -757,4 +707,30 @@ public class Album extends LogicalItem implements Comparable<Album> {
     return availableTumbs[size / 50 - 1];
   }
 
+  /**
+   *  Force any new cover search before displaying it if the album is set "none" cover (for example, if the album contains no cover at all, 
+   *  the album is stuck as NONE_COVER while a thumb refresh is not done manually by the user). 
+   *  If a new cover is added from outside jajuk and no save or save as action is done, the new thumb is not built from the new cover so we force it.
+   */
+  public void resetCoverCache() {
+    String cachedCoverPath = getStringValue(Const.XML_ALBUM_DISCOVERED_COVER);
+    if (Const.COVER_NONE.equals(cachedCoverPath)) {
+      setProperty(Const.XML_ALBUM_DISCOVERED_COVER, "");
+    }
+  }
+
+  /**
+   * Cleanup orphan tracks
+   */
+  protected void cleanupCache() {
+    synchronized (cache) {
+      Iterator<Track> it = cache.iterator();
+      while (it.hasNext()) {
+        Track track = it.next();
+        if (track.getFiles().size() == 0) {
+          it.remove();
+        }
+      }
+    }
+  }
 }
diff --git a/src/main/java/org/jajuk/base/AlbumArtist.java b/src/main/java/org/jajuk/base/AlbumArtist.java
index 5235ddb..7dadb07 100644
--- a/src/main/java/org/jajuk/base/AlbumArtist.java
+++ b/src/main/java/org/jajuk/base/AlbumArtist.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -37,7 +37,6 @@ import org.jajuk.util.Messages;
  * </p>
  */
 public class AlbumArtist extends Artist {
-
   /**
    * Builds an album-artist.
    *
@@ -54,17 +53,15 @@ public class AlbumArtist extends Artist {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return XML_ALBUM_ARTIST;
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_AlbumArtist") + " : " + getName2();
   }
 
diff --git a/src/main/java/org/jajuk/base/AlbumArtistManager.java b/src/main/java/org/jajuk/base/AlbumArtistManager.java
index c5f489d..54c8d77 100644
--- a/src/main/java/org/jajuk/base/AlbumArtistManager.java
+++ b/src/main/java/org/jajuk/base/AlbumArtistManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,34 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.Vector;
 
-import org.jajuk.events.JajukEvent;
-import org.jajuk.events.JajukEvents;
-import org.jajuk.events.ObservationManager;
-import org.jajuk.services.players.QueueModel;
 import org.jajuk.util.Const;
-import org.jajuk.util.error.JajukException;
 
 /**
  * Convenient class to manage album-artists.
  */
 public final class AlbumArtistManager extends ItemManager {
-
   /** Self instance. */
   private static AlbumArtistManager singleton = new AlbumArtistManager();
-
   /** List of all known album-artists. */
   private static Vector<String> albumArtistsList = new Vector<String>(100); // NOPMD
 
@@ -92,7 +81,7 @@ public final class AlbumArtistManager extends ItemManager {
    * @param sName The name of the new albumArtist.
    * @return the albumArtist
    */
-  public synchronized AlbumArtist registerAlbumArtist(String sId, String sName) {
+  synchronized AlbumArtist registerAlbumArtist(String sId, String sName) {
     AlbumArtist albumArtist = getAlbumArtistByID(sId);
     // if we have this albumArtist already, simply return the existing one
     if (albumArtist != null) {
@@ -114,56 +103,13 @@ public final class AlbumArtistManager extends ItemManager {
     return albumArtist;
   }
 
-  /**
-   * Change the item name.
-   * 
-   * @param old The name of the albumArtist to update.
-   * @param sNewName The new name of the albumArtist.
-   * 
-   * @return The new Album-Instance.
-   * 
-   * @throws JajukException Thrown if adjusting the name fails for some reason.
-   */
-  public AlbumArtist changeAlbumArtistName(AlbumArtist old, String sNewName) throws JajukException {
-    synchronized (TrackManager.getInstance()) {
-      // check there is actually a change
-      if (old.getName2().equals(sNewName)) {
-        return old;
-      }
-
-      // find out if the QueueModel is playing this track before we change the track!
-      boolean queueNeedsUpdate = false;
-      if (QueueModel.getPlayingFile() != null
-          && QueueModel.getPlayingFile().getTrack().getAlbumArtist().equals(old)) {
-        queueNeedsUpdate = true;
-      }
-
-      AlbumArtist newItem = registerAlbumArtist(sNewName);
-      // re apply old properties from old item
-      newItem.cloneProperties(old);
-
-      // update tracks
-      for (Track track : TrackManager.getInstance().getTracks()) {
-        if (track.getAlbumArtist().equals(old)) {
-          TrackManager.getInstance().changeTrackAlbumArtist(track, sNewName, null);
-        }
-      }
-      // if current track albumArtist name is changed, notify it
-      if (queueNeedsUpdate) {
-        // We use the same event than for artists to keep things simple
-        ObservationManager.notify(new JajukEvent(JajukEvents.ARTIST_CHANGED));
-      }
-      return newItem;
-    }
-  }
-
   /*
    * (non-Javadoc)
    *
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_ALBUM_ARTISTS;
   }
 
@@ -183,7 +129,7 @@ public final class AlbumArtistManager extends ItemManager {
    * 
    * @return Element
    */
-  public AlbumArtist getAlbumArtistByID(String sID) {
+  AlbumArtist getAlbumArtistByID(String sID) {
     return (AlbumArtist) getItemByID(sID);
   }
 
@@ -196,32 +142,4 @@ public final class AlbumArtistManager extends ItemManager {
   public List<AlbumArtist> getAlbumArtists() {
     return (List<AlbumArtist>) getItems();
   }
-
-  /**
-   * Get ordered list of albumArtists associated with this item.
-   * 
-   * @param item The albumArtist-item to look for.
-   * 
-   * @return the associated albumArtists
-   */
-  public synchronized List<AlbumArtist> getAssociatedAlbumArtists(Item item) {
-    List<AlbumArtist> out;
-    if (item instanceof Track) {
-      out = new ArrayList<AlbumArtist>(1);
-      out.add(((Track) item).getAlbumArtist());
-    } else {
-      // [Perf] If item is a track, just return its album-artist
-      // Use a set to avoid dups
-      Set<AlbumArtist> albumArtistSet = new HashSet<AlbumArtist>();
-
-      List<Track> tracks = TrackManager.getInstance().getAssociatedTracks(item, true);
-      for (Track track : tracks) {
-        albumArtistSet.add(track.getAlbumArtist());
-      }
-      out = new ArrayList<AlbumArtist>(albumArtistSet);
-      Collections.sort(out);
-    }
-    return out;
-  }
-
 }
diff --git a/src/main/java/org/jajuk/base/AlbumComparator.java b/src/main/java/org/jajuk/base/AlbumComparator.java
index b20e8ad..e605ec2 100644
--- a/src/main/java/org/jajuk/base/AlbumComparator.java
+++ b/src/main/java/org/jajuk/base/AlbumComparator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -29,10 +29,8 @@ import java.util.Comparator;
  * @TODO Convert criteria from int to an enum
  */
 public class AlbumComparator implements Comparator<Album>, Serializable {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -5927167916548652076L;
-
   /*
    * This needs to be kept in-sync with what we use in
    * CatalogView.initMetaInformation()!
@@ -40,13 +38,12 @@ public class AlbumComparator implements Comparator<Album>, Serializable {
    * 0 .. genre 1 .. artist 2 .. album 3 .. year 4 .. discovery date 5 .. rate 6 ..
    * hits
    */
-  /** DOCUMENT_ME. */
   private int criteria = 0;
 
   /**
    * Instantiates a new album comparator.
    * 
-   * @param criteria DOCUMENT_ME
+   * @param criteria 
    */
   public AlbumComparator(int criteria) {
     this.criteria = criteria;
@@ -56,6 +53,7 @@ public class AlbumComparator implements Comparator<Album>, Serializable {
    * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
    */
   @Override
+  @SuppressWarnings("ucd")
   public int compare(Album album1, Album album2) {
     // for albums, perform a fast compare
     if (criteria == 2) {
@@ -64,12 +62,10 @@ public class AlbumComparator implements Comparator<Album>, Serializable {
     // get a track for each album
     Track track1 = album1.getAnyTrack();
     Track track2 = album2.getAnyTrack();
-
     // check tracks (normally useless)
     if (track1 == null || track2 == null) {
       return 0;
     }
-
     // @TODO
     // beware, this code is not consistent with equals. This should be ok as
     // result is used by a List but it could be a drama if we used a Set
diff --git a/src/main/java/org/jajuk/base/AlbumManager.java b/src/main/java/org/jajuk/base/AlbumManager.java
index 8c1bd30..b2908bf 100644
--- a/src/main/java/org/jajuk/base/AlbumManager.java
+++ b/src/main/java/org/jajuk/base/AlbumManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.ArrayList;
@@ -42,20 +41,15 @@ import org.jajuk.util.Const;
 import org.jajuk.util.MD5Processor;
 import org.jajuk.util.ReadOnlyIterator;
 import org.jajuk.util.error.JajukException;
-import org.jajuk.util.error.JajukRuntimeException;
 
 /**
  * Convenient class to manage Albums.
  */
 public final class AlbumManager extends ItemManager implements Observer {
-
   /** Self instance. */
   private static AlbumManager singleton = new AlbumManager();
-
   /** Album max rating. */
   private long maxRate = 0l;
-
-  /** DOCUMENT_ME. */
   private int comp = 0;
 
   /**
@@ -80,8 +74,8 @@ public final class AlbumManager extends ItemManager implements Observer {
     registerProperty(new PropertyMetaInformation(Const.XML_ALBUM_SELECTED_COVER, false, false,
         false, false, false, String.class, null));
     // Disc id
-    registerProperty(new PropertyMetaInformation(Const.XML_ALBUM_DISC_ID, false, true, true, false,
-        false, Long.class, -1l));
+    registerProperty(new PropertyMetaInformation(Const.XML_ALBUM_DISC_ID, false, true, false,
+        false, false, Long.class, -1l));
     // Register events
     ObservationManager.register(this);
   }
@@ -111,7 +105,7 @@ public final class AlbumManager extends ItemManager implements Observer {
    * Return hashcode for this item.
    * 
    * @param sName item name
-   * @param discId DOCUMENT_ME
+   * @param discId 
    * 
    * @return ItemManager ID
    */
@@ -122,9 +116,9 @@ public final class AlbumManager extends ItemManager implements Observer {
   /**
    * Register an Album with a known id.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param discID DOCUMENT_ME
+   * @param sId 
+   * @param sName 
+   * @param discID 
    * @return the album
    */
   public Album registerAlbum(String sId, String sName, long discID) {
@@ -140,8 +134,8 @@ public final class AlbumManager extends ItemManager implements Observer {
   /**
    * Register an Album.
    * 
-   * @param sName DOCUMENT_ME
-   * @param discID DOCUMENT_ME
+   * @param sName 
+   * @param discID 
    * 
    * @return the album
    */
@@ -153,45 +147,39 @@ public final class AlbumManager extends ItemManager implements Observer {
   /**
    * Change the item.
    * 
-   * @param old DOCUMENT_ME
-   * @param sNewName DOCUMENT_ME
+   * @param old 
+   * @param sNewName 
    * 
    * @return new album
    * 
    * @throws JajukException the jajuk exception
    */
-  public Album changeAlbumName(Album old, String sNewName) throws JajukException {
+  Album changeAlbumName(Album old, String sNewName) throws JajukException {
     // check there is actually a change
     if (old.getName2().equals(sNewName)) {
       return old;
     }
-
     // check up front as later the state of the track is already changed
     boolean bQueueUpdateRequired = false;
     if (QueueModel.getPlayingFile() != null
         && QueueModel.getPlayingFile().getTrack().getAlbum().equals(old)) {
       bQueueUpdateRequired = true;
     }
-
     Album newItem = registerAlbum(sNewName, old.getDiscID());
     // re apply old properties from old item
     newItem.cloneProperties(old);
-
     // update tracks
     for (Track track : TrackManager.getInstance().getTracks()) {
       if (track.getAlbum().equals(old)) {
         TrackManager.getInstance().changeTrackAlbum(track, sNewName, null);
       }
     }
-
     // if current track album name is changed, notify it
     if (bQueueUpdateRequired) {
       ObservationManager.notify(new JajukEvent(JajukEvents.ALBUM_CHANGED));
     }
-
     // remove old item
     removeItem(old);
-
     return newItem;
   }
 
@@ -226,7 +214,7 @@ public final class AlbumManager extends ItemManager implements Observer {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_ALBUMS;
   }
 
@@ -237,7 +225,7 @@ public final class AlbumManager extends ItemManager implements Observer {
    * 
    * @return Element
    */
-  public Album getAlbumByID(String sID) {
+  Album getAlbumByID(String sID) {
     return (Album) getItemByID(sID);
   }
 
@@ -291,8 +279,6 @@ public final class AlbumManager extends ItemManager implements Observer {
                 albumSet.add(album);
               } else if (item instanceof Year && track.getYear().equals(item)) {
                 albumSet.add(album);
-              } else {
-                throw new JajukRuntimeException("Association not implemented " + item);
               }
             }
           }
@@ -304,7 +290,14 @@ public final class AlbumManager extends ItemManager implements Observer {
       }
     }
     return out;
+  }
 
+  @Override
+  public void cleanup() {
+    for (Item item : getItems()) {
+      ((Album) item).cleanupCache();
+    }
+    super.cleanup();
   }
 
   /**
@@ -516,7 +509,7 @@ public final class AlbumManager extends ItemManager implements Observer {
   /**
    * Gets the album by name.
    * 
-   * @param name DOCUMENT_ME
+   * @param name 
    * 
    * @return associated album (case insensitive) or null if no match
    */
@@ -535,7 +528,6 @@ public final class AlbumManager extends ItemManager implements Observer {
     } finally {
       lock.readLock().unlock();
     }
-
   }
 
   /**
@@ -561,5 +553,4 @@ public final class AlbumManager extends ItemManager implements Observer {
       album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, "");
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/Artist.java b/src/main/java/org/jajuk/base/Artist.java
index 046bc04..2dd000f 100644
--- a/src/main/java/org/jajuk/base/Artist.java
+++ b/src/main/java/org/jajuk/base/Artist.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -33,12 +33,11 @@ import org.jajuk.util.Messages;
  * Logical item.
  */
 public class Artist extends LogicalItem implements Comparable<Artist> {
-
   /**
    * Artist constructor.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
+   * @param sId 
+   * @param sName 
    */
   Artist(String sId, String sName) {
     super(sId, sName);
@@ -50,7 +49,7 @@ public class Artist extends LogicalItem implements Comparable<Artist> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return XML_ARTIST;
   }
 
@@ -69,7 +68,7 @@ public class Artist extends LogicalItem implements Comparable<Artist> {
   /**
    * Alphabetical comparator used to display ordered lists.
    * 
-   * @param otherItem DOCUMENT_ME
+   * @param otherItem 
    * 
    * @return comparison result
    */
@@ -79,7 +78,6 @@ public class Artist extends LogicalItem implements Comparable<Artist> {
     if (otherItem == null) {
       return 1;
     }
-
     // compare using name and id to differentiate unknown items
     StringBuilder current = new StringBuilder(getName2());
     current.append(getID());
@@ -107,13 +105,11 @@ public class Artist extends LogicalItem implements Comparable<Artist> {
         || Messages.getString(UNKNOWN_ARTIST).equalsIgnoreCase(getName());
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_Artist") + " : " + getName2();
   }
 
diff --git a/src/main/java/org/jajuk/base/ArtistManager.java b/src/main/java/org/jajuk/base/ArtistManager.java
index cdea09c..5a4cb5f 100644
--- a/src/main/java/org/jajuk/base/ArtistManager.java
+++ b/src/main/java/org/jajuk/base/ArtistManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.ArrayList;
@@ -42,12 +41,12 @@ import org.jajuk.util.error.JajukException;
  * Convenient class to manage artists.
  */
 public final class ArtistManager extends ItemManager {
-
   /** Self instance. */
   private static ArtistManager singleton = new ArtistManager();
-
   /** List of all known artists. */
   private Vector<String> artistsList = new Vector<String>(100); // NOPMD
+  /** note if we have already fully loaded the Collection to speed up initial startup */
+  private volatile boolean orderedState = false;
 
   /**
    * No constructor available, only static access.
@@ -95,7 +94,7 @@ public final class ArtistManager extends ItemManager {
    * @param sName The name of the new artist.
    * @return the artist
    */
-  public Artist registerArtist(String sId, String sName) {
+  Artist registerArtist(String sId, String sName) {
     Artist artist = getArtistByID(sId);
     // if we have this artist already, simply return the existing one
     if (artist != null) {
@@ -106,17 +105,35 @@ public final class ArtistManager extends ItemManager {
     // add it in genres list if new
     if (!artistsList.contains(sName)) {
       artistsList.add(artist.getName2());
-      // Sort items ignoring case
-      Collections.sort(artistsList, new Comparator<String>() {
-        @Override
-        public int compare(String o1, String o2) {
-          return o1.compareToIgnoreCase(o2);
-        }
-      });
+      // only sort as soon as we have the Collection fully loaded
+      if (orderedState) {
+        sortArtistList();
+      }
     }
     return artist;
   }
 
+  private void sortArtistList() {
+    // Sort items ignoring case
+    Collections.sort(artistsList, new Comparator<String>() {
+      @Override
+      public int compare(String o1, String o2) {
+        return o1.compareToIgnoreCase(o2);
+      }
+    });
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.base.ItemManager#switchToOrderState()
+   */
+  @Override
+  public void switchToOrderState() {
+    // bring this Manager to ordered state when Collection is fully loaded
+    orderedState = true;
+    sortArtistList();
+    super.switchToOrderState();
+  }
+
   /**
    * Change the item name.
    * 
@@ -127,36 +144,30 @@ public final class ArtistManager extends ItemManager {
    * 
    * @throws JajukException Thrown if adjusting the name fails for some reason.
    */
-  public Artist changeArtistName(Artist old, String sNewName) throws JajukException {
-
+  Artist changeArtistName(Artist old, String sNewName) throws JajukException {
     // check if there is actually a change
     if (old.getName2().equals(sNewName)) {
       return old;
     }
-
     // find out if the QueueModel is playing this track before we change the track!
     boolean queueNeedsUpdate = false;
     if (QueueModel.getPlayingFile() != null
         && QueueModel.getPlayingFile().getTrack().getArtist().equals(old)) {
       queueNeedsUpdate = true;
     }
-
     Artist newItem = registerArtist(sNewName);
     // re apply old properties from old item
     newItem.cloneProperties(old);
-
     // update tracks
     for (Track track : TrackManager.getInstance().getTracks()) {
       if (track.getArtist().equals(old)) {
         TrackManager.getInstance().changeTrackArtist(track, sNewName, null);
       }
     }
-
     // if current track artist name is changed, notify it
     if (queueNeedsUpdate) {
       ObservationManager.notify(new JajukEvent(JajukEvents.ARTIST_CHANGED));
     }
-
     return newItem;
   }
 
@@ -166,7 +177,7 @@ public final class ArtistManager extends ItemManager {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_ARTISTS;
   }
 
@@ -186,7 +197,7 @@ public final class ArtistManager extends ItemManager {
    * 
    * @return Element
    */
-  public Artist getArtistByID(String sID) {
+  Artist getArtistByID(String sID) {
     return (Artist) getItemByID(sID);
   }
 
@@ -228,7 +239,6 @@ public final class ArtistManager extends ItemManager {
         // [Perf] If item is a track, just return its artist
         // Use a set to avoid dups
         Set<Artist> artistSet = new HashSet<Artist>();
-
         List<Track> tracks = TrackManager.getInstance().getAssociatedTracks(item, true);
         for (Track track : tracks) {
           artistSet.add(track.getArtist());
diff --git a/src/main/java/org/jajuk/base/Collection.java b/src/main/java/org/jajuk/base/Collection.java
index 3e739a6..da4b00d 100644
--- a/src/main/java/org/jajuk/base/Collection.java
+++ b/src/main/java/org/jajuk/base/Collection.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
@@ -32,8 +31,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
@@ -51,8 +48,6 @@ import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 import org.xml.sax.Attributes;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -60,50 +55,34 @@ import org.xml.sax.helpers.DefaultHandler;
 /**
  * Items root container.
  */
-public final class Collection extends DefaultHandler implements ErrorHandler {
-
-  /** The Constant TAG_CLOSE_NEWLINE. DOCUMENT_ME */
+public final class Collection extends DefaultHandler {
+  /** The Constant TAG_CLOSE_NEWLINE.  */
   private static final String TAG_CLOSE_NEWLINE = ">\n";
-
-  /** The Constant TAB_CLOSE_TAG_START. DOCUMENT_ME */
+  /** The Constant TAB_CLOSE_TAG_START.  */
   private static final String TAB_CLOSE_TAG_START = "</";
-
   /** Self instance. */
   private static Collection coll = new Collection();
-
-  /** DOCUMENT_ME. */
   private static long lTime;
-
   /** Current ItemManager manager. */
   private ItemManager manager;
-
   /** upgrade for track IDs. */
   private final Map<String, String> hmWrongRightTrackID = new HashMap<String, String>();
-
   /** upgrade for album IDs. */
   private final Map<String, String> hmWrongRightAlbumID = new HashMap<String, String>();
-
   /** upgrade for artist IDs. */
   private final Map<String, String> hmWrongRightArtistID = new HashMap<String, String>();
-
   /** upgrade for album-artists IDs. */
   private final Map<String, String> hmWrongRightAlbumArtistID = new HashMap<String, String>();
-
   /** upgrade for genre IDs. */
   private final Map<String, String> hmWrongRightGenreID = new HashMap<String, String>();
-
   /** upgrade for device IDs. */
   private final Map<String, String> hmWrongRightDeviceID = new HashMap<String, String>();
-
   /** upgrade for directory IDs. */
   private final Map<String, String> hmWrongRightDirectoryID = new HashMap<String, String>();
-
   /** upgrade for file IDs. */
   private final Map<String, String> hmWrongRightFileID = new HashMap<String, String>();
-
   /** upgrade for playlist IDs. */
   private final Map<String, String> hmWrongRightPlaylistFileID = new HashMap<String, String>();
-
   /** Conversion of types from Jajuk < 1.4 */
   private final static Map<String, String> CONVERSION;
   static {
@@ -120,68 +99,51 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     CONVERSION.put("9", "ram");
     CONVERSION.put("10", "mp2");
   }
-
   /** [Perf] flag used to accelerate conversion. */
   private boolean needCheckConversions = true;
-
   /** [PERF] Does the type has been checked once for ID computation change ? Indeed, we check only one element of each type to check if this computation changed for perfs. */
   private boolean needCheckID = false;
 
   // Constants value, use lower value for mist numerous items to parse
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private enum Stage {
-    
-    /** DOCUMENT_ME. */
     STAGE_NONE,
-
-    /** The Constant STAGE_FILES. DOCUMENT_ME */
+    /** The Constant STAGE_FILES.  */
     STAGE_FILES,
-
-    /** The Constant STAGE_DIRECTORIES. DOCUMENT_ME */
+    /** The Constant STAGE_DIRECTORIES.  */
     STAGE_DIRECTORIES,
-
-    /** The Constant STAGE_TRACKS. DOCUMENT_ME */
+    /** The Constant STAGE_TRACKS.  */
     STAGE_TRACKS,
-
-    /** The Constant STAGE_ALBUMS. DOCUMENT_ME */
+    /** The Constant STAGE_ALBUMS.  */
     STAGE_ALBUMS,
-
-    /** The Constant STAGE_ARTISTS. DOCUMENT_ME */
+    /** The Constant STAGE_ARTISTS.  */
     STAGE_ARTISTS,
-
-    /** The Constant STAGE_GENRES. DOCUMENT_ME */
+    /** The Constant STAGE_GENRES.  */
     STAGE_GENRES,
-
-    /** The Constant STAGE_PLAYLIST_FILES. DOCUMENT_ME */
+    /** The Constant STAGE_PLAYLIST_FILES.  */
     STAGE_PLAYLIST_FILES,
-
-    /** The Constant STAGE_PLAYLISTS. DOCUMENT_ME */
+    /** The Constant STAGE_PLAYLISTS.  */
     STAGE_PLAYLISTS,
-
-    /** The Constant STAGE_TYPES. DOCUMENT_ME */
+    /** The Constant STAGE_TYPES.  */
     STAGE_TYPES,
-
-    /** The Constant STAGE_DEVICES. DOCUMENT_ME */
+    /** The Constant STAGE_DEVICES.  */
     STAGE_DEVICES,
-
-    /** The Constant STAGE_YEARS. DOCUMENT_ME */
+    /** The Constant STAGE_YEARS.  */
     STAGE_YEARS,
-
     /** STAGE_ALBUM_ARTIST. */
     STAGE_ALBUM_ARTIST
   }
 
   /** *************************************************************************** [PERF] provide current stage (files, tracks...) used to optimize switch when parsing the collection ************************************************************************** */
   private Stage stage = Stage.STAGE_NONE;
-
-  /** The Constant ADDITION_FORMATTER. DOCUMENT_ME */
-  private static final DateFormat ADDITION_FORMATTER = UtilString.getAdditionDateFormatter();
+  /** The Constant additionFormatter.  */
+  private final DateFormat additionFormatter = UtilString.getAdditionDateFormatter();
 
   /**
    * Instance getter.
-   * 
+   *
    * @return the instance
    */
   public static Collection getInstance() {
@@ -197,58 +159,41 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * Write current collection to collection file for persistence between
-   * sessions.
-   * 
-   * @param collectionFile DOCUMENT_ME
-   * 
+   * sessions. 
+   *
+   * @param collectionFile 
+   *
    * @throws IOException Signals that an I/O exception has occurred.
    */
-  public static synchronized void commit(File collectionFile) throws IOException {
+  public static synchronized void commit() throws IOException {
     long time = System.currentTimeMillis();
     String sCharset = Conf.getString(Const.CONF_COLLECTION_CHARSET);
-    final BufferedWriter bw;
-    if (collectionFile.getAbsolutePath().endsWith(".zip")) {
-      bw = new BufferedWriter(new OutputStreamWriter(new ZipOutputStream(new FileOutputStream(
-          collectionFile)), sCharset), 1000000);
-    } else {
-      bw = new BufferedWriter(
-          new OutputStreamWriter(new FileOutputStream(collectionFile), sCharset), 1000000);
-    }
+    java.io.File out = SessionService.getConfFileByPath(Const.FILE_COLLECTION + "."
+        + Const.FILE_SAVING_FILE_EXTENSION);
+    final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out),
+        sCharset), 1000000);
     try {
       bw.write("<?xml version='1.0' encoding='" + sCharset + "'?>\n");
       bw.write("<" + Const.XML_COLLECTION + " " + Const.XML_VERSION + "='" + Const.JAJUK_VERSION
           + "'>\n");
-
       // Devices
       writeItemList(bw, DeviceManager.getInstance().toXML(), DeviceManager.getInstance()
-          .getDevices(), DeviceManager.getInstance().getLabel(), 40);
-      Log.debug("Devices committed.");
-
+          .getDevices(), DeviceManager.getInstance().getXMLTag(), 40);
       // Genres
       writeItemList(bw, GenreManager.getInstance().toXML(), GenreManager.getInstance().getGenres(),
-          GenreManager.getInstance().getLabel(), 40);
-      Log.debug("Genres committed.");
-
+          GenreManager.getInstance().getXMLTag(), 40);
       // Artists
       writeItemList(bw, ArtistManager.getInstance().toXML(), ArtistManager.getInstance()
-          .getArtists(), ArtistManager.getInstance().getLabel(), 40);
-      Log.debug("Artists committed.");
-
+          .getArtists(), ArtistManager.getInstance().getXMLTag(), 40);
       // Album artists
       writeItemList(bw, AlbumArtistManager.getInstance().toXML(), AlbumArtistManager.getInstance()
-          .getAlbumArtists(), AlbumArtistManager.getInstance().getLabel(), 40);
-      Log.debug("Album-artists committed.");
-
+          .getAlbumArtists(), AlbumArtistManager.getInstance().getXMLTag(), 40);
       // Albums
       writeItemList(bw, AlbumManager.getInstance().toXML(), AlbumManager.getInstance().getAlbums(),
-          AlbumManager.getInstance().getLabel(), 40);
-      Log.debug("Albums committed.");
-
+          AlbumManager.getInstance().getXMLTag(), 40);
       // Years
       writeItemList(bw, YearManager.getInstance().toXML(), YearManager.getInstance().getYears(),
-          YearManager.getInstance().getLabel(), 40);
-      Log.debug("Years committed.");
-
+          YearManager.getInstance().getXMLTag(), 40);
       // Tracks
       // Cannot use writeItemList() method as we have a bit of special handling inside the loop here
       TrackManager.getInstance().getLock().readLock().lock();
@@ -265,61 +210,55 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
       } finally {
         TrackManager.getInstance().getLock().readLock().unlock();
       }
-      writeString(bw, TrackManager.getInstance().getLabel(), 200);
-      Log.debug("Tracks committed.");
-
+      writeString(bw, TrackManager.getInstance().getXMLTag(), 200);
       // Directories
       writeItemList(bw, DirectoryManager.getInstance().toXML(), DirectoryManager.getInstance()
-          .getDirectories(), DirectoryManager.getInstance().getLabel(), 100);
-      Log.debug("Directories committed.");
-
+          .getDirectories(), DirectoryManager.getInstance().getXMLTag(), 100);
       // Files
       writeItemList(bw, FileManager.getInstance().toXML(), FileManager.getInstance().getFiles(),
-          FileManager.getInstance().getLabel(), 200);
-      Log.debug("Files committed.");
-
+          FileManager.getInstance().getXMLTag(), 200);
       // Playlists
       writeItemList(bw, PlaylistManager.getInstance().toXML(), PlaylistManager.getInstance()
-          .getPlaylists(), PlaylistManager.getInstance().getLabel(), 200);
-      Log.debug("Playlists committed.");
-
+          .getPlaylists(), PlaylistManager.getInstance().getXMLTag(), 200);
       // end of collection
       bw.write("</" + Const.XML_COLLECTION + TAG_CLOSE_NEWLINE);
       bw.flush();
     } finally {
       bw.close();
     }
+    // Override initial file
+    java.io.File finalFile = SessionService.getConfFileByPath(Const.FILE_COLLECTION);
+    UtilSystem.saveFileWithRecoverySupport(finalFile);
     Log.debug("Collection commited in " + (System.currentTimeMillis() - time) + " ms");
   }
 
   /**
-   * Write item list. DOCUMENT_ME
-   * 
-   * @param bw DOCUMENT_ME
-   * @param header DOCUMENT_ME
-   * @param items DOCUMENT_ME
-   * @param footer DOCUMENT_ME
-   * @param buffer DOCUMENT_ME
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
-   */
+  * Write item list. 
+  *
+  * @param bw 
+  * @param header 
+  * @param items 
+  * @param footer 
+  * @param buffer 
+  *
+  * @throws IOException Signals that an I/O exception has occurred.
+  */
   private static void writeItemList(BufferedWriter bw, String header, List<? extends Item> items,
       String footer, int buffer) throws IOException {
     bw.write(header);
     for (Item item : items) {
       bw.write(item.toXml());
     }
-
     writeString(bw, footer, buffer);
   }
 
   /**
-   * Write string. DOCUMENT_ME
-   * 
-   * @param bw DOCUMENT_ME
-   * @param toWrite DOCUMENT_ME
-   * @param buffer DOCUMENT_ME
-   * 
+   * Write string. 
+   *
+   * @param bw 
+   * @param toWrite 
+   * @param buffer 
+   *
    * @throws IOException Signals that an I/O exception has occurred.
    */
   private static void writeString(BufferedWriter bw, String toWrite, int buffer) throws IOException {
@@ -332,9 +271,9 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * Parse collection.xml file and put all collection information into memory
-   * 
-   * @param file DOCUMENT_ME
-   * 
+   *
+   * @param file 
+   *
    * @throws SAXException the SAX exception
    * @throws ParserConfigurationException the parser configuration exception
    * @throws JajukException the jajuk exception
@@ -342,7 +281,15 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
    */
   public static void load(File file) throws SAXException, ParserConfigurationException,
       JajukException, IOException {
+    // If we load the regular collection.xml file, try to recover it from previous crash
+    java.io.File regularFile = SessionService.getConfFileByPath(Const.FILE_COLLECTION);
+    if (file.equals(regularFile)) {
+      UtilSystem.recoverFileIfRequired(regularFile);
+    }
     Log.debug("Loading: " + file.getName());
+    if (!file.exists()) {
+      throw new JajukException(5, file.toString());
+    }
     lTime = System.currentTimeMillis();
     SAXParserFactory spf = SAXParserFactory.newInstance();
     spf.setValidating(false);
@@ -351,15 +298,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
     spf.setFeature("http://xml.org/sax/features/string-interning", true);
     SAXParser saxParser = spf.newSAXParser();
-    if (!file.exists()) {
-      throw new JajukException(5, file.toString());
-    }
-    if (file.getAbsolutePath().endsWith(".zip")) {
-      InputSource input = new InputSource(new ZipInputStream(new FileInputStream(file)));
-      saxParser.parse(input, getInstance());
-    } else {
-      saxParser.parse(file.toURI().toURL().toString(), getInstance());
-    }
+    saxParser.parse(file.toURI().toURL().toString(), getInstance());
   }
 
   /**
@@ -399,14 +338,13 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * parsing warning.
-   * 
-   * @param spe DOCUMENT_ME
-   * 
+   *
+   * @param spe 
    * @throws SAXException the SAX exception
-   * 
-   * @exception SAXException
    */
   @Override
+  @SuppressWarnings("ucd")
+  //NOSONAR
   public void warning(SAXParseException spe) throws SAXException {
     throw new SAXException(Messages.getErrorMessage(5) + " / " + spe.getSystemId() + "/"
         + spe.getLineNumber() + "/" + spe.getColumnNumber() + " : " + spe.getMessage());
@@ -414,14 +352,12 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * parsing error.
-   * 
-   * @param spe DOCUMENT_ME
-   * 
+   *
+   * @param spe 
    * @throws SAXException the SAX exception
-   * 
-   * @exception SAXException
    */
   @Override
+  @SuppressWarnings("ucd")
   public void error(SAXParseException spe) throws SAXException {
     throw new SAXException(Messages.getErrorMessage(5) + " / " + spe.getSystemId() + "/"
         + spe.getLineNumber() + "/" + spe.getColumnNumber() + " : " + spe.getMessage());
@@ -429,14 +365,12 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * parsing fatal error.
-   * 
-   * @param spe DOCUMENT_ME
-   * 
+   *
+   * @param spe 
    * @throws SAXException the SAX exception
-   * 
-   * @exception SAXException
    */
   @Override
+  @SuppressWarnings("ucd")
   public void fatalError(SAXParseException spe) throws SAXException {
     throw new SAXException(Messages.getErrorMessage(5) + " / " + spe.getSystemId() + "/"
         + spe.getLineNumber() + "/" + spe.getColumnNumber() + " : " + spe.getMessage());
@@ -446,6 +380,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
    * Called at parsing start.
    */
   @Override
+  @SuppressWarnings("ucd")
   public void startDocument() {
     Log.debug("Starting collection file parsing...");
   }
@@ -454,6 +389,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
    * Called at parsing end.
    */
   @Override
+  @SuppressWarnings("ucd")
   public void endDocument() {
     long l = (System.currentTimeMillis() - lTime);
     Log.debug("Collection file parsing done : " + l + " ms");
@@ -468,16 +404,16 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
    * times (like raw names) as it uses a lot of CPU (equals() is called) and we
    * want startup to be as fast as possible. Note that the use of intern() save
    * around 1/4 of overall heap memory
-   * 
+   *
    * We use sax-interning for the main items sections (<styles> for ie). For all
    * raw items, we don't perform equals on item name but we compare the string
    * hashcode
-   * 
-   * @param sUri DOCUMENT_ME
-   * @param s DOCUMENT_ME
-   * @param sQName DOCUMENT_ME
-   * @param attributes DOCUMENT_ME
-   * 
+   *
+   * @param sUri 
+   * @param s 
+   * @param sQName 
+   * @param attributes 
+   *
    * @throws SAXException the SAX exception
    */
   @Override
@@ -488,58 +424,59 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
       // [PERF] Manage top tags to set current stage. Manages 'properties'
       // tags as well
       if (idIndex == -1) {
-        if (Const.XML_DEVICES == sQName) {
+        // Note that we compare string with '==' for performance reasons and it is safe here.
+        if (Const.XML_DEVICES == sQName) { //NOSONAR
           manager = DeviceManager.getInstance();
           stage = Stage.STAGE_DEVICES;
           needCheckID = true;
-        } else if (Const.XML_ALBUMS == sQName) {
+        } else if (Const.XML_ALBUMS == sQName) {//NOSONAR
           manager = AlbumManager.getInstance();
           stage = Stage.STAGE_ALBUMS;
           needCheckID = true;
-        } else if (Const.XML_ARTISTS == sQName) {
+        } else if (Const.XML_ARTISTS == sQName) {//NOSONAR
           manager = ArtistManager.getInstance();
           stage = Stage.STAGE_ARTISTS;
           needCheckID = true;
-        } else if (Const.XML_ALBUM_ARTISTS == sQName) {
+        } else if (Const.XML_ALBUM_ARTISTS == sQName) {//NOSONAR
           manager = AlbumArtistManager.getInstance();
           stage = Stage.STAGE_ALBUM_ARTIST;
           needCheckID = true;
-        } else if (Const.XML_DIRECTORIES == sQName) {
+        } else if (Const.XML_DIRECTORIES == sQName) {//NOSONAR
           manager = DirectoryManager.getInstance();
           stage = Stage.STAGE_DIRECTORIES;
           needCheckID = true;
-        } else if (Const.XML_FILES == sQName) {
+        } else if (Const.XML_FILES == sQName) {//NOSONAR
           manager = FileManager.getInstance();
           stage = Stage.STAGE_FILES;
           needCheckID = true;
-        } else if (Const.XML_PLAYLISTS == sQName) {
+        } else if (Const.XML_PLAYLISTS == sQName) {//NOSONAR
           // This code is here for Jajuk < 1.6 compatibility
           manager = PlaylistManager.getInstance();
           stage = Stage.STAGE_PLAYLISTS;
           needCheckID = true;
-        } else if (Const.XML_PLAYLIST_FILES == sQName) {
+        } else if (Const.XML_PLAYLIST_FILES == sQName) {//NOSONAR
           manager = PlaylistManager.getInstance();
           stage = Stage.STAGE_PLAYLIST_FILES;
           needCheckID = true;
-        } else if (Const.XML_GENRES == sQName) {
+        } else if (Const.XML_GENRES == sQName) {//NOSONAR
           manager = GenreManager.getInstance();
           stage = Stage.STAGE_GENRES;
           needCheckID = true;
-        } else if (Const.XML_TRACKS == sQName) {
+        } else if (Const.XML_TRACKS == sQName) {//NOSONAR
           manager = TrackManager.getInstance();
           stage = Stage.STAGE_TRACKS;
           needCheckID = true;
-        } else if (Const.XML_YEARS == sQName) {
+        } else if (Const.XML_YEARS == sQName) {//NOSONAR
           manager = YearManager.getInstance();
           stage = Stage.STAGE_YEARS;
           needCheckID = true;
-        } else if (Const.XML_TYPES == sQName) {
+        } else if (Const.XML_TYPES == sQName) {//NOSONAR
           // This is here for pre-1.7 collections, after we don't commit types
           // anymore (they are set programmatically)
           manager = TypeManager.getInstance();
           stage = Stage.STAGE_TYPES;
           needCheckID = false;
-        } else if (Const.XML_PROPERTY == sQName) {
+        } else if (Const.XML_PROPERTY == sQName) {//NOSONAR
           // A property description
           boolean bCustom = Boolean.parseBoolean(attributes.getValue(attributes
               .getIndex(Const.XML_CUSTOM)));
@@ -562,7 +499,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
               // from 1.2
               // we reset default value to "today"
               oDefaultValue = UtilString.parse(sDefaultValue, cType);
-            } catch (Exception e) {
+            } catch (ParseException e) {
               oDefaultValue = new Date();
             }
           }
@@ -574,12 +511,11 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
             manager.registerProperty(meta);
           }
         }
-
-        if (Const.XML_PROPERTY == sQName) {
+        if (Const.XML_PROPERTY == sQName) {//NOSONAR
           Log.debug("Found property: " + attributes.getValue(Const.XML_NAME));
         } else {
           Log.debug("Starting stage: '" + stage + "' with property: '" + sQName + "' manager: "
-              + (manager != null ? manager.getLabel() : "<null>"));
+              + (manager != null ? manager.getXMLTag() : "<null>"));
         }
       } else {
         // Manage elements themselves using a switch for performances
@@ -621,23 +557,23 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
           Log.warn("Unexpected Stage: " + stage);
         }
       }
-    } catch (Throwable e) {
+    } catch (Throwable e) {//NOSONAR
       // Make sure to catch every issue here (including runtime exceptions) so we make sure to start
       // jajuk
       StringBuilder sAttributes = new StringBuilder();
       for (int i = 0; i < attributes.getLength(); i++) {
-        sAttributes.append('\n').append(attributes.getQName(i)).append('=').append(
-            attributes.getValue(i));
+        sAttributes.append('\n').append(attributes.getQName(i)).append('=')
+            .append(attributes.getValue(i));
       }
       Log.error(5, sAttributes.toString(), e);
     }
   }
 
   /**
-   * Handle files. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle files. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleFiles(Attributes attributes, int idIndex) {
     String sItemName = attributes.getValue(Const.XML_NAME);
@@ -667,13 +603,11 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     if (dParent == null || track == null) { // more checkups
       return;
     }
-
     String size = attributes.getValue(Const.XML_SIZE);
     long lSize = 0;
     if (size != null) {
       lSize = Long.parseLong(size);
     }
-
     // Quality analyze, handle format problems (mainly for
     // upgrades)
     long lQuality = 0;
@@ -697,7 +631,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     String sRightID = sID;
     if (needCheckID) {
       sRightID = FileManager.createID(sItemName, dParent).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) { //NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong file Id, upgraded: " + sItemName);
@@ -710,14 +644,13 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
   }
 
   /**
-   * Handle directories. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle directories. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleDirectories(Attributes attributes, int idIndex) {
     Directory dParent = null;
-
     // dParent = null;
     String sParentID = attributes.getValue(Const.XML_DIRECTORY_PARENT).intern();
     // UPGRADE
@@ -725,7 +658,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
       sParentID = hmWrongRightDirectoryID.get(sParentID);
     }
     // We use intern() here for performances
-    if (sParentID != "-1") {
+    if (sParentID != "-1") { //NOSONAR
       // Parent directory should be already referenced
       // because of order conservation
       dParent = DirectoryManager.getInstance().getDirectoryByID(sParentID);
@@ -749,7 +682,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     String sRightID = sID;
     if (needCheckID) {
       sRightID = DirectoryManager.createID(sItemName, device, dParent).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) {//NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong directory Id, upgraded: " + sItemName);
@@ -759,7 +692,6 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     Directory directory = DirectoryManager.getInstance().registerDirectory(sRightID, sItemName,
         dParent, device);
     directory.populateProperties(attributes);
-
     // also remember top-level directories at the device
     if (dParent == null) {
       device.addDirectory(directory);
@@ -767,11 +699,11 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
   }
 
   /**
-   * Handle tracks. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
-   * 
+   * Handle tracks. 
+   *
+   * @param attributes 
+   * @param idIndex 
+   *
    * @throws ParseException the parse exception
    */
   private void handleTracks(Attributes attributes, int idIndex) throws ParseException {
@@ -802,7 +734,6 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
       sArtistID = hmWrongRightArtistID.get(sArtistID);
     }
     Artist artist = ArtistManager.getInstance().getArtistByID(sArtistID);
-
     // Album-artist (not a constructor level property)
     String sAlbumArtist = attributes.getValue(Const.XML_ALBUM_ARTIST);
     if (StringUtils.isNotBlank(sAlbumArtist)) {
@@ -819,7 +750,6 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
       // we force album artist to this default, a deep scan will be required to get actual values
       albumArtist = AlbumArtistManager.getInstance().registerAlbumArtist(Const.UNKNOWN_ARTIST);
     }
-
     // Length
     long length = UtilString.fastLongParser(attributes.getValue(Const.XML_TRACK_LENGTH));
     // Type
@@ -849,7 +779,6 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
         Log.debug(Messages.getString("Error.137") + ":" + sTrackName); // wrong
       }
     }
-
     // Idem for disc number
     long lDiscNumber = 0l;
     if (attributes.getValue(Const.XML_TRACK_DISC_NUMBER) != null) {
@@ -862,13 +791,12 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
         }
       }
     }
-
     // UPGRADE test
     String sRightID = sID;
     if (needCheckID) {
       sRightID = TrackManager.createID(sTrackName, album, genre, artist, length, year, lOrder,
           type, lDiscNumber).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) {//NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong Track Id, upgraded: " + sTrackName);
@@ -883,11 +811,10 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     // only set discovery date if it is available in the file
     if (attributes.getValue(Const.XML_TRACK_DISCOVERY_DATE) != null) {
       // Date format should be OK
-      Date dAdditionDate = ADDITION_FORMATTER.parse(attributes
+      Date dAdditionDate = additionFormatter.parse(attributes
           .getValue(Const.XML_TRACK_DISCOVERY_DATE));
       track.setDiscoveryDate(dAdditionDate);
     }
-
     String sComment = attributes.getValue(Const.XML_TRACK_COMMENT);
     if (sComment == null) {
       sComment = "";
@@ -898,17 +825,18 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
   }
 
   /**
-   * Handle albums. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle albums. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleAlbums(Attributes attributes, int idIndex) {
     String sID = attributes.getValue(idIndex).intern();
     String sItemName = attributes.getValue(Const.XML_NAME).intern();
     String sAttributeAlbumArtist = attributes.getValue(Const.XML_ALBUM_ARTIST);
     if (sAttributeAlbumArtist != null) {
-      sAttributeAlbumArtist = sAttributeAlbumArtist.intern();
+      // Make sure to store the string into the String pool to save memory
+      sAttributeAlbumArtist.intern();//NOSONAR
     }
     long lItemDiscID = 0;
     String sAttributeDiskId = attributes.getValue(Const.XML_ALBUM_DISC_ID);
@@ -919,7 +847,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     String sRightID = sID;
     if (needCheckID) {
       sRightID = AlbumManager.createID(sItemName, lItemDiscID).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) {//NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong album Id, upgraded: " + sItemName);
@@ -933,10 +861,10 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
   }
 
   /**
-   * Handle artists. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle artists. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleArtists(Attributes attributes, int idIndex) {
     String sID = attributes.getValue(idIndex).intern();
@@ -945,7 +873,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     String sRightID = sID;
     if (needCheckID) {
       sRightID = ItemManager.createID(sItemName).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) {//NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong artist Id, upgraded: " + sItemName);
@@ -959,10 +887,10 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
   }
 
   /**
-   * Handle genres. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle genres. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleGenres(Attributes attributes, int idIndex) {
     String sID = attributes.getValue(idIndex).intern();
@@ -971,7 +899,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     String sRightID = sID;
     if (needCheckID) {
       sRightID = ItemManager.createID(sItemName).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) {//NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong genre Id, upgraded: " + sItemName);
@@ -985,10 +913,10 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
   }
 
   /**
-   * Handle playlist files. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle playlist files. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handlePlaylistFiles(Attributes attributes, int idIndex) {
     String sParentID = attributes.getValue(Const.XML_DIRECTORY).intern();
@@ -1008,7 +936,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
     String sRightID = sID;
     if (needCheckID) {
       sRightID = PlaylistManager.createID(sItemName, dParent).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) {//NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong playlist Id, upgraded: " + sItemName);
@@ -1022,20 +950,21 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
   }
 
   /**
-   * Handle devices. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle devices. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleDevices(Attributes attributes, int idIndex) {
     String sID = attributes.getValue(idIndex).intern();
     String sItemName = attributes.getValue(Const.XML_NAME);
     long lType = UtilString.fastLongParser(attributes.getValue(Const.XML_TYPE));
+    Device.Type type = Device.Type.values()[(int) lType];
     // UPGRADE test
     String sRightID = sID;
     if (needCheckID) {
       sRightID = ItemManager.createID(sItemName).intern();
-      if (sRightID == sID) {
+      if (sRightID == sID) {//NOSONAR
         needCheckID = UpgradeManager.isUpgradeDetected() || SessionService.isTestMode();
       } else {
         Log.debug("** Wrong device Id, upgraded: " + sItemName);
@@ -1043,17 +972,17 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
       }
     }
     String sURL = attributes.getValue(Const.XML_URL);
-    Device device = DeviceManager.getInstance().registerDevice(sRightID, sItemName, lType, sURL);
+    Device device = DeviceManager.getInstance().registerDevice(sRightID, sItemName, type, sURL);
     if (device != null) {
       device.populateProperties(attributes);
     }
   }
 
   /**
-   * Handle years. DOCUMENT_ME
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   * Handle years. 
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleYears(Attributes attributes, int idIndex) {
     String sID = attributes.getValue(idIndex).intern();
@@ -1066,9 +995,9 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * Handle album artists.
-   * 
-   * @param attributes DOCUMENT_ME
-   * @param idIndex DOCUMENT_ME
+   *
+   * @param attributes 
+   * @param idIndex 
    */
   private void handleAlbumArtists(Attributes attributes, int idIndex) {
     String sID = attributes.getValue(idIndex).intern();
@@ -1081,7 +1010,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * Gets the hm wrong right file id.
-   * 
+   *
    * @return list of wrong file id (used by history)
    */
   public Map<String, String> getHmWrongRightFileID() {
@@ -1090,7 +1019,7 @@ public final class Collection extends DefaultHandler implements ErrorHandler {
 
   /**
    * Gets the wrong right album i ds.
-   * 
+   *
    * @return the wrong right album i ds
    */
   public Map<String, String> getWrongRightAlbumIDs() {
diff --git a/src/main/java/org/jajuk/base/Device.java b/src/main/java/org/jajuk/base/Device.java
index 0352ba4..0326594 100644
--- a/src/main/java/org/jajuk/base/Device.java
+++ b/src/main/java/org/jajuk/base/Device.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
 import java.io.File;
 import java.io.FileFilter;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -40,11 +39,11 @@ import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
 import org.jajuk.services.bookmark.History;
 import org.jajuk.services.core.ExitService;
-import org.jajuk.services.core.SessionService;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.ui.helpers.ManualDeviceRefreshReporter;
 import org.jajuk.ui.helpers.RefreshReporter;
 import org.jajuk.ui.widgets.InformationJPanel;
+import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
@@ -63,74 +62,52 @@ import org.xml.sax.Attributes;
 /**
  * A device ( music files repository )
  * <p>
- * Some properties of a device are immuatable : name, url and type *
+ * Some properties of a device are immutable : name, url and type *
  * <p>
  * Physical item.
  */
 public class Device extends PhysicalItem implements Comparable<Device> {
-
-  /** The Constant OPTION_REFRESH_DEEP.  DOCUMENT_ME */
-  protected static final int OPTION_REFRESH_DEEP = 1;
-
-  /** The Constant OPTION_REFRESH_CANCEL.  DOCUMENT_ME */
-  protected static final int OPTION_REFRESH_CANCEL = 2;
+  /** The Constant OPTION_REFRESH_DEEP.*/
+  private static final int OPTION_REFRESH_DEEP = 1;
+  /** The Constant OPTION_REFRESH_CANCEL. */
+  private static final int OPTION_REFRESH_CANCEL = 2;
 
   // Device type constants
-  // Note: these need to correspond with the static array in @see
-  // org.jajuk.base.DeviceManager !!
-  /** The Constant TYPE_DIRECTORY.  DOCUMENT_ME */
-  public static final int TYPE_DIRECTORY = 0;
-
-  /** The Constant TYPE_CD.  DOCUMENT_ME */
-  public static final int TYPE_CD = 1;
-
-  /** The Constant TYPE_NETWORK_DRIVE.  DOCUMENT_ME */
-  public static final int TYPE_NETWORK_DRIVE = 2;
-
-  /** The Constant TYPE_EXT_DD.  DOCUMENT_ME */
-  public static final int TYPE_EXT_DD = 3;
-
-  /** The Constant TYPE_PLAYER.  DOCUMENT_ME */
-  public static final int TYPE_PLAYER = 4;
+  /**
+   * .
+   */
+  public enum Type {
+    DIRECTORY, FILES_CD, NETWORK_DRIVE, EXTDD, PLAYER
+  }
 
   /** Device URL (performances). */
   private String sUrl;
-
   /** IO file for optimizations*. */
   private java.io.File fio;
-
   /** Mounted device flag. */
   private boolean bMounted = false;
-
   /** directories. */
   private final List<Directory> alDirectories = new ArrayList<Directory>(20);
-
   /** Already refreshing flag. */
-  private volatile boolean bAlreadyRefreshing = false;
-
+  private volatile boolean bAlreadyRefreshing = false; //NOSONAR
   /** Already synchronizing flag. */
-  private volatile boolean bAlreadySynchronizing = false;
-
+  private volatile boolean bAlreadySynchronizing = false; //NOSONAR
   /** Volume of created files during synchronization. */
   private long lVolume = 0;
-
   /** date last refresh. */
   private long lDateLastRefresh;
-
   /** Progress reporter *. */
   private RefreshReporter reporter;
-
   /** Refresh deepness choice *. */
   private int choice = Device.OPTION_REFRESH_DEEP;
-
-  /** [PERF] cache rootDir directory */
+  /** [PERF] cache rootDir directory. */
   private Directory rootDir;
 
   /**
    * Device constructor.
    * 
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
+   * @param sId 
+   * @param sName 
    */
   Device(final String sId, final String sName) {
     super(sId, sName);
@@ -139,9 +116,9 @@ public class Device extends PhysicalItem implements Comparable<Device> {
   /**
    * Adds the directory.
    * 
-   * @param directory DOCUMENT_ME
+   * @param directory 
    */
-  public void addDirectory(final Directory directory) {
+  void addDirectory(final Directory directory) {
     alDirectories.add(directory);
   }
 
@@ -156,23 +133,18 @@ public class Device extends PhysicalItem implements Comparable<Device> {
     long l = System.currentTimeMillis();
     // directories cleanup
     boolean bChanges = cleanDirectories(dirsToRefresh);
-
     // files cleanup
     bChanges = bChanges | cleanFiles(dirsToRefresh);
-
     // Playlist cleanup
     bChanges = bChanges | cleanPlaylist(dirsToRefresh);
-
     // clear history to remove old files referenced in it
     if (Conf.getString(Const.CONF_HISTORY) != null) {
       History.getInstance().clear(Integer.parseInt(Conf.getString(Const.CONF_HISTORY)));
     }
-
     // delete old history items
     l = System.currentTimeMillis() - l;
     Log.debug("{{" + getName() + "}} Old file references cleaned in: "
-        + ((l < 1000) ? l + " ms" : l / 1000 + " s, changes: " + bChanges));
-
+        + ((l < 1000) ? l + " ms, changes: " + bChanges : l / 1000 + " s, changes: " + bChanges));
     return bChanges;
   }
 
@@ -204,6 +176,9 @@ public class Device extends PhysicalItem implements Comparable<Device> {
           && !plf.getFIO().exists()) {
         PlaylistManager.getInstance().removeItem(plf);
         Log.debug("Removed: " + plf);
+        if (reporter != null) {
+          reporter.notifyFileOrPlaylistDropped();
+        }
         bChanges = true;
       }
     }
@@ -242,6 +217,9 @@ public class Device extends PhysicalItem implements Comparable<Device> {
         FileManager.getInstance().removeFile(file);
         Log.debug("Removed: " + file);
         bChanges = true;
+        if (reporter != null) {
+          reporter.notifyFileOrPlaylistDropped();
+        }
       }
     }
     return bChanges;
@@ -256,15 +234,16 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    */
   private boolean cleanDirectories(List<Directory> dirsToRefresh) {
     boolean bChanges = false;
-    // need to use a shallow copy to avoid concurrent exceptions
-
     List<Directory> dirs = null;
     if (dirsToRefresh == null) {
       dirs = DirectoryManager.getInstance().getDirectories();
     } else {
-      dirs = dirsToRefresh;
+      // If one or more named directories are provided, not only clean them up but also their sub directories
+      dirs = new ArrayList<Directory>(dirsToRefresh);
+      for (Directory dir : dirsToRefresh) {
+        dirs.addAll(dir.getDirectoriesRecursively());
+      }
     }
-
     for (final Directory dir : dirs) {
       if (!ExitService.isExiting() && dir.getDevice().equals(this) && dir.getDevice().isMounted()
           && !dir.getFio().exists()) {
@@ -280,7 +259,7 @@ public class Device extends PhysicalItem implements Comparable<Device> {
   /**
    * Alphabetical comparator used to display ordered lists of devices.
    * 
-   * @param otherDevice DOCUMENT_ME
+   * @param otherDevice 
    * 
    * @return comparison result
    */
@@ -290,7 +269,6 @@ public class Device extends PhysicalItem implements Comparable<Device> {
     if (otherDevice == null) {
       return -1;
     }
-
     // We must be consistent with equals, see
     // http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html
     int comp = getName().compareToIgnoreCase(otherDevice.getName());
@@ -310,23 +288,21 @@ public class Device extends PhysicalItem implements Comparable<Device> {
     return lDateLastRefresh;
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_Device") + " : " + getName();
   }
 
   /**
-   * Gets the device type s.
+   * Gets the device type as a string.
    * 
-   * @return the device type s
+   * @return the device type as string
    */
   public String getDeviceTypeS() {
-    return DeviceManager.getInstance().getDeviceType(getType());
+    return getType().name();
   }
 
   /**
@@ -349,7 +325,6 @@ public class Device extends PhysicalItem implements Comparable<Device> {
     if (dirRoot != null) {
       return dirRoot.getFilesRecursively();
     }
-
     // nothing found, return empty list
     return new ArrayList<org.jajuk.base.File>();
   }
@@ -359,7 +334,7 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    * 
    * @return Returns the IO file reference to this directory.
    */
-  public File getFio() {
+  public File getFIO() {
     return fio;
   }
 
@@ -371,13 +346,34 @@ public class Device extends PhysicalItem implements Comparable<Device> {
   @Override
   public String getHumanValue(final String sKey) {
     if (Const.XML_TYPE.equals(sKey)) {
-      final long lType = getLongValue(sKey);
-      return DeviceManager.getInstance().getDeviceType(lType);
+      return getTypeLabel(getType());
     } else {// default
       return super.getHumanValue(sKey);
     }
   }
 
+  /**
+   * Return label for a type.
+   *
+   * @param type 
+   * @return label for a type
+   */
+  public static String getTypeLabel(Type type) {
+    if (type == Type.DIRECTORY) {
+      return Messages.getString("Device_type.directory");
+    } else if (type == Type.FILES_CD) {
+      return Messages.getString("Device_type.file_cd");
+    } else if (type == Type.EXTDD) {
+      return Messages.getString("Device_type.extdd");
+    } else if (type == Type.PLAYER) {
+      return Messages.getString("Device_type.player");
+    } else if (type == Type.NETWORK_DRIVE) {
+      return Messages.getString("Device_type.network_drive");
+    } else {
+      return null;
+    }
+  }
+
   /*
    * (non-Javadoc)
    * 
@@ -385,38 +381,67 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    */
   @Override
   public ImageIcon getIconRepresentation() {
-    switch ((int) getType()) {
-    case 0:
-      return setIcon(IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_MOUNTED_SMALL),
+    if (getType() == Type.DIRECTORY) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_MOUNTED_SMALL),
           IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_UNMOUNTED_SMALL));
-    case 1:
-      return setIcon(IconLoader.getIcon(JajukIcons.DEVICE_CD_MOUNTED_SMALL),
+    } else if (getType() == Type.FILES_CD) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_CD_MOUNTED_SMALL),
           IconLoader.getIcon(JajukIcons.DEVICE_CD_UNMOUNTED_SMALL));
-    case 2:
-      return setIcon(IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED_SMALL),
+    } else if (getType() == Type.NETWORK_DRIVE) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED_SMALL),
           IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED_SMALL));
-    case 3:
-      return setIcon(IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_MOUNTED_SMALL),
+    } else if (getType() == Type.EXTDD) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_MOUNTED_SMALL),
           IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_UNMOUNTED_SMALL));
-    case 4:
-      return setIcon(IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_MOUNTED_SMALL),
+    } else if (getType() == Type.PLAYER) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_MOUNTED_SMALL),
           IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_UNMOUNTED_SMALL));
-    default:
-      Log.warn("Unknown type of device detected: " + getType());
+    } else {
+      Log.warn("Unknown type of device detected: " + getType().name());
       return null;
     }
   }
 
+  /*
+   * Return large icon representation of the device
+   * @Return large icon representation of the device
+   */
   /**
-   * Sets the icon.
-   * 
+   * Gets the icon representation large.
+   *
+   * @return the icon representation large
+   */
+  public ImageIcon getIconRepresentationLarge() {
+    if (getType() == Type.DIRECTORY) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_MOUNTED),
+          IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_UNMOUNTED));
+    } else if (getType() == Type.FILES_CD) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_CD_MOUNTED),
+          IconLoader.getIcon(JajukIcons.DEVICE_CD_UNMOUNTED));
+    } else if (getType() == Type.NETWORK_DRIVE) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED),
+          IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED));
+    } else if (getType() == Type.EXTDD) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_MOUNTED),
+          IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_UNMOUNTED));
+    } else if (getType() == Type.PLAYER) {
+      return rightIcon(IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_MOUNTED),
+          IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_UNMOUNTED));
+    } else {
+      Log.warn("Unknown type of device detected: " + getType().name());
+      return null;
+    }
+  }
+
+  /**
+   * Return the right icon between mounted or unmounted.
+   *
    * @param mountedIcon The icon to return for a mounted device
    * @param unmountedIcon The icon to return for an unmounted device
-   * 
    * @return Returns either of the two provided icons depending on the state of
    * the device
    */
-  private ImageIcon setIcon(ImageIcon mountedIcon, ImageIcon unmountedIcon) {
+  private ImageIcon rightIcon(ImageIcon mountedIcon, ImageIcon unmountedIcon) {
     if (isMounted()) {
       return mountedIcon;
     } else {
@@ -430,7 +455,7 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return Const.XML_DEVICE;
   }
 
@@ -441,7 +466,7 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    */
   public Directory getRootDirectory() {
     if (rootDir == null) {
-      rootDir = DirectoryManager.getInstance().getDirectoryForIO(getFio(), this);
+      rootDir = DirectoryManager.getInstance().getDirectoryForIO(getFIO(), this);
     }
     return rootDir;
   }
@@ -451,8 +476,8 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    * 
    * @return the type
    */
-  public long getType() {
-    return getLongValue(Const.XML_TYPE);
+  public Device.Type getType() {
+    return Type.values()[(int) getLongValue(Const.XML_TYPE)];
   }
 
   /**
@@ -533,29 +558,16 @@ public class Device extends PhysicalItem implements Comparable<Device> {
         cleanRemovedFiles(dirsToRefresh);
       }
       reporter.cleanupDone();
-
       // Actual refresh
       refreshCommand(((i == Device.OPTION_REFRESH_DEEP) || forcedDeep), true, dirsToRefresh);
-     
+      // cleanup logical items
+      org.jajuk.base.Collection.cleanupLogical();
       // if it is a move, clean old files *after* the refresh
       if (bAfterMove) {
         cleanRemovedFiles(dirsToRefresh);
       }
-
       // notify views to refresh
       ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
-      // Commit collection at each refresh (can be useful if
-      // application
-      // is closed brutally with control-C or shutdown and that
-      // exit hook has no time to perform commit).
-      // But don't commit when any device is refreshing to avoid collisions.
-      if (!DeviceManager.getInstance().isAnyDeviceRefreshing()) {
-        try {
-          org.jajuk.base.Collection.commit(SessionService.getConfFileByPath(Const.FILE_COLLECTION));
-        } catch (final IOException e) {
-          Log.error(e);
-        }
-      }
     } finally {
       // Do not let current reporter as a manual reporter because it would fail
       // in NPE with auto-refresh
@@ -568,14 +580,14 @@ public class Device extends PhysicalItem implements Comparable<Device> {
   /**
    * Prepare manual refresh.
    * 
-   * @param bAsk DOCUMENT_ME
+   * @param bAsk ask user to perform deep or fast refresh 
    * 
    * @return the user choice (deep or fast)
    * 
    * @throws JajukException if user canceled, device cannot be refreshed or device already
    * refreshing
    */
-  public int prepareRefresh(final boolean bAsk) throws JajukException {
+  int prepareRefresh(final boolean bAsk) throws JajukException {
     if (bAsk) {
       final Object[] possibleValues = { Messages.getString("FilesTreeView.60"),// fast
           Messages.getString("FilesTreeView.61"),// deep
@@ -584,9 +596,10 @@ public class Device extends PhysicalItem implements Comparable<Device> {
         SwingUtilities.invokeAndWait(new Runnable() {
           @Override
           public void run() {
-            choice = JOptionPane.showOptionDialog(null, Messages.getString("FilesTreeView.59"),
-                Messages.getString("Option"), JOptionPane.DEFAULT_OPTION,
-                JOptionPane.QUESTION_MESSAGE, null, possibleValues, possibleValues[0]);
+            choice = JOptionPane.showOptionDialog(JajukMainWindow.getInstance(),
+                Messages.getString("FilesTreeView.59"), Messages.getString("Option"),
+                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, possibleValues,
+                possibleValues[0]);
           }
         });
       } catch (Exception e) {
@@ -597,7 +610,6 @@ public class Device extends PhysicalItem implements Comparable<Device> {
         return choice;
       }
     }
-
     // JajukException are not trapped, will be thrown to the caller
     final Device device = this;
     if (!device.isMounted()) {
@@ -614,37 +626,34 @@ public class Device extends PhysicalItem implements Comparable<Device> {
 
   /**
    * Check that the device is available and not void.
-   * 
-   * @param bManual manual or automatic refresh ?
+   * <p>We Cannot mount void devices because of the jajuk reference cleanup thread 
+   * ( a refresh would clear the entire device collection)</p>
    * 
    * @return true if the device is ready for mounting, false if the device is void
    * 
-   * @throws JajukException if the device is not accessible
    */
-  private boolean checkDevice(boolean bManual) throws JajukException {
+  private boolean checkDevice() {
+    return pathExists() && !isVoid();
+  }
+
+  /**
+   * Return whether a device maps a void directory.
+   *
+   * @return whether a device maps a void directory
+   */
+  private boolean isVoid() {
     final File file = new File(getUrl());
-    if (!file.exists()) {
-      throw new JajukException(11, "\"" + getName() + "\" at URL : " + getUrl());
-    }
-    /*
-     * Cannot mount void devices because of the jajuk reference cleanup thread 
-     * ( a refresh would clear the entire device collection)
-     */
-    if (file.listFiles() == null || file.listFiles().length == 0) {
-      if (bManual) {
-        final int answer = Messages.getChoice(
-            "[" + getName() + "] " + Messages.getString("Confirmation_void_refresh"),
-            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
-        // leave if user doesn't confirm to mount the void device
-        return (answer == JOptionPane.YES_OPTION);
-      } else {
-        // In auto mode, never mount a void device
-        return false;
-      }
-    } else {
-      // Device is not void
-      return true;
-    }
+    return (file.listFiles() == null || file.listFiles().length == 0);
+  }
+
+  /**
+   * Return whether the device path exists at this time.
+   *
+   * @return whether the device path exists at this time
+   */
+  private boolean pathExists() {
+    final File file = new File(getUrl());
+    return file.exists();
   }
 
   /**
@@ -652,20 +661,34 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    * 
    * @param bManual set whether mount is manual or auto
    * 
-   * @return whether the device has been mounted
+   * @return whether the device has been mounted. If user is asked for mounting but cancel, this method returns false.
    * 
-   * @throws JajukException if device cannot be mounted
+   * @throws JajukException if device cannot be mounted due to technical reason.
    */
   public boolean mount(final boolean bManual) throws JajukException {
     if (bMounted) {
+      // Device already mounted
       throw new JajukException(111);
     }
-    // Check if we can mount the device. It can throw a JajukException if void or unavailable
-    // device
-    boolean readyToMount = checkDevice(bManual);
+    // Check if we can mount the device. 
+    boolean readyToMount = checkDevice();
     // Effective mounting if available.
     if (readyToMount) {
       bMounted = true;
+    } else if (pathExists() && isVoid() && bManual) {
+      // If the device is void and in manual mode, leave a chance to the user to 
+      // force it
+      final int answer = Messages.getChoice(
+          "[" + getName() + "] " + Messages.getString("Confirmation_void_refresh"),
+          JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
+      // leave if user doesn't confirm to mount the void device
+      if (answer != JOptionPane.YES_OPTION) {
+        return false;
+      } else {
+        bMounted = true;
+      }
+    } else {
+      throw new JajukException(11, "\"" + getName() + "\" at URL : " + getUrl());
     }
     // notify views to refresh if needed
     ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_MOUNT));
@@ -690,22 +713,20 @@ public class Device extends PhysicalItem implements Comparable<Device> {
         // no more a boolean
         if (meta.getName().equals(Const.XML_DEVICE_AUTO_REFRESH)
             && (sValue.equalsIgnoreCase(Const.TRUE) || sValue.equalsIgnoreCase(Const.FALSE))) {
-          switch ((int) getType()) {
-          case TYPE_DIRECTORY: // directory
+          if (getType() == Type.DIRECTORY) {
             sValue = "0.5d";
-            break;
-          case TYPE_CD: // file cd
+          }
+          if (getType() == Type.FILES_CD) {
             sValue = "0d";
-            break;
-          case TYPE_NETWORK_DRIVE: // network drive
+          }
+          if (getType() == Type.NETWORK_DRIVE) {
             sValue = "0d";
-            break;
-          case TYPE_EXT_DD: // ext dd
+          }
+          if (getType() == Type.EXTDD) {
             sValue = "3d";
-            break;
-          case TYPE_PLAYER: // player
+          }
+          if (getType() == Type.PLAYER) {
             sValue = "3d";
-            break;
           }
         }
         try {
@@ -766,7 +787,7 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    * 
    * @return true if some changes occurred in device
    */
-  public synchronized boolean refreshCommand(final boolean bDeepScan, final boolean bManual,
+  boolean refreshCommand(final boolean bDeepScan, final boolean bManual,
       List<Directory> dirsToRefresh) {
     try {
       // Check if this device is mounted (useful when called by
@@ -774,13 +795,11 @@ public class Device extends PhysicalItem implements Comparable<Device> {
       if (!isMounted()) {
         return false;
       }
-
       // Check that device is still available
-      boolean readyToMount = checkDevice(bManual);
+      boolean readyToMount = checkDevice();
       if (!readyToMount) {
         return false;
       }
-
       bAlreadyRefreshing = true;
       // reporter is already set in case of manual refresh
       if (reporter == null) {
@@ -797,7 +816,6 @@ public class Device extends PhysicalItem implements Comparable<Device> {
       int iNbFilesBeforeRefresh = FileManager.getInstance().getElementCount();
       int iNbDirsBeforeRefresh = DirectoryManager.getInstance().getElementCount();
       int iNbPlaylistsBeforeRefresh = PlaylistManager.getInstance().getElementCount();
-
       if (bDeepScan && Log.isDebugEnabled()) {
         Log.debug("Starting refresh of device : " + this);
       }
@@ -807,7 +825,6 @@ public class Device extends PhysicalItem implements Comparable<Device> {
       if (!getDirectories().contains(top)) {
         addDirectory(top);
       }
-
       // Start actual scan
       List<Directory> dirs = null;
       if (dirsToRefresh == null) {
@@ -820,7 +837,6 @@ public class Device extends PhysicalItem implements Comparable<Device> {
       for (Directory dir : dirs) {
         scanRecursively(dir, bDeepScan);
       }
-
       // Force a GUI refresh if new files or directories discovered or have been
       // removed
       if (((FileManager.getInstance().getElementCount() - iNbFilesBeforeRefresh) != 0)
@@ -836,8 +852,6 @@ public class Device extends PhysicalItem implements Comparable<Device> {
     } finally {
       // make sure to unlock refreshing even if an error occurred
       bAlreadyRefreshing = false;
-      // cleanup logical items
-      org.jajuk.base.Collection.cleanupLogical();
       // reporter is null if mount is not mounted due to early return
       if (reporter != null) {
         // Notify the reporter of the actual refresh startup
@@ -937,7 +951,7 @@ public class Device extends PhysicalItem implements Comparable<Device> {
   /**
    * Synchronize action itself.
    */
-  public void synchronizeCommand() {
+  void synchronizeCommand() {
     try {
       bAlreadySynchronizing = true;
       long lTime = System.currentTimeMillis();
@@ -1003,8 +1017,8 @@ public class Device extends PhysicalItem implements Comparable<Device> {
   /**
    * Synchronize a device with another one (unidirectional).
    * 
-   * @param dSrc DOCUMENT_ME
-   * @param dest DOCUMENT_ME
+   * @param dSrc 
+   * @param dest 
    * 
    * @return nb of created files
    */
@@ -1173,9 +1187,8 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    */
   @Override
   public String toString() {
-    return "Device[ID=" + getID() + " Name=" + getName() + " Type="
-        + DeviceManager.getInstance().getDeviceType(getLongValue(Const.XML_TYPE)) + " URL=" + sUrl
-        + "]";
+    return "Device[ID=" + getID() + " Name=" + getName() + " Type=" + getType().name() + " URL="
+        + sUrl + "]";
   }
 
   /**
@@ -1189,7 +1202,7 @@ public class Device extends PhysicalItem implements Comparable<Device> {
    * Unmount the device with ejection.
    * 
    * @param bEjection set whether the device must be ejected
-   * @param bUIRefresh set wheter the UI should be refreshed
+   * @param bUIRefresh set whether the UI should be refreshed
    */
   public void unmount(final boolean bEjection, final boolean bUIRefresh) {
     // look to see if the device is already mounted
@@ -1207,5 +1220,4 @@ public class Device extends PhysicalItem implements Comparable<Device> {
       ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_UNMOUNT));
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/DeviceManager.java b/src/main/java/org/jajuk/base/DeviceManager.java
index 71ec03d..f8040d7 100644
--- a/src/main/java/org/jajuk/base/DeviceManager.java
+++ b/src/main/java/org/jajuk/base/DeviceManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,11 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.io.File;
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -47,23 +45,12 @@ import org.jajuk.util.log.Log;
  * Convenient class to manage devices.
  */
 public final class DeviceManager extends ItemManager {
-
-  /** Supported device types names. */
-  private final List<String> alDevicesTypes = new ArrayList<String>(10);
-
   /** Self instance. */
   private static DeviceManager singleton = new DeviceManager();
-
   /** Date last global refresh. */
   private long lDateLastGlobalRefresh = 0;
-
   /** List of deep-refresh devices after an upgrade. */
   private final Set<Device> devicesDeepRefreshed = new HashSet<Device>();
-
-  /** DeviceTypes Identification strings  Note: this needs to correspond with the constants in @see org.jajuk.base.Device !! */
-  public static final String[] DEVICE_TYPES = { "Device_type.directory", "Device_type.file_cd",
-      "Device_type.network_drive", "Device_type.extdd", "Device_type.player" };
-
   /** Auto-refresh thread. */
   private final Thread tAutoRefresh = new Thread("Device Auto Refresh Thread") {
     @Override
@@ -78,8 +65,6 @@ public final class DeviceManager extends ItemManager {
       }
     }
   };
-
-  /** DOCUMENT_ME. */
   private volatile boolean bGlobalRefreshing = false;
 
   /**
@@ -119,7 +104,7 @@ public final class DeviceManager extends ItemManager {
 
   /**
    * Start auto refresh thread.
-   * DOCUMENT_ME
+   * 
    */
   public void startAutoRefreshThread() {
     if (!tAutoRefresh.isAlive()) {
@@ -140,33 +125,33 @@ public final class DeviceManager extends ItemManager {
   /**
    * Register a device.
    * 
-   * @param sName DOCUMENT_ME
-   * @param lDeviceType DOCUMENT_ME
-   * @param sUrl DOCUMENT_ME
+   * @param sName 
+   * @param deviceType 
+   * @param sUrl 
    * 
    * @return device
    */
-  public Device registerDevice(String sName, long lDeviceType, String sUrl) {
+  public Device registerDevice(String sName, Device.Type deviceType, String sUrl) {
     String sId = createID(sName);
-    return registerDevice(sId, sName, lDeviceType, sUrl);
+    return registerDevice(sId, sName, deviceType, sUrl);
   }
 
   /**
    * Register a device with a known id.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param lDeviceType DOCUMENT_ME
-   * @param sUrl DOCUMENT_ME
+   * @param sId 
+   * @param sName 
+   * @param deviceType 
+   * @param sUrl 
    * @return device
    */
-  public Device registerDevice(String sId, String sName, long lDeviceType, String sUrl) {
+  Device registerDevice(String sId, String sName, Device.Type deviceType, String sUrl) {
     Device device = getDeviceByID(sId);
     if (device != null) {
       return device;
     }
     device = new Device(sId, sName);
-    device.setProperty(Const.XML_TYPE, lDeviceType);
+    device.setProperty(Const.XML_TYPE, (long) deviceType.ordinal());
     device.setUrl(sUrl);
     registerItem(device);
     return device;
@@ -174,17 +159,16 @@ public final class DeviceManager extends ItemManager {
 
   /**
    * Check none device already has this name or is a parent directory.
-   * 
-   * @param sName DOCUMENT_ME
-   * @param iDeviceType DOCUMENT_ME
-   * @param sUrl DOCUMENT_ME
-   * @param bNew DOCUMENT_ME
-   * 
+   *
+   * @param sName 
+   * @param deviceType 
+   * @param sUrl 
+   * @param bNew 
    * @return 0:ok or error code
    */
-  public int checkDeviceAvailablity(String sName, int iDeviceType, String sUrl, boolean bNew) {
+  public int checkDeviceAvailablity(String sName, Device.Type deviceType, String sUrl, boolean bNew) {
     // don't check if it is a CD as all CDs may use the same mount point
-    if (iDeviceType == Device.TYPE_CD) {
+    if (deviceType == Device.Type.FILES_CD) {
       return 0;
     }
     // check name and path
@@ -207,7 +191,7 @@ public final class DeviceManager extends ItemManager {
       }
     }
     // check availability
-    if (iDeviceType != Device.TYPE_EXT_DD) { // not a remote device, TBI for remote
+    if (deviceType != Device.Type.EXTDD) { // not a remote device, TBI for remote
       // test directory is available
       File file = new File(sUrl);
       // check if the url exists and is readable
@@ -219,33 +203,15 @@ public final class DeviceManager extends ItemManager {
   }
 
   /**
-   * Register a device type.
-   * 
-   * @param sDeviceType DOCUMENT_ME
-   */
-  public void registerDeviceType(String sDeviceType) {
-    alDevicesTypes.add(sDeviceType);
-  }
-
-  /**
-   * Gets the device types number.
-   * 
-   * @return number of registered devices
-   */
-  public int getDeviceTypesNumber() {
-    return alDevicesTypes.size();
-  }
-
-  /**
    * Return first device found being parent of the provided path.
    * 
-   * @param path DOCUMENT_ME
+   * @param path 
    * 
    * @return  first device found being parent of the provided path
    */
-  public Device getDeviceByPath(File path) {
+  Device getDeviceByPath(File path) {
     for (Device device : getDevices()) {
-      if (UtilSystem.isAncestor(device.getFio(), path)) {
+      if (UtilSystem.isAncestor(device.getFIO(), path)) {
         return device;
       }
     }
@@ -253,30 +219,10 @@ public final class DeviceManager extends ItemManager {
   }
 
   /**
-   * Gets the device types.
-   * 
-   * @return Device types iteration
-   */
-  public Iterator<String> getDeviceTypes() {
-    return alDevicesTypes.iterator();
-  }
-
-  /**
-   * Get a device type name for a given index.
-   * 
-   * @param index DOCUMENT_ME
-   * 
-   * @return device name for a given index
-   */
-  public String getDeviceType(long index) {
-    return alDevicesTypes.get((int) index);
-  }
-
-  /**
-   * Remove a device.
-   * 
-   * @param device DOCUMENT_ME
-   */
+  * Remove a device.
+  * 
+  * @param device 
+  */
   public void removeDevice(Device device) {
     lock.writeLock().lock();
     try {
@@ -346,35 +292,13 @@ public final class DeviceManager extends ItemManager {
     return bOut;
   }
 
-  /**
-   * Clean all devices.
-   */
-  public void cleanAllDevices() {
-    lock.writeLock().lock();
-    try {
-      for (Device device : getDevices()) {
-        // Do not auto-refresh CD as several CD may share the same mount
-        // point
-        if (device.getType() == Device.TYPE_CD) {
-          continue;
-        }
-        FileManager.getInstance().cleanDevice(device.getName());
-        DirectoryManager.getInstance().cleanDevice(device.getName());
-        PlaylistManager.getInstance().cleanDevice(device.getName());
-      }
-      clear();
-    } finally {
-      lock.writeLock().unlock();
-    }
-  }
-
   /*
    * (non-Javadoc)
    * 
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_DEVICES;
   }
 
@@ -391,7 +315,7 @@ public final class DeviceManager extends ItemManager {
    * Refresh of all devices with auto-refresh enabled (used in automatic mode)
    * Must be the shortest possible.
    */
-  public void refreshAllDevices() {
+  void refreshAllDevices() {
     try {
       // check thread is not already refreshing
       if (bGlobalRefreshing) {
@@ -403,7 +327,7 @@ public final class DeviceManager extends ItemManager {
       for (Device device : getDevices()) {
         // Do not auto-refresh CD as several CD may share the same mount
         // point
-        if (device.getType() == Device.TYPE_CD) {
+        if (device.getType() == Device.Type.FILES_CD) {
           continue;
         }
         double frequency = 60000 * device.getDoubleValue(Const.XML_DEVICE_AUTO_REFRESH);
@@ -432,9 +356,10 @@ public final class DeviceManager extends ItemManager {
           // refresh the device (deep refresh forced after an upgrade)
           bNeedUIRefresh = bNeedUIRefresh
               | device.refreshCommand(bNeedDeepAfterUpgrade, false, null);
-
           // UI refresh if required
           if (bNeedUIRefresh) {
+            // Cleanup logical items
+            Collection.cleanupLogical();
             /*
              * Notify views to refresh once the device is refreshed, do not wait all devices
              * refreshing as it may be tool long
diff --git a/src/main/java/org/jajuk/base/Directory.java b/src/main/java/org/jajuk/base/Directory.java
index bc781c4..3e1a1ab 100644
--- a/src/main/java/org/jajuk/base/Directory.java
+++ b/src/main/java/org/jajuk/base/Directory.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -30,19 +30,19 @@ import java.util.Set;
 
 import javax.swing.ImageIcon;
 
-import org.jajuk.services.bookmark.History;
 import org.jajuk.services.core.ExitService;
 import org.jajuk.services.tags.Tag;
 import org.jajuk.ui.helpers.RefreshReporter;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukFileFilter;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilFeatures;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.error.JajukRuntimeException;
+import org.jajuk.util.filters.AudioFilter;
 import org.jajuk.util.log.Log;
 
 /**
@@ -51,26 +51,21 @@ import org.jajuk.util.log.Log;
  * Physical item.
  */
 public class Directory extends PhysicalItem implements Comparable<Directory> {
-
   /** Parent directory ID*. */
   private final Directory dParent;
-
   /** Directory device. */
   private final Device device;
-
   /** IO file for optimizations*. */
   private java.io.File fio;
-
-  /** DOCUMENT_ME. */
   private long discID = -1l;
 
   /**
    * Directory constructor.
-   * 
-   * @param sName DOCUMENT_ME
-   * @param sId DOCUMENT_ME
-   * @param dParent DOCUMENT_ME
-   * @param device DOCUMENT_ME
+   *
+   * @param sId 
+   * @param sName 
+   * @param dParent 
+   * @param device 
    */
   Directory(String sId, String sName, Directory dParent, Device device) {
     super(sId, sName);
@@ -91,7 +86,7 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return XML_DIRECTORY;
   }
 
@@ -189,7 +184,7 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
   /**
    * return ordered sibling files from the given file index.
    * 
-   * @param fileStart DOCUMENT_ME
+   * @param fileStart 
    * 
    * @return files or null if the given file is unknown
    */
@@ -242,7 +237,7 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
    * 
    * @return true, if given directory is a parent directory of this directory
    */
-  public boolean hasAncestor(Directory directory) {
+  boolean hasAncestor(Directory directory) {
     Directory dirTested = this;
     while (true) {
       if (!dirTested.equals(this) && dirTested.equals(directory)) {
@@ -279,27 +274,16 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
    * force files tag read
    * @param reporter Refresh handler
    */
-  public void scan(boolean bDeepScan, RefreshReporter reporter) {
-
-    // Wait a given delay (Bug #1793 : some NAS crash due to overload)
-    try {
-      Thread.sleep(Conf.getInt(CONF_REFRESHING_DELAY_MS));
-    } catch (Exception e) {
-      Log.error(e);
-    }
-
+  void scan(boolean bDeepScan, RefreshReporter reporter) {
     // Make sure to reset the disc ID
     this.discID = -1;
     java.io.File[] filelist = getFio().listFiles(UtilSystem.getFileFilter());
     if (filelist == null || filelist.length == 0) { // none file, leave
       return;
     }
-
     // Create a list of music files and playlist files to consider
     List<File> musicFiles = new ArrayList<File>(filelist.length);
-    List<File> playlistFiles = new ArrayList<File>(filelist.length);
-    List<Long> durations = new ArrayList<Long>(filelist.length);
-
+    List<File> playlistFiles = new ArrayList<File>(1 + filelist.length / 10);
     for (int i = 0; i < filelist.length; i++) {
       // Leave ASAP if exit request
       if (ExitService.isExiting()) {
@@ -312,46 +296,28 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
             + "}}");
         continue;
       }
-
       // Ignore iTunes files
       if (filelist[i].getName().startsWith("._")) {
         continue;
       }
-
       // check if we recognize the file as music file
       String extension = UtilSystem.getExtension(filelist[i]);
       Type type = TypeManager.getInstance().getTypeByExtension(extension);
-
-      // Now, compute disc ID and cache tags (only in deep mode because we don't
-      // want to read tags in fast modes)
-      if (bDeepScan && type.getTagImpl() != null) {
-        try {
-          Tag tag = Tag.getTagForFio(filelist[i], false);
-          durations.add(tag.getLength());
-        } catch (JajukException je) {
-          Log.error(je);
-        }
-      }
-
-      boolean bIsMusic = (Boolean) type.getValue(Const.XML_TYPE_IS_MUSIC);
-      if (bIsMusic) {
+      // Now, compute disc ID and cache tags 
+      if (type.getBooleanValue(Const.XML_TYPE_IS_MUSIC)) {
         musicFiles.add(filelist[i]);
       } else { // playlist
         playlistFiles.add(filelist[i]);
       }
     }
-
-    // Compute the disc id (deep mode only)
-    if (bDeepScan) {
-      this.discID = UtilFeatures.computeDiscID(durations);
-    }
-
+    // Compute the disc id 
+    this.discID = computeDiscID();
     // Perform actual scan and check errors for each file
-    for (File musicfile : musicFiles) {
+    for (File musicFile : musicFiles) {
       try {
-        scanMusic(musicfile, bDeepScan, reporter);
+        scanMusic(musicFile, bDeepScan, reporter);
       } catch (Exception e) {
-        Log.error(103, filelist.length > 0 ? "{{" + musicfile.toString() + "}}" : "", e);
+        Log.error(103, filelist.length > 0 ? "{{" + musicFile.toString() + "}}" : "", e);
       }
     }
     for (File playlistFile : playlistFiles) {
@@ -363,7 +329,6 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
     }
     // Clear the tag cache so tags are actually read at next deep refresh
     Tag.clearCache();
-
     // Force cover detection (after done once, the cover file is cached as album property)
     // We need this to avoid bug #1550 : if the device is created, then unplugged, catalog
     // view cover/no-cover filter is messed-up because the findCover() method always return null.
@@ -374,10 +339,26 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
   }
 
   /**
+   * Compute the directory disc id (simply the sum in bits of the audio files lengths)
+   * @return the directory disc id
+   */
+  private long computeDiscID() {
+    long out = 0;
+    JajukFileFilter filter = new JajukFileFilter(AudioFilter.getInstance());
+    File fDir = getFio();
+    java.io.File[] files = fDir.listFiles();// null if none file
+    // found
+    for (int i = 0; files != null && i < files.length; i++) {
+      if (filter.accept(files[i])) {
+        out += files[i].length();
+      }
+    }
+    return out;
+  }
+
+  /**
    * Return list of albums for current directory.
-   * 
-   * @param 
-   * 
+   *
    * @return list of albums for current directory
    */
   public Set<Album> getAlbums() {
@@ -391,11 +372,10 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
 
   /**
    * Scan music.
-   * 
-   * @param bDeepScan DOCUMENT_ME
-   * @param reporter DOCUMENT_ME
-   * @param music DOCUMENT_ME
-   * 
+   *
+   * @param music 
+   * @param bDeepScan 
+   * @param reporter 
    * @throws JajukException the jajuk exception
    */
   private void scanMusic(java.io.File music, boolean bDeepScan, RefreshReporter reporter)
@@ -409,22 +389,18 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
     if (UtilSystem.isUnderWindows() && fileRef != null) {
       fileRef.setName(lName);
     }
-
     // if known file and no deep scan, just leave
     if (fileRef != null && !bDeepScan) {
       return;
     }
-
     // Is this format tag readable ?
     Type type = TypeManager.getInstance().getTypeByExtension(UtilSystem.getExtension(music));
     boolean tagSupported = (type.getTaggerClass() != null);
-
     // Deep refresh : if the audio file format doesn't support tagging (like wav) and the file
     // is already known, continue, no need to try to read tags
     if (!tagSupported && fileRef != null) {
       return;
     }
-
     // Ignore tag error to make sure to get a
     // tag object in all cases.
     Tag tag = Tag.getTagForFio(music, true);
@@ -437,7 +413,6 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
       // if an error occurs, just display a message but keep the track
       Log.error(103, "{{" + music.getAbsolutePath() + "}}", null);
     }
-
     String sTrackName = tag.getTrackName();
     String sAlbumName = tag.getAlbumName();
     String sArtistName = tag.getArtistName();
@@ -449,50 +424,25 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
     long lOrder = tag.getOrder();
     String sAlbumArtist = tag.getAlbumArtist();
     long discNumber = tag.getDiscNumber();
-
     if (fileRef == null && reporter != null) {
       // stats, do it here and not
       // before because we ignore the
       // file if we cannot read it
       reporter.notifyNewFile();
     }
-
     // Store oldDiscID, it is used to clone album and track
     // properties when album disc ID was unset to avoid loosing ratings or custom properties
     long oldDiscID = 0;
     if (fileRef != null) {
       oldDiscID = fileRef.getTrack().getAlbum().getDiscID();
     }
-
     Track track = registerFile(music, sId, sTrackName, sAlbumName, sArtistName, sGenre, length,
         sYear, lQuality, sComment, lOrder, sAlbumArtist, oldDiscID, discID, discNumber);
-
     for (String s : Tag.getActivatedExtraTags()) {
       track.setProperty(s, tag.getTagField(s));
     }
   }
 
-  /**
-   * Register file.
-   * 
-   * @param music DOCUMENT_ME
-   * @param sTrackName DOCUMENT_ME
-   * @param sAlbumName DOCUMENT_ME
-   * @param sArtistName DOCUMENT_ME
-   * @param sGenre DOCUMENT_ME
-   * @param length DOCUMENT_ME
-   * @param sYear DOCUMENT_ME
-   * @param lQuality DOCUMENT_ME
-   * @param sComment DOCUMENT_ME
-   * @param lOrder DOCUMENT_ME
-   * @param sAlbumArtist DOCUMENT_ME
-   * @param discID DOCUMENT_ME
-   * @param discNumber DOCUMENT_ME
-   * @param sFileId DOCUMENT_ME
-   * @param oldDiskID DOCUMENT_ME
-   * 
-   * @return the track
-   */
   private Track registerFile(java.io.File music, String sFileId, String sTrackName,
       String sAlbumName, String sArtistName, String sGenre, long length, String sYear,
       long lQuality, String sComment, long lOrder, String sAlbumArtist, long oldDiskID,
@@ -507,69 +457,84 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
     long trackNumber = TrackManager.getInstance().getElementCount();
     Track track = TrackManager.getInstance().registerTrack(sTrackName, album, genre, artist,
         length, year, lOrder, type, discNumber);
-    // Fix for #1630 : if a album discID = 0 or -1 (when upgrading from older releases), we
-    // clone the properties from the old track mapped with the old album id so we keep rating
-    // (among other data)
-    if (oldDiskID == -1 || oldDiskID == 0) {
-      String oldAlbumID = AlbumManager.createID(sAlbumName, oldDiskID);
-      Album oldAlbum = AlbumManager.getInstance().getAlbumByID(oldAlbumID);
-      if (oldAlbum != null) {
-        // Also clone album properties (useful to keep custom tags)
-        album.cloneProperties(oldAlbum);
-        String oldTrackID = TrackManager.createID(sTrackName, oldAlbum, genre, artist, length,
-            year, lOrder, type, discNumber);
-        Track oldTrack = TrackManager.getInstance().getTrackByID(oldTrackID);
-        if (oldTrack != null) {
-          track.cloneProperties(oldTrack);
-        }
-      }
+    cloneTrackPropertiesIfRemovedMeanwhile(track);
+    cloneAlbumAndTrackPropertiesIfAlbumIDChanged(sTrackName, sAlbumName, length, lOrder, oldDiskID,
+        discID, discNumber, album, genre, year, artist, type, track);
+    org.jajuk.base.File file = FileManager.getInstance().registerFile(sFileId, music.getName(),
+        this, track, music.length(), lQuality);
+    updateDateInformation(file, music, trackNumber, track);
+    // Comment is at the track level, note that we take last
+    // found file comment but we changing a comment, we will
+    // apply to all files for a track
+    track.setComment(sComment);
+    // Apply the album artist
+    track.setAlbumArtist(albumArtist);
+    // Make sure to refresh file size
+    file.setProperty(Const.XML_SIZE, music.length());
+    return track;
+  }
+
+  /**
+   * Force to reset track properties if the track name has been changed so its associated track has been moved to a the attic
+   * @param track
+   */
+  private void cloneTrackPropertiesIfRemovedMeanwhile(Track track) {
+    Track removedTrack = TrackManager.getInstance().getTrackFromAttic(track.getID());
+    if (removedTrack != null) {
+      track.cloneProperties(removedTrack);
     }
+  }
 
+  private void updateDateInformation(org.jajuk.base.File file, java.io.File music,
+      long trackNumber, Track track) {
     // Note date for file date property. CAUTION: do not try to
     // check current date to accelerate refreshing if file has not
     // been modified since last refresh as user can rename a parent
     // directory and the files times under it are not modified
     long lastModified = music.lastModified();
-
     // Use file date if the "force file date" option is used
     if (Conf.getBoolean(Const.CONF_FORCE_FILE_DATE)) {
       track.setDiscoveryDate(new Date(lastModified));
     } else if (TrackManager.getInstance().getElementCount() > trackNumber) {
       // Update discovery date only if it is a new track
-
-      // A new track has been created, we can safely update
-      // the track date
-      // We don't want to update date if the track is already
-      // known, even if
-      // it is a new file because a track can map several
-      // files and discovery date
-      // is a track attribute, not file one
+      // A new track has been created, we can safely update  the track date
+      // We don't want to update date if the track is already known, even if
+      // it is a new file because a track can map several files and discovery date
+      // is a track attribute, not file one.
       track.setDiscoveryDate(new Date());
     }
-
-    org.jajuk.base.File file = FileManager.getInstance().registerFile(sFileId, music.getName(),
-        this, track, music.length(), lQuality);
     // Set file date
     file.setProperty(Const.XML_FILE_DATE, new Date(lastModified));
-    // Comment is at the track level, note that we take last
-    // found file comment but we changing a comment, we will
-    // apply to all files for a track
-    track.setComment(sComment);
-    // Apply the album artist
-    track.setAlbumArtist(albumArtist);
-    // Make sure to refresh file size
-    file.setProperty(Const.XML_SIZE, music.length());
+  }
 
-    return track;
+  private void cloneAlbumAndTrackPropertiesIfAlbumIDChanged(String sTrackName, String sAlbumName,
+      long length, long lOrder, long oldDiskID, long discID, long discNumber, Album album,
+      Genre genre, Year year, Artist artist, Type type, Track track) {
+    // Fix for #1630 : we clone the properties from the old track mapped with the old album id so we keep rating
+    // (among other data)
+    if (oldDiskID != discID) {
+      String oldAlbumID = AlbumManager.createID(sAlbumName, oldDiskID);
+      Album oldAlbum = AlbumManager.getInstance().getAlbumByID(oldAlbumID);
+      if (oldAlbum != null) {
+        // Also clone album properties (useful to keep custom tags)
+        album.cloneProperties(oldAlbum);
+        String oldTrackID = TrackManager.createID(sTrackName, oldAlbum, genre, artist, length,
+            year, lOrder, type, discNumber);
+        Track oldTrack = TrackManager.getInstance().getTrackByID(oldTrackID);
+        if (oldTrack != null) {
+          track.cloneProperties(oldTrack);
+        }
+      }
+    }
   }
 
   /**
    * Scan playlist.
-   * DOCUMENT_ME
    * 
-   * @param file DOCUMENT_ME
-   * @param bDeepScan DOCUMENT_ME
-   * @param reporter DOCUMENT_ME
+   * 
+   * @param file 
+   * @param bDeepScan 
+   * @param reporter 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -582,7 +547,7 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
       return;
     }
     Playlist plFile = PlaylistManager.getInstance().registerPlaylistFile(file, this);
-    plFile.forceRefresh(); // force refresh
+    plFile.load(); // force refresh
     if (plfRef == null && reporter != null) {
       // stats, do it here and not
       // before because we ignore the
@@ -638,11 +603,8 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
 
   /**
    * Alphabetical comparator used to display ordered lists of directories
-   * <p>
-   * Sort ignoring cases
-   * </p>.
    * 
-   * @param otherDirectory DOCUMENT_ME
+   * @param otherDirectory 
    * 
    * @return comparison result
    */
@@ -651,7 +613,6 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
     if (otherDirectory == null) {
       return -1;
     }
-
     // Perf: leave if directories are equals
     if (otherDirectory.equals(this)) {
       return 0;
@@ -682,13 +643,11 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
     return true;
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     String sName = null;
     if (getParentDirectory() == null) {
       sName = getDevice().getUrl();
@@ -750,16 +709,6 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
   }
 
   /**
-   * Set name (useful for Windows because same object can have different cases).
-   * 
-   * @param name Item name
-   */
-  protected void setName(String name) {
-    setProperty(Const.XML_NAME, name);
-    this.name = name;
-  }
-
-  /**
    * Refresh the directory synchronously, no dialog. <br>
    * This method is only a wrapper to Device.refreshCommand() method
    * 
@@ -774,64 +723,6 @@ public class Directory extends PhysicalItem implements Comparable<Directory> {
   }
 
   /**
-   * Scan directory to cleanup removed files and playlists.
-   * 
-   * @return whether some items have been removed
-   */
-  public boolean cleanRemovedFiles() {
-    boolean bChanges = false;
-    // need to use a shallow copy to avoid concurrent exceptions
-    final List<Directory> dirs = DirectoryManager.getInstance().getDirectories();
-    // directories cleanup
-    for (final Item item : dirs) {
-      final Directory dir = (Directory) item;
-      if (!ExitService.isExiting() && dir.getDevice().isMounted() && dir.isChildOf(this)
-          && !dir.getFio().exists()) {
-        // note that associated files are removed too
-        DirectoryManager.getInstance().removeDirectory(dir.getID());
-        Log.debug("Removed: " + dir);
-        bChanges = true;
-      }
-    }
-    // files cleanup
-    final List<org.jajuk.base.File> lFiles = FileManager.getInstance().getFiles();
-    for (final org.jajuk.base.File file : lFiles) {
-      if (!ExitService.isExiting()
-          // Only take into consideration files from this directory or
-          // from
-          // sub-directories
-          && (file.getDirectory().equals(this) || file.getDirectory().isChildOf(this))
-          && file.isReady() &&
-          // Remove file if it doesn't exist any more or if it is a iTunes
-          // file (useful for jajuk < 1.4)
-          !file.getFIO().exists() || file.getName().startsWith("._")) {
-        FileManager.getInstance().removeFile(file);
-        Log.debug("Removed: " + file);
-        bChanges = true;
-      }
-    }
-    // Playlist cleanup
-    final List<Playlist> plfiles = PlaylistManager.getInstance().getPlaylists();
-    for (final Playlist plf : plfiles) {
-      if (!ExitService.isExiting()
-          // Only take into consideration files from this directory or
-          // from
-          // sub-directories
-          && (plf.getDirectory().equals(this) || plf.getDirectory().isChildOf(this))
-          && plf.isReady() && !plf.getFIO().exists()) {
-        PlaylistManager.getInstance().removeItem(plf);
-        Log.debug("Removed: " + plf);
-        bChanges = true;
-      }
-    }
-    // clear history to remove old files referenced in it
-    if (Conf.getString(Const.CONF_HISTORY) != null) {
-      History.getInstance().clear(Integer.parseInt(Conf.getString(Const.CONF_HISTORY)));
-    }
-    return bChanges;
-  }
-
-  /**
    * Return true is this is a child directory of the specified directory.
    * 
    * @param directory ancestor directory
diff --git a/src/main/java/org/jajuk/base/DirectoryManager.java b/src/main/java/org/jajuk/base/DirectoryManager.java
index 7b2622d..c288c88 100644
--- a/src/main/java/org/jajuk/base/DirectoryManager.java
+++ b/src/main/java/org/jajuk/base/DirectoryManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.ArrayList;
@@ -35,7 +34,6 @@ import org.jajuk.util.UtilSystem;
  * Convenient class to manage directories.
  */
 public final class DirectoryManager extends ItemManager {
-
   /** Self instance. */
   private static DirectoryManager singleton = new DirectoryManager();
 
@@ -124,7 +122,7 @@ public final class DirectoryManager extends ItemManager {
   }
 
   /**
-   * Gets a shallow copy of all directories.
+   * Gets a defensive copy of all directories.
    * 
    * @return ordered directories list
    */
@@ -150,14 +148,14 @@ public final class DirectoryManager extends ItemManager {
    * 
    * @return Directory matching the id
    */
-  public Directory getDirectoryByID(final String sID) {
+  Directory getDirectoryByID(final String sID) {
     return (Directory) getItemByID(sID);
   }
 
   /**
    * Gets the directory for io.
    *
-   * @param fio DOCUMENT_ME
+   * @param fio 
    * @param device Associated device
    * @return Directory matching the io file
    */
@@ -177,14 +175,14 @@ public final class DirectoryManager extends ItemManager {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_DIRECTORIES;
   }
 
   /**
    * Register a root device directory.
    * 
-   * @param device DOCUMENT_ME
+   * @param device 
    * 
    * @return the directory
    */
@@ -195,9 +193,9 @@ public final class DirectoryManager extends ItemManager {
   /**
    * Register a directory.
    * 
-   * @param sName DOCUMENT_ME
-   * @param dParent DOCUMENT_ME
-   * @param device DOCUMENT_ME
+   * @param sName 
+   * @param dParent 
+   * @param device 
    * 
    * @return the directory
    */
@@ -210,13 +208,13 @@ public final class DirectoryManager extends ItemManager {
   /**
    * Register a directory with a known id.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param dParent DOCUMENT_ME
-   * @param device DOCUMENT_ME
+   * @param sId 
+   * @param sName 
+   * @param dParent 
+   * @param device 
    * @return the directory
    */
-  public Directory registerDirectory(final String sId, final String sName, final Directory dParent,
+  Directory registerDirectory(final String sId, final String sName, final Directory dParent,
       final Device device) {
     Directory directory = getDirectoryByID(sId);
     if (directory != null) {
@@ -231,7 +229,7 @@ public final class DirectoryManager extends ItemManager {
    * Remove a directory and all subdirectories from main directory repository.
    * Remove reference from parent directories as well.
    * 
-   * @param sId DOCUMENT_ME
+   * @param sId 
    */
   public void removeDirectory(final String sId) {
     lock.writeLock().lock();
@@ -242,7 +240,7 @@ public final class DirectoryManager extends ItemManager {
         return;
       }
       // remove all files
-      // need to use a shallow copy to avoid concurrent exceptions
+      // need to use a defensive copy to avoid concurrent exceptions
       final List<File> alFiles = new ArrayList<File>(dir.getFiles());
       for (final File file : alFiles) {
         FileManager.getInstance().removeFile(file);
diff --git a/src/main/java/org/jajuk/base/File.java b/src/main/java/org/jajuk/base/File.java
index 6f5e849..6640554 100644
--- a/src/main/java/org/jajuk/base/File.java
+++ b/src/main/java/org/jajuk/base/File.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -40,26 +40,23 @@ import org.jajuk.util.log.Log;
  * <p>
  * Physical item.
  */
-public class File extends PhysicalItem implements Comparable<File>, Const {
-
+public class File extends PhysicalItem implements Comparable<File> {
   /** Parent directory. */
-  protected final Directory directory;
-
+  private final Directory directory;
   /** Associated track. */
-  protected Track track;
-
+  private Track track;
   /** IO file associated with this file. */
   private java.io.File fio;
 
   /**
-   * File instanciation.
-   * 
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param directory DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * @param lSize DOCUMENT_ME
-   * @param lQuality DOCUMENT_ME
+   * File instantiation.
+   *
+   * @param sId 
+   * @param sName 
+   * @param directory 
+   * @param track 
+   * @param lSize 
+   * @param lQuality 
    */
   File(String sId, String sName, Directory directory, Track track, long lSize, long lQuality) {
     super(sId, sName);
@@ -73,17 +70,17 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return XML_FILE;
   }
 
   /**
    * toString method.
-   * 
+   *
    * @return the string
    */
   @Override
@@ -94,10 +91,10 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * String representation as displayed in a search result.
-   * 
+   *
    * @return the string
    */
-  public String toStringSearch() {
+  String toStringSearch() {
     StringBuilder sb = new StringBuilder(track.getGenre().getName2()).append('/')
         .append(track.getArtist().getName2()).append('/').append(track.getAlbum().getName2())
         .append('/').append(track.getName()).append(" [").append(directory.getName()).append('/')
@@ -107,9 +104,9 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Return true is the specified directory is an ancestor for this file.
-   * 
-   * @param directory DOCUMENT_ME
-   * 
+   *
+   * @param directory 
+   *
    * @return true, if checks for ancestor
    */
   public boolean hasAncestor(Directory directory) {
@@ -128,7 +125,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the size.
-   * 
+   *
    * @return the size
    */
   public long getSize() {
@@ -137,7 +134,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the directory.
-   * 
+   *
    * @return the directory
    */
   public Directory getDirectory() {
@@ -146,7 +143,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the device.
-   * 
+   *
    * @return associated device
    */
   public Device getDevice() {
@@ -155,7 +152,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the type.
-   * 
+   *
    * @return associated type
    */
   public Type getType() {
@@ -168,7 +165,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the quality.
-   * 
+   *
    * @return the quality
    */
   public long getQuality() {
@@ -177,7 +174,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the track.
-   * 
+   *
    * @return the track
    */
   public Track getTrack() {
@@ -186,7 +183,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Return absolute file path name.
-   * 
+   *
    * @return String
    */
   public String getAbsolutePath() {
@@ -202,17 +199,17 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
    * Sort ignoring cases
    * </p>
    * .
-   * 
-   * @param otherFile DOCUMENT_ME
-   * 
+   *
+   * @param otherFile 
+   *
    * @return comparison result
    */
   @Override
   public int compareTo(File otherFile) {
+    int comp;
     // Begin by comparing file parent directory for performances
     if (directory.equals(otherFile.getDirectory())) {
       // If both files are in the same directory, sort by track order
-
       int iOrder = (int) getTrack().getOrder();
       int iOrderOther = (int) otherFile.getTrack().getOrder();
       if (iOrder != iOrderOther) {
@@ -223,21 +220,27 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
       String otherAbs = otherFile.getName();
       // We must be consistent with equals, see
       // http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html
-      int comp = abs.compareToIgnoreCase(otherAbs);
-      if (comp == 0) {
-        return abs.compareTo(otherAbs);
+      if (abs.equalsIgnoreCase(otherAbs)) {
+        comp = abs.compareTo(otherAbs);
       } else {
-        return comp;
+        comp = abs.compareToIgnoreCase(otherAbs);
       }
+      return comp;
     } else {
-      // Files are in different directories, sort by parent directory
-      return this.getDirectory().compareTo(otherFile.getDirectory());
+      // Files are in different directories, sort by absolute path
+      // Do not compare simply parent directories to avoid general contact violation about transitivity
+      if (UtilSystem.isUnderWindows()) {
+        comp = this.getAbsolutePath().compareToIgnoreCase(otherFile.getAbsolutePath());
+      } else {
+        comp = this.getAbsolutePath().compareTo(otherFile.getAbsolutePath());
+      }
+      return comp;
     }
   }
 
   /**
    * Return true if the file can be accessed right now.
-   * 
+   *
    * @return true the file can be accessed right now
    */
   public boolean isReady() {
@@ -246,7 +249,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Return true if the file is currently refreshed or synchronized.
-   * 
+   *
    * @return true if the file is currently refreshed or synchronized
    */
   public boolean isScanned() {
@@ -258,7 +261,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Return Io file associated with this file.
-   * 
+   *
    * @return the FIO
    */
   public java.io.File getFIO() {
@@ -270,7 +273,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Return whether this item should be hidden with hide option.
-   * 
+   *
    * @return whether this item should be hidden with hide option
    */
   public boolean shouldBeHidden() {
@@ -283,7 +286,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Sets the track.
-   * 
+   *
    * @param track The track to set.
    */
   public void setTrack(Track track) {
@@ -298,19 +301,17 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
     }
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_File") + " : " + getName();
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.Item#getHumanValue(java.lang.String)
    */
   @Override
@@ -354,7 +355,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the any.
-   * 
+   *
    * @return a human representation of all concatenated properties
    */
   @Override
@@ -373,7 +374,6 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
     sb.append(lTrack.getDuration());
     sb.append(lTrack.getRate());
     sb.append(lTrack.getValue(Const.XML_TRACK_COMMENT));
-    sb.append(lTrack.getAlbumArtist().getName2());
     AlbumArtist albumArtist = lTrack.getAlbumArtist();
     if (albumArtist != null) {
       sb.append(albumArtist.getName2());
@@ -391,7 +391,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.Item#getIconRepresentation()
    */
   @Override
@@ -406,7 +406,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
     URL iconUrl = null;
     String sIcon;
     if (type != null) {
-      sIcon = (String) type.getProperties().get(Const.XML_TYPE_ICON);
+      sIcon = (String) type.getValue(Const.XML_TYPE_ICON);
       try {
         iconUrl = new URL(sIcon);
       } catch (MalformedURLException e) {
@@ -423,9 +423,10 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Set name (useful for Windows because same object can have different cases).
-   * 
+   *
    * @param name Item name
    */
+  @Override
   protected void setName(String name) {
     setProperty(Const.XML_NAME, name);
     this.name = name;
@@ -433,7 +434,7 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
 
   /**
    * Gets the html format text.
-   * 
+   *
    * @return text to be displayed in the tray balloon and tooltip with HTML
    * formating that is used correctly under Linux
    */
@@ -459,5 +460,4 @@ public class File extends PhysicalItem implements Comparable<File>, Const {
     sOut += "</HTML>";
     return sOut;
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/FileManager.java b/src/main/java/org/jajuk/base/FileManager.java
index f84f630..b18ced1 100644
--- a/src/main/java/org/jajuk/base/FileManager.java
+++ b/src/main/java/org/jajuk/base/FileManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.ArrayList;
@@ -36,6 +35,8 @@ import org.apache.commons.collections.CollectionUtils;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
+import org.jajuk.services.bookmark.History;
+import org.jajuk.services.bookmark.HistoryItem;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -52,13 +53,15 @@ import org.jajuk.util.log.Log;
  * Convenient class to manage files.
  */
 public final class FileManager extends ItemManager {
-
   /** Best of files. */
   private final List<File> alBestofFiles = new ArrayList<File>(20);
-
   /** Self instance. */
   private static FileManager singleton = new FileManager();
-
+  /**
+   * Played recently filtering predicate
+   * <br/>Applies on HistoryItem collections 
+   */
+  protected static final int CONSIDERE_AS_RECENTLY_PLAYED_DAYS = 150;
   /** File comparator based on rate. */
   private final Comparator<File> rateComparator = new Comparator<File>() {
     @Override
@@ -106,7 +109,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Gets the instance.
-   * 
+   *
    * @return singleton
    */
   public static FileManager getInstance() {
@@ -115,14 +118,14 @@ public final class FileManager extends ItemManager {
 
   /**
    * Register an File with a known id.
-   * 
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param directory DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * @param lSize DOCUMENT_ME
-   * @param lQuality DOCUMENT_ME
-   * 
+   *
+   * @param sId 
+   * @param sName 
+   * @param directory 
+   * @param track 
+   * @param lSize 
+   * @param lQuality 
+   *
    * @return the file
    */
   public File registerFile(String sId, String sName, Directory directory, Track track, long lSize,
@@ -136,14 +139,12 @@ public final class FileManager extends ItemManager {
         if (directory.getDevice().isRefreshing() && Log.isDebugEnabled()) {
           Log.debug("registrated new file: " + file);
         }
-      } else {
+      } else if (!file.getName().equals(sName)) {
         // If file already exist and the track has changed, make changes
         // Set name again because under Windows, the file name case
         // could have changed but we keep the same file object
         file.setName(sName);
       }
-      // add this file to track
-      file.setTrack(track);
       // Add file to track
       track.addFile(file);
       return file;
@@ -154,13 +155,13 @@ public final class FileManager extends ItemManager {
 
   /**
    * Register an File without known id.
-   * 
-   * @param sName DOCUMENT_ME
-   * @param directory DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * @param lSize DOCUMENT_ME
-   * @param lQuality DOCUMENT_ME
-   * 
+   *
+   * @param sName 
+   * @param directory 
+   * @param track 
+   * @param lSize 
+   * @param lQuality 
+   *
    * @return the file
    */
   public File registerFile(String sName, Directory directory, Track track, long lSize, long lQuality) {
@@ -170,10 +171,10 @@ public final class FileManager extends ItemManager {
 
   /**
    * Get file hashcode (ID).
-   * 
-   * @param sName DOCUMENT_ME
-   * @param dir DOCUMENT_ME
-   * 
+   *
+   * @param sName 
+   * @param dir 
+   *
    * @return file ID
    */
   protected static String createID(String sName, Directory dir) {
@@ -193,12 +194,12 @@ public final class FileManager extends ItemManager {
 
   /**
    * Change a file name.
-   * 
-   * @param fileOld DOCUMENT_ME
-   * @param sNewName DOCUMENT_ME
-   * 
+   *
+   * @param fileOld 
+   * @param sNewName 
+   *
    * @return new file
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   public File changeFileName(org.jajuk.base.File fileOld, String sNewName) throws JajukException {
@@ -217,10 +218,8 @@ public final class FileManager extends ItemManager {
           && QueueModel.getCurrentItem().getFile().equals(fileOld) && QueueModel.isPlayingTrack()) {
         throw new CannotRenameException(172);
       }
-
       java.io.File fileNew = new java.io.File(fileOld.getFIO().getParentFile().getAbsolutePath()
           + java.io.File.separator + sNewName);
-
       // check file name and extension
       if (!(UtilSystem.getExtension(fileNew).equals(UtilSystem.getExtension(fileOld.getFIO())))) {
         // no extension change
@@ -239,7 +238,6 @@ public final class FileManager extends ItemManager {
       } catch (Exception e) {
         throw new CannotRenameException(134, e);
       }
-
       // OK, remove old file and register this new file
       // Compute file ID
       Directory dir = fileOld.getDirectory();
@@ -251,12 +249,9 @@ public final class FileManager extends ItemManager {
       org.jajuk.base.File fNew = new File(sNewId, sNewName, fileOld.getDirectory(), track,
           fileOld.getSize(), fileOld.getQuality());
       // transfer all properties and reset id and name
-      // We use a shallow copy of properties to avoid any properties share between
-      // two items
-      fNew.setProperties(fileOld.getShallowProperties());
+      fNew.setProperties(fileOld.getProperties());
       fNew.setProperty(Const.XML_ID, sNewId); // reset new id and name
       fNew.setProperty(Const.XML_NAME, sNewName); // reset new id and name
-
       removeFile(fileOld);
       registerItem(fNew);
       track.addFile(fNew);
@@ -274,10 +269,10 @@ public final class FileManager extends ItemManager {
 
   /**
    * Change a file directory and actually move the old file to the new directory.
-   * 
+   *
    * @param old old file
    * @param newDir new dir
-   * 
+   *
    * @return new file or null if an error occurs
    * @throws JajukException the jajuk exception
    */
@@ -290,12 +285,9 @@ public final class FileManager extends ItemManager {
       // create a new file (with own fio and sAbs)
       File fNew = new File(sNewId, old.getName(), newDir, track, old.getSize(), old.getQuality());
       // Transfer all properties (including id), then set right id and directory
-      // We use a shallow copy of properties to avoid any properties share between
-      // two items
-      fNew.setProperties(old.getShallowProperties());
+      fNew.setProperties(old.getProperties());
       fNew.setProperty(Const.XML_ID, sNewId);
       fNew.setProperty(Const.XML_DIRECTORY, newDir.getID());
-
       // Real IO move
       try {
         if (!old.getFIO().renameTo(fNew.getFIO())) {
@@ -304,7 +296,6 @@ public final class FileManager extends ItemManager {
       } catch (Exception e) {
         throw new CannotRenameException(134, e);
       }
-
       // OK, remove old file and register this new file
       removeFile(old);
       registerItem(fNew);
@@ -317,7 +308,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Clean all references for the given device.
-   * 
+   *
    * @param sId :
    * Device id
    */
@@ -336,8 +327,8 @@ public final class FileManager extends ItemManager {
 
   /**
    * Remove a file reference.
-   * 
-   * @param file DOCUMENT_ME
+   *
+   * @param file 
    */
   public void removeFile(File file) {
     lock.writeLock().lock();
@@ -352,14 +343,13 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return file by full path.
-   * 
+   *
    * @param sPath :
    * full path
-   * 
+   *
    * @return file or null if given path is not known
    */
-
-  public File getFileByPath(String sPath) {
+  File getFileByPath(String sPath) {
     lock.readLock().lock();
     try {
       File fOut = null;
@@ -394,11 +384,11 @@ public final class FileManager extends ItemManager {
 
   /**
    * Gets the ready files.
-   * 
+   *
    * @return All accessible files of the collection
    */
   public List<File> getReadyFiles() {
-    List<File> files = FileManager.getInstance().getFiles();
+    List<File> files = getFiles();
     CollectionUtils.filter(files, new JajukPredicates.ReadyFilePredicate());
     return files;
   }
@@ -406,7 +396,7 @@ public final class FileManager extends ItemManager {
   /**
    * Return a shuffle mounted and unbaned file from the entire collection or
    * null if none available using these criterias.
-   * 
+   *
    * @return the file
    */
   public File getShuffleFile() {
@@ -423,7 +413,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return an ordered playlist with the entire accessible shuffle collection.
-   * 
+   *
    * @return The entire accessible shuffle collection (can return a void
    * collection)
    */
@@ -431,6 +421,8 @@ public final class FileManager extends ItemManager {
     List<File> alEligibleFiles = getReadyFiles();
     // filter banned files
     CollectionUtils.filter(alEligibleFiles, new JajukPredicates.BannedFilePredicate());
+    // We filter recently played tracks to improve the quality of the randomness
+    filterRecentlyPlayedTracks(alEligibleFiles);
     // shuffle
     Collections.shuffle(alEligibleFiles, UtilSystem.getRandom());
     // song level, just shuffle full collection
@@ -447,7 +439,6 @@ public final class FileManager extends ItemManager {
         index.put(album, albums.indexOf(album));
       }
       Collections.sort(alEligibleFiles, new Comparator<File>() {
-
         @Override
         public int compare(File f1, File f2) {
           if (f1.getTrack().getAlbum().equals(f2.getTrack().getAlbum())) {
@@ -461,7 +452,6 @@ public final class FileManager extends ItemManager {
           }
           return index.get(f1.getTrack().getAlbum()) - index.get(f2.getTrack().getAlbum());
         }
-
       });
       return alEligibleFiles;
       // else return shuffle albums
@@ -471,8 +461,38 @@ public final class FileManager extends ItemManager {
   }
 
   /**
+   * Filter files to keep only files not played recently. 
+   * <br/>It contributes to improve the shuffling experience by avoiding playing the same track twice 
+   * in a small period of time. It can't be implemented using a predicate because we want to break ASAP, 
+   * when the max time is reached.
+   * <br/>Note however that we stop filtering when we reach a too small size of remaining files.
+   * @param files files to filter
+   */
+  protected void filterRecentlyPlayedTracks(List<File> files) {
+    long now = new Date().getTime();
+    for (HistoryItem item : History.getInstance().getItems()) {
+      int trackAgeDays = (int) ((now - item.getDate()) / Const.MILLISECONDS_IN_A_DAY);
+      if (trackAgeDays < CONSIDERE_AS_RECENTLY_PLAYED_DAYS) {
+        if (files.size() > Const.NB_TRACKS_ON_ACTION) {
+          File file = FileManager.getInstance().getFileByID(item.getFileId());
+          if (file != null && file.getTrack() != null) {
+            // Remove this item if it exist in the list (otherwise, List does nothing)
+            files.remove(file);
+          }
+        } else {
+          //We reach the floor of too few tracks so we stop to filter by date
+          break;
+        }
+      } else {
+        // We reach the non-recently played area of the history, we can leave
+        break;
+      }
+    }
+  }
+
+  /**
    * Return a shuffle mounted file from the novelties.
-   * 
+   *
    * @return the novelty file
    */
   public File getNoveltyFile() {
@@ -482,7 +502,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return a shuffled playlist with the entire accessible novelties collection.
-   * 
+   *
    * @return The entire accessible novelties collection (can return a void
    * collection)
    */
@@ -494,12 +514,12 @@ public final class FileManager extends ItemManager {
    * Return an ordered playlist with the accessible novelties collection The
    * number of returned items is limited to NB_TRACKS_ON_ACTION for performance
    * reasons.
-   * 
-   * @param bHideUnmounted DOCUMENT_ME
-   * 
+   *
+   * @param bHideUnmounted 
+   *
    * @return The entire accessible novelties collection
    */
-  public List<File> getGlobalNoveltiesPlaylist(boolean bHideUnmounted) {
+  List<File> getGlobalNoveltiesPlaylist(boolean bHideUnmounted) {
     List<File> alEligibleFiles = new ArrayList<File>(1000);
     List<Track> tracks = TrackManager.getInstance().getTracks();
     // Filter by age
@@ -533,7 +553,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return a shuffled playlist with the entire accessible novelties collection.
-   * 
+   *
    * @return The entire accessible novelties collection
    */
   public List<File> getShuffleNoveltiesPlaylist() {
@@ -551,9 +571,9 @@ public final class FileManager extends ItemManager {
 
   /**
    * Convenient method used to return shuffled files by album.
-   * 
-   * @param alEligibleFiles DOCUMENT_ME
-   * 
+   *
+   * @param alEligibleFiles 
+   *
    * @return Shuffled tracks by album
    */
   private List<File> getShuffledFilesByAlbum(List<File> alEligibleFiles) {
@@ -586,7 +606,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Gets the sorted by rate.
-   * 
+   *
    * @return a sorted set of the collection by rate, highest first
    */
   private List<File> getSortedByRate() {
@@ -600,7 +620,7 @@ public final class FileManager extends ItemManager {
   /**
    * Return a shuffled playlist with the entire accessible bestof collection,
    * best first.
-   * 
+   *
    * @return Shuffled best tracks (n% of favorite)
    */
   public List<File> getGlobalBestofPlaylist() {
@@ -622,7 +642,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return ordered (by rate) bestof files.
-   * 
+   *
    * @return top files
    */
   public List<File> getBestOfFiles() {
@@ -639,15 +659,12 @@ public final class FileManager extends ItemManager {
    */
   public void refreshBestOfFiles() {
     Log.debug("Invoking Refresh of BestOf-Files");
-
     // clear data
     alBestofFiles.clear();
-
     // create a temporary table to remove unmounted files
     int iNbBestofFiles = Integer.parseInt(Conf.getString(Const.CONF_BESTOF_TRACKS_SIZE));
     List<File> alEligibleFiles = new ArrayList<File>(iNbBestofFiles);
     List<Track> tracks = TrackManager.getInstance().getTracks();
-
     // filter banned tracks
     CollectionUtils.filter(tracks, new JajukPredicates.BannedTrackPredicate());
     for (Track track : tracks) {
@@ -657,7 +674,6 @@ public final class FileManager extends ItemManager {
       }
     }
     Collections.sort(alEligibleFiles, rateComparator);
-
     // Keep as much items as we can
     int i = 0;
     while (i < alEligibleFiles.size() && i < iNbBestofFiles) {
@@ -669,10 +685,10 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return next mounted file ( used in continue mode ).
-   * 
+   *
    * @param file :
    * a file
-   * 
+   *
    * @return next file from entire collection
    */
   public File getNextFile(File file) {
@@ -708,10 +724,10 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return next mounted file from a different album than the provided file.
-   * 
+   *
    * @param file :
    * a file
-   * 
+   *
    * @return next file from entire collection
    */
   public File getNextAlbumFile(File file) {
@@ -732,10 +748,10 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return previous mounted file.
-   * 
+   *
    * @param file :
    * a file
-   * 
+   *
    * @return previous file from entire collection
    */
   public File getPreviousFile(File file) {
@@ -768,9 +784,9 @@ public final class FileManager extends ItemManager {
 
   /**
    * Return whether the given file is the very first file from collection.
-   * 
-   * @param file DOCUMENT_ME
-   * 
+   *
+   * @param file 
+   *
    * @return true, if checks if is very first file
    */
   public boolean isVeryfirstFile(File file) {
@@ -783,19 +799,19 @@ public final class FileManager extends ItemManager {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_FILES;
   }
 
   /**
    * Gets the file by id.
-   * 
+   *
    * @param sID Item ID
-   * 
+   *
    * @return File matching the id
    */
   public File getFileByID(String sID) {
@@ -804,7 +820,7 @@ public final class FileManager extends ItemManager {
 
   /**
    * Gets the files.
-   * 
+   *
    * @return ordered files list
    */
   @SuppressWarnings("unchecked")
@@ -814,12 +830,11 @@ public final class FileManager extends ItemManager {
 
   /**
    * Gets the files iterator.
-   * 
+   *
    * @return files iterator
    */
   @SuppressWarnings("unchecked")
   public ReadOnlyIterator<File> getFilesIterator() {
     return new ReadOnlyIterator<File>((Iterator<File>) getItemsIterator());
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/Genre.java b/src/main/java/org/jajuk/base/Genre.java
index e900188..eb96e30 100644
--- a/src/main/java/org/jajuk/base/Genre.java
+++ b/src/main/java/org/jajuk/base/Genre.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -33,12 +33,11 @@ import org.jajuk.util.Messages;
  * Logical item
  */
 public class Genre extends LogicalItem implements Comparable<Genre> {
-
   /**
    * Genre constructor.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
+   * @param sId 
+   * @param sName 
    */
   Genre(String sId, String sName) {
     super(sId, sName);
@@ -50,7 +49,7 @@ public class Genre extends LogicalItem implements Comparable<Genre> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return XML_GENRE;
   }
 
@@ -70,7 +69,7 @@ public class Genre extends LogicalItem implements Comparable<Genre> {
   /**
    * Alphabetical comparator used to display ordered lists.
    * 
-   * @param otherItem DOCUMENT_ME
+   * @param otherItem 
    * 
    * @return comparison result
    */
@@ -103,13 +102,11 @@ public class Genre extends LogicalItem implements Comparable<Genre> {
         || Messages.getString(UNKNOWN_GENRE).equalsIgnoreCase(getName());
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_Genre") + " : " + getName2();
   }
 
@@ -136,5 +133,4 @@ public class Genre extends LogicalItem implements Comparable<Genre> {
   public ImageIcon getIconRepresentation() {
     return IconLoader.getIcon(JajukIcons.GENRE);
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/GenreManager.java b/src/main/java/org/jajuk/base/GenreManager.java
index 730d0e8..34b6031 100644
--- a/src/main/java/org/jajuk/base/GenreManager.java
+++ b/src/main/java/org/jajuk/base/GenreManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.Arrays;
@@ -42,13 +41,12 @@ import org.jajuk.util.error.JajukException;
  * Convenient class to manage genres.
  */
 public final class GenreManager extends ItemManager {
-
   /** Self instance. */
   private static GenreManager singleton = new GenreManager();
-
   /* List of all known genres */
-  /** DOCUMENT_ME. */
   private Vector<String> genresList; // NOPMD
+  /** note if we have already fully loaded the Collection to speed up initial startup */
+  private volatile boolean orderedState = false;
 
   /**
    * No constructor available, only static access.
@@ -81,7 +79,7 @@ public final class GenreManager extends ItemManager {
   /**
    * Register a genre.
    * 
-   * @param sName DOCUMENT_ME
+   * @param sName 
    * 
    * @return the genre
    */
@@ -93,11 +91,11 @@ public final class GenreManager extends ItemManager {
   /**
    * Register a genre with a known id.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
+   * @param sId 
+   * @param sName 
    * @return the genre
    */
-  public Genre registerGenre(String sId, String sName) {
+  Genre registerGenre(String sId, String sName) {
     Genre genre = getGenreByID(sId);
     if (genre != null) {
       return genre;
@@ -107,22 +105,43 @@ public final class GenreManager extends ItemManager {
     // add it in genres list if new
     if (!genresList.contains(sName)) {
       genresList.add(genre.getName2());
-      // Sort items ignoring case
-      Collections.sort(genresList, new Comparator<String>() {
-        @Override
-        public int compare(String o1, String o2) {
-          return o1.compareToIgnoreCase(o2);
-        }
-      });
+      // only sort as soon as we have the Collection fully loaded
+      if (orderedState) {
+        sortGenreList();
+      }
     }
     return genre;
   }
 
   /**
+   * 
+   */
+  private void sortGenreList() {
+    // Sort items ignoring case
+    Collections.sort(genresList, new Comparator<String>() {
+      @Override
+      public int compare(String o1, String o2) {
+        return o1.compareToIgnoreCase(o2);
+      }
+    });
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.base.ItemManager#switchToOrderState()
+   */
+  @Override
+  public void switchToOrderState() {
+    // bring this Manager to ordered state when Collection is fully loaded
+    orderedState = true;
+    sortGenreList();
+    super.switchToOrderState();
+  }
+
+  /**
    * Register preset genres.
-   * DOCUMENT_ME
+   * 
    */
-  public void registerPresetGenres() {
+  private void registerPresetGenres() {
     // create default genre list
     genresList = new Vector<String>(Arrays.asList(UtilFeatures.GENRES));
     Collections.sort(genresList);
@@ -134,7 +153,7 @@ public final class GenreManager extends ItemManager {
   /**
    * Return genre by name.
    * 
-   * @param name DOCUMENT_ME
+   * @param name 
    * 
    * @return the genre by name
    */
@@ -152,14 +171,14 @@ public final class GenreManager extends ItemManager {
   /**
    * Change the item name.
    * 
-   * @param old DOCUMENT_ME
-   * @param sNewName DOCUMENT_ME
+   * @param old 
+   * @param sNewName 
    * 
    * @return new item
    * 
    * @throws JajukException the jajuk exception
    */
-  public Genre changeGenreName(Genre old, String sNewName) throws JajukException {
+  Genre changeGenreName(Genre old, String sNewName) throws JajukException {
     // check there is actually a change
     if (old.getName2().equals(sNewName)) {
       return old;
@@ -197,7 +216,7 @@ public final class GenreManager extends ItemManager {
    * <p>
    * example: "ROCK".
    * 
-   * @param sName DOCUMENT_ME
+   * @param sName 
    * 
    * @return the string
    */
@@ -216,7 +235,7 @@ public final class GenreManager extends ItemManager {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_GENRES;
   }
 
@@ -260,5 +279,4 @@ public final class GenreManager extends ItemManager {
   public ReadOnlyIterator<Genre> getGenresIterator() {
     return new ReadOnlyIterator<Genre>((Iterator<Genre>) getItemsIterator());
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/base/Item.java b/src/main/java/org/jajuk/base/Item.java
index 2589a70..a2e282d 100644
--- a/src/main/java/org/jajuk/base/Item.java
+++ b/src/main/java/org/jajuk/base/Item.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,18 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
+import com.google.common.collect.Lists;
+
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import javax.swing.ImageIcon;
 
+import org.jajuk.services.core.PersistenceService;
+import org.jajuk.services.core.PersistenceService.Urgency;
+import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.util.Const;
 import org.jajuk.util.UtilString;
 import org.jajuk.util.log.Log;
@@ -42,15 +47,18 @@ import org.xml.sax.Attributes;
  * </p>.
  */
 public abstract class Item implements Const {
-
   /** We cache the ID to avoid getting it from properties for CPU performance reasons. */
-  String sID;
-
+  private String sID;
   /** We cache the name to avoid getting it from properties for CPU performance reasons. */
   String name;
-
   /** Item properties, singleton use very high load factor as this size will not change often. */
   private Map<String, Object> properties = new HashMap<String, Object>(2, 1f);
+  /** Cache-string which holds the filter-string for the default "any"-Searches, this is filled during the first search and 
+   * cleaned on all points where the properties are adjusted. */
+  private String any = null;
+  private static final List<String> lowPriorityCollectionProperties = Lists.asList(XML_TRACK_HITS,
+      new String[] { XML_TRACK_TOTAL_PLAYTIME, XML_EXPANDED, XML_ALBUM_DISCOVERED_COVER,
+          XML_TRACK_RATE, XML_ORIGIN });
 
   /**
    * Constructor.
@@ -84,9 +92,21 @@ public abstract class Item implements Const {
   }
 
   /**
+   * Set a new name
+   * @param newName
+   */
+  void setName(String newName) {
+    this.name = newName;
+    setProperty(XML_NAME, newName);
+    notifyCollectionChange(XML_NAME);
+  }
+
+  /**
    * Item hashcode (used by the equals method) See
    * http://www.geocities.com/technofundo/tech/java/equalhash.html
    * 
+   * Note that the hashCode is already cached in String class, no need to do it again.
+   * 
    * @return the int
    */
   @Override
@@ -95,16 +115,16 @@ public abstract class Item implements Const {
   }
 
   /**
-   * Get item description (HTML).
+   * Get item title (HTML) used in some dialogs.
    * 
    * @return item description
    */
-  public abstract String getDesc();
+  public abstract String getTitle();
 
   /**
    * Equal method to check two items are identical.
    * 
-   * @param otherItem DOCUMENT_ME
+   * @param otherItem 
    * 
    * @return true, if equals
    */
@@ -114,37 +134,18 @@ public abstract class Item implements Const {
     if (!(otherItem instanceof Item)) {
       return false;
     }
-
     // [Perf] We can compare with an == operator here because
     // all ID are stored into String intern() buffer
     return getID() == ((Item) otherItem).getID();
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.base.Item#getProperties()
-   */
   /**
-   * Gets the properties.
+   * Get a defensive copy of all the item properties.
    * 
-   * @return the properties
+   * @return a defensive copy of all the item properties
    */
   public Map<String, Object> getProperties() {
-    return properties;
-  }
-
-  /**
-   * Return a shallow copy of the item properties.
-   * 
-   * @return a shallow copy of the item properties
-   */
-  public Map<String, Object> getShallowProperties() {
-    HashMap<String, Object> out = new HashMap<String, Object>(properties.size());
-    for (String key : properties.keySet()) {
-      out.put(key, properties.get(key));
-    }
-    return out;
+    return new HashMap<String, Object>(properties);
   }
 
   /*
@@ -155,12 +156,12 @@ public abstract class Item implements Const {
   /**
    * Gets the value.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the value
    */
   public Object getValue(String sKey) {
-    Object out = getProperties().get(sKey);
+    Object out = properties.get(sKey);
     // look at properties to check the given property is known
     if (out == null) {
       // no? take property default
@@ -172,12 +173,12 @@ public abstract class Item implements Const {
   /**
    * Gets the long value.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the long value
    */
   public long getLongValue(String sKey) {
-    Long out = (Long) getProperties().get(sKey);
+    Long out = (Long) properties.get(sKey);
     // look at properties to check the given property is known
     if (out == null) {
       // no? take property default
@@ -189,12 +190,12 @@ public abstract class Item implements Const {
   /**
    * Gets the double value.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the double value
    */
   public double getDoubleValue(String sKey) {
-    Double out = (Double) getProperties().get(sKey);
+    Double out = (Double) properties.get(sKey);
     // look at properties to check the given property is known
     if (out == null) {
       // no? take property default
@@ -207,12 +208,12 @@ public abstract class Item implements Const {
    * Return String value for String type values. We assume that given property
    * is a String.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the string value
    */
   public String getStringValue(String sKey) {
-    String out = (String) getProperties().get(sKey);
+    String out = (String) properties.get(sKey);
     // look at properties to check the given property is known
     if (out == null) {
       // no? take property default
@@ -224,12 +225,12 @@ public abstract class Item implements Const {
   /**
    * Gets the boolean value.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the boolean value
    */
   public boolean getBooleanValue(String sKey) {
-    Boolean out = (Boolean) getProperties().get(sKey);
+    Boolean out = (Boolean) properties.get(sKey);
     // look at properties to check the given property is known
     if (out == null) {
       // no? take property default
@@ -241,12 +242,12 @@ public abstract class Item implements Const {
   /**
    * Gets the date value.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the date value
    */
   public Date getDateValue(String sKey) {
-    Date out = (Date) getProperties().get(sKey);
+    Date out = (Date) properties.get(sKey);
     // look at properties to check the given property is known
     if (out == null) {
       // no? take property default
@@ -258,11 +259,11 @@ public abstract class Item implements Const {
   /**
    * Gets the default value.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the default value
    */
-  public Object getDefaultValue(String sKey) {
+  private Object getDefaultValue(String sKey) {
     PropertyMetaInformation meta = getMeta(sKey);
     return meta.getDefaultValue();
   }
@@ -274,9 +275,9 @@ public abstract class Item implements Const {
    */
   /**
    * Contains property.
-   * DOCUMENT_ME
    * 
-   * @param sKey DOCUMENT_ME
+   * 
+   * @param sKey 
    * 
    * @return true if...
    */
@@ -292,26 +293,51 @@ public abstract class Item implements Const {
    */
   /**
    * Sets the property.
-   * DOCUMENT_ME
    * 
-   * @param sKey DOCUMENT_ME
-   * @param oValue DOCUMENT_ME
+   * 
+   * @param sKey 
+   * @param oValue 
    */
   public final void setProperty(String sKey, Object oValue) {
-    getProperties().put(sKey, oValue);
+    // reset cached value
+    any = null;
+    properties.put(sKey, oValue);
+    notifyCollectionChange(sKey);
+  }
+
+  private final void notifyCollectionChange(String key) {
+    // Ignore this if the persistence service is not yet started to speed up startup
+    if (!PersistenceService.getInstance().isAlive()) {
+      return;
+    }
+    // SmartPlaylist are not persisted
+    if (this instanceof SmartPlaylist) {
+      return;
+    }
+    // Webradios are stored outside the collection file and are persisted separately
+    if (this instanceof WebRadio) {
+      PersistenceService.getInstance().setRadiosChanged();
+    } else {
+      // Some properties like the track total play time is incremented very often and we don't want to commit 
+      // collection that soon so we set a low urgency to its commit
+      if (lowPriorityCollectionProperties.contains(key)) {
+        PersistenceService.getInstance().setCollectionChanged(Urgency.LOW);
+      } else {
+        // On the contrary, we want others changes to be commited ASAP
+        PersistenceService.getInstance().setCollectionChanged(Urgency.HIGH);
+      }
+    }
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.base.Item#getAny()
-   */
   /**
    * Gets the any.
    * 
    * @return the any
    */
   public String getAny() {
+    if (any != null) {
+      return any;
+    }
     StringBuilder sb = new StringBuilder(100);
     Iterator<String> it = properties.keySet().iterator();
     while (it.hasNext()) {
@@ -325,25 +351,9 @@ public abstract class Item implements Const {
         }
         sb.append(sValue);
       }
-
     }
-    return sb.toString();
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.base.Item#setDefaultProperty(java.lang.String,
-   *      java.lang.String)
-   */
-  /**
-   * Populate default property.
-   * DOCUMENT_ME
-   * 
-   * @param meta DOCUMENT_ME
-   */
-  public void populateDefaultProperty(PropertyMetaInformation meta) {
-    properties.put(meta.getName(), meta.getDefaultValue());
+    any = sb.toString();
+    return any;
   }
 
   /**
@@ -351,9 +361,9 @@ public abstract class Item implements Const {
    * 
    * @return the string
    */
-  public String toXml() {
+  String toXml() {
     try {
-      StringBuilder sb = new StringBuilder("<").append(getLabel());
+      StringBuilder sb = new StringBuilder("<").append(getXMLTag());
       sb.append(getPropertiesXml());
       sb.append("/>\n");
       return sb.toString();
@@ -366,11 +376,11 @@ public abstract class Item implements Const {
   }
 
   /**
-   * Gets the label.
+   * Gets the XML tag.
    * 
    * @return an identifier used to generate XML representation of this item
    */
-  abstract String getLabel();
+  public abstract String getXMLTag();
 
   /**
    * Gets the properties xml.
@@ -438,6 +448,8 @@ public abstract class Item implements Const {
         }
       }
     }
+    // remove cached value
+    any = null;
   }
 
   /**
@@ -447,6 +459,9 @@ public abstract class Item implements Const {
    */
   public void setProperties(Map<String, Object> properties) {
     this.properties = properties;
+    // remove cached value
+    any = null;
+    notifyCollectionChange(null);
   }
 
   /*
@@ -456,18 +471,21 @@ public abstract class Item implements Const {
    */
   /**
    * Removes the property.
-   * DOCUMENT_ME
    * 
-   * @param sKey DOCUMENT_ME
+   * 
+   * @param sKey 
    */
   public void removeProperty(String sKey) {
     properties.remove(sKey);
+    // remove cached value
+    any = null;
+    notifyCollectionChange(null);
   }
 
   /**
    * Default implementation for this method, simply return standard value.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the human value
    */
@@ -495,9 +513,9 @@ public abstract class Item implements Const {
    * Clone all properties from a given properties list but not overwrite
    * constructor properties.
    * 
-   * @param propertiesSource DOCUMENT_ME
+   * @param propertiesSource 
    */
-  public void cloneProperties(Item propertiesSource) {
+  void cloneProperties(Item propertiesSource) {
     Iterator<String> it = propertiesSource.getProperties().keySet().iterator();
     while (it.hasNext()) {
       String sProperty = it.next();
@@ -505,6 +523,8 @@ public abstract class Item implements Const {
         this.properties.put(sProperty, propertiesSource.getValue(sProperty));
       }
     }
+    // reset cached value
+    any = null;
   }
 
   /**
@@ -522,5 +542,4 @@ public abstract class Item implements Const {
   public long getRate() {
     return -1;
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/ItemManager.java b/src/main/java/org/jajuk/base/ItemManager.java
index d146201..faf7aa0 100644
--- a/src/main/java/org/jajuk/base/ItemManager.java
+++ b/src/main/java/org/jajuk/base/ItemManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.ArrayList;
@@ -33,9 +32,10 @@ import java.util.TreeSet;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.Predicate;
+import org.jajuk.services.core.PersistenceService;
+import org.jajuk.services.core.PersistenceService.Urgency;
 import org.jajuk.services.tags.Tag;
+import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.util.Const;
 import org.jajuk.util.MD5Processor;
 import org.jajuk.util.error.JajukException;
@@ -45,31 +45,25 @@ import org.jajuk.util.log.Log;
  * Managers parent class.
  */
 public abstract class ItemManager {
-
   /** Maps item classes -> instance, must be a linked map for ordering (mandatory in commited collection). */
   private static Map<Class<?>, ItemManager> hmItemManagers = new LinkedHashMap<Class<?>, ItemManager>(
       10);
-
   /** Maps properties meta information name and object. */
   private final Map<String, PropertyMetaInformation> hmPropertiesMetaInformation = new LinkedHashMap<String, PropertyMetaInformation>(
       10);
-
   /** The Lock. */
   ReadWriteLock lock = new ReentrantReadWriteLock();
-
   /** Use an array list during startup which is faster during loading the collection. */
   private List<Item> startupItems = new ArrayList<Item>(100);
-
   /** Stores the items by ID to have quick access if necessary. */
   private final Map<String, Item> internalMap = new HashMap<String, Item>(100);
-
   /** Collection pointer : at the beginning point to the ArrayList, later this is replaced by a TreeSet to have correct ordering. */
   private Collection<Item> items = startupItems;
 
   /**
    * Item manager default constructor.
    */
-  ItemManager() {
+  public ItemManager() {
   }
 
   /**
@@ -96,7 +90,6 @@ public abstract class ItemManager {
       // populate a new TreeSet with the startup-items
       if (startupItems != null) {
         items = new TreeSet<Item>(startupItems);
-
         // Free startup memory
         startupItems = null;
       }
@@ -107,26 +100,26 @@ public abstract class ItemManager {
 
   /**
    * Registers a new item manager.
-   * 
+   *
    * @param c Managed item class
-   * @param itemManager DOCUMENT_ME
+   * @param itemManager 
    */
   public static void registerItemManager(Class<?> c, ItemManager itemManager) {
     hmItemManagers.put(c, itemManager);
   }
 
   /**
-   * Gets the label.
+   * Gets the XML tag.
    * 
    * @return identifier used for XML generation
    */
-  public abstract String getLabel();
+  public abstract String getXMLTag();
 
   /**
    * Gets the meta information.
-   * 
-   * @param sPropertyName DOCUMENT_ME
-   * 
+   *
+   * @param sPropertyName 
+   *
    * @return meta data for given property
    */
   public PropertyMetaInformation getMetaInformation(String sPropertyName) {
@@ -135,8 +128,8 @@ public abstract class ItemManager {
 
   /**
    * Remove a property *.
-   * 
-   * @param sProperty DOCUMENT_ME
+   *
+   * @param sProperty 
    */
   public void removeProperty(String sProperty) {
     PropertyMetaInformation meta = getMetaInformation(sProperty);
@@ -146,10 +139,10 @@ public abstract class ItemManager {
 
   /**
    * Remove a custom property from all items for the given manager.
-   * 
-   * @param meta DOCUMENT_ME
+   *
+   * @param meta 
    */
-  public void applyRemoveProperty(PropertyMetaInformation meta) {
+  void applyRemoveProperty(PropertyMetaInformation meta) {
     lock.readLock().lock();
     try {
       for (Item item : items) {
@@ -162,14 +155,13 @@ public abstract class ItemManager {
 
   /**
    * Generic method to access to a parameterized list of items.
-   * 
-   * @param meta DOCUMENT_ME
-   * 
+   *
+   * @param meta 
+   *
    * @return the item-parameterized list
-   * 
+   *
    * protected abstract HashMap<String, Item> getItemsMap();
    */
-
   /** Add a custom property to all items for the given manager */
   public void applyNewProperty(PropertyMetaInformation meta) {
     lock.readLock().lock();
@@ -185,11 +177,11 @@ public abstract class ItemManager {
   /**
    * Attention, this method does not return a full XML, but rather an excerpt
    * that is then completed in Collection.commit()!
-   * 
+   *
    * @return (partial) XML representation of this manager
    */
-  public String toXML() {
-    StringBuilder sb = new StringBuilder("<").append(getLabel() + ">");
+  String toXML() {
+    StringBuilder sb = new StringBuilder("<").append(getXMLTag() + ">");
     Iterator<String> it = hmPropertiesMetaInformation.keySet().iterator();
     while (it.hasNext()) {
       String sProperty = it.next();
@@ -201,7 +193,7 @@ public abstract class ItemManager {
 
   /**
    * Return the associated read write lock.
-   * 
+   *
    * @return the associated read write lock
    */
   public ReadWriteLock getLock() {
@@ -218,11 +210,11 @@ public abstract class ItemManager {
    * -All in lower case expect first letter of first word
    * <p>
    * example: "My artist".
-   * 
+   *
    * @param sName The name to format.
-   * 
+   *
    * @return the string
-   * 
+   *
    * TODO: the "all lowercase" part is not done currently, should this be changed??
    */
   public static String format(String sName) {
@@ -238,7 +230,7 @@ public abstract class ItemManager {
 
   /**
    * Gets the properties.
-   * 
+   *
    * @return properties Meta informations
    */
   public Collection<PropertyMetaInformation> getProperties() {
@@ -247,7 +239,7 @@ public abstract class ItemManager {
 
   /**
    * Gets the custom properties including activated extra tags.
-   * 
+   *
    * @return custom properties Meta informations
    */
   public Collection<PropertyMetaInformation> getCustomProperties() {
@@ -264,7 +256,7 @@ public abstract class ItemManager {
 
   /**
    * Gets the custom properties without the activated extra tags.
-   * 
+   *
    * @return custom properties Meta informations
    */
   public Collection<PropertyMetaInformation> getUserCustomProperties() {
@@ -281,7 +273,7 @@ public abstract class ItemManager {
 
   /**
    * Gets the visible properties.
-   * 
+   *
    * @return visible properties Meta informations
    */
   public Collection<PropertyMetaInformation> getVisibleProperties() {
@@ -298,9 +290,9 @@ public abstract class ItemManager {
 
   /**
    * Get the manager from a given attribute name.
-   * 
+   *
    * @param sProperty The property to compare.
-   * 
+   *
    * @return an ItemManager if one is found for the property or null if none
    * found.
    */
@@ -332,9 +324,9 @@ public abstract class ItemManager {
 
   /**
    * Get ItemManager manager for given item class.
-   * 
-   * @param c DOCUMENT_ME
-   * 
+   *
+   * @param c 
+   *
    * @return associated item manager or null if none was found
    */
   public static ItemManager getItemManager(Class<?> c) {
@@ -342,22 +334,12 @@ public abstract class ItemManager {
   }
 
   /**
-   * Return an iteration over item managers.
-   * 
-   * @return the item managers
-   */
-  public static Iterator<ItemManager> getItemManagers() {
-    return hmItemManagers.values().iterator();
-  }
-
-  /**
    * Perform cleanup : delete useless items.
    */
   @SuppressWarnings("unchecked")
   public void cleanup() {
     lock.writeLock().lock();
     try {
-
       // Prefetch item manager type for performances
       short managerType = 0; // Album
       if (this instanceof ArtistManager) {
@@ -403,12 +385,11 @@ public abstract class ItemManager {
     } finally {
       lock.writeLock().unlock();
     }
-
   }
 
   /**
    * Perform a cleanup of all orphan tracks associated with given item.
-   * 
+   *
    * @param item item whose associated tracks should be checked for cleanup
    */
   protected void cleanOrphanTracks(Item item) {
@@ -419,24 +400,42 @@ public abstract class ItemManager {
 
   /**
    * Remove a given item.
-   * 
-   * @param item DOCUMENT_ME
+   *
+   * @param item 
    */
-  protected void removeItem(Item item) {
+  public void removeItem(Item item) {
     lock.writeLock().lock();
     try {
       if (item != null) {
         items.remove(item);
         internalMap.remove(item.getID());
+        notifyCollectionChange(item);
       }
     } finally {
       lock.writeLock().unlock();
     }
   }
 
+  private final void notifyCollectionChange(Item item) {
+    // Ignore this if the persistence service is not yet started to speed up startup
+    if (!PersistenceService.getInstance().isAlive()) {
+      return;
+    }
+    // SmartPlaylist are not persisted
+    if (item instanceof SmartPlaylist) {
+      return;
+    }
+    // Webradios are stored outside the collection file and are persisted separately
+    if (item instanceof WebRadio) {
+      PersistenceService.getInstance().setRadiosChanged();
+    } else {
+      PersistenceService.getInstance().setCollectionChanged(Urgency.HIGH);
+    }
+  }
+
   /**
    * Register a given item.
-   * 
+   *
    * @param item : the item to add
    */
   protected void registerItem(Item item) {
@@ -444,6 +443,7 @@ public abstract class ItemManager {
     try {
       items.add(item);
       internalMap.put(item.getID(), item);
+      notifyCollectionChange(item);
     } finally {
       lock.writeLock().unlock();
     }
@@ -451,8 +451,8 @@ public abstract class ItemManager {
 
   /**
    * Register a new property.
-   * 
-   * @param meta DOCUMENT_ME
+   *
+   * @param meta 
    */
   public void registerProperty(PropertyMetaInformation meta) {
     hmPropertiesMetaInformation.put(meta.getName(), meta);
@@ -460,14 +460,14 @@ public abstract class ItemManager {
 
   /**
    * Change any item.
-   * 
-   * @param itemToChange DOCUMENT_ME
-   * @param sKey DOCUMENT_ME
-   * @param oValue DOCUMENT_ME
+   *
+   * @param itemToChange 
+   * @param sKey 
+   * @param oValue 
    * @param filter : files we want to deal with
-   * 
+   *
    * @return the changed item
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   public static Item changeItem(Item itemToChange, String sKey, Object oValue, Set<File> filter)
@@ -507,6 +507,11 @@ public abstract class ItemManager {
       } else if (Const.XML_TRACK_RATE.equals(sKey)) {
         newItem = TrackManager.getInstance().changeTrackRate(file.getTrack(), (Long) oValue);
       } else { // others properties
+        // check extra tags
+        if (Tag.getActivatedExtraTags().contains(sKey)) {
+          TrackManager.getInstance().changeTrackField(file.getTrack(), sKey, (String) oValue,
+              filter);
+        }
         // check if this key is known for files
         if (file.getMeta(sKey) != null) {
           itemToChange.setProperty(sKey, oValue);
@@ -586,13 +591,18 @@ public abstract class ItemManager {
       }
     } else if (itemToChange instanceof Year) {
       itemToChange.setProperty(sKey, oValue);
+    } else if (itemToChange instanceof WebRadio) {
+      itemToChange.setProperty(sKey, oValue);
+      if (Const.XML_NAME.equals(sKey)) {
+        itemToChange.setName((String) oValue);
+      }
     }
     return newItem;
   }
 
   /**
    * Gets the element count.
-   * 
+   *
    * @return number of item
    */
   public int getElementCount() {
@@ -601,9 +611,9 @@ public abstract class ItemManager {
 
   /**
    * Gets the item by id.
-   * 
+   *
    * @param sID Item ID
-   * 
+   *
    * @return Item
    */
   public Item getItemByID(String sID) {
@@ -611,39 +621,32 @@ public abstract class ItemManager {
   }
 
   /**
-   * Return a copy of all registered items.
-   * 
+   * Return a copy of all registered items. The resulting list can be used without
+   * need of locking.
+   *
    * @return a copy of all registered items
    */
   public List<? extends Item> getItems() {
-    return new ArrayList<Item>(items);
-  }
-
-  /**
-   * Return a shallow copy of all registered items filtered using the provided
-   * predicate*.
-   * 
-   * @param predicate DOCUMENT_ME
-   * 
-   * @return a shallow copy of all registered items filtered using the provided
-   * 
-   * @arg predicate : the predicate
-   */
-  public List<? extends Item> getFilteredItems(Predicate predicate) {
-    ArrayList<Item> itemsCopy = new ArrayList<Item>(items);
-    CollectionUtils.filter(itemsCopy, predicate);
-    return itemsCopy;
+    // getItems() creates a copy of the list of items and thus iterates over the current list of items
+    // therefore a ConcurrentModifcationException could be triggered if we do not lock while actually
+    // doing the copying. Usage of the list afterwards is save without locking
+    lock.readLock().lock();
+    try {
+      return new ArrayList<Item>(items);
+    } finally {
+      lock.readLock().unlock();
+    }
   }
 
   /**
-   * ***************************************************************************
-   * Return all registered enumeration CAUTION : do not call remove() on this
-   * iterator, you would effectively remove items instead of using regular
-   * removeItem() primitive
-   * **************************************************************************.
-   * 
-   * @return the items iterator
-   */
+  * ***************************************************************************
+  * Return all registered enumeration CAUTION : do not call remove() on this
+  * iterator, you would effectively remove items instead of using regular
+  * removeItem() primitive
+  * **************************************************************************.
+  *
+  * @return the items iterator
+  */
   protected Iterator<? extends Item> getItemsIterator() {
     return items.iterator();
   }
@@ -671,10 +674,8 @@ public abstract class ItemManager {
     try {
       // first create a copy
       ArrayList<Item> itemsCopy = new ArrayList<Item>(items);
-
       // then remove all elements
       clear();
-
       // and then re-add all items again to make them correctly sorted again
       for (Item item : itemsCopy) {
         registerItem(item);
@@ -686,9 +687,9 @@ public abstract class ItemManager {
 
   /**
    * Basic implementation for item hashcode computation.
-   * 
+   *
    * @param sName item name
-   * 
+   *
    * @return ItemManager ID
    */
   protected static String createID(String sName) {
diff --git a/src/main/java/org/jajuk/base/LogicalItem.java b/src/main/java/org/jajuk/base/LogicalItem.java
index ec72616..5e94f83 100644
--- a/src/main/java/org/jajuk/base/LogicalItem.java
+++ b/src/main/java/org/jajuk/base/LogicalItem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,21 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 /**
  * A logical Item (genre, artist, year, album...)
  */
 public abstract class LogicalItem extends Item {
-
   /**
    * The Constructor.
    * 
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
+   * @param sId 
+   * @param sName 
    */
   LogicalItem(String sId, String sName) {
     super(sId, sName);
@@ -46,5 +44,4 @@ public abstract class LogicalItem extends Item {
     // Use class metadata because this method is used by several logical items
     return getClass().getCanonicalName() + "[ID=" + getID() + " Name={{" + getName() + "}}]";
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/PhysicalItem.java b/src/main/java/org/jajuk/base/PhysicalItem.java
index 2bf8e08..9ef12d2 100644
--- a/src/main/java/org/jajuk/base/PhysicalItem.java
+++ b/src/main/java/org/jajuk/base/PhysicalItem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,24 +16,21 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 /**
  * A physical Item (file, directory, device...)
  */
 public abstract class PhysicalItem extends Item {
-
   /**
    * The Constructor.
    * 
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
+   * @param sId 
+   * @param sName 
    */
-  PhysicalItem(String sId, String sName) {
+  public PhysicalItem(String sId, String sName) {
     super(sId, sName);
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/Playlist.java b/src/main/java/org/jajuk/base/Playlist.java
index bf1c1d3..1701f0d 100644
--- a/src/main/java/org/jajuk/base/Playlist.java
+++ b/src/main/java/org/jajuk/base/Playlist.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -31,8 +31,10 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import javax.swing.ImageIcon;
 import javax.swing.JFileChooser;
@@ -57,7 +59,6 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.filters.PlaylistFilter;
 import org.jajuk.util.log.Log;
 
-
 /**
  * A playlist
  * <p>
@@ -70,49 +71,25 @@ import org.jajuk.util.log.Log;
  * have separate implementations for each of the types to separate the code better.
  */
 public class Playlist extends PhysicalItem implements Comparable<Playlist> {
-
   /**
    * playlist type.
    */
   public enum Type {
-
-    /** DOCUMENT_ME. */
-    NORMAL,
-    
-    /** DOCUMENT_ME. */
-    QUEUE,
-    
-    /** DOCUMENT_ME. */
-    NEW,
-    
-    /** DOCUMENT_ME. */
-    BOOKMARK,
-    
-    /** DOCUMENT_ME. */
-    BESTOF,
-    
-    /** DOCUMENT_ME. */
-    NOVELTIES
+    NORMAL, QUEUE, NEW, BOOKMARK, BESTOF, NOVELTIES
   }
 
   /** Playlist parent directory. */
   private Directory dParentDirectory;
-
   /** Files list, singleton. */
   private List<File> alFiles;
-
   /** Associated physical file. */
   private java.io.File fio;
-
   /** Playlist type. */
   private final Type type;
-
   /** pre-calculated absolute path for perf. */
   private String sAbs = null;
-
   /** Contains files outside device flag. */
   private boolean bContainsExtFiles = false;
-
   /** Whether we ask for device mounting if required. */
   private boolean askForMounting = true;
 
@@ -120,9 +97,9 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
    * playlist constructor.
    * 
    * @param type playlist type
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param dParentDirectory DOCUMENT_ME
+   * @param sId 
+   * @param sName 
+   * @param dParentDirectory 
    */
   Playlist(final Type type, final String sId, final String sName, final Directory dParentDirectory) {
     super(sId, sName);
@@ -134,18 +111,27 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   /**
    * playlist constructor.
    * 
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param dParentDirectory DOCUMENT_ME
+   * @param sId 
+   * @param sName 
+   * @param dParentDirectory 
    */
   public Playlist(final String sId, final String sName, final Directory dParentDirectory) {
     this(Playlist.Type.NORMAL, sId, sName, dParentDirectory);
   }
 
   /**
-   * Add a file to this playlist.
+   * Gets the type.
+   * 
+   * @return Returns the Type.
+   */
+  public Type getType() {
+    return type;
+  }
+
+  /**
+   * Add a file at the end of this playlist.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -156,19 +142,10 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   }
 
   /**
-   * Gets the type.
-   * 
-   * @return Returns the Type.
-   */
-  public Type getType() {
-    return type;
-  }
-
-  /**
-   * Add a file to this playlist.
+   * Add a file to this playlist. at a given index.
    * 
-   * @param index DOCUMENT_ME
-   * @param file DOCUMENT_ME
+   * @param index 
+   * @param file 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -193,7 +170,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
         // start immediately playing
         QueueModel.push(item, false);
       }
-
       // we don't need to adjust the alFiles here because for playlist type QUEUE
       // the contents is taken directly from the QueueModel in case of
     } else {
@@ -205,7 +181,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
    * Add some files to this playlist.
    * 
    * @param alFilesToAdd :   List of Files
-   * @param position DOCUMENT_ME
+   * @param position 
    */
   public void addFiles(final List<File> alFilesToAdd, int position) {
     try {
@@ -232,7 +208,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
       if (alFiles == null) {
         return;
       }
-
       alFiles.clear();
     }
   }
@@ -273,7 +248,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     } catch (final IOException e) {
       throw new JajukException(28, getName(), e);
     }
-
     // Now move the temp file to final one if everything seems ok
     moveTempPlaylistFile(temp);
   }
@@ -281,12 +255,11 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   /**
    * Move temp playlist file.
    * 
-   * @param temp DOCUMENT_ME
+   * @param temp 
    * 
    * @throws JajukException the jajuk exception
    */
   private void moveTempPlaylistFile(java.io.File temp) throws JajukException {
-
     if (temp.exists() && temp.length() > 0) {
       try {
         UtilSystem.copy(temp, getFIO());
@@ -311,7 +284,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
    * Sort ignoring cases
    * </p>.
    * 
-   * @param o DOCUMENT_ME
+   * @param o 
    * 
    * @return comparison result
    */
@@ -321,12 +294,10 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     if (o == null) {
       return -1;
     }
-
     // Perf: leave if items are equals
     if (o.equals(this)) {
       return 0;
     }
-
     final Playlist otherPlaylistFile = o;
     final String abs = getName() + (getDirectory() != null ? getAbsolutePath() : "");
     final String sOtherAbs = otherPlaylistFile.getName()
@@ -353,7 +324,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   /**
    * Down a track in the playlist.
    * 
-   * @param index DOCUMENT_ME
+   * @param index index of the track to down
    */
   public void down(final int index) {
     if (type == Type.BOOKMARK) {
@@ -362,7 +333,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
       QueueModel.down(index);
     } else if ((alFiles != null) && (index < alFiles.size() - 1)) {
       // the last track cannot go deeper
-
       // n+1 file becomes nth file
       Collections.swap(alFiles, index, index + 1);
     }
@@ -371,7 +341,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   /**
    * Equal method to check two playlists are identical.
    * 
-   * @param otherPlaylistFile DOCUMENT_ME
+   * @param otherPlaylistFile 
    * 
    * @return true, if equals
    */
@@ -381,22 +351,11 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     if (!(otherPlaylistFile instanceof Playlist)) {
       return false;
     }
-
     final Playlist plfOther = (Playlist) otherPlaylistFile;
     return getID().equals(plfOther.getID()) && plfOther.getType() == type;
   }
 
   /**
-   * Force playlist re-read (don't use the cache). Can be used after a forced
-   * refresh
-   * 
-   * @throws JajukException the jajuk exception
-   */
-  public void forceRefresh() throws JajukException {
-    alFiles = load(); // populate playlist
-  }
-
-  /**
    * Return absolute file path name.
    * 
    * @return String
@@ -407,8 +366,8 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
         return sAbs;
       }
       final Directory dCurrent = getDirectory();
-      final StringBuilder sbOut = new StringBuilder(dCurrent.getDevice().getUrl()).append(
-          dCurrent.getRelativePath()).append(java.io.File.separatorChar).append(getName());
+      final StringBuilder sbOut = new StringBuilder(dCurrent.getDevice().getUrl())
+          .append(dCurrent.getRelativePath()).append(java.io.File.separatorChar).append(getName());
       sAbs = sbOut.toString();
     } else {
       // smart playlist path depends on the user selected from the save as
@@ -418,19 +377,16 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
       if (fio == null) {
         return "";
       }
-
       sAbs = fio.getAbsolutePath();
     }
     return sAbs;
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_Playlist_File") + " : " + getName();
   }
 
@@ -479,7 +435,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
       // reading the m3u file twice)
       if (getFIO().exists() && getFIO().canRead()) {
         // check device is mounted
-        alFiles = load(); // populate playlist
+        load(); // populate playlist
       } else { // error accessing playlist
         throw new JajukException(9, getFIO().getAbsolutePath());
       }
@@ -547,7 +503,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return Const.XML_PLAYLIST_FILE;
   }
 
@@ -567,11 +523,9 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   /**
    * Parse a playlist.
    * 
-   * @return the list< file>
-   * 
    * @throws JajukException the jajuk exception
    */
-  public List<File> load() throws JajukException {
+  public void load() throws JajukException {
     final List<File> files = new ArrayList<File>(10);
     try {
       BufferedReader br = new BufferedReader(new FileReader(getFIO()));
@@ -579,7 +533,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
         String sLine = null;
         boolean bUnknownDevicesMessage = false;
         while ((sLine = br.readLine()) != null) {
-           if (sLine.length() == 0) { // void line
+          if (sLine.length() == 0) { // void line
             continue;
           }
           // replace '\' by '/'
@@ -604,7 +558,8 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
             // Check for file existence in jajuk collection using Guava Files.simplyPath
             // Don't use File.getAbsolutePath() because its result can contain ./ or ../
             // Don't use File.getCanonicalPath() because it resolves symlinks under unix.
-            File jajukFile = FileManager.getInstance().getFileByPath(Files.simplifyPath(fioAbsPath));
+            File jajukFile = FileManager.getInstance()
+                .getFileByPath(Files.simplifyPath(fioAbsPath));
             if (jajukFile == null) { // check if this file is known in collection
               fio = new java.io.File(sLine); // check if given url is not absolute
               jajukFile = FileManager.getInstance().getFileByPath(fio.getAbsolutePath());
@@ -629,7 +584,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
       throw new JajukException(17, (getDirectory() != null && getFIO() != null ? getFIO()
           .getAbsolutePath() : "<unknown>"), e);
     }
-    return files;
+    this.alFiles = files;
   }
 
   /**
@@ -642,35 +597,56 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     if ((alFiles == null) || (alFiles.size() == 0)) {
       Messages.showErrorMessage(18);
     } else {
-      QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(alFiles), Conf
-          .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+      QueueModel.push(
+          UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(alFiles),
+              Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
     }
   }
 
   /**
-   * Remove a track from the playlist.
+   * Remove an set of tracks index from the playlist.
+   * We expect at this point that the playlist has already been loaded once at least.
    * 
-   * @param index DOCUMENT_ME
-   */
-  public void remove(final int index) {
+   * @param Set<Integer> indexes
+   *            Array of index to drop. We expect the array to contain integers sorted by ascendent order.
+   *               
+   **/
+  public void remove(final Set<Integer> indexes) {
     if (type == Type.BOOKMARK) {
-      Bookmarks.getInstance().remove(index);
+      for (int index : indexes) {
+        Bookmarks.getInstance().remove(index);
+      }
     } else if (type == Type.QUEUE) {
-      QueueModel.remove(index, index);
+      QueueModel.remove(indexes);
     } else {
-      alFiles.remove(index);
+      for (int index : indexes) {
+        alFiles.remove(index);
+      }
     }
   }
 
   /**
+   * Remove a track at specified index from the playlist.
+   * 
+   * @param int index
+   *            index of the track to remove
+   *               
+   **/
+  public void remove(final int index) {
+    Set<Integer> indexes = new HashSet<Integer>(1);
+    indexes.add(index);
+    remove(indexes);
+  }
+
+  /**
    * Replace a file inside a playlist.
    * 
-   * @param fOld DOCUMENT_ME
-   * @param fNew DOCUMENT_ME
+   * @param fOld 
+   * @param fNew 
    * 
    * @throws JajukException the jajuk exception
    */
-  public void replaceFile(final File fOld, final File fNew) throws JajukException {
+  void replaceFile(final File fOld, final File fNew) throws JajukException {
     if (type == Type.BOOKMARK) {
       List<File> files = Bookmarks.getInstance().getFiles();
       final Iterator<File> it = files.iterator();
@@ -689,7 +665,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
       for (int i = 0; it.hasNext(); i++) {
         final File fileToTest = it.next().getFile();
         if (fileToTest.equals(fOld)) {
-          QueueModel.remove(i, i); // just remove
+          QueueModel.remove(i); // just remove
           final List<StackItem> al = new ArrayList<StackItem>(1);
           al.add(new StackItem(fNew));
           QueueModel.insert(al, i);
@@ -728,9 +704,9 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
    */
   public void saveAs() throws JajukException, InterruptedException, InvocationTargetException {
     FileChooserRunnable runnable = new FileChooserRunnable();
-
-    SwingUtilities.invokeLater(runnable);
-
+    // We have to wait the runnable to ensure that the caller get the correct selected
+    // path before remaining code execution
+    SwingUtilities.invokeAndWait(runnable);
     if (runnable.getException() != null) {
       throw runnable.getException();
     }
@@ -755,16 +731,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   }
 
   /**
-   * Sets the parent directory.
-   * 
-   * @param parentDirectory The dParentDirectory to set.
-   */
-  protected void setParentDirectory(final Directory parentDirectory) {
-    dParentDirectory = parentDirectory;
-    setProperty(Const.XML_DIRECTORY, parentDirectory == null ? "-1" : parentDirectory.getID());
-  }
-
-  /**
    * Return whether this item should be hidden with hide option.
    * 
    * @return whether this item should be hidden with hide option
@@ -796,7 +762,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
   /**
    * Up a track in the playlist.
    * 
-   * @param index DOCUMENT_ME
+   * @param index 
    */
   public void up(final int index) {
     if (type == Type.BOOKMARK) {
@@ -805,7 +771,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
       QueueModel.up(index);
     } else if ((alFiles != null) && (index > 0)) { // the first track
       // cannot go further
-
       // n-1 file becomes nth file
       Collections.swap(alFiles, index, index - 1);
     }
@@ -821,7 +786,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     if (alFiles == null) {
       return 0;
     }
-
     float rate = 0f;
     int nb = 0;
     for (File file : alFiles) {
@@ -840,7 +804,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     if (alFiles == null) {
       return 0;
     }
-
     int hits = 0;
     for (File file : alFiles) {
       hits += file.getTrack().getHits();
@@ -857,7 +820,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     if (alFiles == null) {
       return 0;
     }
-
     long length = 0;
     for (File file : alFiles) {
       length += file.getTrack().getDuration();
@@ -874,14 +836,29 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     if (alFiles == null) {
       return 0;
     }
-
     return alFiles.size();
   }
 
   /**
+    * Gets the any.
+    *
+    * @return a human representation of all concatenated properties
+    */
+  @Override
+  public String getAny() {
+    // rebuild any
+    StringBuilder sb = new StringBuilder(100);
+    sb.append(super.getAny()); // add all files-based properties
+    // now add others properties
+    sb.append(getDirectory().getDevice().getName());
+    sb.append(getAbsolutePath());
+    return sb.toString();
+  }
+
+  /**
    * Return true is the specified directory is an ancestor for this playlist.
    * 
-   * @param directory DOCUMENT_ME
+   * @param directory 
    * 
    * @return true, if checks for ancestor
    */
@@ -905,7 +882,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
    */
   private final class FileChooserRunnable implements Runnable {
     // records if there are exceptions during doing the call
-    /** DOCUMENT_ME. */
     JajukException ex = null;
 
     /*
@@ -916,8 +892,8 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
     @Override
     public void run() {
       try {
-        final JajukFileChooser jfchooser = new JajukFileChooser(new JajukFileFilter(PlaylistFilter
-            .getInstance()));
+        final JajukFileChooser jfchooser = new JajukFileChooser(new JajukFileFilter(
+            PlaylistFilter.getInstance()));
         jfchooser.setDialogType(JFileChooser.SAVE_DIALOG);
         jfchooser.setAcceptDirectories(true);
         String sPlaylist = Const.DEFAULT_PLAYLIST_FILE;
@@ -940,7 +916,7 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
                 + UtilString.getAdditionDateFormatter().format(new Date());
           } else {
             sPlaylist = file.getDirectory().getAbsolutePath() + java.io.File.separatorChar
-                + file.getTrack().getHumanValue(Const.XML_ALBUM);
+                + UtilSystem.getNormalizedFilename(file.getTrack().getHumanValue(Const.XML_ALBUM));
           }
         } else {
           return;
@@ -955,7 +931,6 @@ public class Playlist extends PhysicalItem implements Comparable<Playlist> {
           } else {
             file = new java.io.File(file.getAbsolutePath() + "." + Const.EXT_PLAYLIST);
           }
-
           // set new file path ( this playlist is a special playlist, just in
           // memory )
           setFIO(file);
diff --git a/src/main/java/org/jajuk/base/PlaylistManager.java b/src/main/java/org/jajuk/base/PlaylistManager.java
index afea311..2451a6b 100644
--- a/src/main/java/org/jajuk/base/PlaylistManager.java
+++ b/src/main/java/org/jajuk/base/PlaylistManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.io.IOException;
@@ -43,7 +42,6 @@ import org.jajuk.util.log.Log;
  * Convenient class to manage playlists.
  */
 public final class PlaylistManager extends ItemManager implements Observer {
-
   /** Self instance. */
   private static PlaylistManager singleton = new PlaylistManager();
 
@@ -76,12 +74,12 @@ public final class PlaylistManager extends ItemManager implements Observer {
   /**
    * Register an Playlist with a known id.
    * 
-   * @param fio DOCUMENT_ME
-   * @param dParentDirectory DOCUMENT_ME
+   * @param fio 
+   * @param dParentDirectory 
    * 
    * @return the playlist
    */
-  public Playlist registerPlaylistFile(java.io.File fio, Directory dParentDirectory) {
+  Playlist registerPlaylistFile(java.io.File fio, Directory dParentDirectory) {
     String sId = createID(fio.getName(), dParentDirectory);
     return registerPlaylistFile(sId, fio.getName(), dParentDirectory);
   }
@@ -89,14 +87,14 @@ public final class PlaylistManager extends ItemManager implements Observer {
   /**
    * Creates the id.
    * 
-   * @param sName DOCUMENT_ME
-   * @param dParentDirectory DOCUMENT_ME
+   * @param sName 
+   * @param dParentDirectory 
    * 
    * @return ItemManager ID
    */
   protected static String createID(String sName, Directory dParentDirectory) {
-    return MD5Processor.hash(new StringBuilder(dParentDirectory.getDevice().getName()).append(
-        dParentDirectory.getRelativePath()).append(sName).toString());
+    return MD5Processor.hash(new StringBuilder(dParentDirectory.getDevice().getName())
+        .append(dParentDirectory.getRelativePath()).append(sName).toString());
   }
 
   /**
@@ -106,7 +104,7 @@ public final class PlaylistManager extends ItemManager implements Observer {
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    */
-  public void removePlaylistFile(Playlist plf) throws IOException {
+  private void removePlaylistFile(Playlist plf) throws IOException {
     String sFileToDelete = plf.getDirectory().getFio().getAbsoluteFile().toString()
         + java.io.File.separatorChar + plf.getName();
     lock.writeLock().lock();
@@ -115,7 +113,6 @@ public final class PlaylistManager extends ItemManager implements Observer {
       if (fileToDelete.exists()) {
         UtilSystem.deleteFile(fileToDelete);
       }
-
       // remove playlist
       removeItem(plf);
     } finally {
@@ -149,9 +146,9 @@ public final class PlaylistManager extends ItemManager implements Observer {
   /**
    * Register an Playlist with a known id.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param dParentDirectory DOCUMENT_ME
+   * @param sId 
+   * @param sName 
+   * @param dParentDirectory 
    * @return the playlist
    */
   public Playlist registerPlaylistFile(String sId, String sName, Directory dParentDirectory) {
@@ -184,21 +181,21 @@ public final class PlaylistManager extends ItemManager implements Observer {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_PLAYLIST_FILES;
   }
 
   /**
    * Change a playlist name.
    * 
-   * @param plfOld DOCUMENT_ME
-   * @param sNewName DOCUMENT_ME
+   * @param plfOld 
+   * @param sNewName 
    * 
    * @return new playlist
    * 
    * @throws JajukException the jajuk exception
    */
-  public Playlist changePlaylistFileName(Playlist plfOld, String sNewName) throws JajukException {
+  Playlist changePlaylistFileName(Playlist plfOld, String sNewName) throws JajukException {
     lock.writeLock().lock();
     try {
       // check given name is different
@@ -217,9 +214,7 @@ public final class PlaylistManager extends ItemManager implements Observer {
       // create a new playlist (with own fio and sAbs)
       Playlist plfNew = new Playlist(sNewId, sNewName, plfOld.getDirectory());
       // Transfer all properties (id and name)
-      // We use a shallow copy of properties to avoid any properties share between
-      // two items
-      plfNew.setProperties(plfOld.getShallowProperties());
+      plfNew.setProperties(plfOld.getProperties());
       plfNew.setProperty(Const.XML_ID, sNewId); // reset new id and name
       plfNew.setProperty(Const.XML_NAME, sNewName); // reset new id and name
       // check file name and extension
@@ -348,7 +343,6 @@ public final class PlaylistManager extends ItemManager implements Observer {
         return pl;
       }
     }
-
     // none found
     return null;
   }
diff --git a/src/main/java/org/jajuk/base/PropertyMetaInformation.java b/src/main/java/org/jajuk/base/PropertyMetaInformation.java
index 38db6ae..c1cf22f 100644
--- a/src/main/java/org/jajuk/base/PropertyMetaInformation.java
+++ b/src/main/java/org/jajuk/base/PropertyMetaInformation.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.net.MalformedURLException;
@@ -36,49 +35,37 @@ import org.jajuk.util.log.Log;
  * A Jajuk property meta information.
  */
 public class PropertyMetaInformation {
-
   /** Property name. */
   private final String sName;
-
   /** Is property a custom property?. */
   private boolean bCustom = false;
-
   /** Is property element of associated item constructor? (and so used in the checksum ID hash). */
   private boolean bConstructor = false;
-
   /** Property Type (java.lang.String for ie) */
   private final Class<?> cType;
-
   /** Default value (null: no default). */
-  Object oDefaultValue;
-
+  private Object oDefaultValue;
   /** This property should be displayed to UI?. */
-  boolean bShouldBeDisplayed = true;
-
+  private boolean bShouldBeDisplayed = true;
   /** Editable?. */
-  boolean bEditable = true;
-
+  private boolean bEditable = true;
   /** Unique?. */
-  boolean bMergeable = false;
-
+  private boolean bMergeable = false;
   /** Human Type. */
   private String sHumanType;
 
-  /** Today. */
-  public static final Date TODAY = new Date();
-
   /**
-   * constructor.
-   * 
-   * @param sName Property name
-   * @param bCustom Is custom property
-   * @param bConstructor Is constructor property
-   * @param bShouldBeDisplayed Does this standard property must be displayed (exp for ie is not)
-   * @param bEditable Is this property editable
-   * @param bMergeable Is this property mergeable if we display several items together
-   * @param cType Property type
-   * @param oDefaultValue Default value
-   */
+  * constructor.
+  * 
+  * @param sName Property name
+  * @param bCustom Is custom property
+  * @param bConstructor Is constructor property
+  * @param bShouldBeDisplayed Does this standard property must be displayed (exp for ie is not)
+  * @param bEditable Is this property editable
+  * @param bMergeable Is this property mergeable if we display several items together
+  * @param cType Property type
+  * @param oDefaultValue Default value
+  */
   public PropertyMetaInformation(String sName, boolean bCustom, boolean bConstructor,
       boolean bShouldBeDisplayed, boolean bEditable, boolean bMergeable, Class<?> cType,
       Object oDefaultValue) {
@@ -181,7 +168,7 @@ public class PropertyMetaInformation {
    * 
    * @return property meta information XML description
    */
-  public String toXML() {
+  String toXML() {
     String sDefault = "";
     try {
       if (oDefaultValue != null) {
@@ -211,7 +198,6 @@ public class PropertyMetaInformation {
    * public void setDefaultValue(String defaultValue) { oDefaultValue =
    * defaultValue; }
    */
-
   /* (non-Javadoc)
    * @see java.lang.Object#toString()
    */
@@ -266,5 +252,4 @@ public class PropertyMetaInformation {
   public String getHumanName() {
     return Messages.getHumanPropertyName(getName());
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/SearchResult.java b/src/main/java/org/jajuk/base/SearchResult.java
index 4b01c04..f3558b9 100644
--- a/src/main/java/org/jajuk/base/SearchResult.java
+++ b/src/main/java/org/jajuk/base/SearchResult.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import org.jajuk.services.webradio.WebRadio;
@@ -27,44 +26,27 @@ import org.jajuk.services.webradio.WebRadio;
  * A search result, contains a file and a search description.
  */
 public class SearchResult implements Comparable<SearchResult> {
-
   /**
    * Result type *.
    */
   public enum SearchResultType {
-
-    /** DOCUMENT_ME. */
-    FILE,
-    
-    /** DOCUMENT_ME. */
-    WEBRADIO
+    FILE, WEBRADIO
   }
 
   /** The associated file. */
-  File file;
-
+  private File file;
   /** The associated web radio. */
-  WebRadio radio;
-
+  private WebRadio radio;
   /** Pre-calculated search string. */
-  String sResu;
-
-  /**
-   * Instantiates a new search result.
-   * 
-   * @param file DOCUMENT_ME
-   */
-  public SearchResult(File file) {
-    this(file, file.toStringSearch());
-  }
+  private String sResu;
 
   /**
-   * Instantiates a new search result.
-   * 
-   * @param file DOCUMENT_ME
-   * @param sResu DOCUMENT_ME
-   */
-  public SearchResult(File file, String sResu) {
+  * Instantiates a new search result.
+  * 
+  * @param file 
+  * @param sResu 
+  */
+  SearchResult(File file, String sResu) {
     this.file = file;
     this.sResu = sResu;
   }
@@ -72,8 +54,8 @@ public class SearchResult implements Comparable<SearchResult> {
   /**
    * Instantiates a new search result.
    * 
-   * @param radio DOCUMENT_ME
-   * @param sResu DOCUMENT_ME
+   * @param radio 
+   * @param sResu 
    */
   public SearchResult(WebRadio radio, String sResu) {
     this.radio = radio;
@@ -100,7 +82,6 @@ public class SearchResult implements Comparable<SearchResult> {
     if (sr == null) {
       return -1;
     }
-
     return sResu.compareToIgnoreCase(sr.getResu());
   }
 
@@ -143,5 +124,4 @@ public class SearchResult implements Comparable<SearchResult> {
   public String getResu() {
     return sResu;
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/SmartPlaylist.java b/src/main/java/org/jajuk/base/SmartPlaylist.java
index 619ba27..ac44e36 100644
--- a/src/main/java/org/jajuk/base/SmartPlaylist.java
+++ b/src/main/java/org/jajuk/base/SmartPlaylist.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -29,28 +29,15 @@ package org.jajuk.base;
  * we call the constructor directly without performing any item registration.
  */
 public class SmartPlaylist extends Playlist {
-
-  /**
-   * The Constructor.
-   * 
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param dParentDirectory DOCUMENT_ME
-   */
-  public SmartPlaylist(String sId, String sName, Directory dParentDirectory) {
-    super(sId, sName, dParentDirectory);
-  }
-
   /**
    * The Constructor.
    * 
-   * @param type DOCUMENT_ME
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param dParentDirectory DOCUMENT_ME
+   * @param type 
+   * @param sId 
+   * @param sName 
+   * @param dParentDirectory 
    */
   public SmartPlaylist(Type type, String sId, String sName, Directory dParentDirectory) {
     super(type, sId, sName, dParentDirectory);
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/Track.java b/src/main/java/org/jajuk/base/Track.java
index b026d31..9733c45 100644
--- a/src/main/java/org/jajuk/base/Track.java
+++ b/src/main/java/org/jajuk/base/Track.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -30,7 +30,7 @@ import java.util.Set;
 import javax.swing.ImageIcon;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.services.core.RatingManager;
+import org.jajuk.services.core.RatingService;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
@@ -45,44 +45,36 @@ import org.jajuk.util.log.Log;
  * Logical item.
  */
 public class Track extends LogicalItem implements Comparable<Track> {
-
   /** Track album*. */
   private final Album album;
-
   /** Track genre. */
   private final Genre genre;
-
   /** Track artist. */
   private final Artist artist;
-
   /** Track length. */
   private final long length;
-
   /** Track year. */
   private final Year year;
-
   /** Track type. */
   private final Type type;
-
   /** Album Artist. */
   private AlbumArtist albumArtist;
-
   /** Track associated files. */
   private final List<File> alFiles = new ArrayList<File>(1);
 
   /**
    * Track constructor.
    *
-   * @param sId DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param album DOCUMENT_ME
-   * @param genre DOCUMENT_ME
-   * @param artist DOCUMENT_ME
-   * @param length DOCUMENT_ME
-   * @param year DOCUMENT_ME
-   * @param lOrder DOCUMENT_ME
-   * @param type DOCUMENT_ME
-   * @param lDiscNumber DOCUMENT_ME
+   * @param sId 
+   * @param sName 
+   * @param album 
+   * @param genre 
+   * @param artist 
+   * @param length 
+   * @param year 
+   * @param lOrder 
+   * @param type 
+   * @param lDiscNumber 
    */
   Track(String sId, String sName, Album album, Genre genre, Artist artist, long length, Year year,
       long lOrder, Type type, long lDiscNumber) {
@@ -117,13 +109,12 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * toString method.
-   * 
+   *
    * @return the string
    */
   @Override
   public String toString() {
     StringBuilder sOut = new StringBuilder();
-
     sOut.append("Track[ID=").append(getID()).append(" Name={{").append(getName()).append("}} ")
         .append(album).append(" ").append(genre).append(" ").append(artist).append(" Length=")
         .append(length).append(" Year=").append(year.getValue()).append(" Rate=").append(getRate())
@@ -139,7 +130,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the any.
-   * 
+   *
    * @return a human representation of all concatenated properties
    */
   @Override
@@ -155,11 +146,11 @@ public class Track extends LogicalItem implements Comparable<Track> {
   }
 
   /**
-   * Default comparator for tracks, not used for sorting (use TrackComparator
-   * for that) But only for storage.
-   * 
-   * @param otherTrack DOCUMENT_ME
-   * 
+   * Default comparator for tracks, not used for actual sorting (use TrackComparator
+   * for that), only for storage purpose.
+   *
+   * @param otherTrack 
+   *
    * @return comparison result
    */
   @Override
@@ -169,7 +160,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the album.
-   * 
+   *
    * @return the album
    */
   public Album getAlbum() {
@@ -178,7 +169,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets a copy of associated files.
-   * 
+   *
    * @return a copy of associated files
    */
   public List<org.jajuk.base.File> getFiles() {
@@ -187,35 +178,18 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Remove specified file from associated files.
-   * 
+   *
    * @param file : the file to remove
    */
-  public void removeFile(File file) {
+  void removeFile(File file) {
     alFiles.remove(file);
   }
 
   /**
-   * Gets the files.
-   * 
-   * @param filter files we want to deal with, null means no filter
-   * 
-   * @return all associated files
-   */
-  public List<org.jajuk.base.File> getFiles(Set<File> filter) {
-    List<File> out = new ArrayList<File>(alFiles.size());
-    for (File file : alFiles) {
-      if (filter == null || filter.contains(file)) {
-        out.add(file);
-      }
-    }
-    return out;
-  }
-
-  /**
-   * Gets the ready files.
-   * 
-   * @return ready files
-   */
+  * Gets the ready files.
+  *
+  * @return ready files
+  */
   public List<File> getReadyFiles() {
     List<File> alReadyFiles = new ArrayList<File>(alFiles.size());
     for (File file : alFiles) {
@@ -228,12 +202,12 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the ready files.
-   * 
+   *
    * @param filter files we want to deal with, null means no filter
-   * 
+   *
    * @return ready files with given filter
    */
-  public List<File> getReadyFiles(Set<File> filter) {
+  List<File> getReadyFiles(Set<File> filter) {
     List<File> alReadyFiles = new ArrayList<File>(alFiles.size());
     for (File file : alFiles) {
       if (file.isReady() && (filter == null || filter.contains(file))) {
@@ -245,12 +219,11 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Get sum size of all files this track map to.
-   * 
+   *
    * @return the total size
    */
   public long getTotalSize() {
     long l = 0;
-
     for (final File file : alFiles) {
       l += file.getSize();
     }
@@ -259,15 +232,14 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the playable file.
-   * 
+   *
    * @param bIgnoreUnmounted Do we return unmounted files
-   * 
+   *
    * @return best file to play for this track or null if none available
    */
   public File getBestFile(boolean bIgnoreUnmounted) {
     File fileOut = null;
     final List<File> alMountedFiles = new ArrayList<File>(2);
-
     // firstly, filter mounted files if needed
     for (final File file : alFiles) {
       if (!bIgnoreUnmounted || file.isReady()) {
@@ -305,7 +277,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the hits.
-   * 
+   *
    * @return the hits
    */
   public long getHits() {
@@ -314,7 +286,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the comment.
-   * 
+   *
    * @return the comment
    */
   public String getComment() {
@@ -323,7 +295,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Get track number.
-   * 
+   *
    * @return the order
    */
   public long getOrder() {
@@ -332,7 +304,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Get disc number.
-   * 
+   *
    * @return the disc number
    */
   public long getDiscNumber() {
@@ -341,7 +313,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Get album artist.
-   * 
+   *
    * @return the album artist
    */
   public AlbumArtist getAlbumArtist() {
@@ -350,7 +322,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the album artist or artist if album-artist is not available.
-   * 
+   *
    * @return the albumArtist or artist if album artist not available
    * <p>
    * If this is various, the album artist is tried to be defined by the
@@ -359,9 +331,10 @@ public class Track extends LogicalItem implements Comparable<Track> {
    */
   public String getAlbumArtistOrArtist() {
     // If the album artist tag is provided, perfect, let's use it !
-    String albumArtist = getAlbumArtist().getName();
-    if (StringUtils.isNotBlank(albumArtist) && !(Const.UNKNOWN_ARTIST.equals(albumArtist))) {
-      return albumArtist;
+    AlbumArtist albumArtist = getAlbumArtist();
+    if (albumArtist != null && StringUtils.isNotBlank(albumArtist.getName())
+        && !(Const.UNKNOWN_ARTIST.equals(albumArtist.getName()))) {
+      return albumArtist.getName();
     }
     // various artist? check if all artists are the same
     Artist artist = getArtist();
@@ -376,7 +349,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the year.
-   * 
+   *
    * @return the year
    */
   public Year getYear() {
@@ -385,7 +358,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the duration.
-   * 
+   *
    * @return length in sec
    */
   public long getDuration() {
@@ -402,7 +375,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the discovery date.
-   * 
+   *
    * @return the date where the track has been discovered (added into the
    * collection)
    */
@@ -412,7 +385,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the type.
-   * 
+   *
    * @return the type
    */
   public Type getType() {
@@ -421,7 +394,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the artist.
-   * 
+   *
    * @return the artist
    */
   public Artist getArtist() {
@@ -430,7 +403,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the genre.
-   * 
+   *
    * @return the genre
    */
   public Genre getGenre() {
@@ -439,8 +412,8 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Add an associated file.
-   * 
-   * @param file DOCUMENT_ME
+   *
+   * @param file 
    */
   public void addFile(File file) {
     // make sure a file will be referenced by only one track (first found)
@@ -451,14 +424,14 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Sets the hits.
-   * 
+   *
    * @param hits The iHits to set.
    */
   public void setHits(long hits) {
     setProperty(Const.XML_TRACK_HITS, hits);
     // Store max playcount
-    if (hits > RatingManager.getMaxPlaycount()) {
-      RatingManager.setMaxPlaycount(hits);
+    if (hits > RatingService.getMaxPlaycount()) {
+      RatingService.setMaxPlaycount(hits);
     }
   }
 
@@ -474,7 +447,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
    * Set track preference (from -3 to 3: -3: hate, -2=dislike, -1=poor, +1=like,
    * +2=love +3=crazy). The preference is a factor given by the user to increase
    * or decrease a track rate.
-   * 
+   *
    * @param preference from -3 to 3
    */
   public void setPreference(long preference) {
@@ -490,60 +463,67 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Compute final track rate.
-   * 
-   * @see http://trac.jajuk.info/ticket/1179
+   *
+   * @see #1179
    */
   public void updateRate() {
     try {
-      // rate contains final rate [0,100]
-      long rate = 0;
-      // Normalize values to avoid division by zero
-      long duration = getDuration();
-      long playcount = getHits();
-      // Playcount must be > 0 to avoid divisions by zero and log(0) operations
-      if (playcount <= 0) {
-        playcount = 1;
-      }
-      float playtimeRate = 0.5f;
-      if (duration == 0) {
-        // If duration = 0, always set playtimeRate to 0.5
-        Log.info("Duration = 0 for: {{" + getName() + "}}. Playtime forced to 0.5");
+      // -- Manual rating : just use preference
+      if (Conf.getBoolean(Const.CONF_MANUAL_RATINGS)) {
+        long preference = getLongValue(Const.XML_TRACK_PREFERENCE);
+        long rate = RatingService.getRateForPreference(preference);
+        setRate(rate);
+        // -- Semi-Automatic (standard) rating 
       } else {
-        // Compute playtime rate = total play time / (play count * track length)
-        playtimeRate = (float) getLongValue(Const.XML_TRACK_TOTAL_PLAYTIME)
-            / (playcount * duration);
-      }
-      // playtimeRate can be > 1 because of player impl duration computation
-      // precision issue or if user seeks back into the track
-      // set =1.
-      if (playtimeRate > 1) {
-        Log.warn("Playtime rate > 1 for: {{" + getName() + "}} value=" + playtimeRate);
-        // We reset tpt and hits to
-        // make things clear and to avoid increasing the error with time
-        setProperty(Const.XML_TRACK_TOTAL_PLAYTIME, duration * playcount);
-        playtimeRate = 1f;
-      }
-
-      // compute the playcount rate (logarithmic scale to take number of plays
-      // into account)
-      // playcountRate = ln(track playcount)/ln(max playcount)
-      long maxPlayCount = RatingManager.getMaxPlaycount();
-      if (maxPlayCount <= 0) {
-        maxPlayCount = 1;
+        // rate contains final rate [0,100]
+        long rate = 0;
+        // Normalize values to avoid division by zero
+        long duration = getDuration();
+        long playcount = getHits();
+        // Playcount must be > 0 to avoid divisions by zero and log(0) operations
+        if (playcount <= 0) {
+          playcount = 1;
+        }
+        float playtimeRate = 0.5f;
+        if (duration == 0) {
+          // If duration = 0, always set playtimeRate to 0.5
+          Log.info("Duration = 0 for: {{" + getName() + "}}. Playtime forced to 0.5");
+        } else {
+          // Compute playtime rate = total play time / (play count * track length)
+          playtimeRate = (float) getLongValue(Const.XML_TRACK_TOTAL_PLAYTIME)
+              / (playcount * duration);
+        }
+        // playtimeRate can be > 1 because of player impl duration computation
+        // precision issue or if user seeks back into the track
+        // set =1.
+        if (playtimeRate > 1) {
+          Log.warn("Playtime rate > 1 for: {{" + getName() + "}} value=" + playtimeRate);
+          // We reset tpt and hits to
+          // make things clear and to avoid increasing the error with time
+          setProperty(Const.XML_TRACK_TOTAL_PLAYTIME, duration * playcount);
+          playtimeRate = 1f;
+        }
+        // compute the playcount rate (logarithmic scale to take number of plays
+        // into account)
+        // playcountRate = ln(track playcount)/ln(max playcount)
+        long maxPlayCount = RatingService.getMaxPlaycount();
+        if (maxPlayCount <= 0) {
+          maxPlayCount = 1;
+        }
+        float playcountRate = (float) (Math.log(playcount) / Math.log(maxPlayCount));
+        // Intermediate rate is a mix between playtime and playcount rates with
+        // factor 0.75 for the first one and 0.25 for the second
+        float intermediateRate = (0.75f * playtimeRate) + (0.25f * playcountRate);
+        // Final rate is intermediateRate in whish we apply the user preference
+        // from
+        // -3 (hate) to 3 (adore)
+        long preference = getLongValue(Const.XML_TRACK_PREFERENCE);
+        long absPreference = Math.abs(preference);
+        rate = Math.round(100 * (intermediateRate + (preference + absPreference) / 2)
+            / (absPreference + 1));
+        // Apply new rate
+        setRate(rate);
       }
-      float playcountRate = (float) (Math.log(playcount) / Math.log(maxPlayCount));
-      // Intermediate rate is a mix between playtime and playcount rates with
-      // factor 0.75 for the first one and 0.25 for the second
-      float intermediateRate = (0.75f * playtimeRate) + (0.25f * playcountRate);
-      // Final rate is intermediateRate in whish we apply the user preference
-      // from
-      // -3 (hate) to 3 (adore)
-      long preference = getLongValue(Const.XML_TRACK_PREFERENCE);
-      long absPreference = Math.abs(preference);
-      rate = Math.round(100 * (intermediateRate + (preference + absPreference) / 2)
-          / (absPreference + 1));
-      // Apply new rate
-      setRate(rate);
     } catch (Exception e) {
       // We catch any arithmetic issue here to avoid preventing next track
       // startup
@@ -553,18 +533,18 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Sets the rate.
-   * 
+   *
    * @param rate The lRate to set.
    */
   protected void setRate(long rate) {
     setProperty(Const.XML_TRACK_RATE, rate);
-    RatingManager.setRateHasChanged(true);
+    RatingService.setRateHasChanged(true);
   }
 
   /**
    * Sets the comment.
-   * 
-   * @param sComment DOCUMENT_ME
+   *
+   * @param sComment 
    */
   public void setComment(String sComment) {
     setProperty(Const.XML_TRACK_COMMENT, sComment);
@@ -572,7 +552,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Sets the album artist.
-   * 
+   *
    * @param albumArtist : the album artist
    */
   public void setAlbumArtist(AlbumArtist albumArtist) {
@@ -583,7 +563,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Sets the discovery date.
-   * 
+   *
    * @param additionDate The sAdditionDate to set.
    */
   public void setDiscoveryDate(Date additionDate) {
@@ -592,7 +572,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Return whether this item should be hidden with hide option.
-   * 
+   *
    * @return whether this item should be hidden with hide option
    */
   public boolean shouldBeHidden() {
@@ -604,27 +584,25 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return XML_TRACK;
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Item_Track") + " : " + getName();
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.Item#getHumanValue(java.lang.String)
    */
   @Override
@@ -662,7 +640,6 @@ public class Track extends LogicalItem implements Comparable<Track> {
       return getStringValue(sKey);
     } else if (Const.XML_FILES.equals(sKey)) {
       final StringBuilder sbOut = new StringBuilder();
-
       for (final File file : alFiles) {
         sbOut.append(file.getAbsolutePath());
         sbOut.append(',');
@@ -679,7 +656,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.Item#getIconRepresentation()
    */
   @Override
@@ -689,7 +666,7 @@ public class Track extends LogicalItem implements Comparable<Track> {
 
   /**
    * Gets the files string.
-   * 
+   *
    * @return a list of associated files in format : file1,file2...
    */
   public String getFilesString() {
diff --git a/src/main/java/org/jajuk/base/TrackComparator.java b/src/main/java/org/jajuk/base/TrackComparator.java
index 22f1ce3..c87a74a 100644
--- a/src/main/java/org/jajuk/base/TrackComparator.java
+++ b/src/main/java/org/jajuk/base/TrackComparator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.io.Serializable;
@@ -31,10 +30,8 @@ import org.jajuk.util.UtilString;
  * Multi-method track comparator.
  */
 public class TrackComparator implements Comparator<Track>, Serializable {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -4735723947400147134L;
-
   /** Sorting method. */
   private final TrackComparatorType comparatorType;
 
@@ -42,32 +39,23 @@ public class TrackComparator implements Comparator<Track>, Serializable {
    * Sorting methods constants.
    */
   public enum TrackComparatorType {
-    
     /** Compare first based on the genre, then on artist and then on album. */
     GENRE_ARTIST_ALBUM,
-    
     /** Compare based on artist and then album. */
     ARTIST_ALBUM,
-    
     /** Compare only on album. */
     ALBUM,
-    
     /** Compare only on year. */
     YEAR_ALBUM,
-    
     /** Compare only on the discovery date of the album. */
     DISCOVERY_ALBUM,
-    
     /** Compare on the rate and then the album. */
     RATE_ALBUM,
-    
     /** Compare on the number of hits and then on the album. */
     HITS_ALBUM,
-    
     /** Compare on disc number and order of the track in the album. */
     ORDER,
-    
-    /** Compare to find identifical tracks. */
+    /** Compare to find identical tracks. */
     ALMOST_IDENTICAL
   }
 
@@ -100,42 +88,43 @@ public class TrackComparator implements Comparator<Track>, Serializable {
     // 2 tracks with different years
     // Genre/artist/album
     if (comparatorType == TrackComparatorType.GENRE_ARTIST_ALBUM) {
-      sHashCompare = new StringBuilder().append(track.getGenre().getName2()).append(
-          track.getArtist().getName2()).append(track.getAlbum().getName2()).append(
-          UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
+      sHashCompare = new StringBuilder().append(track.getGenre().getName2())
+          .append(track.getArtist().getName2()).append(track.getAlbum().getName2())
+          .append(UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
     }// Artist/album
     else if (comparatorType == TrackComparatorType.ARTIST_ALBUM) {
-      sHashCompare = new StringBuilder().append(track.getArtist().getName2()).append(
-          track.getAlbum().getName2()).append(UtilString.padNumber(track.getOrder(), 5)).append(
-          track.getName()).toString();
+      sHashCompare = new StringBuilder().append(track.getArtist().getName2())
+          .append(track.getAlbum().getName2()).append(UtilString.padNumber(track.getOrder(), 5))
+          .append(track.getName()).toString();
     }
     // Album
     else if (comparatorType == TrackComparatorType.ALBUM) {
-      sHashCompare = new StringBuilder().append(track.getAlbum().getName2()).append(
-          UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
+      sHashCompare = new StringBuilder().append(track.getAlbum().getName2())
+          .append(UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
     }
     // Year / album
     if (comparatorType == TrackComparatorType.YEAR_ALBUM) {
-      sHashCompare = new StringBuilder().append(
-          UtilString.padNumber(999999999 - track.getYear().getValue(), 10)).append(
-          UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
+      sHashCompare = new StringBuilder()
+          .append(UtilString.padNumber(999999999 - track.getYear().getValue(), 10))
+          .append(UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
     }
     // discovery date / album
     else if (comparatorType == TrackComparatorType.DISCOVERY_ALBUM) {
-      sHashCompare = new StringBuilder().append(FORMATTER.format(track.getDiscoveryDate())).append(
-          track.getAlbum().getName2()).append(UtilString.padNumber(track.getOrder(), 5)).append(
-          track.getName()).toString();
+      sHashCompare = new StringBuilder().append(FORMATTER.format(track.getDiscoveryDate()))
+          .append(track.getAlbum().getName2()).append(UtilString.padNumber(track.getOrder(), 5))
+          .append(track.getName()).toString();
     }
     // Rate / album
     else if (comparatorType == TrackComparatorType.RATE_ALBUM) {
-      sHashCompare = new StringBuilder().append(
-          UtilString.padNumber(999999999 - track.getRate(), 10)).append(
-          UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
+      sHashCompare = new StringBuilder()
+          .append(UtilString.padNumber(999999999 - track.getRate(), 10))
+          .append(UtilString.padNumber(track.getOrder(), 5)).append(track.getName()).toString();
     }
     // Hits / album
     else if (comparatorType == TrackComparatorType.HITS_ALBUM) {
-      sHashCompare = new StringBuilder().append(
-          UtilString.padNumber(999999999 - track.getHits(), 10)).append(track.getName()).toString();
+      sHashCompare = new StringBuilder()
+          .append(UtilString.padNumber(999999999 - track.getHits(), 10)).append(track.getName())
+          .toString();
     }
     // Disc number / Order / track name
     else if (comparatorType == TrackComparatorType.ORDER) {
@@ -148,14 +137,13 @@ public class TrackComparator implements Comparator<Track>, Serializable {
     else if (comparatorType == TrackComparatorType.ALMOST_IDENTICAL) {
       sHashCompare = buildIdenticalTestFootprint(track);
     }
-
     return sHashCompare;
   }
 
   /**
    * Return a footprint used to find almost-identical track.
    * 
-   * @param track DOCUMENT_ME
+   * @param track 
    * 
    * @return a footprint used to find almost-identical track
    */
diff --git a/src/main/java/org/jajuk/base/TrackManager.java b/src/main/java/org/jajuk/base/TrackManager.java
index 53d8b99..591ac43 100644
--- a/src/main/java/org/jajuk/base/TrackManager.java
+++ b/src/main/java/org/jajuk/base/TrackManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,20 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 
+import javax.swing.JOptionPane;
+
 import org.jajuk.base.TrackComparator.TrackComparatorType;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
@@ -39,6 +42,7 @@ import org.jajuk.services.tags.Tag;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.MD5Processor;
+import org.jajuk.util.Messages;
 import org.jajuk.util.ReadOnlyIterator;
 import org.jajuk.util.UtilString;
 import org.jajuk.util.error.JajukException;
@@ -49,22 +53,20 @@ import org.jajuk.util.log.Log;
  * Convenient class to manage Tracks.
  */
 public final class TrackManager extends ItemManager {
-
   /** Self instance. */
   private static TrackManager singleton = new TrackManager();
-
   /** Autocommit flag for tags *. */
   private volatile boolean bAutocommit = true;
-
   /** Set of tags to commit. */
   private final Set<Tag> tagsToCommit = new HashSet<Tag>(10);
+  /** Attic for tracks that have been dropped but may be useful when a file is renamed to restore its properties */
+  private final Map<String, Track> attic = new HashMap<String, Track>(0);
 
   /**
    * No constructor available, only static access.
    */
   private TrackManager() {
     super();
-
     // ---register properties---
     // ID
     registerProperty(new PropertyMetaInformation(Const.XML_ID, false, true, false, false, false,
@@ -97,7 +99,7 @@ public final class TrackManager extends ItemManager {
     // not editable
     registerProperty(new PropertyMetaInformation(Const.XML_TRACK_RATE, false, false, true, false,
         true, Long.class, 0));
-    // Files
+    // Files. This is now a derivated property, build on demand. Never commited because always null.
     registerProperty(new PropertyMetaInformation(Const.XML_FILES, false, false, true, false, false,
         String.class, null));
     // Hits
@@ -127,7 +129,9 @@ public final class TrackManager extends ItemManager {
     // Track ban status
     registerProperty(new PropertyMetaInformation(Const.XML_TRACK_BANNED, false, false, true, true,
         false, Boolean.class, false));
-
+    // Scrobble flag
+    registerProperty(new PropertyMetaInformation(Const.XML_TRACK_SCROBBLE, false, false, true,
+        true, true, Boolean.class, true));
   }
 
   /**
@@ -140,17 +144,32 @@ public final class TrackManager extends ItemManager {
   }
 
   /**
+   * Confirm before actually changing a tag
+   * @param track the track to be changed
+   * @return whether user accept to actually change a tag
+   */
+  private boolean confirm(Track track) {
+    if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_BEFORE_TAG_WRITE)) {
+      final int iResu = Messages.getChoice(Messages.getString("Confirmation_tag_write") + " : \n"
+          + track.getFilesString(), JOptionPane.YES_NO_CANCEL_OPTION,
+          JOptionPane.INFORMATION_MESSAGE);
+      return iResu == JOptionPane.YES_OPTION;
+    }
+    return true;
+  }
+
+  /**
    * Register an Track.
    * 
-   * @param sName DOCUMENT_ME
-   * @param album DOCUMENT_ME
-   * @param genre DOCUMENT_ME
-   * @param artist DOCUMENT_ME
-   * @param length DOCUMENT_ME
-   * @param year DOCUMENT_ME
-   * @param lOrder DOCUMENT_ME
-   * @param type DOCUMENT_ME
-   * @param lDiscNumber DOCUMENT_ME
+   * @param sName 
+   * @param album 
+   * @param genre 
+   * @param artist 
+   * @param length 
+   * @param year 
+   * @param lOrder 
+   * @param type 
+   * @param lDiscNumber 
    * 
    * @return the track
    */
@@ -163,15 +182,15 @@ public final class TrackManager extends ItemManager {
   /**
    * Return hashcode for a track.
    * 
-   * @param sName DOCUMENT_ME
-   * @param album DOCUMENT_ME
-   * @param genre DOCUMENT_ME
-   * @param artist DOCUMENT_ME
-   * @param length DOCUMENT_ME
-   * @param year DOCUMENT_ME
-   * @param lOrder DOCUMENT_ME
-   * @param type DOCUMENT_ME
-   * @param lDiscNumber DOCUMENT_ME
+   * @param sName 
+   * @param album 
+   * @param genre 
+   * @param artist 
+   * @param length 
+   * @param year 
+   * @param lOrder 
+   * @param type 
+   * @param lDiscNumber 
    * 
    * @return the string
    */
@@ -188,18 +207,17 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Register an Track with a known id.
-   * 
-   * @param sName DOCUMENT_ME
-   * @param sId DOCUMENT_ME
-   * @param album DOCUMENT_ME
-   * @param genre DOCUMENT_ME
-   * @param artist DOCUMENT_ME
-   * @param length DOCUMENT_ME
-   * @param year DOCUMENT_ME
-   * @param lOrder DOCUMENT_ME
-   * @param type DOCUMENT_ME
-   * @param lDiscNumber DOCUMENT_ME
-   * 
+   *
+   * @param sId 
+   * @param sName 
+   * @param album 
+   * @param genre 
+   * @param artist 
+   * @param length 
+   * @param year 
+   * @param lOrder 
+   * @param type 
+   * @param lDiscNumber 
    * @return the track
    */
   public Track registerTrack(String sId, String sName, Album album, Genre genre, Artist artist,
@@ -219,7 +237,6 @@ public final class TrackManager extends ItemManager {
       synchronized (cache) {
         cache.add(track);
       }
-
       return track;
     } finally {
       lock.writeLock().unlock();
@@ -234,9 +251,9 @@ public final class TrackManager extends ItemManager {
    * @throw an exception if a tag cannot be commited
    */
   public void commit() throws JajukException {
-    lock.writeLock().lock();
     try {
-      // Iterate over a shallow copy to avoid concurrent issues (note also that
+      lock.writeLock().lock();
+      // Iterate over a defensive copy to avoid concurrent issues (note also that
       // several threads can commit at the same time). We synchronize the copy and
       // we drop tags to commit.
       List<Tag> toCommit = null;
@@ -278,19 +295,20 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change a track album.
-   * 
+   *
+   * @param track 
+   * @param sNewAlbum 
    * @param filter files we want to deal with
-   * @param track DOCUMENT_ME
-   * @param sNewAlbum DOCUMENT_ME
-   * 
    * @return new track
-   * 
    * @throws JajukException the jajuk exception
    */
   public Track changeTrackAlbum(Track track, String sNewAlbum, Set<File> filter)
       throws JajukException {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getAlbum().getName2().equals(sNewAlbum)) {
         return track;
@@ -338,19 +356,20 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change a track artist.
-   * 
+   *
+   * @param track 
+   * @param sNewArtist 
    * @param filter files we want to deal with
-   * @param track DOCUMENT_ME
-   * @param sNewArtist DOCUMENT_ME
-   * 
    * @return new track
-   * 
    * @throws JajukException the jajuk exception
    */
   public Track changeTrackArtist(Track track, String sNewArtist, Set<File> filter)
       throws JajukException {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getArtist().getName2().equals(sNewArtist)) {
         return track;
@@ -364,7 +383,6 @@ public final class TrackManager extends ItemManager {
       // change tag in files
       for (final File file : alReady) {
         final Tag tag = Tag.getTagForFio(file.getFIO(), false);
-
         tag.setArtistName(sNewArtist);
         if (bAutocommit) {
           tag.commit();
@@ -377,7 +395,6 @@ public final class TrackManager extends ItemManager {
       synchronized (cache) {
         cache.remove(track);
       }
-
       // if current track artist name is changed, notify it
       if (QueueModel.getPlayingFile() != null
           && QueueModel.getPlayingFile().getTrack().getArtist().equals(track.getArtist())) {
@@ -399,21 +416,21 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change a track genre.
-   * 
+   *
+   * @param track 
+   * @param sNewGenre 
    * @param filter files we want to deal with
-   * @param track DOCUMENT_ME
-   * @param sNewGenre DOCUMENT_ME
-   * 
    * @return new track
-   * 
    * @throws JajukException the jajuk exception
    */
   public Track changeTrackGenre(Track track, String sNewGenre, Set<File> filter)
       throws JajukException {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
-
       if (track.getGenre().getName2().equals(sNewGenre)) {
         return track;
       }
@@ -426,7 +443,6 @@ public final class TrackManager extends ItemManager {
       // change tag in files
       for (final File file : alReady) {
         Tag tag = Tag.getTagForFio(file.getFIO(), false);
-
         tag.setGenreName(sNewGenre);
         if (bAutocommit) {
           tag.commit();
@@ -439,7 +455,6 @@ public final class TrackManager extends ItemManager {
       synchronized (cache) {
         cache.remove(track);
       }
-
       // register the new item
       Genre newGenre = GenreManager.getInstance().registerGenre(sNewGenre);
       Track newTrack = registerTrack(track.getName(), track.getAlbum(), newGenre,
@@ -456,18 +471,19 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change a track year.
-   * 
+   *
+   * @param track 
+   * @param newItem 
    * @param filter files we want to deal with
-   * @param track DOCUMENT_ME
-   * @param newItem DOCUMENT_ME
-   * 
    * @return new track or null if wrong format
-   * 
    * @throws JajukException the jajuk exception
    */
   public Track changeTrackYear(Track track, String newItem, Set<File> filter) throws JajukException {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getYear().getName().equals(newItem)) {
         return track;
@@ -485,7 +501,6 @@ public final class TrackManager extends ItemManager {
       // change tag in files
       for (final File file : alReady) {
         Tag tag = Tag.getTagForFio(file.getFIO(), false);
-
         tag.setYear(newItem);
         if (bAutocommit) {
           tag.commit();
@@ -498,7 +513,6 @@ public final class TrackManager extends ItemManager {
       synchronized (cache) {
         cache.remove(track);
       }
-
       // Register new item
       Year newYear = YearManager.getInstance().registerYear(newItem);
       Track newTrack = registerTrack(track.getName(), track.getAlbum(), track.getGenre(),
@@ -513,19 +527,19 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change a track comment.
-   * 
+   *
+   * @param track 
+   * @param sNewItem 
    * @param filter files we want to deal with
-   * @param track DOCUMENT_ME
-   * @param sNewItem DOCUMENT_ME
-   * 
-   * @return new track or null if wronf format
-   * 
+   * @return new track or null if wrong format
    * @throws JajukException the jajuk exception
    */
-  public Track changeTrackComment(Track track, String sNewItem, Set<File> filter)
-      throws JajukException {
-    lock.writeLock().lock();
+  Track changeTrackComment(Track track, String sNewItem, Set<File> filter) throws JajukException {
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getComment().equals(sNewItem)) {
         return track;
@@ -562,14 +576,15 @@ public final class TrackManager extends ItemManager {
   /**
    * Change a track rate.
    * 
-   * @param track DOCUMENT_ME
-   * @param lNew DOCUMENT_ME
+   * @param track 
+   * @param lNew 
    * 
    * @return new track or null if wrong format
    */
   public Track changeTrackRate(Track track, long lNew) {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      // No confirmation here as this code is called during startup and is not available from GUI anyway
       // check there is actually a change
       if (track.getRate() == lNew) {
         return track;
@@ -589,19 +604,20 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change a track order.
-   * 
+   *
+   * @param track 
+   * @param lNewOrder 
    * @param filter files we want to deal with
-   * @param track DOCUMENT_ME
-   * @param lNewOrder DOCUMENT_ME
-   * 
    * @return new track or null if wrong format
-   * 
    * @throws JajukException the jajuk exception
    */
   public Track changeTrackOrder(Track track, long lNewOrder, Set<File> filter)
       throws JajukException {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getOrder() == lNewOrder) {
         return track;
@@ -626,13 +642,11 @@ public final class TrackManager extends ItemManager {
           tagsToCommit.add(tag);
         }
       }
-
       // Remove the track from the old album
       List<Track> cache = track.getAlbum().getTracksCache();
       synchronized (cache) {
         cache.remove(track);
       }
-
       Track newTrack = registerTrack(track.getName(), track.getAlbum(), track.getGenre(),
           track.getArtist(), track.getDuration(), track.getYear(), lNewOrder, track.getType(),
           track.getDiscNumber());
@@ -644,20 +658,62 @@ public final class TrackManager extends ItemManager {
   }
 
   /**
-   * Change a track name.
+  * Change a generic field.
+  * 
+  * @param track the track to write against.
+  * @param tagFieldKey the tag key
+  * @param tagFieldValue the tag value as a string
+  * @param filter files we want to deal with
    * 
+  * @return the track
+  *
+  * @throws JajukException if the tag can't be written
+  */
+  public Track changeTrackField(Track track, String tagFieldKey, String tagFieldValue,
+      Set<File> filter) throws JajukException {
+    try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
+      List<File> alReady = null;
+      // check if files are accessible
+      alReady = track.getReadyFiles();
+      if (alReady.size() == 0) {
+        throw new NoneAccessibleFileException(10);
+      }
+      // change tag in files
+      for (File file : alReady) {
+        Tag tag = Tag.getTagForFio(file.getFIO(), false);
+        tag.setTagField(tagFieldKey, tagFieldValue);
+        if (bAutocommit) {
+          tag.commit();
+        } else {
+          tagsToCommit.add(tag);
+        }
+      }
+      return track;
+    } finally {
+      lock.writeLock().unlock();
+    }
+  }
+
+  /**
+   * Change a track name.
+   *
+   * @param track 
+   * @param sNewItem 
    * @param filter files we want to deal with
-   * @param track DOCUMENT_ME
-   * @param sNewItem DOCUMENT_ME
-   * 
    * @return new track
-   * 
    * @throws JajukException the jajuk exception
    */
   public Track changeTrackName(Track track, String sNewItem, Set<File> filter)
       throws JajukException {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getName().equals(sNewItem)) {
         return track;
@@ -678,13 +734,11 @@ public final class TrackManager extends ItemManager {
           tagsToCommit.add(tag);
         }
       }
-
       // Remove old track from the album
       List<Track> cache = track.getAlbum().getTracksCache();
       synchronized (cache) {
         cache.remove(track);
       }
-
       Track newTrack = registerTrack(sNewItem, track.getAlbum(), track.getGenre(),
           track.getArtist(), track.getDuration(), track.getYear(), track.getOrder(),
           track.getType(), track.getDiscNumber());
@@ -702,19 +756,19 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change track album artist.
-   * 
-   * @param track DOCUMENT_ME
-   * @param filter DOCUMENT_ME
-   * @param sNewItem DOCUMENT_ME
-   * 
+   *
+   * @param track 
+   * @param sNewItem 
+   * @param filter 
    * @return the item
-   * 
    * @throws JajukException the jajuk exception
    */
-  public Item changeTrackAlbumArtist(Track track, String sNewItem, Set<File> filter)
-      throws JajukException {
-    lock.writeLock().lock();
+  Item changeTrackAlbumArtist(Track track, String sNewItem, Set<File> filter) throws JajukException {
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getAlbumArtist() != null && track.getAlbumArtist().getName2().equals(sNewItem)) {
         return track;
@@ -752,19 +806,20 @@ public final class TrackManager extends ItemManager {
 
   /**
    * Change track disc number.
-   * 
-   * @param track DOCUMENT_ME
-   * @param filter DOCUMENT_ME
-   * @param lNewDiscNumber DOCUMENT_ME
-   * 
+   *
+   * @param track 
+   * @param lNewDiscNumber 
+   * @param filter 
    * @return the item
-   * 
    * @throws JajukException the jajuk exception
    */
   public Item changeTrackDiscNumber(Track track, long lNewDiscNumber, Set<File> filter)
       throws JajukException {
-    lock.writeLock().lock();
     try {
+      lock.writeLock().lock();
+      if (!confirm(track)) {
+        return track;
+      }
       // check there is actually a change
       if (track.getDiscNumber() == lNewDiscNumber) {
         return track;
@@ -789,19 +844,16 @@ public final class TrackManager extends ItemManager {
           tagsToCommit.add(tag);
         }
       }
-
       // Remove the track from the old album
       List<Track> cache = track.getAlbum().getTracksCache();
       synchronized (cache) {
         cache.remove(track);
       }
-
       // if current track album name is changed, notify it
       if (QueueModel.getPlayingFile() != null
           && QueueModel.getPlayingFile().getTrack().getAlbum().equals(track.getAlbum())) {
         ObservationManager.notify(new JajukEvent(JajukEvents.ALBUM_CHANGED));
       }
-
       Track newTrack = registerTrack(track.getName(), track.getAlbum(), track.getGenre(),
           track.getArtist(), track.getDuration(), track.getYear(), track.getDiscNumber(),
           track.getType(), lNewDiscNumber);
@@ -815,9 +867,9 @@ public final class TrackManager extends ItemManager {
   /**
    * Update files references. 
    * 
-   * @param oldTrack DOCUMENT_ME
-   * @param newTrack DOCUMENT_ME
-   * @param filter DOCUMENT_ME
+   * @param oldTrack 
+   * @param newTrack 
+   * @param filter 
    */
   private void updateFilesReferences(Track oldTrack, Track newTrack, Set<File> filter) {
     lock.writeLock().lock();
@@ -832,11 +884,11 @@ public final class TrackManager extends ItemManager {
   }
 
   /**
-   * Post change. DOCUMENT_ME
+   * Post change. 
    * 
-   * @param track DOCUMENT_ME
-   * @param newTrack DOCUMENT_ME
-   * @param filter DOCUMENT_ME
+   * @param track 
+   * @param newTrack 
+   * @param filter 
    */
   private void postChange(Track track, Track newTrack, Set<File> filter) {
     lock.writeLock().lock();
@@ -860,7 +912,7 @@ public final class TrackManager extends ItemManager {
    */
   @Override
   public void cleanup() {
-    // No need to lock or synchronize, getTracks() is a shallow copy of tracks
+    // No need to lock or synchronize, getTracks() is a defensive copy of tracks
     for (Track track : getTracks()) {
       if (track.getFiles().size() == 0) { // no associated file
         removeItem(track);
@@ -882,7 +934,7 @@ public final class TrackManager extends ItemManager {
   /**
    * Remove a file mapping from a track.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    */
   public void removeFile(File file) {
     Track track = file.getTrack();
@@ -890,7 +942,8 @@ public final class TrackManager extends ItemManager {
     try {
       // Remove file reference
       track.removeFile(file);
-
+      // Put it in the attic 
+      attic.put(track.getID(), track);
       // If the track contained a single file, drop it
       if (track.getFiles().size() == 0) {
         // the track don't map
@@ -900,7 +953,15 @@ public final class TrackManager extends ItemManager {
     } finally {
       lock.writeLock().unlock();
     }
+  }
 
+  /**
+   * Return a track from attic or null if not found
+   * @param id the track id to search for
+   * @return a track from attic or null if not found
+   */
+  public Track getTrackFromAttic(String id) {
+    return attic.get(id);
   }
 
   /*
@@ -909,18 +970,18 @@ public final class TrackManager extends ItemManager {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_TRACKS;
   }
 
   /**
    * Get ordered tracks list associated with this item
    * <p>
-   * This is a shallow copy only
+   * This is a defensive copy only
    * </p>
    * .
    * 
-   * @param item DOCUMENT_ME
+   * @param item 
    * @param sorted Whether the output should be sorted on it (actually applied on
    * artists,years and genres because others items are already sorted)
    * 
@@ -935,14 +996,13 @@ public final class TrackManager extends ItemManager {
   /**
    * Get ordered tracks list associated with a list of items (of the same type)
    * <p>
-   * This is a shallow copy only
+   * This is a defensive copy only
    * </p>
    * .
-   * 
+   *
+   * @param items 
    * @param sorted Whether the output should be sorted on it (actually applied on
    * artists,years and genres because others items are already sorted)
-   * @param items DOCUMENT_ME
-   * 
    * @return the associated tracks
    */
   @SuppressWarnings("unchecked")
@@ -1102,7 +1162,7 @@ public final class TrackManager extends ItemManager {
   /**
    * Perform a search in all files names with given criteria.
    * 
-   * @param criteria DOCUMENT_ME
+   * @param criteria 
    * 
    * @return an ordered list of available files
    */
@@ -1127,7 +1187,6 @@ public final class TrackManager extends ItemManager {
     } finally {
       lock.readLock().unlock();
     }
-
   }
 
   /**
@@ -1147,5 +1206,4 @@ public final class TrackManager extends ItemManager {
   public void setAutocommit(boolean autocommit) {
     this.bAutocommit = autocommit;
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/Type.java b/src/main/java/org/jajuk/base/Type.java
index a081d77..2cbcbc4 100644
--- a/src/main/java/org/jajuk/base/Type.java
+++ b/src/main/java/org/jajuk/base/Type.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -34,13 +34,10 @@ import org.jajuk.util.log.Log;
  * Music type.
  */
 public class Type extends PhysicalItem implements Comparable<Type> {
-
   /** Type extension ex:mp3,ogg. */
   private final String sExtension;
-
   /** Player impl. */
   private final Class<ITagImpl> cTagImpl;
-
   /** Player class. */
   private final Class<IPlayerImpl> cPlayerImpl;
 
@@ -50,8 +47,8 @@ public class Type extends PhysicalItem implements Comparable<Type> {
    * @param sId type id if given
    * @param sName type name
    * @param sExtension type file extension (.mp3...)
-   * @param cPlayerImpl DOCUMENT_ME
-   * @param cTagImpl DOCUMENT_ME
+   * @param cPlayerImpl 
+   * @param cTagImpl 
    */
   Type(final String sId, final String sName, final String sExtension,
       final Class<IPlayerImpl> cPlayerImpl, final Class<ITagImpl> cTagImpl) {
@@ -78,13 +75,11 @@ public class Type extends PhysicalItem implements Comparable<Type> {
     return toString().compareTo(other.toString());
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getString("Type") + " : " + getName();
   }
 
@@ -113,7 +108,7 @@ public class Type extends PhysicalItem implements Comparable<Type> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return XML_TYPE;
   }
 
@@ -137,7 +132,7 @@ public class Type extends PhysicalItem implements Comparable<Type> {
 
   /**
    * Gets the tag impl.
-   * 
+   *
    * @return Returns the tagImpl.
    */
   public ITagImpl getTagImpl() {
@@ -171,11 +166,9 @@ public class Type extends PhysicalItem implements Comparable<Type> {
    */
   public static String[] getExtensionsFromTypes(final List<Type> types) {
     String[] extensions = {};
-
     if (types != null) {
       final int typesSize = types.size();
       final Type[] typesArray = types.toArray(new Type[typesSize]);
-
       extensions = new String[typesSize];
       for (int i = 0; i < typesSize; i++) {
         extensions[i] = typesArray[i].getExtension();
@@ -192,5 +185,4 @@ public class Type extends PhysicalItem implements Comparable<Type> {
   public boolean isVideo() {
     return Messages.getString(Const.TYPE_VIDEO).equals(getName());
   }
-
 }
diff --git a/src/main/java/org/jajuk/base/TypeManager.java b/src/main/java/org/jajuk/base/TypeManager.java
index d8910d4..1e83475 100644
--- a/src/main/java/org/jajuk/base/TypeManager.java
+++ b/src/main/java/org/jajuk/base/TypeManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -29,6 +29,7 @@ import java.util.Map;
 
 import org.jajuk.services.players.IPlayerImpl;
 import org.jajuk.services.tags.ITagImpl;
+import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 import org.jajuk.util.ReadOnlyIterator;
@@ -39,40 +40,28 @@ import org.jajuk.util.UtilSystem;
  * <p>
  */
 public final class TypeManager extends ItemManager {
-
   /** The Constant ICON_16X16_VIDEO for the supported media types. */
   private static final String ICON_16X16_VIDEO = "icons/16x16/type_video_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_APE for the supported media types. */
   private static final String ICONS_16X16_TYPE_APE = "icons/16x16/type_ape_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_MP2 for the supported media types. */
   private static final String ICONS_16X16_TYPE_MP2 = "icons/16x16/type_mp2_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_AAC for the supported media types. */
   private static final String ICONS_16X16_TYPE_AAC = "icons/16x16/type_aac_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_WMA for the supported media types. */
   private static final String ICONS_16X16_TYPE_WMA = "icons/16x16/type_wma_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_FLAC for the supported media types. */
   private static final String ICONS_16X16_TYPE_FLAC = "icons/16x16/type_flac_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_RAM for the supported media types. */
   private static final String ICONS_16X16_TYPE_RAM = "icons/16x16/type_ram_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_OGG for the supported media types. */
   private static final String ICONS_16X16_TYPE_OGG = "icons/16x16/type_ogg_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_WAV for the supported media types. */
   private static final String ICONS_16X16_TYPE_WAV = "icons/16x16/type_wav_16x16.png";
-
   /** The Constant ICONS_16X16_TYPE_MP3 for the supported media types. */
   private static final String ICONS_16X16_TYPE_MP3 = "icons/16x16/type_mp3_16x16.png";
-
   /** extensions->types. */
   private final Map<String, Type> hmSupportedTypes = new HashMap<String, Type>(10);
-
   /** Self instance. */
   private static TypeManager singleton = new TypeManager();
 
@@ -142,7 +131,6 @@ public final class TypeManager extends ItemManager {
       // if the type is already in memory, use it
       return hmSupportedTypes.get(sExtension);
     }
-
     type = new Type(sId, sName, sExtension, (Class<IPlayerImpl>) cPlayerImpl,
         (Class<ITagImpl>) cTagImpl);
     registerItem(type);
@@ -198,7 +186,6 @@ public final class TypeManager extends ItemManager {
     if (hmSupportedTypes.isEmpty()) {
       return "";
     }
-
     StringBuilder sb = new StringBuilder();
     Iterator<String> it = hmSupportedTypes.keySet().iterator();
     while (it.hasNext()) {
@@ -215,7 +202,7 @@ public final class TypeManager extends ItemManager {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_TYPES;
   }
 
@@ -226,7 +213,7 @@ public final class TypeManager extends ItemManager {
    * 
    * @return item
    */
-  public Type getTypeByID(String sID) {
+  Type getTypeByID(String sID) {
     return (Type) getItemByID(sID);
   }
 
@@ -304,9 +291,9 @@ public final class TypeManager extends ItemManager {
    * Note that we use explicite strings for icon location. It's to avoid loading
    * all icons at startup, we do it asynchronously to accelerate startup
    * </p>
-   * 
+   *
    * @throws ClassNotFoundException the class not found exception
-   * @throws Exception    */
+   */
   public static void registerTypesMplayerAvailable() throws ClassNotFoundException {
     // mp3
     Type type = TypeManager.getInstance().registerType(Messages.getString("Type.mp3"),
@@ -328,6 +315,12 @@ public final class TypeManager extends ItemManager {
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, true);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICONS_16X16_TYPE_OGG)
         .toExternalForm());
+    type = TypeManager.getInstance().registerType(Messages.getString("Type.ogg"), Const.EXT_OGA,
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_JAUDIOTAGGER));
+    type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
+    type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, true);
+    type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICONS_16X16_TYPE_OGG)
+        .toExternalForm());
     // Wav
     type = TypeManager.getInstance().registerType(Messages.getString("Type.wav"), Const.EXT_WAV,
         Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
@@ -395,34 +388,33 @@ public final class TypeManager extends ItemManager {
         .toExternalForm());
     // mp2
     type = TypeManager.getInstance().registerType(Messages.getString("Type.mp2"), Const.EXT_MP2,
-        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, true);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICONS_16X16_TYPE_MP2)
         .toExternalForm());
     // web radios
     type = TypeManager.getInstance().registerType(Messages.getString("Type.radio"),
-        Const.EXT_RADIO, Class.forName(Const.PLAYER_IMPL_WEBRADIOS),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_RADIO, Class.forName(Const.PLAYER_IMPL_WEBRADIOS), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, true);
     // APE
     type = TypeManager.getInstance().registerType(Messages.getString("Type.ape"), Const.EXT_APE,
-        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICONS_16X16_TYPE_APE)
         .toExternalForm());
     // MAC = APE
     type = TypeManager.getInstance().registerType(Messages.getString("Type.mac"), Const.EXT_MAC,
-        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICONS_16X16_TYPE_APE)
         .toExternalForm());
     // MPC
     type = TypeManager.getInstance().registerType(Messages.getString("Type.mpc"), Const.EXT_MPC,
-        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     // Change the MPC icon here if you find one
@@ -430,7 +422,7 @@ public final class TypeManager extends ItemManager {
         .toExternalForm());
     // MP+
     type = TypeManager.getInstance().registerType(Messages.getString("Type.mpc"), Const.EXT_MPPLUS,
-        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     // Change the MPC icon here if you find one
@@ -438,7 +430,7 @@ public final class TypeManager extends ItemManager {
         .toExternalForm());
     // MPP
     type = TypeManager.getInstance().registerType(Messages.getString("Type.mpc"), Const.EXT_MPP,
-        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     // Change the MPC icon here if you find one
@@ -446,26 +438,30 @@ public final class TypeManager extends ItemManager {
         .toExternalForm());
     // WavPack
     type = TypeManager.getInstance().registerType(Messages.getString("Type.wavpack"), Const.EXT_WV,
-        Class.forName(Const.PLAYER_IMPL_MPLAYER), Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     // Official logo contains text and doesn't display well in 16x16, take wav
     // logo
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICONS_16X16_TYPE_WAV)
         .toExternalForm());
-
     // -- VIDEO --
+    if (Conf.getBoolean(Const.CONF_SHOW_VIDEOS)) {
+      registerVideoTypes();
+    }
+  }
+
+  private static void registerVideoTypes() throws ClassNotFoundException {
+    Type type;
     // AVI
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_AVI, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_AVI, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
     // mpg
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_MPG, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_MPG, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
@@ -478,43 +474,37 @@ public final class TypeManager extends ItemManager {
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
     // mpeg
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_MPEG, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_MPEG, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
     // mkv
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_MKV, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_MKV, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
     // asf
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_ASF, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_ASF, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
     // wmv
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_WMV, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_WMV, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
     // mov
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_MOV, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_MOV, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
     // ogm
     type = TypeManager.getInstance().registerType(Messages.getString(Const.TYPE_VIDEO),
-        Const.EXT_OGM, Class.forName(Const.PLAYER_IMPL_MPLAYER),
-        Class.forName(Const.TAG_IMPL_NO_TAGS));
+        Const.EXT_OGM, Class.forName(Const.PLAYER_IMPL_MPLAYER), null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
     type.setProperty(Const.XML_TYPE_SEEK_SUPPORTED, Const.TRUE);
     type.setProperty(Const.XML_TYPE_ICON, UtilSystem.getResource(ICON_16X16_VIDEO).toExternalForm());
diff --git a/src/main/java/org/jajuk/base/Year.java b/src/main/java/org/jajuk/base/Year.java
index 7e7af6f..f3c21a5 100644
--- a/src/main/java/org/jajuk/base/Year.java
+++ b/src/main/java/org/jajuk/base/Year.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -33,7 +33,6 @@ import org.jajuk.util.UtilString;
  * <br>Logical item
  */
 public class Year extends LogicalItem implements Comparable<Year> {
-
   /** The year that is stored in this object. */
   private final long value;
 
@@ -58,7 +57,7 @@ public class Year extends LogicalItem implements Comparable<Year> {
    * @see org.jajuk.base.Item#getIdentifier()
    */
   @Override
-  public final String getLabel() {
+  public final String getXMLTag() {
     return XML_YEAR;
   }
 
@@ -83,17 +82,14 @@ public class Year extends LogicalItem implements Comparable<Year> {
     if (other == null) {
       return -1;
     }
-
     return (int) (getValue() - other.getValue());
   }
 
-  /**
-   * Get item description.
-   * 
-   * @return the desc
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getTitle()
    */
   @Override
-  public String getDesc() {
+  public String getTitle() {
     return Messages.getHumanPropertyName(Const.XML_YEAR) + " : " + getName();
   }
 
@@ -125,7 +121,12 @@ public class Year extends LogicalItem implements Comparable<Year> {
    * 
    * @return true, if looks valid
    */
-  public boolean looksValid() {
+  boolean looksValid() {
     return value > 1000 && value < 3000;
   }
+
+  @Override
+  public String toString() {
+    return Long.toString(value);
+  }
 }
diff --git a/src/main/java/org/jajuk/base/YearManager.java b/src/main/java/org/jajuk/base/YearManager.java
index d112448..76c266e 100644
--- a/src/main/java/org/jajuk/base/YearManager.java
+++ b/src/main/java/org/jajuk/base/YearManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.base;
 
 import java.util.Iterator;
@@ -31,7 +30,6 @@ import org.jajuk.util.ReadOnlyIterator;
  * Convenient class to manage years.
  */
 public final class YearManager extends ItemManager {
-
   /** Self instance. */
   private static YearManager singleton = new YearManager();
 
@@ -64,7 +62,7 @@ public final class YearManager extends ItemManager {
   /**
    * Register a year.
    * 
-   * @param pYear DOCUMENT_ME
+   * @param pYear 
    * 
    * @return the year
    */
@@ -76,12 +74,12 @@ public final class YearManager extends ItemManager {
   /**
    * Register a year with a known id.
    * 
-   * @param sId DOCUMENT_ME
-   * @param pYear DOCUMENT_ME
+   * @param sId 
+   * @param pYear 
    * 
    * @return the year
    */
-  public Year registerYear(String sId, String pYear) {
+  Year registerYear(String sId, String pYear) {
     Year year = getYearByID(sId);
     if (year != null) {
       return year;
@@ -97,7 +95,7 @@ public final class YearManager extends ItemManager {
    * @see org.jajuk.base.ItemManager#getIdentifier()
    */
   @Override
-  public String getLabel() {
+  public String getXMLTag() {
     return Const.XML_YEARS;
   }
 
@@ -108,7 +106,7 @@ public final class YearManager extends ItemManager {
    * 
    * @return Element
    */
-  public Year getYearByID(String sID) {
+  Year getYearByID(String sID) {
     return (Year) getItemByID(sID);
   }
 
@@ -131,5 +129,4 @@ public final class YearManager extends ItemManager {
   public ReadOnlyIterator<Year> getYearsIterator() {
     return new ReadOnlyIterator<Year>((Iterator<Year>) getItemsIterator());
   }
-
 }
diff --git a/src/main/java/org/jajuk/events/HighPriorityObserver.java b/src/main/java/org/jajuk/events/HighPriorityObserver.java
index e0a60ea..5ed580f 100644
--- a/src/main/java/org/jajuk/events/HighPriorityObserver.java
+++ b/src/main/java/org/jajuk/events/HighPriorityObserver.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.events;
 
@@ -24,5 +24,4 @@ package org.jajuk.events;
  * Special Observer whish must be updated before any other.
  */
 public interface HighPriorityObserver extends Observer {
-
 }
diff --git a/src/main/java/org/jajuk/events/JajukEvent.java b/src/main/java/org/jajuk/events/JajukEvent.java
index a8f2b51..576ec57 100644
--- a/src/main/java/org/jajuk/events/JajukEvent.java
+++ b/src/main/java/org/jajuk/events/JajukEvent.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.events;
 
 import java.util.Properties;
@@ -27,18 +26,16 @@ import java.util.Properties;
  * Jajuk event (Observer pattern).
  */
 public class JajukEvent {
-
   /** Event subject. */
   private final JajukEvents subject;
-
   /** Event properties. */
   private Properties pDetails;
 
   /**
    * Event constructor.
    *
-   * @param subject DOCUMENT_ME
-   * @param pDetails DOCUMENT_ME
+   * @param subject 
+   * @param pDetails 
    */
   public JajukEvent(JajukEvents subject, Properties pDetails) {
     this.subject = subject;
@@ -50,7 +47,7 @@ public class JajukEvent {
   /**
    * Event constructor.
    * 
-   * @param subject DOCUMENT_ME
+   * @param subject 
    */
   public JajukEvent(JajukEvents subject) {
     this(subject, null);
@@ -92,7 +89,7 @@ public class JajukEvent {
   /**
    * event equals method.
    * 
-   * @param obj DOCUMENT_ME
+   * @param obj 
    * 
    * @return true, if equals
    */
@@ -133,5 +130,4 @@ public class JajukEvent {
     }
     return hash;
   }
-
 }
diff --git a/src/main/java/org/jajuk/events/JajukEvents.java b/src/main/java/org/jajuk/events/JajukEvents.java
index f0253b8..c2e6397 100644
--- a/src/main/java/org/jajuk/events/JajukEvents.java
+++ b/src/main/java/org/jajuk/events/JajukEvents.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,205 +16,144 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.events;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public enum JajukEvents {
-
-  /** repeat mode changed. */
-  REPEAT_MODE_STATUS_CHANGED,
-
+  /** At least one mode (shuffle, repeat, repaet all, continue ...) has changed. */
+  MODE_STATUS_CHANGED,
   /** new device. */
   DEVICE_NEW,
-
   /** removed device. */
   DEVICE_DELETE,
-
   /** parameters change. */
   PARAMETERS_CHANGE,
-
   /** device properties display. */
   DEVICE_PROPERTIES,
-
   /** mount device. */
   DEVICE_MOUNT,
-
   /** unmount a device. */
   DEVICE_UNMOUNT,
-
   /** test a device. */
   DEVICE_TEST,
-
   /** refresh a device. */
   DEVICE_REFRESH,
-
   /** sync. a device */
   DEVICE_SYNCHRO,
-
   /** refresh a view is required. */
   VIEW_REFRESH_REQUEST,
-
   /** the stop button has been pressed. */
   PLAYER_STOP,
-
   /** the play button has been pressed. */
   PLAYER_PLAY,
-
   /** the pause button has been pressed. */
   PLAYER_PAUSE,
-
   /** the resume button has been pressed. */
   PLAYER_RESUME,
-
   /** Queue should be refreshed. */
   QUEUE_NEED_REFRESH,
-
   /** a file has been launched by the fifo. */
   FILE_LAUNCHED,
-
   /** heart beat for general use to refresh subscribers. */
   /** every n secs */
   HEART_BEAT,
-
   /** a web radio has been launched. */
   WEBRADIO_LAUNCHED,
-
+  /** The web radio information has been updated. */
+  WEBRADIO_INFO_UPDATED,
   /** a reinit has been required. */
   ZERO,
-
-  /** special mode (global shuffle, novelties, bestof...) */
-  SPECIAL_MODE,
-
+  /** Smart functions (global shuffle, novelties, bestof...) */
+  SMART_FUNCTION_LAUNCHED,
   /** an error occurred during a play. */
   PLAY_ERROR,
-
   /** A track is opening. */
   PLAY_OPENING,
-
   /** mute state changed. */
   MUTE_STATE,
-
   /** clear history. */
   CLEAR_HISTORY,
-
   /** launch first time wizard. */
   WIZARD,
-
   /** volume changed. */
   VOLUME_CHANGED,
-
   /** new custom property. */
   CUSTOM_PROPERTIES_ADD,
-
   /** remove custom property. */
   CUSTOM_PROPERTIES_REMOVE,
-
   /** file name change. */
   FILE_NAME_CHANGED,
-
   /** Genre name change. */
   GENRE_NAME_CHANGED,
-
   /** file rate change. */
   RATE_CHANGED,
-
   /** Cddb wizard required. */
   CDDB_WIZARD,
-
   /** logical tree sorting method changed. */
   LOGICAL_TREE_SORT,
-
   /** cover default changed. */
   COVER_DEFAULT_CHANGED,
-
-  /** clear table selection. */
-  TABLE_CLEAR_SELECTION,
-
   /** DJ creation or removal. */
   DJS_CHANGE,
-
   /** One or more ambiences have been. */
   /** removed/added/changed */
   AMBIENCES_CHANGE,
-
   /** One or more webradios have been. */
   /** removed/added/changed */
   WEBRADIOS_CHANGE,
-
   /** user changed current ambience. */
   AMBIENCES_SELECTION_CHANGE,
-
   /** An ambience has been removed. */
   AMBIENCE_REMOVED,
-
   /** Current played track artist name has been. */
   /** changed */
   ARTIST_CHANGED,
-
   /** Current played track album name has been. */
   /** changed */
   ALBUM_CHANGED,
-
   /** Current played track album name has been. */
   /** changed */
   TRACK_CHANGED,
-
   /** Language changed. */
   LANGUAGE_CHANGED,
-
   /** Perspective changed. */
   PERSPECTIVE_CHANGED,
-
   /** Current track is finished. */
   FILE_FINISHED,
-
   /** Lyrics data has been downloaded. */
   LYRICS_DOWNLOADED,
-
   /** A file has been copied (used by prepare party). */
   FILE_COPIED,
-
   /** A file is converted from one media type to another. */
   FILE_CONVERSION,
-
   /** Covers should be refreshed. */
   COVER_NEED_REFRESH,
-
   /** Ratings have to be reseted. */
   RATE_RESET,
-
   /** Preferences have been reset. */
   PREFERENCES_RESET,
-
   /** Suggestion view should be refreshed. */
   SUGGESTIONS_REFRESH,
-
   /** Table selection changed. */
   TABLE_SELECTION_CHANGED,
-
   /** Tree selection changed. */
   TREE_SELECTION_CHANGED,
-
   /** Playing track has been banned. */
   BANNED,
-
   /** ALARMS CHANGED (REMOVED, ADDED). */
   ALARMS_CHANGE,
-
   /** Thumb created. */
   THUMB_CREATED,
-
   /** Exiting Jajuk. */
   EXITING,
-
   /** D-Bus command that shows the notification with the currently played file. */
   SHOW_CURRENTLY_PLAYING,
-
   /** Inform the interested objects about a change in the visibility of the slimbar. */
-  SLIMBAR_VISIBILTY_CHANGED
+  SLIMBAR_VISIBILTY_CHANGED,
+  /** RATING_MODE_CHANGED */
+  RATING_MODE_CHANGED
 }
diff --git a/src/main/java/org/jajuk/events/ObservationManager.java b/src/main/java/org/jajuk/events/ObservationManager.java
index e0999ce..b018cdc 100644
--- a/src/main/java/org/jajuk/events/ObservationManager.java
+++ b/src/main/java/org/jajuk/events/ObservationManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.events;
 
 import java.util.HashMap;
@@ -38,16 +37,12 @@ import org.jajuk.util.log.Log;
  * All notification methods are synchronized to assure event order.
  */
 public final class ObservationManager {
-
   /** one event -> list of components. */
   static ObserverRegistry observerRegistry = new ObserverRegistry();
-
   /** Last event for a given subject (used for new objects that just registrated to this subject). */
   static Map<JajukEvents, Properties> hLastEventBySubject = new HashMap<JajukEvents, Properties>(10);
-
   /** The queue itself. Must be synchronized, so we use a ConcurrentLinkedQueue which is thread-safe */
   static BlockingQueue<JajukEvent> queue = new LinkedBlockingQueue<JajukEvent>();
-
   /** The observation fifo. */
   private static ObservationManagerThread observationThread;
 
@@ -82,12 +77,10 @@ public final class ObservationManager {
    */
   public static synchronized void unregister(Observer observer) {
     Set<JajukEvents> eventSubjectSet = observer.getRegistrationKeys();
-
     // can return null if no keys are registered
     if (eventSubjectSet == null) {
       return;
     }
-
     for (JajukEvents subject : eventSubjectSet) {
       boolean bRemoved = observerRegistry.unregister(subject, observer);
       if (bRemoved) {
@@ -107,7 +100,7 @@ public final class ObservationManager {
     // exception throw in the register current thread
     try {
       /*
-       * do not launch it in a regular thread because EDT waits thread end to
+       * We don't launch it in a regular thread because EDT waits thread end to
        * display
        */
       queue.add(event);
@@ -215,7 +208,6 @@ public final class ObservationManager {
  * Observation manager thread that consumes events asynchronously
  */
 class ObservationManagerThread extends Thread {
-
   ObservationManagerThread() {
     super("Observation Manager Thread");
   }
diff --git a/src/main/java/org/jajuk/events/Observer.java b/src/main/java/org/jajuk/events/Observer.java
index 3b2ed8d..1b9cc14 100644
--- a/src/main/java/org/jajuk/events/Observer.java
+++ b/src/main/java/org/jajuk/events/Observer.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.events;
 
 import java.util.Set;
@@ -27,7 +26,6 @@ import java.util.Set;
  * GoF Observer pattern Observer.
  */
 public interface Observer {
-
   /**
    * Action to be done when receiving an event with this ID.
    * 
diff --git a/src/main/java/org/jajuk/events/ObserverRegistry.java b/src/main/java/org/jajuk/events/ObserverRegistry.java
index beec4cb..44514a1 100644
--- a/src/main/java/org/jajuk/events/ObserverRegistry.java
+++ b/src/main/java/org/jajuk/events/ObserverRegistry.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.events;
 
 import java.util.ArrayList;
@@ -36,11 +35,9 @@ import org.jajuk.util.log.Log;
  * to handle informing observers about events happening in other objects.
  */
 class ObserverRegistry {
-
   /** The list of Observers per JajukEvents. */
   private final Map<JajukEvents, List<Observer>> hEventComponents = new Hashtable<JajukEvents, List<Observer>>(
       10);
-
   /** Number of current executions for a given event. */
   private static Map<JajukEvent, Integer> canals = new HashMap<JajukEvent, Integer>(10);
 
@@ -67,7 +64,6 @@ class ObserverRegistry {
       }
       canals.put(event, numberOfExecutions + 1);
     }
-
     try {
       JajukEvents subject = event.getSubject();
       List<Observer> observers = hEventComponents.get(subject);
@@ -92,7 +88,6 @@ class ObserverRegistry {
         int numberOfExecutions = canals.get(event);
         assert (numberOfExecutions > 0);
         canals.put(event, numberOfExecutions - 1);
-
         // to avoid adding more and more memory via the canals-map, we should remove items when they
         // reach zero again
         // the effect on memory is rather small, but it shows up after some time in memory profiles
diff --git a/src/main/java/org/jajuk/events/package.html b/src/main/java/org/jajuk/events/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/events/package.html
+++ b/src/main/java/org/jajuk/events/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/i18n/jajuk_zh.properties b/src/main/java/org/jajuk/i18n/jajuk_zh.properties
deleted file mode 100644
index 4a1297c..0000000
--- a/src/main/java/org/jajuk/i18n/jajuk_zh.properties
+++ /dev/null
@@ -1,565 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<body><![CDATA[
-#Module de langue français pour Jajuk
-#Ecrit par : Bertrand Florat
-#Copyright 2003,2004 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
-#FROM en 1.85
-#$Revision$
-
-#General Strings 
-Type.mp3=Mpeg layer 3
-Type.playlist=Playlist
-Type.ogg=Ogg Vorbis
-Type.wav=Audio WAVE/SPEEX
-Type.au=Sun Audio
-Type.aiff=Apple Audio Interchange
-
-unknown=未知
-unknown_artist=未知
-unknown_album=未知
-unknown_genre=未知
-unknown_year=未知
-
-Confirmation_exit=你真的想退出Jajuk吗?
-Confirmation_delete=警告!你将从磁盘上彻底删除以下文件:
-Confirmation_void_refresh=警告!你将刷新一个空的设备,该设备将被清空。在Unix下,确定该设备被选用。继续吗?
-
-Device_type.directory=目录
-Device_type.file_cd=音乐文件CD
-Device_type.audio_cd=音乐CD
-Device_type.remote=远程(未安装)
-Device_type.extdd=外部硬盘
-Device_type.player=播放器
-
-Perspective_Description_Files=物理的
-Perspective_Description_Tracks=逻辑的
-Perspective_Description_Configuration=设置
-Perspective_Description_Statistics=统计数据
-Perspective_Description_Help=帮助
-Perspective_Description_Display=播放器
-
-Info=信息
-Warning=警告
-Error=错误
-
-PerspectiveBarJPanel.org.jajuk.ui.perspectives.PhysicalPerspective=物理视图
-PerspectiveBarJPanel.org.jajuk.ui.perspectives.LogicalPerspective=逻辑视图
-PerspectiveBarJPanel.org.jajuk.ui.perspectives.ConfigurationPerspective=设置视图
-PerspectiveBarJPanel.org.jajuk.ui.perspectives.StatPerspective=统计视图
-PerspectiveBarJPanel.org.jajuk.ui.perspectives.HelpPerspective=帮助视图
-PerspectiveBarJPanel.org.jajuk.ui.perspectives.PlayerPerspective=e播放器视图
-
-Language_desc_en=英语
-Language_desc_fr=法语
-Language_desc_de=德语
-Language_desc_it=意大利语
-Language_desc_sv=瑞典语
-Language_desc_nl=荷兰语
-Language_desc_cn=中文
-
-#Error codes
-Error.000=未知错误
-Error.001=默认视角未找到
-Error.002=不能打开视角
-Error.003=不能示例制定的视图
-Error.005=收藏文件分析错误,你的收藏可能因未知错误损坏。
-Error.007=播放文件错误
-Error.008=停止播放文件错误
-Error.009=不能读取文件
-Error.010=在安装的设备中无法找到与该音轨相关的文件
-Error.011=安装设备出现技术错误
-Error.012=卸载设备出现技术错误,该设备可能被其他程序使用
-Error.013=无法去除设备:可能已经被安装或正在刷新
-Error.014=无法卸载设备:被占用,请先停止用该设备播放音轨,再将其卸载。
-Error.015=无法卸载设备:改设备未被安装
-Error.016=无法访问指定设备,请键入设备访问点。例如: Unix下 '/cdrom' ,MS Windows下 'e:' 
-Error.017=解析播放列表文件错误
-Error.018=没有找到可访问音轨
-Error.019=与已有的设备重名
-Error.020=拷贝文件IO错误,请检查磁盘空间
-Error.021=需键入Url地址。例如: MS Windows下 'd:\mp3',Unix下 '/opt/mp3' 
-Error.022=需键入名称。例如: 'Hard drive', 'CD ROCK' 
-Error.023=无法读取文件
-Error.024=无法写入文件
-Error.025=您正试图从一个未安装的设备上读取文件
-Error.026=注册播放器错误
-Error.027=同步取消
-Error.028=保存播放列表文件错误
-Error.029=一个已有设备在该设备的上级目录,并与其子目录有相同路径
-Error.101=设备不存在或无法访问
-Error.102=错误
-Error.103=读取标签信息错误
-Error.104=写入标签信息错误
-Error.105=资源捆绑键异常
-Error.106=未知异常
-Error.107=正在刷新
-Error.108=视图文件解析错误
-Error.109=播放器或标识设备类不可获得
-Error.110=该名称被Jajuk内部系统使用,请更改名称
-Error.111=设备已经安装
-Error.112=无法安装设备
-Error.113=无法储存用户设置
-Error.114=无法读取用户设置
-Error.116=无法注册视图,构造类未找到或出错,请查看堆栈跟踪
-Error.117=无法打开视角,类型未找到
-Error.118=处理事件请求错误
-Error.119=处理历史文件错误
-Error.120=无法访问设备:可能未安装、正在刷新或正在进行同步操作
-Error.121=设备正在使用,不能卸载
-Error.122=先入先出错误
-Error.123=设置外观和感觉选项错误
-Error.124=发现另一进程,您只能同时运行一个Jajuk实例
-Error.125=设备已经卸载
-Error.126=不支持该音频格式
-Error.127=新歌无特定时间限制,您可在参数视角中进行设置
-Error.128=已经是收藏中第一个音轨,没有上一音轨可用
-Error.129=封面图片读取错误
-Error.130=该封面已经读取到本地,无法写入
-
-#Strings from a class
-ParameterView.0=历史持续时间:
-ParameterView.2=设置您希望保存已播放音轨的天数。如不希望保存历史设为-1,永久保存设为0。
-ParameterView.3=清除历史
-ParameterView.4=清除历史
-ParameterView.8=历史
-ParameterView.9=播放 :
-ParameterView.10=空
-ParameterView.11=启动时不读取音乐
-ParameterView.12=播放最后一个
-ParameterView.13=播放上次运行时播放的最后一个音轨
-ParameterView.14=乱序播放
-ParameterView.15=随机播放收藏中一个音轨
-ParameterView.16=播放所选文件:
-ParameterView.17=选择一个启动时播放的文件
-ParameterView.18=选择一个启动时播放的文件
-ParameterView.19=启动
-ParameterView.26=设置
-ParameterView.27=彻底删除一个文件之前
-ParameterView.28=彻底删除一个文件之前始终询问
-ParameterView.29=退出Jajuk之前
-ParameterView.30=退出Jajuk之前始终询问
-ParameterView.33=选项
-ParameterView.34=只显示已安装的设备
-ParameterView.35=隐藏已卸载设备中的音轨
-ParameterView.36=播放完收藏后从头开始播放
-ParameterView.37=循环播放收藏
-ParameterView.38=语言:
-ParameterView.42=界面语言设置:
-ParameterView.43=外观和感觉:
-ParameterView.44=外观和感觉设置
-ParameterView.45=外观和感觉设置
-ParameterView.46=日志:
-ParameterView.47=致命错误
-ParameterView.48=错误
-ParameterView.49=警告
-ParameterView.50=信息
-ParameterView.51=调试
-ParameterView.52=Jajuk多项设置:致命错误:只显示致命错误, 错误:+显示错误, 信息:+显示信息讯息, 警告:+显示警告, 调试: 所有讯息
-ParameterView.59=简介播放位置 (%) : 
-ParameterView.60=简介播放位置, 从 0 ( 音轨开头 ) 到 99 ( 音轨结束 )
-ParameterView.61=简介播放长度 (sec) : 
-ParameterView.62=简介播放秒数
-ParameterView.71=P2P
-ParameterView.72=共享音轨 ?
-ParameterView.73=如果您允许他人从音乐盒中读取音轨,请选择该选项
-ParameterView.74=密码:
-ParameterView.75=设置音乐盒的密码读取通道。如果无密码,所有人将不能读取其中内容。
-ParameterView.76=增加远程设置
-ParameterView.77=如果选择,您在远程读取他人音乐盒时,将使用个人设置.
-ParameterView.78=隐藏本地设置
-ParameterView.79=如果选择,他人将无法读取您的个人设置.
-ParameterView.85=应用
-ParameterView.86=返回默认值
-ParameterView.87=参数
-ParameterView.98=标签
-ParameterView.99=进行深层标签搜索
-ParameterView.100=<html>强制Jajuk重新读取实际id3格式标签。<p>当您在读取被其他应用程序修改过的标签时,该功能非常有用</html>
-ParameterView.101=使用上层目录名作为专辑名称U
-ParameterView.102=当Jajuk不能读取id3格式标签时,使用上层目录名作为专辑名称
-ParameterView.103=语言包将在重启Jajuk后生效L
-ParameterView.104=外观和感觉将在重启Jajuk后生效
-ParameterView.109=设置已保存
-ParameterView.110=设置还原为默认值
-ParameterView.111=最佳播放表长度:
-ParameterView.112=设置最佳播放表长度(从 1 到 100)
-ParameterView.113=在过滤器中使用regexp
-ParameterView.114=在过滤器中使用规范表达式(Regexp 格式), 例如: .*foo.*
-ParameterView.115=高级
-ParameterView.116=备份收藏文件
-ParameterView.117=选择,如果您希望备份收藏文件至 collection-<nb>.xml
-ParameterView.118=备份大小 (Mb)
-ParameterView.119=备份大小 (Mb)
-ParameterView.120=收藏字符格式
-ParameterView.121=收藏字符格式。 UTF-16对亚洲及欧洲字符进行了优化。
-ParameterView.122=视图
-ParameterView.123=读取默认设置
-ParameterView.124=读取Jajuk默认视图、视角位置及尺寸
-ParameterView.125=读取默认设置
-ParameterView.126=视图修改将在重启Jajuk后生效
-ParameterView.127=仅在安装的设备中查找
-ParameterView.128=仅在安装的设备中查找(显示在搜索框中)
-ParameterView.129=新歌时间限制(天):
-ParameterView.130=新歌时限天数:在这个天数之内添加的音轨将作为新歌
-ParameterView.131=最好的音轨
-ParameterView.132=启动时播放一首您最爱的歌曲
-ParameterView.133=新歌
-ParameterView.134=启动时播放一首收藏中的新歌
-ParameterView.135=最后一首最后播放
-ParameterView.136=上次最后播放的歌放在最后播放
-ParameterView.139=网络
-ParameterView.140=使用HTTP代理
-ParameterView.141=使用HTTP代理,如果您使用局域网需通过代理服务器连接网络,这个选项将非常有用
-ParameterView.142=代理用户名
-ParameterView.143=代理用户名用来获得授权
-ParameterView.144=代理服务器名
-ParameterView.145=代理服务器名或IP地址
-ParameterView.146=代理端口
-ParameterView.147=代理TCP-IP端口(通常为 3128)
-ParameterView.148=使用自动封面
-ParameterView.149=使用自动封面从互联网下载封面 (如果需要,请在网络选项中设置代理)
-ParameterView.150=最小封面尺寸(Kb)
-ParameterView.151=从网络下载的最小封面尺寸(Kb)
-ParameterView.152=最大封面尺寸(Kb)
-ParameterView.153=从网络下载的最大封面尺寸(Kb)
-ParameterView.154=精确搜索
-ParameterView.155=精确搜索。搜索越精确,您将越可能找到正确的封面。
-ParameterView.156=低
-ParameterView.157=中
-ParameterView.158=高
-ParameterView.159=封面
-ParameterView.160=连接超时(sec)
-ParameterView.161=连接超时(sec) : 在此时间内未获应答将视为操作失败
-ParameterView.162=下载超时(sec) 
-ParameterView.163=下载超时(sec) : 在此时间内未下载指定文件将视为操作失败
-
-Main.12=这是您的第一个Jajuk片断, 您需要首先在设备视角中添加至少一个设备
-Main.13=Jajuk成功启动
-Main.21=确认
-
-Device.21=刷新 [
-Device.22=]  确定 [
-Device.25=] 已刷新 
-Device.26= 秒 - 
-Device.27= 新文件 - 
-Device.28= 已删除的参考信息
-Device.31=同步. [
-Device.33=同步完成  
-Device.34= 秒 - 
-Device.35= 创建文件 (
-Device.36= MB) 
-Device.41=同步. [
-Device.42=]  正在拷贝 [
-
-FIFO.4=). 您希望安装该设备吗 ?
-FIFO.10=正在播放: 
-FIFO.13= kbps
-
-HistoryItem.0=年-月-日 小时:分钟
-
-DeviceWizard.0=设备向导
-DeviceWizard.1=设备类型 : 
-DeviceWizard.2=设备名称 : 
-DeviceWizard.3=设备位置 : 
-DeviceWizard.4=Unix 设备安装点 (可选): 
-DeviceWizard.7=进行即时刷新
-DeviceWizard.8=启动时自动安装
-DeviceWizard.9=启动时自动刷新
-DeviceWizard.10=与……同步 : 
-DeviceWizard.11=Unidirectional synchronization
-DeviceWizard.12=All new files found on the source device are copied into this device. Nothing will be written to source device
-DeviceWizard.13=Bidirectional synchronization
-DeviceWizard.14=All new files found on one device are copied to the other one
-DeviceWizard.33=OK
-DeviceWizard.34=Cancel
-DeviceWizard.43=Please choose a directory
-DeviceWizard.44=Device created
-DeviceWizard.45=Please give device name. Ex: CD A, Laptop...
-DeviceWizard.46=Please give device location. Ex: d:\mp3 under Windows, /home/foo/mp3 under Unix
-DeviceWizard.47=Please give device Unix mount point. Ex:/media/cdrom
-DeviceWizard.48=<html>Check this if you want to perform an immediate refresh of the device (advised)<p>Note this operation can take a while for large devices</html>
-DeviceWizard.49=<html>Check this if you want to mount automatically the device at jajuk start<p>Especially for directories on current hard disk. Avoid it for CDs</html>
-DeviceWizard.50=<html>Check this if you want to perform a refresh at each Jajuk start<p>(Use it only for small devices)</html>
-DeviceWizard.51=Check this if you want to synchronize this device with another one
-DeviceWizard.52=Select a source device
-
-JajukJMenuBar.0=File
-JajukJMenuBar.1=Open file
-JajukJMenuBar.3=Exit
-JajukJMenuBar.5=Properties
-JajukJMenuBar.6=New property
-JajukJMenuBar.7=Delete a property
-JajukJMenuBar.8=Views
-JajukJMenuBar.9=Mode
-JajukJMenuBar.10=Repeat
-JajukJMenuBar.11=Shuffle
-JajukJMenuBar.12=Continue
-JajukJMenuBar.13=Intro
-JajukJMenuBar.14=Help
-JajukJMenuBar.15=Help contents
-JajukJMenuBar.16=About
-
-PlaylistFileItem.2=New playlist
-PlaylistFileItem.3=Bookmarks
-PlaylistFileItem.4=Best-of
-PlaylistFileItem.5=Current Queue
-
-JajukFileChooser.0=Please choose track(s) to play
-
-SearchBox.0=Perform a search among tracks, artists, genres, directory...
-
-CommandJPanel.0=View play history
-CommandJPanel.1=Repeat mode: play tracks in a loop
-CommandJPanel.2=Shuffle mode: play randomly selected tracks
-CommandJPanel.3=Continue mode: continue to play next tracks when finished
-CommandJPanel.4=Intro mode: play only a part of each track. Offset and time can be set in the parameters view
-CommandJPanel.5=Play a shuffle selection from the entire collection
-CommandJPanel.6=Play your own favourite tracks
-CommandJPanel.7=Turn sound off
-CommandJPanel.8=Play previous track in current selection
-CommandJPanel.9=Play next track in current selection
-CommandJPanel.10=Fast rewind in current track
-CommandJPanel.11=Pause/Resume current track
-CommandJPanel.12=Stop
-CommandJPanel.13=Fast forward in current track
-CommandJPanel.14=Volume
-CommandJPanel.15=Go to this position in the played track
-CommandJPanel.16=Play novelties, age option can be set in the parameter view
-CommandJPanel.17=Continue in current album
-
-InformationJPanel.5=Total music time to be played 
-InformationJPanel.6=Track bitrate
-InformationJPanel.7=Current track progression
-
-AbstractPlaylistEditorView.0=Track
-AbstractPlaylistEditorView.1=Location
-AbstractPlaylistEditorView.2=Run this playlist
-AbstractPlaylistEditorView.3=Save this playlist
-AbstractPlaylistEditorView.4=Add an item to this playlist
-AbstractPlaylistEditorView.5=Remove an item from this playlist
-AbstractPlaylistEditorView.6=Set item position higher
-AbstractPlaylistEditorView.7=Set item position lower
-AbstractPlaylistEditorView.8=Display current played playlist
-AbstractPlaylistEditorView.9=Erase this playlist
-AbstractPlaylistEditorView.15=Playlist editor
-AbstractPlaylistEditorView.17=You are about to update on disk all following playlists :
-
-StatView.0=Others
-StatView.1=Styles repartition
-StatView.2=No data available
-StatView.3=Others
-StatView.4=Size by device (Gb)
-StatView.5=No data available
-StatView.7=Collection size by month
-StatView.8=Months
-StatView.9=Size (Gb)
-StatView.10=No data available
-StatView.12=Total number of tracks by month
-StatView.13=Months
-StatView.14=Track number
-StatView.15=No data available
-StatView.16=Statistics
-StatView.24=older
-
-CDScanView.0=CD label : 
-CDScanView.1=Enter CD label. Ex: CD1, ROCK...
-CDScanView.2=Enter CD label. Ex: CD1, ROCK...
-CDScanView.3=CD Location : 
-CDScanView.4=CD Location where CD can be found. Ex: '/cdrom' under Unix, 'e:' under MS Windows...
-CDScanView.5=CD Location where CD can be found. Ex: '/cdrom' on Unix, 'e:' under MS Windows...
-CDScanView.6=Scan
-CDScanView.12=CD Scanner
-CDScanView.18=Scans the CD and adds automatically all music files into the collection
-CDScanView.19=Select CD location
-
-TracksTreeView.0=Logical tree
-TracksTreeView.1=Play
-TracksTreeView.2=Push
-TracksTreeView.3=Play shuffle
-TracksTreeView.4=Play repeat
-TracksTreeView.5=Delete
-TracksTreeView.6=Set a property
-TracksTreeView.7=Properties
-TracksTreeView.8=Play
-TracksTreeView.9=Push
-TracksTreeView.10=Play shuffle
-TracksTreeView.11=Play repeat
-TracksTreeView.12=Delete
-TracksTreeView.13=Set a property
-TracksTreeView.14=Properties
-TracksTreeView.15=Play
-TracksTreeView.16=Push
-TracksTreeView.17=Play shuffle
-TracksTreeView.18=Play repeat
-TracksTreeView.19=Delete
-TracksTreeView.20=Set a property
-TracksTreeView.21=Properties
-TracksTreeView.22=Play
-TracksTreeView.23=Push
-TracksTreeView.24=Delete
-TracksTreeView.25=Set a property
-TracksTreeView.26=Properties
-TracksTreeView.27=Collection
-TracksTreeView.31= tracks
-
-LogicalPlaylistRepositoryView.0=Playlists
-
-CoverView.3=Cover
-CoverView.4=Previous image from the disk and/or the web if auto-cover option is checked
-CoverView.5=Next image from the disk and/or the web if auto-cover option is checked
-CoverView.6=Save cover with its original name
-CoverView.7=Save cover as...
-CoverView.8=Use this cover as default cover for this album
-CoverView.9=covers
-CoverView.10=Save cover as
-CoverView.11=Cover saved
-
-AnimationView.0=Animation
-
-FilesTreeView.0=Physical tree
-FilesTreeView.1=Play
-FilesTreeView.2=Push
-FilesTreeView.3=Copy
-FilesTreeView.4=Cut
-FilesTreeView.5=Paste
-FilesTreeView.6=Rename
-FilesTreeView.7=Delete
-FilesTreeView.8=Set a property
-FilesTreeView.9=Properties
-FilesTreeView.10=Play
-FilesTreeView.11=Push
-FilesTreeView.12=Play Shuffle
-FilesTreeView.13=Play repeat
-FilesTreeView.14=Desynchronize
-FilesTreeView.15=Resynchronize
-FilesTreeView.16=Create playlist
-FilesTreeView.17=Copy
-FilesTreeView.18=Cut
-FilesTreeView.19=Paste
-FilesTreeView.20=Rename
-FilesTreeView.21=Delete
-FilesTreeView.22=Set a property
-FilesTreeView.23=Properties
-FilesTreeView.24=Play
-FilesTreeView.25=Push
-FilesTreeView.26=Play Shuffle
-FilesTreeView.27=Play repeat
-FilesTreeView.28=Mount
-FilesTreeView.29=Unmount
-FilesTreeView.30=Refresh
-FilesTreeView.31=Synchronize
-FilesTreeView.32=Test
-FilesTreeView.33=Create playlists
-FilesTreeView.34=Set a property
-FilesTreeView.35=Properties
-FilesTreeView.36=Play
-FilesTreeView.37=Push
-FilesTreeView.38=Play Shuffle
-FilesTreeView.39=Play Repeat
-FilesTreeView.40=Copy
-FilesTreeView.41=Cut
-FilesTreeView.42=Paste
-FilesTreeView.43=Rename
-FilesTreeView.44=Delete
-FilesTreeView.45=Set a property
-FilesTreeView.46=Properties
-FilesTreeView.47=Collection
-FilesTreeView.52= files : 
-FilesTreeView.53= Gb
-FilesTreeView.54= Mb
-
-TracksTableView.0=Logical table
-TracksTableView.1=Track
-TracksTableView.2=Album
-TracksTableView.3=Artist
-TracksTableView.4=Length
-TracksTableView.5=Style
-TracksTableView.6=Rate
-
-AbstractTableView.0=Filter: 
-AbstractTableView.1=Property to filter
-AbstractTableView.3=Value to be used by the filter
-AbstractTableView.4=Apply filter
-AbstractTableView.5=Clear the filter
-AbstractTableView.6=Apply an advanced filter
-AbstractTableView.7=contains :
-
-AboutView.7=About
-AboutView.8=License
-AboutView.9=System
-AboutView.10=About
-
-PhysicalPlaylistRepositoryView.0=Play
-PhysicalPlaylistRepositoryView.1=Edit
-PhysicalPlaylistRepositoryView.2=Save as
-PhysicalPlaylistRepositoryView.3=Delete
-PhysicalPlaylistRepositoryView.4=Properties
-PhysicalPlaylistRepositoryView.6=Playlists
-PhysicalPlaylistRepositoryView.8=Specials
-PhysicalPlaylistRepositoryView.9=Queue
-PhysicalPlaylistRepositoryView.10=Current queue: drag and drop to it for playing
-PhysicalPlaylistRepositoryView.11=New
-PhysicalPlaylistRepositoryView.12=New playlist: drag and drop to it for adding files
-PhysicalPlaylistRepositoryView.13=Bookmarks
-PhysicalPlaylistRepositoryView.14=Bookmark playlist: drag and drop to it for keeping it
-PhysicalPlaylistRepositoryView.15=Best of
-PhysicalPlaylistRepositoryView.16=Best of playlist : contains top tracks
-
-FilesTableView.0=Physical table物理桌面
-FilesTableView.1=Play播放
-FilesTableView.2=Push
-FilesTableView.3=Play shuffle
-FilesTableView.4=Play repeat
-FilesTableView.5=Set a property
-FilesTableView.6=Properties
-FilesTableView.7=Track
-FilesTableView.8=Album
-FilesTableView.9=Artist
-FilesTableView.10=Length
-FilesTableView.11=Style
-FilesTableView.12=Device
-FilesTableView.13=File
-FilesTableView.14=Rate
-
-DeviceView.0=Add a device
-DeviceView.1=Remove an unmounted device (doesn't remove anything physically from disk)
-DeviceView.2=Selected device properties
-DeviceView.3=Mount selected device
-DeviceView.4=Unmount selected device
-DeviceView.5=Test selected device availability
-DeviceView.6=Refresh selected device
-DeviceView.7=Synchronize selected device
-DeviceView.8=Mount
-DeviceView.9=Unmount
-DeviceView.10=Test
-DeviceView.11=Refresh
-DeviceView.12=Synchronize
-DeviceView.13=Remove unmounted device
-DeviceView.14=Get properties
-DeviceView.17=New
-DeviceView.18=Add a device
-DeviceView.21=The device is available 
-DeviceView.22=The device cannot be accessed
-DeviceView.23=Devices
-
-JajukWindow.3=Jajuk advanced jukebox
-JajukWindow.4=Exit
-JajukWindow.5=About
-JajukWindow.6=Play Shuffle
-JajukWindow.7=Play Best of
-JajukWindow.8=Show Jajuk at startup
-JajukWindow.9=Hide Jajuk at startup
-JajukWindow.10=Pause ||
-JajukWindow.11=Stop  []
-JajukWindow.12=Play >
-JajukWindow.13=Previous <--
-JajukWindow.14=Next -->
-JajukWindow.15=Play novelties
-JajukWindow.16=Continue album
-JajukWindow.17=Jajuk : Advanced Jukebox
-JajukWindow.18=Ready to play
-
-HelpView.2=Help
-
-DownloadManager.0=<html>Jajuk needs your HTTP proxy password to grab covers<br>If you don't want them, please change your settings in the Covers tab of Parameter view<br>If you don't have any proxy, please change your settings in the Network tab of the Parameter view</html>
-DownloadManager.1=Password required
-]]></body>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/i18n/package.html b/src/main/java/org/jajuk/i18n/package.html
deleted file mode 100644
index c995ec7..0000000
--- a/src/main/java/org/jajuk/i18n/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<HTML>
-<BODY>
-<p>Internationalisation classes and translation properties files</p>
-</BODY>
-</HTML>
diff --git a/src/main/java/org/jajuk/services/alarm/Alarm.java b/src/main/java/org/jajuk/services/alarm/Alarm.java
index c9460c6..20e536a 100644
--- a/src/main/java/org/jajuk/services/alarm/Alarm.java
+++ b/src/main/java/org/jajuk/services/alarm/Alarm.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.alarm;
 
@@ -36,25 +36,19 @@ import org.jajuk.util.log.Log;
  * An Alarm.
  */
 public class Alarm {
-
   /** The files to play. */
   private List<File> alToPlay;
-
   /** The webradio to play. */
   private WebRadio radio;
-
-  /** DOCUMENT_ME. */
   private String alarmAction;
-
-  /** DOCUMENT_ME. */
   private Date aTime;
 
   /**
    * Instantiates a new alarm.
    * 
-   * @param aTime DOCUMENT_ME
-   * @param alFiles DOCUMENT_ME
-   * @param mode DOCUMENT_ME
+   * @param aTime 
+   * @param alFiles 
+   * @param mode 
    */
   public Alarm(java.util.Date aTime, List<File> alFiles, String mode) {
     this.aTime = aTime;
@@ -65,9 +59,9 @@ public class Alarm {
   /**
    * Instantiates a new alarm.
    * 
-   * @param aTime DOCUMENT_ME
-   * @param radio DOCUMENT_ME
-   * @param mode DOCUMENT_ME
+   * @param aTime 
+   * @param radio 
+   * @param mode 
    */
   public Alarm(java.util.Date aTime, WebRadio radio, String mode) {
     this.aTime = aTime;
@@ -82,11 +76,10 @@ public class Alarm {
     Log.debug("Wake up at " + new Date());
     if (alarmAction.equals(Const.ALARM_START_ACTION)) {
       if (alToPlay != null) {
-        QueueModel.push(UtilFeatures.createStackItems(alToPlay, Conf
-            .getBoolean(Const.CONF_STATE_REPEAT_ALL), false), false);
+        QueueModel.push(UtilFeatures.createStackItems(alToPlay,
+            Conf.getBoolean(Const.CONF_STATE_REPEAT), false), false);
       } else if (radio != null) {
         QueueModel.launchRadio(radio);
-
       }
     } else {
       QueueModel.stopRequest();
@@ -108,5 +101,4 @@ public class Alarm {
   public void nextDay() {
     aTime = DateUtils.addDays(aTime, 1);
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/alarm/AlarmManager.java b/src/main/java/org/jajuk/services/alarm/AlarmManager.java
index 1c1b9d8..01dddd5 100644
--- a/src/main/java/org/jajuk/services/alarm/AlarmManager.java
+++ b/src/main/java/org/jajuk/services/alarm/AlarmManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.alarm;
 
 import java.util.ArrayList;
@@ -52,29 +51,19 @@ import org.jajuk.util.log.Log;
  * TODO: We could use Timer instead of implementing the Timer loop ourselves here!.
  * TODO : multi-alarms management
  */
-
 public class AlarmManager implements Observer {
-
-  /** DOCUMENT_ME. */
   private static AlarmManager singleton = new AlarmManager();
-
   static {
     // Start the clock
     singleton.clock.start();
-
     // register the instance so that it receives updates of changes to the configured Alarm
     ObservationManager.register(singleton);
-
     // force last event update
     singleton.update(new JajukEvent(JajukEvents.ALARMS_CHANGE));
   }
-
-  /** DOCUMENT_ME. */
   private Alarm alarm;
-
   /** This thread looks alarms up and call weak up when it's time. */
   private final Thread clock = new Thread("Alarm manager Thread") {
-
     @Override
     public void run() {
       Log.debug("Starting Alarm thread");
@@ -115,7 +104,6 @@ public class AlarmManager implements Observer {
     // Reset rate and total play time (automatic part of rating system)
     if (subject.equals(JajukEvents.ALARMS_CHANGE)) {
       if (Conf.getBoolean(Const.CONF_ALARM_ENABLED)) {
-
         // construct a Date with the configured alarm-time
         int hours = Conf.getInt(Const.CONF_ALARM_TIME_HOUR);
         int minutes = Conf.getInt(Const.CONF_ALARM_TIME_MINUTES);
@@ -125,11 +113,10 @@ public class AlarmManager implements Observer {
         cal.set(Calendar.HOUR_OF_DAY, hours);
         cal.set(Calendar.MINUTE, minutes);
         cal.set(Calendar.SECOND, seconds);
-
         // If chosen date is already past, consider that user meant
         // tomorrow
         Date alarmDate = cal.getTime();
-        if (alarmDate.before(new Date())) {
+        if (alarmDate.before(new Date())) { //NOSONAR
           alarmDate = DateUtils.addDays(alarmDate, 1);
         }
         // Compute playlist if required
@@ -142,7 +129,7 @@ public class AlarmManager implements Observer {
           String item = conf.substring(conf.indexOf('/') + 1, conf.length());
           alToPlay = new ArrayList<File>();
           if (mode.equals(Const.STARTUP_MODE_ITEM)) {
-            if (conf.matches(SearchResultType.FILE.name() + ".*")) {
+            if (conf.matches(SearchResultType.FILE.name() + ".*")) { //NOSONAR
               File file = FileManager.getInstance().getFileByID(item);
               if (file != null) {
                 alToPlay.add(file);
@@ -150,26 +137,24 @@ public class AlarmManager implements Observer {
             } else if (conf.matches(SearchResultType.WEBRADIO.name() + ".*")) {
               radio = WebRadioManager.getInstance().getWebRadioByName(item);
             }
-
           } else if (mode.equals(Const.STARTUP_MODE_SHUFFLE)) {
             // Filter files by ambience or if none ambience matches, perform a global shuffle 
             // ignoring current ambience
             alToPlay = UtilFeatures.filterByAmbience(FileManager.getInstance()
                 .getGlobalShufflePlaylist(), ambience);
-            if (alToPlay.size() == 0) {
+            if (alToPlay.size() == 0) { //NOSONAR
               alToPlay = FileManager.getInstance().getGlobalShufflePlaylist();
             }
           } else if (mode.equals(Const.STARTUP_MODE_BESTOF)) {
             alToPlay = UtilFeatures.filterByAmbience(FileManager.getInstance()
                 .getGlobalBestofPlaylist(), ambience);
-            if (alToPlay.size() == 0) {
+            if (alToPlay.size() == 0) { //NOSONAR
               alToPlay = FileManager.getInstance().getGlobalBestofPlaylist();
             }
-
           } else if (mode.equals(Const.STARTUP_MODE_NOVELTIES)) {
             alToPlay = UtilFeatures.filterByAmbience(FileManager.getInstance()
                 .getGlobalNoveltiesPlaylist(), ambience);
-            if (alToPlay.size() == 0) {
+            if (alToPlay.size() == 0) { //NOSONAR
               alToPlay = FileManager.getInstance().getGlobalNoveltiesPlaylist();
             }
           } else {
@@ -197,5 +182,4 @@ public class AlarmManager implements Observer {
     keys.add(JajukEvents.ALARMS_CHANGE);
     return keys;
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/alarm/package.html b/src/main/java/org/jajuk/services/alarm/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/alarm/package.html
+++ b/src/main/java/org/jajuk/services/alarm/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/bookmark/Bookmarks.java b/src/main/java/org/jajuk/services/bookmark/Bookmarks.java
index 5fe8882..7acfb7b 100644
--- a/src/main/java/org/jajuk/services/bookmark/Bookmarks.java
+++ b/src/main/java/org/jajuk/services/bookmark/Bookmarks.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.bookmark;
 
 import java.util.ArrayList;
@@ -35,10 +34,8 @@ import org.jajuk.util.Const;
  * Manages bookmarks.
  */
 public final class Bookmarks {
-
   /** Singleton self-instance. */
   private static Bookmarks bookmarks = new Bookmarks();
-
   /** Bookmarked files. */
   private List<File> alFiles = new ArrayList<File>(100);
 
@@ -81,7 +78,6 @@ public final class Bookmarks {
     for (File file : alFiles) {
       sbOut.append(file.getID()).append(',');
     }
-
     if (sbOut.length() > 0) {
       return sbOut.substring(0, sbOut.length() - 1);// remove last ','
     } else {
@@ -109,7 +105,7 @@ public final class Bookmarks {
   /**
    * Down a track in the playlist.
    * 
-   * @param index DOCUMENT_ME
+   * @param index 
    */
   public synchronized void down(int index) {
     if (index < alFiles.size() - 1) { // the last track cannot go
@@ -122,7 +118,7 @@ public final class Bookmarks {
   /**
    * Up a track in the playlist.
    * 
-   * @param index DOCUMENT_ME
+   * @param index 
    */
   public synchronized void up(int index) {
     if (index > 0) { // the first track cannot go further
@@ -134,7 +130,7 @@ public final class Bookmarks {
   /**
    * Remove a track from the playlist.
    * 
-   * @param index DOCUMENT_ME
+   * @param index 
    */
   public synchronized void remove(int index) {
     alFiles.remove(index);
@@ -144,8 +140,8 @@ public final class Bookmarks {
   /**
    * Add a track from the playlist.
    * 
-   * @param index DOCUMENT_ME
-   * @param file DOCUMENT_ME
+   * @param index 
+   * @param file 
    */
   public synchronized void addFile(int index, File file) {
     alFiles.add(index, file);
@@ -155,7 +151,7 @@ public final class Bookmarks {
   /**
    * Add a file to this playlist.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    */
   public void addFile(File file) {
     int index = alFiles.size();
@@ -165,7 +161,7 @@ public final class Bookmarks {
   /**
    * Add files to this playlist.
    * 
-   * @param alFilesToAdd DOCUMENT_ME
+   * @param alFilesToAdd 
    */
   public void addFiles(List<File> alFilesToAdd) {
     for (File file : alFilesToAdd) {
diff --git a/src/main/java/org/jajuk/services/bookmark/History.java b/src/main/java/org/jajuk/services/bookmark/History.java
index 0e03a2b..266a753 100644
--- a/src/main/java/org/jajuk/services/bookmark/History.java
+++ b/src/main/java/org/jajuk/services/bookmark/History.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.bookmark;
 
 import java.io.BufferedWriter;
@@ -35,7 +34,6 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.Vector;
 
-import javax.swing.SwingUtilities;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
@@ -45,12 +43,14 @@ import org.jajuk.events.HighPriorityObserver;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
+import org.jajuk.services.core.PersistenceService;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.ui.widgets.InformationJPanel;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilString;
+import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 import org.xml.sax.Attributes;
@@ -65,16 +65,13 @@ import org.xml.sax.helpers.DefaultHandler;
  * .sun.com/javase/6/docs/api/javax/swing/package-summary.html#threading
  */
 public final class History extends DefaultHandler implements HighPriorityObserver {
-
   /** Self instance. */
   private static History history = new History();
-
-  /** History repository, last play first. */
-  private static Vector<HistoryItem> vHistory = new Vector<HistoryItem>(100); // NOPMD
-
+  /** History repository, last play first. KEEP THIS A VECTOR, not an ArrayList, 
+   * it is accessed directly as model for the SearchJPanel*/
+  private static Vector<HistoryItem> items = new Vector<HistoryItem>(100);
   /** History begin date. */
   private static long lDateStart;
-
   /** Cached date formatter. */
   private SimpleDateFormat formatter;
 
@@ -92,15 +89,14 @@ public final class History extends DefaultHandler implements HighPriorityObserve
    */
   private History() {
     super();
-
     ObservationManager.register(this);
     // check if something has already started
     if (ObservationManager.getDetailLastOccurence(JajukEvents.FILE_LAUNCHED,
         Const.DETAIL_CURRENT_FILE_ID) != null
         && ObservationManager.getDetailLastOccurence(JajukEvents.FILE_LAUNCHED,
             Const.DETAIL_CURRENT_DATE) != null) {
-      update(new JajukEvent(JajukEvents.FILE_LAUNCHED, ObservationManager
-          .getDetailsLastOccurence(JajukEvents.FILE_LAUNCHED)));
+      update(new JajukEvent(JajukEvents.FILE_LAUNCHED,
+          ObservationManager.getDetailsLastOccurence(JajukEvents.FILE_LAUNCHED)));
     }
     // Fill date formatter
     formatter = new SimpleDateFormat(Messages.getString("HistoryItem.0"), Locale.getDefault());
@@ -119,24 +115,24 @@ public final class History extends DefaultHandler implements HighPriorityObserve
     eventSubjectSet.add(JajukEvents.CLEAR_HISTORY);
     eventSubjectSet.add(JajukEvents.FILE_NAME_CHANGED);
     eventSubjectSet.add(JajukEvents.LANGUAGE_CHANGED);
-
     return eventSubjectSet;
   }
 
   /**
-   * Gets the history.
+   * Gets the history, newest played tracks first.
+   * <br/>Do not return a defensive copy as the history combobox relies on it as model
    * 
    * @return the history
    */
-  public Vector<HistoryItem> getHistory() { // NOPMD
-    return vHistory;
+  public Vector<HistoryItem> getItems() {
+    return items;
   }
 
   /**
    * Add an history item.
    * 
-   * @param sFileId DOCUMENT_ME
-   * @param lDate DOCUMENT_ME
+   * @param sFileId 
+   * @param lDate 
    */
   public void addItem(String sFileId, long lDate) {
     // no history
@@ -151,98 +147,83 @@ public final class History extends DefaultHandler implements HighPriorityObserve
     HistoryItem hi = new HistoryItem(sFileId, lDate);
     // check if previous history item is not the same,
     // otherwise, keep last one
-    if (vHistory.size() > 0) {
-      HistoryItem hiPrevious = vHistory.get(0);
+    if (items.size() > 0) {
+      HistoryItem hiPrevious = items.get(0);
       if (hiPrevious.getFileId().equals(hi.getFileId())) {
-        vHistory.remove(0);
+        items.remove(0);
       }
-      vHistory.add(0, hi); // keep only most recent date
+      items.add(0, hi); // keep only most recent date
       // test maximum history size, if >, remove oldest item
-      if (vHistory.size() > Const.MAX_HISTORY_SIZE) {
-        vHistory.remove(vHistory.size() - 1);
+      if (items.size() > Const.MAX_HISTORY_SIZE) {
+        items.remove(items.size() - 1);
       }
     } else { // first element in history
-      vHistory.add(0, hi);
+      items.add(0, hi);
     }
+    PersistenceService.getInstance().setHistoryChanged();
   }
 
   /**
    * Clear history.
    */
   public void clear() {
-    vHistory.clear();
+    items.clear();
   }
 
   /**
    * Cleanup history of dead items (removed files after a refresh).
    */
   public void cleanup() {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        Iterator<HistoryItem> it = vHistory.iterator();
-        while (it.hasNext()) {
-          HistoryItem hi = it.next();
-          if (FileManager.getInstance().getFileByID(hi.getFileId()) == null) {
-            it.remove();
-          }
-        }
+    Iterator<HistoryItem> it = items.iterator();
+    while (it.hasNext()) {
+      HistoryItem hi = it.next();
+      if (FileManager.getInstance().getFileByID(hi.getFileId()) == null) {
+        it.remove();
       }
-    });
+    }
   }
 
   /**
    * Change ID for a file.
    * 
-   * @param sIDOld DOCUMENT_ME
-   * @param sIDNew DOCUMENT_ME
+   * @param sIDOld 
+   * @param sIDNew 
    */
   public void changeID(final String sIDOld, final String sIDNew) {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        for (int i = 0; i < vHistory.size(); i++) {
-          HistoryItem hi = vHistory.get(i);
-          if (hi.getFileId().equals(sIDOld)) {
-            vHistory.remove(i);
-            vHistory.add(i, new HistoryItem(sIDNew, hi.getDate()));
-          }
-        }
+    for (int i = 0; i < items.size(); i++) {
+      HistoryItem hi = items.get(i);
+      if (hi.getFileId().equals(sIDOld)) {
+        items.remove(i);
+        items.add(i, new HistoryItem(sIDNew, hi.getDate()));
       }
-    });
+    }
   }
 
   /**
    * Clear history for all history items before iDays days.
    * 
-   * @param iDays DOCUMENT_ME
+   * @param iDays 
    */
   public void clear(final int iDays) {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-
-        // Begins by clearing deleted files
-        Iterator<HistoryItem> it = vHistory.iterator();
-        while (it.hasNext()) {
-          HistoryItem hi = it.next();
-          if (FileManager.getInstance().getFileByID(hi.getFileId()) == null) {
-            it.remove();
-          }
-        }
-        // Follow day limits
-        if (iDays == -1) { // infinite history
-          return;
-        }
-        it = vHistory.iterator();
-        while (it.hasNext()) {
-          HistoryItem hi = it.next();
-          if (hi.getDate() < (System.currentTimeMillis() - (((long) iDays) * Const.MILLISECONDS_IN_A_DAY))) {
-            it.remove();
-          }
-        }
+    // Begins by clearing deleted files
+    Iterator<HistoryItem> it = items.iterator();
+    while (it.hasNext()) {
+      HistoryItem hi = it.next();
+      if (FileManager.getInstance().getFileByID(hi.getFileId()) == null) {
+        it.remove();
       }
-    });
+    }
+    // Follow day limits
+    if (iDays == -1) { // infinite history
+      return;
+    }
+    it = items.iterator();
+    while (it.hasNext()) {
+      HistoryItem hi = it.next();
+      if (hi.getDate() < (System.currentTimeMillis() - (((long) iDays) * Const.MILLISECONDS_IN_A_DAY))) {
+        it.remove();
+      }
+    }
   }
 
   /**
@@ -254,13 +235,15 @@ public final class History extends DefaultHandler implements HighPriorityObserve
     if (lDateStart == 0) {
       lDateStart = System.currentTimeMillis();
     }
-    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
-        SessionService.getConfFileByPath(Const.FILE_HISTORY)), "UTF-8"));
+    java.io.File out = SessionService.getConfFileByPath(Const.FILE_HISTORY + "."
+        + Const.FILE_SAVING_FILE_EXTENSION);
+    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out),
+        "UTF-8"));
     try {
       bw.write("<?xml version='1.0' encoding='UTF-8'?>\n");
       bw.write("<history JAJUK_VERSION='" + Const.JAJUK_VERSION + "' begin_date='"
           + Long.toString(lDateStart) + "'>\n");
-      Iterator<HistoryItem> it = vHistory.iterator();
+      Iterator<HistoryItem> it = items.iterator();
       while (it.hasNext()) {
         HistoryItem hi = it.next();
         bw.write("\t<play file='" + hi.getFileId() + "' date='" + hi.getDate() + "'/>\n");
@@ -270,6 +253,9 @@ public final class History extends DefaultHandler implements HighPriorityObserve
     } finally {
       bw.close();
     }
+    java.io.File finalFile = SessionService.getConfFileByPath(Const.FILE_HISTORY);
+    UtilSystem.saveFileWithRecoverySupport(finalFile);
+    Log.debug("History commited to : " + finalFile.getAbsolutePath());
   }
 
   /**
@@ -278,11 +264,12 @@ public final class History extends DefaultHandler implements HighPriorityObserve
    */
   public static void load() {
     try {
+      File historyFile = SessionService.getConfFileByPath(Const.FILE_HISTORY);
+      UtilSystem.recoverFileIfRequired(historyFile);
       SAXParserFactory spf = SAXParserFactory.newInstance();
       spf.setValidating(false);
       SAXParser saxParser = spf.newSAXParser();
-      File frt = SessionService.getConfFileByPath(Const.FILE_HISTORY);
-      saxParser.parse(frt.toURI().toURL().toString(), getInstance());
+      saxParser.parse(historyFile.toURI().toURL().toString(), getInstance());
       // delete old history items
       getInstance().clear(Integer.parseInt(Conf.getString(Const.CONF_HISTORY)));
     } catch (Exception e) {
@@ -296,36 +283,20 @@ public final class History extends DefaultHandler implements HighPriorityObserve
   }
 
   /**
-   * Gets the last file.
-   * 
-   * @return id of last played registered track or null if history is empty
-   */
-  public String getLastFile() {
-    HistoryItem hiLast = null;
-    if (vHistory.size() == 0) {
-      return null;
-    }
-    hiLast = vHistory.get(0);
-
-    // we only add valid entries to hiLast, so hiLast cannot be null at this point...
-    return hiLast.getFileId();
-  }
-
-  /**
    * Return the history item by index.
    * 
-   * @param index DOCUMENT_ME
+   * @param index 
    * 
    * @return the history item
    */
   public HistoryItem getHistoryItem(int index) {
-    return (index >= 0 && index < vHistory.size() ? vHistory.get(index) : null);
+    return (index >= 0 && index < items.size() ? items.get(index) : null);
   }
 
   /**
    * parsing warning.
    *
-   * @param spe DOCUMENT_ME
+   * @param spe 
    * @throws SAXException the SAX exception
    */
   @Override
@@ -337,7 +308,7 @@ public final class History extends DefaultHandler implements HighPriorityObserve
   /**
    * parsing error.
    *
-   * @param spe DOCUMENT_ME
+   * @param spe 
    * @throws SAXException the SAX exception
    */
   @Override
@@ -349,7 +320,7 @@ public final class History extends DefaultHandler implements HighPriorityObserve
   /**
    * parsing fatal error.
    *
-   * @param spe DOCUMENT_ME
+   * @param spe 
    * @throws SAXException the SAX exception
    */
   @Override
@@ -359,28 +330,12 @@ public final class History extends DefaultHandler implements HighPriorityObserve
   }
 
   /**
-   * Called at parsing start.
-   */
-  @Override
-  public void startDocument() {
-    Log.debug("Starting history file parsing...");
-  }
-
-  /**
-   * Called at parsing end.
-   */
-  @Override
-  public void endDocument() {
-    Log.debug("History file parsing done");
-  }
-
-  /**
    * Called when we start an element.
    * 
-   * @param sUri DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param sQName DOCUMENT_ME
-   * @param attributes DOCUMENT_ME
+   * @param sUri 
+   * @param sName 
+   * @param sQName 
+   * @param attributes 
    * 
    * @throws SAXException the SAX exception
    */
@@ -396,31 +351,17 @@ public final class History extends DefaultHandler implements HighPriorityObserve
       Map<String, String> hm = Collection.getInstance().getHmWrongRightFileID();
       if (hm.size() > 0 && hm.containsKey(sID)) {
         sID = hm.get(sID);
-        Log.debug("upload:" + sID);
+        Log.debug("upgrade ID:" + sID);
       }
       // test if this file is still known in the collection
       if (FileManager.getInstance().getFileByID(sID) != null) {
         HistoryItem hi = new HistoryItem(sID, UtilString.fastLongParser(attributes
             .getValue(attributes.getIndex("date"))));
-        vHistory.add(hi);
+        items.add(hi);
       }
     }
   }
 
-  /**
-   * Called when we reach the end of an element.
-   * 
-   * @param sUri DOCUMENT_ME
-   * @param sName DOCUMENT_ME
-   * @param sQName DOCUMENT_ME
-   * 
-   * @throws SAXException the SAX exception
-   */
-  @Override
-  public void endElement(String sUri, String sName, String sQName) throws SAXException {
-    // nothing to do here...
-  }
-
   /*
    * (non-Javadoc)
    *
@@ -428,41 +369,33 @@ public final class History extends DefaultHandler implements HighPriorityObserve
    */
   @Override
   public void update(final JajukEvent event) {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        JajukEvents subject = event.getSubject();
-        try {
-          if (JajukEvents.FILE_LAUNCHED.equals(subject)) {
-            String sFileID = (String) ObservationManager.getDetail(event,
-                Const.DETAIL_CURRENT_FILE_ID);
-            long lDate = ((Long) ObservationManager.getDetail(event, Const.DETAIL_CURRENT_DATE))
-                .longValue();
-            addItem(sFileID, lDate);
-          } else if (JajukEvents.DEVICE_REFRESH.equals(subject)) {
-            cleanup();
-          } else if (JajukEvents.CLEAR_HISTORY.equals(subject)) {
-            clear();
-            InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.251"),
-                InformationJPanel.MessageType.INFORMATIVE);
-          } else if (JajukEvents.LANGUAGE_CHANGED.equals(subject)) {
-            // reset formatter
-            formatter = new SimpleDateFormat(Messages.getString("HistoryItem.0"), Locale
-                .getDefault());
-          } else if (JajukEvents.FILE_NAME_CHANGED.equals(subject)) {
-            Properties properties = event.getDetails();
-            org.jajuk.base.File fileOld = (org.jajuk.base.File) properties.get(Const.DETAIL_OLD);
-            org.jajuk.base.File fNew = (org.jajuk.base.File) properties.get(Const.DETAIL_NEW);
-            // change id in history
-            changeID(fileOld.getID(), fNew.getID());
-          }
-        } catch (Exception e) {
-          Log.error(e);
-          return;
-        }
+    JajukEvents subject = event.getSubject();
+    try {
+      if (JajukEvents.FILE_LAUNCHED.equals(subject)) {
+        String sFileID = (String) ObservationManager.getDetail(event, Const.DETAIL_CURRENT_FILE_ID);
+        long lDate = ((Long) ObservationManager.getDetail(event, Const.DETAIL_CURRENT_DATE))
+            .longValue();
+        addItem(sFileID, lDate);
+      } else if (JajukEvents.DEVICE_REFRESH.equals(subject)) {
+        cleanup();
+      } else if (JajukEvents.CLEAR_HISTORY.equals(subject)) {
+        clear();
+        InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.251"),
+            InformationJPanel.MessageType.INFORMATIVE);
+      } else if (JajukEvents.LANGUAGE_CHANGED.equals(subject)) {
+        // reset formatter
+        formatter = new SimpleDateFormat(Messages.getString("HistoryItem.0"), Locale.getDefault());
+      } else if (JajukEvents.FILE_NAME_CHANGED.equals(subject)) {
+        Properties properties = event.getDetails();
+        org.jajuk.base.File fileOld = (org.jajuk.base.File) properties.get(Const.DETAIL_OLD);
+        org.jajuk.base.File fNew = (org.jajuk.base.File) properties.get(Const.DETAIL_NEW);
+        // change id in history
+        changeID(fileOld.getID(), fNew.getID());
       }
-    });
-
+    } catch (Exception e) {
+      Log.error(e);
+      return;
+    }
   }
 
   /**
diff --git a/src/main/java/org/jajuk/services/bookmark/HistoryItem.java b/src/main/java/org/jajuk/services/bookmark/HistoryItem.java
index 1adc4b5..b29a5d7 100644
--- a/src/main/java/org/jajuk/services/bookmark/HistoryItem.java
+++ b/src/main/java/org/jajuk/services/bookmark/HistoryItem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.bookmark;
 
 import java.util.Date;
@@ -30,18 +29,16 @@ import org.jajuk.base.FileManager;
  * An history item.
  */
 public class HistoryItem {
-
   /** File Id. */
   private String sFileId;
-
   /** Play date. */
   private long lDate;
 
   /**
    * Instantiates a new history item.
    * 
-   * @param sFileId DOCUMENT_ME
-   * @param lDate DOCUMENT_ME
+   * @param sFileId 
+   * @param lDate 
    */
   public HistoryItem(String sFileId, long lDate) {
     this.sFileId = sFileId;
@@ -60,7 +57,7 @@ public class HistoryItem {
   /**
    * Sets the date.
    * 
-   * @param lDate DOCUMENT_ME
+   * @param lDate 
    */
   public void setDate(long lDate) {
     this.lDate = lDate;
@@ -96,7 +93,6 @@ public class HistoryItem {
     if (file == null) {
       return "no file (" + getFileId() + ')';
     }
-
     String sDate = History.getInstance().getDateFormatter().format(new Date(getDate()));
     StringBuilder sb = new StringBuilder();
     sb.append('[').append(sDate).append("] ");
diff --git a/src/main/java/org/jajuk/services/bookmark/package.html b/src/main/java/org/jajuk/services/bookmark/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/bookmark/package.html
+++ b/src/main/java/org/jajuk/services/bookmark/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/cddb/CDDBTrack.java b/src/main/java/org/jajuk/services/cddb/CDDBTrack.java
index 0bf5aa2..b25f682 100644
--- a/src/main/java/org/jajuk/services/cddb/CDDBTrack.java
+++ b/src/main/java/org/jajuk/services/cddb/CDDBTrack.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.cddb;
 
@@ -28,14 +28,12 @@ import org.jajuk.base.Track;
  * A CDDB track.
  */
 public class CDDBTrack implements FreedbTrack {
-
-  /** DOCUMENT_ME. */
   Track track;
 
   /**
    * Instantiates a new cDDB track.
    * 
-   * @param track DOCUMENT_ME
+   * @param track 
    */
   public CDDBTrack(Track track) {
     this.track = track;
@@ -47,7 +45,6 @@ public class CDDBTrack implements FreedbTrack {
   @Override
   public int getLength() {
     return (int) track.getDuration();
-
   }
 
   /* (non-Javadoc)
@@ -74,5 +71,4 @@ public class CDDBTrack implements FreedbTrack {
   public String toString() {
     return "CDDB: " + track.toString();
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/cddb/package.html b/src/main/java/org/jajuk/services/cddb/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/cddb/package.html
+++ b/src/main/java/org/jajuk/services/cddb/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/core/CleanupService.java b/src/main/java/org/jajuk/services/core/CleanupService.java
new file mode 100644
index 0000000..70c1663
--- /dev/null
+++ b/src/main/java/org/jajuk/services/core/CleanupService.java
@@ -0,0 +1,74 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.services.core;
+
+import net.miginfocom.layout.LinkHandler;
+
+import org.jajuk.util.log.Log;
+
+/**
+ * This thread is responsible for various cleanups during jajuk execution
+ * <p>
+ * Singleton
+ * <p>
+ */
+public final class CleanupService extends Thread {
+  private static CleanupService self = new CleanupService();
+  private static final int DELAY_BETWEEN_CHECKS_SEC = 1800;
+
+  /**
+   * Instantiates a new rating manager.
+   */
+  private CleanupService() {
+    // set thread name
+    super("Cleanup service Thread");
+    setPriority(Thread.MIN_PRIORITY);
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see java.lang.Thread#run()
+   */
+  @Override
+  public void run() {
+    while (!ExitService.isExiting()) {
+      try {
+        Thread.sleep(1000 * DELAY_BETWEEN_CHECKS_SEC);
+        Log.debug("Cleanup");
+        // workaround to free space in MigLayout
+        // see http://migcalendar.com/forum/viewtopic.php?f=8&t=3236&p=7012
+        LinkHandler.getValue("", "", 1); // simulated read
+      } catch (Exception e) {
+        Log.error(e);
+      }
+    }
+  }
+
+  /**
+   * Gets the single instance of RatingManager.
+   * 
+   * @return single instance of RatingManager
+   */
+  public static CleanupService getInstance() {
+    return self;
+  }
+}
diff --git a/src/main/java/org/jajuk/services/core/ExitService.java b/src/main/java/org/jajuk/services/core/ExitService.java
index f09eae2..535d063 100644
--- a/src/main/java/org/jajuk/services/core/ExitService.java
+++ b/src/main/java/org/jajuk/services/core/ExitService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,37 +16,31 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.core;
 
-import java.io.File;
-
 import org.jajuk.base.Collection;
-import org.jajuk.base.DeviceManager;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
 import org.jajuk.services.bookmark.History;
 import org.jajuk.services.dbus.DBusManager;
-import org.jajuk.services.dj.AmbienceManager;
 import org.jajuk.services.players.Player;
 import org.jajuk.services.players.QueueModel;
-import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.services.webradio.CustomRadiosPersistenceHelper;
+import org.jajuk.services.webradio.PresetRadiosPersistenceHelper;
 import org.jajuk.ui.actions.JajukAction;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
-import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
 
 /**
  * All code related to jajuk exit.
  */
 public class ExitService extends Thread {
-
   /** Exit code. */
   private static int iExitCode = 0;
-
   /** Exiting flag. */
   private volatile static boolean bExiting = false;
 
@@ -57,110 +51,36 @@ public class ExitService extends Thread {
     super("Exit hook thread");
   }
 
-  /**
-   * commit some of the managers and other things that are
-   * stored. This is usually only called during exit, but
-   * should be called in-between sometimes.
-   * 
-   * @param bExit DOCUMENT_ME
-   * 
-   * @throws Exception the exception
-   */
-  public static void commit(boolean bExit) throws Exception {
-    Log.debug("Commiting Queue, Ambiences, WebRadio, Configuration and collection.");
-
-    // Store current FIFO for next session
-    QueueModel.commit();
-
-    // commit ambiences
-    AmbienceManager.getInstance().commit();
-
-    // Commit webradios
-    WebRadioManager.getInstance().commit();
-
-    // Store webradio state
-    Conf
-        .setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, Boolean.toString(QueueModel.isPlayingRadio()));
-
-    // commit configuration
-    org.jajuk.util.Conf.commit();
-
-    // commit history
-    History.commit();
-
-    // Wait few secs if some devices are still refreshing, a kill signal has
-    // been sent to them
-    if (DeviceManager.getInstance().isAnyDeviceRefreshing()) {
-      for (int i = 0; i < 10; i++) {
-        if (DeviceManager.getInstance().isAnyDeviceRefreshing()) {
-          Thread.sleep(1000);
-          Log.debug("Waiting for refresh process end...");
-        } else {
-          continue;
-        }
-      }
-    }
-
-    // Commit collection if not still refreshing
-    if (!DeviceManager.getInstance().isAnyDeviceRefreshing()) {
-      Collection.commit(SessionService.getConfFileByPath(Const.FILE_COLLECTION_EXIT));
-      // create an exit proof file if required
-      if (bExit) {
-        UtilSystem.createEmptyFile(SessionService
-            .getConfFileByPath(Const.FILE_COLLECTION_EXIT_PROOF));
-      }
-    }
-  }
-
   /* (non-Javadoc)
    * @see java.lang.Thread#run()
    */
   @Override
   public void run() {
     Log.debug("Exit Hook begin");
-
+    // Store webradio state
+    Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, Boolean.toString(QueueModel.isPlayingRadio()));
     // stop sound ASAP
     Player.stop(true);
-
     ObservationManager.notifySync(new JajukEvent(JajukEvents.EXITING));
-
+    // Last attempt to store the collection data, may not be reached on fast computers but persistence manager
+    // should have save already most of the data
+    try {
+      Collection.commit();
+      // Commit webradios
+      CustomRadiosPersistenceHelper.commit();
+      PresetRadiosPersistenceHelper.commit();
+      QueueModel.commit();
+      History.commit();
+    } catch (Exception e1) {
+      Log.error(e1);
+    }
     try {
       // commit only if exit is safe (to avoid commiting empty collection) 
       if (iExitCode == 0) {
-        // commit all managers/items
-        commit(true);
-
         // Disconnect Dbus if required
         DBusManager.disconnect();
-
         /* release keystrokes resources */
         JajukAction.cleanup();
-
-        // Remove localhost_<user> session files
-        // (can occur when network is not available)
-        File[] files = SessionService.getConfFileByPath(Const.FILE_SESSIONS).listFiles();
-        if (files != null) {
-          for (File element : files) {
-            if (element.getName().indexOf("localhost") != -1) {
-              if (!element.exists()) {
-                Log.info("Session file: " + element.getAbsolutePath() + " does not exist.");
-              } else if (element.delete()) {
-                Log.warn("Deleted session file: " + element.getAbsolutePath());
-              } else {
-                Log.warn("Could not delete file: " + element.getAbsolutePath());
-              }
-            }
-          }
-        }
-
-        // Remove session flag.
-        File file = SessionService.getSessionIdFile();
-        if (!file.exists()) {
-          Log.info("Cannot delete file, file: " + file.toString()
-              + " does not exist or workspace move.");
-        } else if (!file.delete()) {
-          Log.warn("Could not delete file: " + file.toString());
-        }
       }
     } catch (Exception e) {
       Log.error(e);
@@ -196,5 +116,4 @@ public class ExitService extends Thread {
   public static boolean isExiting() {
     return bExiting;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/core/PersistenceService.java b/src/main/java/org/jajuk/services/core/PersistenceService.java
new file mode 100644
index 0000000..5d96b0f
--- /dev/null
+++ b/src/main/java/org/jajuk/services/core/PersistenceService.java
@@ -0,0 +1,250 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.services.core;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.jajuk.base.Collection;
+import org.jajuk.base.DeviceManager;
+import org.jajuk.services.bookmark.History;
+import org.jajuk.services.players.QueueModel;
+import org.jajuk.services.players.StackItem;
+import org.jajuk.services.webradio.CustomRadiosPersistenceHelper;
+import org.jajuk.services.webradio.PresetRadiosPersistenceHelper;
+import org.jajuk.ui.perspectives.IPerspective;
+import org.jajuk.util.log.Log;
+
+/**
+ * This thread is responsible for commiting configuration or collection files on events. 
+ * This allows to save files during Jajuk running and not only when exiting the app as before. 
+ * <p>
+ * It is sometimes difficult to get clear events to check to so we also start a differential check 
+ * on a regular basis through a thread
+ * </p>
+ * <p>
+ * Singleton
+ * <p>
+ */
+public final class PersistenceService extends Thread {
+  public enum Urgency {
+    HIGH, MEDIUM, LOW
+  }
+
+  private static PersistenceService self = new PersistenceService();
+  private String lastCommitQueueCheckSum;
+  private static final int HEART_BEAT_MS = 1000;
+  private static final int MIN_DELAY_AFTER_PERSPECTIVE_CHANGE_MS = 5000;
+  private static final int DELAY_HIGH_URGENCY_BEATS = 5;
+  private static final int DELAY_MEDIUM_URGENCY_BEATS = 15;
+  private static final int DELAY_LOW_URGENCY_BEATS = 600 * HEART_BEAT_MS;
+  /** Collection change flag **/
+  private volatile Map<Urgency, Boolean> collectionChanged = new HashMap<Urgency, Boolean>(3);
+  private volatile boolean radiosChanged = false;
+  private volatile boolean historyChanged = false;
+  private volatile Map<IPerspective, Long> dateMinNextPerspectiveCommit = new HashMap<IPerspective, Long>(
+      10);
+
+  /**
+   * Inform the persister service that the perspective should be commited
+   * @param perspective the perspective that changed
+   */
+  public void setPerspectiveChanged(IPerspective perspective) {
+    synchronized (dateMinNextPerspectiveCommit) {
+      dateMinNextPerspectiveCommit.put(perspective,
+          (System.currentTimeMillis() + MIN_DELAY_AFTER_PERSPECTIVE_CHANGE_MS));
+    }
+  }
+
+  /**
+   * Inform the persister service that the history should be commited
+   */
+  public void setHistoryChanged() {
+    historyChanged = true;
+  }
+
+  /**
+   * Inform the persister service that the collection should be commited with the given urgency
+   * @param urgency the urgency for the collection to be commited
+   */
+  public void setCollectionChanged(Urgency urgency) {
+    collectionChanged.put(urgency, true);
+  }
+
+  /**
+   * Inform the persister service that the radios should be commited
+   */
+  public void setRadiosChanged() {
+    radiosChanged = true;
+  }
+
+  /**
+   * Instantiates a new rating manager.
+   */
+  private PersistenceService() {
+    // set thread name
+    super("Persistence Manager Thread");
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see java.lang.Thread#run()
+   */
+  @Override
+  public void run() {
+    init();
+    int comp = 1;
+    while (!ExitService.isExiting()) {
+      try {
+        Thread.sleep(HEART_BEAT_MS);
+        if (comp % DELAY_HIGH_URGENCY_BEATS == 0) {
+          performHighUrgencyActions();
+        }
+        if (comp % DELAY_MEDIUM_URGENCY_BEATS == 0) {
+          performMediumUrgencyActions();
+        }
+        if (comp % DELAY_LOW_URGENCY_BEATS == 0) {
+          performLowUrgencyActions();
+        }
+        comp++;
+      } catch (Exception e) {
+        Log.error(e);
+      }
+    }
+  }
+
+  private void init() {
+    this.lastCommitQueueCheckSum = getQueueModelChecksum();
+    collectionChanged.put(Urgency.LOW, false);
+    collectionChanged.put(Urgency.MEDIUM, false);
+    collectionChanged.put(Urgency.HIGH, false);
+    setPriority(Thread.MAX_PRIORITY);
+  }
+
+  private void performHighUrgencyActions() throws Exception {
+    commitWebradiosIfRequired();
+    if (collectionChanged.get(Urgency.HIGH) && !DeviceManager.getInstance().isAnyDeviceRefreshing()) {
+      try {
+        Collection.commit();
+      } finally {
+        collectionChanged.put(Urgency.HIGH, false);
+      }
+    }
+  }
+
+  private void performMediumUrgencyActions() throws Exception {
+    // Queue
+    commitQueueModelIfRequired();
+    // Collection
+    if (collectionChanged.get(Urgency.MEDIUM)
+        && !DeviceManager.getInstance().isAnyDeviceRefreshing()) {
+      try {
+        Collection.commit();
+      } finally {
+        collectionChanged.put(Urgency.MEDIUM, false);
+      }
+    }
+    // Perspectives
+    handcommitPerspectivesIfRequired();
+  }
+
+  private void handcommitPerspectivesIfRequired() throws Exception {
+    List<IPerspective> datesCopy = new ArrayList<IPerspective>(
+        dateMinNextPerspectiveCommit.keySet());
+    for (IPerspective perspective : datesCopy) {
+      if (System.currentTimeMillis() - dateMinNextPerspectiveCommit.get(perspective) >= 0) {
+        try {
+          perspective.commit();
+        } finally {
+          synchronized (dateMinNextPerspectiveCommit) {
+            dateMinNextPerspectiveCommit.remove(perspective);
+          }
+        }
+      }
+    }
+  }
+
+  private void performLowUrgencyActions() throws Exception {
+    //History
+    commitHistoryIfRequired();
+    // Collection
+    if (collectionChanged.get(Urgency.LOW) && !DeviceManager.getInstance().isAnyDeviceRefreshing()) {
+      try {
+        Collection.commit();
+      } finally {
+        collectionChanged.put(Urgency.LOW, false);
+      }
+    }
+  }
+
+  private void commitWebradiosIfRequired() throws IOException {
+    try {
+      if (radiosChanged) {
+        // Commit webradios
+        CustomRadiosPersistenceHelper.commit();
+        PresetRadiosPersistenceHelper.commit();
+      }
+    } finally {
+      radiosChanged = false;
+    }
+  }
+
+  private void commitQueueModelIfRequired() throws IOException {
+    String checksum = getQueueModelChecksum();
+    if (!checksum.equals(this.lastCommitQueueCheckSum)) {
+      try {
+        QueueModel.commit();
+      } finally {
+        this.lastCommitQueueCheckSum = checksum;
+      }
+    }
+  }
+
+  private void commitHistoryIfRequired() throws IOException {
+    if (historyChanged) {
+      try {
+        History.commit();
+      } finally {
+        historyChanged = false;
+      }
+    }
+  }
+
+  private String getQueueModelChecksum() {
+    StringBuilder sb = new StringBuilder();
+    for (StackItem item : QueueModel.getQueue()) {
+      sb.append(item.getFile().getID());
+    }
+    // Do not use MD5Processor class here to avoid the intern() method that 
+    // could create a permgen memory leak
+    byte[] checksum = DigestUtils.md5(sb.toString());
+    return new String(checksum);
+  }
+
+  public static PersistenceService getInstance() {
+    return self;
+  }
+}
diff --git a/src/main/java/org/jajuk/services/core/RatingManager.java b/src/main/java/org/jajuk/services/core/RatingService.java
similarity index 88%
rename from src/main/java/org/jajuk/services/core/RatingManager.java
rename to src/main/java/org/jajuk/services/core/RatingService.java
index 43e0875..ee35a37 100644
--- a/src/main/java/org/jajuk/services/core/RatingManager.java
+++ b/src/main/java/org/jajuk/services/core/RatingService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.core;
 
 import java.util.HashSet;
@@ -47,21 +46,17 @@ import org.jajuk.util.log.Log;
  * Singleton
  * <p>
  */
-public final class RatingManager extends Thread implements Observer {
-
-  /** DOCUMENT_ME. */
-  private static RatingManager self = new RatingManager();
-
+public final class RatingService extends Thread implements Observer {
+  private static RatingService self = new RatingService();
   /** Flag the fact a rate has change for a track, used by bestof view refresh for perfs. */
   private static boolean bRateHasChanged = true;
-
   /** Max rate. */
   private static long lMaxPlaycount = 0l;
 
   /**
    * Instantiates a new rating manager.
    */
-  private RatingManager() {
+  private RatingService() {
     // set thread name
     super("Rating Manager Thread");
     setPriority(Thread.MIN_PRIORITY);
@@ -74,7 +69,7 @@ public final class RatingManager extends Thread implements Observer {
    * 
    * @return single instance of RatingManager
    */
-  public static RatingManager getInstance() {
+  public static RatingService getInstance() {
     return self;
   }
 
@@ -99,7 +94,6 @@ public final class RatingManager extends Thread implements Observer {
         ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
         bRateHasChanged = false;
       }
-
     }
   }
 
@@ -113,6 +107,15 @@ public final class RatingManager extends Thread implements Observer {
   }
 
   /**
+   * Return a valid [0;100] rating for given preference
+   * @param preference
+   * @return
+   */
+  public static long getRateForPreference(long preference) {
+    return Math.round((16.6 * preference + 50));
+  }
+
+  /**
    * Set max playcount.
    * 
    * @param value the playcount value
@@ -127,15 +130,6 @@ public final class RatingManager extends Thread implements Observer {
   }
 
   /**
-   * Checks for rate changed.
-   * 
-   * @return Returns the bRateHasChanged.
-   */
-  public static boolean hasRateChanged() {
-    return bRateHasChanged;
-  }
-
-  /**
    * Sets the rate has changed.
    * 
    * @param rateHasChanged The bRateHasChanged to set.
@@ -154,6 +148,7 @@ public final class RatingManager extends Thread implements Observer {
     Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
     eventSubjectSet.add(JajukEvents.RATE_RESET);
     eventSubjectSet.add(JajukEvents.PREFERENCES_RESET);
+    eventSubjectSet.add(JajukEvents.RATING_MODE_CHANGED);
     return eventSubjectSet;
   }
 
@@ -206,7 +201,12 @@ public final class RatingManager extends Thread implements Observer {
       FileManager.getInstance().refreshBestOfFiles();
       InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.253"),
           InformationJPanel.MessageType.INFORMATIVE);
+    } else if (subject == JajukEvents.RATING_MODE_CHANGED) {
+      // Update rate in case of manual/auto ratings switch
+      for (Track track : TrackManager.getInstance().getTracks()) {
+        track.updateRate();
+      }
+      ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/core/SessionService.java b/src/main/java/org/jajuk/services/core/SessionService.java
index 0a47c3f..8c95304 100644
--- a/src/main/java/org/jajuk/services/core/SessionService.java
+++ b/src/main/java/org/jajuk/services/core/SessionService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.core;
 
@@ -24,29 +24,17 @@ import java.awt.GraphicsEnvironment;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.net.InetAddress;
 import java.net.URL;
-import java.net.UnknownHostException;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
 import java.util.Properties;
 import java.util.StringTokenizer;
 
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 
-import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.ui.wizard.FirstTimeWizard;
-import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
-import org.jajuk.util.IconLoader;
-import org.jajuk.util.JajukIcons;
 import org.jajuk.util.MD5Processor;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UpgradeManager;
-import org.jajuk.util.UtilGUI;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukRuntimeException;
 import org.jajuk.util.log.Log;
@@ -55,37 +43,24 @@ import org.jajuk.util.log.Log;
  * Multi-session and test/final mode facilities.
  */
 public class SessionService {
-
   /** Debug mode. */
   private static boolean bIdeMode = false;
-
   /** Test mode. */
   private static boolean bTestMode = false;
-
   /** Workspace PATH*. */
   private static String workspace;
-
   /** Forced workspace location (required for some special packaging like portableapps) *. */
   private static String forcedWorkspacePath = null;
-
-  /** Directory used to flag the current jajuk session. */
-  private static File sessionIdFile;
-
   /** Lock used to trigger first time wizard window close*. */
   private static short[] isFirstTimeWizardClosed = new short[0];
-
   /** Bootstrap file content as key/value format. */
   private static Properties bootstrapContent = new Properties();
-
   /** For performances, store conf root path. */
   private static String confRoot;
-
   /** Boostrap file test workspace path key. */
   private static final String KEY_TEST = "test";
-
   /** Boostrap file final workspace path key. */
   private static final String KEY_FINAL = "final";
-
   /** First time wizard instance if required. */
   private static FirstTimeWizard ftw;
 
@@ -97,77 +72,8 @@ public class SessionService {
   }
 
   /**
-   * check if another session is already started.
-   */
-  public static void checkOtherSession() {
-
-    try {
-      SwingUtilities.invokeAndWait(new Runnable() {
-        @Override
-        public void run() {
-          // Check for remote concurrent users using the same
-          // configuration
-          // files. Create concurrent session directory if needed
-          File sessions = getConfFileByPath(Const.FILE_SESSIONS);
-          if (!sessions.exists() && !sessions.mkdir()) {
-            Log.warn("Could not create directory " + sessions.toString());
-          }
-          // Check for concurrent session
-          File[] files = sessions.listFiles();
-          // display a warning if sessions directory contains some
-          // others users
-          // We ignore presence of ourself session id that can be
-          // caused by a
-          // crash
-          if (files.length > 0 && !Conf.getBoolean(Const.CONF_NOT_SHOW_AGAIN_CONCURRENT_SESSION)) {
-            StringBuilder details = new StringBuilder();
-            for (File element : files) {
-              details.append(element.getName());
-              details.append('\n');
-            }
-            JOptionPane optionPane = UtilGUI.getNarrowOptionPane(72);
-            optionPane.setMessage(UtilGUI.getLimitedMessage(Messages.getString("Warning.2")
-                + details.toString(), 20));
-            Object[] options = { Messages.getString("Ok"), Messages.getString("Hide"),
-                Messages.getString("Purge") };
-            optionPane.setOptions(options);
-            optionPane.setMessageType(JOptionPane.WARNING_MESSAGE);
-            JDialog dialog = optionPane.createDialog(null, Messages.getString("Warning"));
-            dialog.setAlwaysOnTop(true);
-            // keep it modal (useful at startup)
-            dialog.setModal(true);
-            dialog.pack();
-            dialog.setIconImage(IconLoader.getIcon(JajukIcons.LOGO_FRAME).getImage());
-            dialog.setLocationRelativeTo(JajukMainWindow.getInstance());
-            dialog.setVisible(true);
-            if (Messages.getString("Hide").equals(optionPane.getValue())) {
-              // Not show again
-              Conf.setProperty(Const.CONF_NOT_SHOW_AGAIN_CONCURRENT_SESSION, Const.TRUE);
-            } else if (Messages.getString("Purge").equals(optionPane.getValue())) {
-              // Clean up old locks directories in session folder
-              files = sessions.listFiles();
-              for (int i = 0; i < files.length; i++) {
-                if (!files[i].delete()) {
-                  Messages.showDetailedErrorMessage(131,
-                      "Cannot delete : " + files[i].getAbsolutePath(), "");
-                  Log.error(131);
-                  break;
-                }
-              }
-            }
-          }
-        }
-      });
-    } catch (InterruptedException e) {
-      Log.error(e);
-    } catch (InvocationTargetException e) {
-      Log.error(e);
-    }
-  }
-
-  /**
    * Checks if is ide mode.
-   * 
+   *
    * @return true, if is ide mode
    */
   public static boolean isIdeMode() {
@@ -176,7 +82,7 @@ public class SessionService {
 
   /**
    * Checks if is test mode.
-   * 
+   *
    * @return true, if is test mode
    */
   public static boolean isTestMode() {
@@ -185,7 +91,7 @@ public class SessionService {
 
   /**
    * Gets the workspace.
-   * 
+   *
    * @return the workspace
    */
   public static String getWorkspace() {
@@ -194,7 +100,7 @@ public class SessionService {
 
   /**
    * Sets the test mode.
-   * 
+   *
    * @param bTestMode the new test mode
    */
   public static void setTestMode(boolean bTestMode) {
@@ -203,7 +109,7 @@ public class SessionService {
 
   /**
    * Sets the workspace.
-   * 
+   *
    * @param workspace the new workspace
    */
   public static void setWorkspace(String workspace) {
@@ -223,29 +129,9 @@ public class SessionService {
   }
 
   /**
-   * Gets the session id file.
-   * 
-   * @return the session id file
-   */
-  public static File getSessionIdFile() {
-    if (sessionIdFile == null) {
-      String sHostname;
-      try {
-        sHostname = InetAddress.getLocalHost().getHostName();
-      } catch (final UnknownHostException e) {
-        sHostname = "localhost";
-      }
-      sessionIdFile = getConfFileByPath(Const.FILE_SESSIONS + '/' + sHostname + '_'
-          + System.getProperty("user.name") + '_'
-          + new SimpleDateFormat("yyyyMMdd-kkmmss", Locale.getDefault()).format(UtilSystem.TODAY));
-    }
-    return sessionIdFile;
-  }
-
-  /**
    * Walks through the command line arguments and sets flags for any one that we
    * recognize.
-   * 
+   *
    * @param args The list of command line arguments that is passed to main()
    */
   public static void handleCommandline(final String[] args) {
@@ -296,7 +182,6 @@ public class SessionService {
     for (final Object element : System.getProperties().keySet()) {
       String key = (String) element;
       String value = System.getProperty(key);
-
       // Tells jajuk it is inside the IDE (useful to find right
       // location for images and jar resources)
       if (Const.CLI_IDE.equals(key) && Const.TRUE.equalsIgnoreCase(value)) {
@@ -310,16 +195,6 @@ public class SessionService {
   }
 
   /**
-   * Creates the session file.
-   * DOCUMENT_ME
-   */
-  public static void createSessionFile() {
-    if (!getSessionIdFile().mkdir()) {
-      Log.warn("Could not create directory for session: " + sessionIdFile);
-    }
-  }
-
-  /**
    * Discover the jajuk workspace by reading the bootstrap file.<br>
    * Searched in this order :
    * <ul>
@@ -328,7 +203,7 @@ public class SessionService {
    * <li>Default path presence</li>
    * <li>Human selection</li>
    * </ul>
-   * 
+   *
    * @throws InterruptedException the interrupted exception
    */
   public static void discoverWorkspace() throws InterruptedException {
@@ -336,7 +211,6 @@ public class SessionService {
       // Upgrade the bootstrap file if it exists (must be done here, not in upgrade step 1
       // because of the boot sequence dependencies)
       UpgradeManager.upgradeBootstrapFile();
-
       // Use any forced workspace location given in CLI. Note that this path has
       // already been validated in the handleCommand() method
       if (forcedWorkspacePath != null) {
@@ -361,25 +235,30 @@ public class SessionService {
             // Parse bootstrap file (XML format)
             FileInputStream fis = new FileInputStream(bootstrap);
             bootstrapContent.loadFromXML(fis);
-
             String workspacePath = null;
-
             // Compute the final workspace path
             if (isTestMode()) {
               workspacePath = (String) bootstrapContent.get(KEY_TEST);
             } else {
               workspacePath = (String) bootstrapContent.get(KEY_FINAL);
             }
-
+            // Case where the file exist but doesn't contain the path lines
+            if (workspacePath == null) {
+              throw new IllegalStateException("the bootsrap file doesn't contain the path lines");
+            }
             // Check if the repository can be found
-            if (new File(workspacePath + '/'
-                + (isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk")).canRead()) {
+            File targetWorkspace = new File(workspacePath + '/'
+                + (isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk"));
+            if (targetWorkspace.canRead()) {
               setWorkspace(workspacePath);
             } else {
               // Use default directory but do not commit the bootstrap file because the workspace could
               // be available again later, especially if located in a detachable device
               System.out
                   .println("[BOOT] Workspace given in bootstrap file is not accessible, using home directory as a workspace");
+              if (!targetWorkspace.getAbsolutePath().equals(UtilSystem.getUserHome())) {
+                Messages.showErrorMessage(182, targetWorkspace.getAbsolutePath());
+              }
               setWorkspace(UtilSystem.getUserHome());
             }
             // Bootstrap file corrupted
@@ -432,7 +311,7 @@ public class SessionService {
       SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
-          // default workspace displayed in the first time wizard is either the user home 
+          // default workspace displayed in the first time wizard is either the user home
           // or the forced path if provided (can't be changed by the user from the wizard anyway)
           String defaultWorkspacePath = UtilSystem.getUserHome();
           if (forcedWorkspacePath != null) {
@@ -450,7 +329,10 @@ public class SessionService {
           Log.error(e);
         }
       }
-      setWorkspace(ftw.getUserWorkspacePath());
+      // selection can be null if user postpone the configuration
+      if (ftw.getUserWorkspacePath() != null) {
+        setWorkspace(ftw.getUserWorkspacePath());
+      }
     }
   }
 
@@ -496,9 +378,9 @@ public class SessionService {
    * Return destination file in cache for a given URL <br>
    * We store the file using the URL's MD3 5 hash to ensure unicity and avoid
    * unexpected characters in file names.
-   * 
+   *
    * @param url resource URL
-   * 
+   *
    * @return File in cache if any or null otherwise
    */
   public static File getCachePath(final URL url) {
@@ -509,9 +391,9 @@ public class SessionService {
 
   /**
    * Gets the conf file by path.
-   * 
+   *
    * @param sPATH Configuration file or directory path
-   * 
+   *
    * @return the file relative to jajuk directory
    */
   public static final File getConfFileByPath(final String sPATH) {
@@ -527,7 +409,7 @@ public class SessionService {
 
   /**
    * Return whether user provided a forced workspace on command line.
-   * 
+   *
    * @return whether user provided a forced workspace.
    */
   public static boolean isForcedWorkspace() {
@@ -536,7 +418,7 @@ public class SessionService {
 
   /**
    * Return default workspace location.
-   * 
+   *
    * @return default workspace location
    */
   public static final File getDefaultCollectionPath() {
@@ -561,20 +443,17 @@ public class SessionService {
         element.delete();
       }
     }
-
   }
 
   /**
    * Return bootstrap file absolute path
-   * 
-   * 
-   * 
+   *
    * This bootstrap file location can be overridden by providing -bootstrap=<URL> CLI option.
-   * 
-   * @param filename DOCUMENT_ME
-   * 
+   *
+   * @param filename 
+   *
    * @return bootstrap file absolute path
-   * 
+   *
    * @filename filename of the bootstrap path
    */
   public static String getBootstrapPath(String filename) {
@@ -583,17 +462,16 @@ public class SessionService {
 
   /**
    * Return bootstrap file absolute path
-   * 
+   *
    * It also fixes #1473 by moving if required the bootstrap file (see See
-   * https://trac.jajuk.info/ticket/1473)
-   * 
-   * 
+   * #1473)
+   *
+   *
    * This bootstrap file location can be overridden by providing -bootstrap=<URL> CLI option
-   * 
+   *
    * @return bootstrap file absolute path
    */
   public static String getBootstrapPath() {
     return getBootstrapPath(Const.FILE_BOOTSTRAP);
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/core/package.html b/src/main/java/org/jajuk/services/core/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/core/package.html
+++ b/src/main/java/org/jajuk/services/core/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/covers/Cover.java b/src/main/java/org/jajuk/services/covers/Cover.java
index 9056c72..4e044ae 100644
--- a/src/main/java/org/jajuk/services/covers/Cover.java
+++ b/src/main/java/org/jajuk/services/covers/Cover.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.covers;
 
 import java.awt.Image;
@@ -45,7 +44,6 @@ import org.jajuk.util.log.Log;
  * A cover, encapsulates URL, files and manages cover priority to display.
  */
 public class Cover implements Comparable<Cover>, Const {
-
   /**
    * Covers type enumeration.
    * <p>
@@ -70,43 +68,25 @@ public class Cover implements Comparable<Cover>, Const {
    * </p>
    */
   public enum CoverType {
-
-    /** DOCUMENT_ME. */
-    NO_COVER,
-
-    /** DOCUMENT_ME. */
-    REMOTE_COVER,
-
-    /** DOCUMENT_ME. */
-    LOCAL_COVER,
-
+    NO_COVER, REMOTE_COVER, LOCAL_COVER,
     // cover stored in the tag of a file
-    TAG_COVER,
-    
-    /** DOCUMENT_ME. */
-    STANDARD_COVER,
-    
-    /** DOCUMENT_ME. */
-    SELECTED_COVER
+    TAG_COVER, STANDARD_COVER, SELECTED_COVER
   }
 
   /** Cover URL*. */
   private final URL url;
-
   /** Cover Type. */
   private final CoverType type;
-
   /** Associated file. */
   private File file;
-
   /** Default cover image. */
   private static final ImageIcon DEFAULT_COVER_ICON = UtilGUI.getImage(IMAGES_SPLASHSCREEN);
 
   /**
    * Constructor for remote covers.
-   * 
-   * @param type DOCUMENT_ME
-   * @param url DOCUMENT_ME
+   *
+   * @param url 
+   * @param type 
    */
   public Cover(final URL url, final CoverType type) {
     this.url = url;
@@ -120,10 +100,9 @@ public class Cover implements Comparable<Cover>, Const {
 
   /**
    * Constructor for local covers.
-   * 
-   * @param type DOCUMENT_ME
-   * @param localFile DOCUMENT_ME
-   * 
+   *
+   * @param localFile 
+   * @param type 
    * @throws IOException Signals that an I/O exception has occurred.
    */
   public Cover(final File localFile, final CoverType type) throws IOException {
@@ -209,11 +188,10 @@ public class Cover implements Comparable<Cover>, Const {
 
   /**
    * Gets the image.
-   * 
+   *
    * @return Returns the image.
-   * 
-   * @throws InterruptedException the interrupted exception
    * @throws IOException Signals that an I/O exception has occurred.
+   * @throws InterruptedException the interrupted exception
    * @throws JajukException the jajuk exception
    */
   public Image getImage() throws IOException, InterruptedException, JajukException {
@@ -231,6 +209,7 @@ public class Cover implements Comparable<Cover>, Const {
       MediaTracker tracker = new MediaTracker(JajukMainWindow.getInstance());
       tracker.addImage(image, 1);
       tracker.waitForAll();
+      tracker.removeImage(image);
       // If image cannot be correctly loaded, throw an exception
       if (tracker.getErrorsAny() != null && tracker.getErrorsAny().length > 0) {
         throw new JajukException(9, getFile().getAbsolutePath());
@@ -247,13 +226,13 @@ public class Cover implements Comparable<Cover>, Const {
    */
   @Override
   public String toString() {
-    return "Type=" + type + " URL=" + url;
+    return "Type=" + type + " URL={{" + url + "}}";
   }
 
   /**
    * Equals needed for consistency for sorting.
    * 
-   * @param o DOCUMENT_ME
+   * @param o 
    * 
    * @return true, if equals
    */
@@ -263,12 +242,9 @@ public class Cover implements Comparable<Cover>, Const {
     if (!(o instanceof Cover)) {
       return false;
     }
-
     // we have an item of type Cover, so we can cast it safely
     Cover cOther = (Cover) o;
-
     return url.toString().equals(cOther.getURL().toString());
-
   }
 
   /**
@@ -294,5 +270,4 @@ public class Cover implements Comparable<Cover>, Const {
   public File getFile() {
     return this.file;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/covers/package.html b/src/main/java/org/jajuk/services/covers/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/covers/package.html
+++ b/src/main/java/org/jajuk/services/covers/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/dbus/DBusManager.java b/src/main/java/org/jajuk/services/dbus/DBusManager.java
index ae88166..a90c81c 100644
--- a/src/main/java/org/jajuk/services/dbus/DBusManager.java
+++ b/src/main/java/org/jajuk/services/dbus/DBusManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dbus;
 
@@ -24,7 +24,6 @@ package org.jajuk.services.dbus;
  * Base class to connect/disconnect to the session wide DBus daemon.
  */
 public final class DBusManager {
-
   /** Support for D-Bus remote control of Jajuk. */
   private static DBusSupportImpl dbus;
 
@@ -43,8 +42,7 @@ public final class DBusManager {
     try {
       if (dbus == null) {
         dbus = new DBusSupportImpl();
-
-        // the connect method will internally catch errors and report them to the
+        // The connect method will internally catch errors and report them to the
         // logfile
         dbus.connect();
       }
@@ -62,7 +60,6 @@ public final class DBusManager {
   public static void disconnect() {
     if (dbus != null) {
       dbus.disconnect();
-
       // reset to let initialize work correctly in all cases
       dbus = null;
     }
diff --git a/src/main/java/org/jajuk/services/dbus/DBusSignalImpl.java b/src/main/java/org/jajuk/services/dbus/DBusSignalImpl.java
index 360d2b3..c7a1e2a 100644
--- a/src/main/java/org/jajuk/services/dbus/DBusSignalImpl.java
+++ b/src/main/java/org/jajuk/services/dbus/DBusSignalImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dbus;
 
@@ -25,24 +25,21 @@ import org.freedesktop.dbus.DBusSignal;
 import org.freedesktop.dbus.exceptions.DBusException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class DBusSignalImpl implements DBusInterface {
-
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public static class FileChangedSignal extends DBusSignal {
-
-    /** DOCUMENT_ME. */
     String filename;
 
     /**
      * The Constructor.
      *
-     * @param filename DOCUMENT_ME
-     * @param path DOCUMENT_ME
-     * @param args DOCUMENT_ME
+     * @param filename 
+     * @param path 
+     * @param args 
      * @throws DBusException the d bus exception
      */
     public FileChangedSignal(String filename, String path, Object... args) throws DBusException {
@@ -58,7 +55,6 @@ public class DBusSignalImpl implements DBusInterface {
     public String getFilename() {
       return this.filename;
     }
-
   }
 
   /*
@@ -70,5 +66,4 @@ public class DBusSignalImpl implements DBusInterface {
   public boolean isRemote() {
     return false;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/dbus/DBusSupport.java b/src/main/java/org/jajuk/services/dbus/DBusSupport.java
index 83ae232..65365ea 100644
--- a/src/main/java/org/jajuk/services/dbus/DBusSupport.java
+++ b/src/main/java/org/jajuk/services/dbus/DBusSupport.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dbus;
 
@@ -33,10 +33,9 @@ import org.freedesktop.dbus.DBusInterface;
  */
 @org.freedesktop.DBus.Description("Methods to remotely control Jajuk including play/pause/next/prev track and some other useful actions.")
 public interface DBusSupport extends DBusInterface {
-
   /**
    * Previous.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -45,7 +44,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Next.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -54,7 +53,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Rewind.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -63,7 +62,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Play pause.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -72,7 +71,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Stop.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -81,7 +80,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Forward.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -90,7 +89,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Exit.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -99,7 +98,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Shuffle global.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -108,7 +107,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Previous album.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -117,7 +116,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Next album.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -126,7 +125,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Increase volume.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -135,7 +134,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Decrease volume.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -144,7 +143,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Mute.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -153,7 +152,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Current html.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the string
    * 
@@ -164,7 +163,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Current.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the string
    * 
@@ -175,7 +174,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Ban current.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -184,7 +183,7 @@ public interface DBusSupport extends DBusInterface {
 
   /**
    * Show currently playing.
-   * DOCUMENT_ME
+   * 
    * 
    * @throws Exception the exception
    */
@@ -198,7 +197,6 @@ public interface DBusSupport extends DBusInterface {
    */
   @org.freedesktop.DBus.Description("Adds the currently playing track to the list of bookmarks/favourites. Does nothing, if there is no file currently playing.")
   void bookmarkCurrentlyPlaying() throws Exception;
-
   /*
   * Actions that are not supported (yet): REPEAT_MODE, SHUFFLE_MODE,
   * CONTINUE_MODE, INTRO_MODE, DEVICE_NEW, DEVICE_DELETE, DEVICE_PROPERTIES,
diff --git a/src/main/java/org/jajuk/services/dbus/DBusSupportImpl.java b/src/main/java/org/jajuk/services/dbus/DBusSupportImpl.java
index 6fc751c..692e9e4 100644
--- a/src/main/java/org/jajuk/services/dbus/DBusSupportImpl.java
+++ b/src/main/java/org/jajuk/services/dbus/DBusSupportImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dbus;
 
@@ -62,17 +62,13 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class DBusSupportImpl implements DBusSupport, Observer {
-
   /** The D-Bus Path that is used. */
   private static final String PATH = "/JajukDBus";
-
   /** The D-Bus name of the Bus that we request. */
   private static final String BUS = "org.jajuk.dbus.DBusSupport";
-
-  /** DOCUMENT_ME. */
   DBusConnection conn;
 
   /**
@@ -85,18 +81,14 @@ public class DBusSupportImpl implements DBusSupport, Observer {
    */
   void connect() {
     Log.info("Trying to start support for D-Bus on Linux with Bus: " + BUS + " and Path: " + PATH);
-
     try {
       conn = DBusConnection.getConnection(DBusConnection.SESSION);
       conn.requestBusName(BUS);
-
       conn.exportObject(PATH, this);
-
       Log.info("D-Bus support started successfully");
     } catch (DBusException e) {
       Log.error(e);
     }
-
     // register to player events
     ObservationManager.register(this);
   }
@@ -108,9 +100,7 @@ public class DBusSupportImpl implements DBusSupport, Observer {
    */
   void disconnect() {
     Log.info("Disconnecting from D-Bus");
-
     ObservationManager.unregister(this);
-
     if (conn != null) {
       conn.disconnect();
     }
@@ -122,7 +112,6 @@ public class DBusSupportImpl implements DBusSupport, Observer {
    * These methods are invoked via D-Bus and trigger the corresponding action in
    * Jajuk
    */
-
   /*
    * (non-Javadoc)
    * 
@@ -285,7 +274,6 @@ public class DBusSupportImpl implements DBusSupport, Observer {
   @Override
   public String current() throws Exception {
     Log.info("Invoking D-Bus action for 'current'");
-
     String title = null;
     File file = QueueModel.getPlayingFile();
     if (QueueModel.isPlayingRadio()) {
@@ -338,15 +326,12 @@ public class DBusSupportImpl implements DBusSupport, Observer {
       // the action expects a JComponent, which we do not have here, therefore we do it directly here
       // ActionManager.getAction(JajukActions.BOOKMARK_SELECTION).perform()
       Bookmarks.getInstance().addFile(file);
-
       INotificator notifier = NotificatorFactory.getNotificator();
       if (notifier != null) {
         String pattern = Conf.getString(Const.CONF_PATTERN_BALLOON_NOTIFIER);
         String text = UtilString.applyPattern(file, pattern, false, false);
-
         notifier.notify("Bookmarked", text);
       }
-
     }
   }
 
@@ -387,9 +372,7 @@ public class DBusSupportImpl implements DBusSupport, Observer {
     if (subject.equals(JajukEvents.FILE_LAUNCHED)) {
       String id = (String) ObservationManager.getDetail(event, Const.DETAIL_CURRENT_FILE_ID);
       Item item = FileManager.getInstance().getItemByID(id);
-
       Log.debug("Got update for new file launched, item: " + item);
-
       try {
         if (conn == null) {
           Log.warn("Cannot send DBus-Signal when not connected to D-Bus!");
@@ -399,10 +382,8 @@ public class DBusSupportImpl implements DBusSupport, Observer {
       } catch (DBusException e) {
         Log.error(e);
       }
-
     } else {
       Log.warn("Unexpected subject received in Observer: " + event);
     }
-
   }
 }
diff --git a/src/main/java/org/jajuk/services/dbus/package.html b/src/main/java/org/jajuk/services/dbus/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/dbus/package.html
+++ b/src/main/java/org/jajuk/services/dbus/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/dj/Ambience.java b/src/main/java/org/jajuk/services/dj/Ambience.java
index 59b7db9..26b461d 100644
--- a/src/main/java/org/jajuk/services/dj/Ambience.java
+++ b/src/main/java/org/jajuk/services/dj/Ambience.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.util.HashSet;
@@ -34,13 +33,10 @@ import org.jajuk.base.GenreManager;
  * translated and can change with current locale
  */
 public class Ambience implements Comparable<Ambience> {
-
   /** List of genres. */
   private Set<Genre> genres;
-
   /** Ambience name. */
   private String sName;
-
   /** Ambience ID. */
   private final String sID;
 
@@ -80,7 +76,7 @@ public class Ambience implements Comparable<Ambience> {
   /**
    * Constructor.
    *
-   * @param sID DOCUMENT_ME
+   * @param sID 
    * @param sName Ambience name
    */
   public Ambience(String sID, String sName) {
@@ -98,9 +94,9 @@ public class Ambience implements Comparable<Ambience> {
 
   /**
    * Adds the genre.
-   * DOCUMENT_ME
    * 
-   * @param genre DOCUMENT_ME
+   * 
+   * @param genre 
    */
   public void addGenre(Genre genre) {
     if (genre != null) {
@@ -110,9 +106,9 @@ public class Ambience implements Comparable<Ambience> {
 
   /**
    * Removes the genre.
-   * DOCUMENT_ME
    * 
-   * @param genre DOCUMENT_ME
+   * 
+   * @param genre 
    */
   public void removeGenre(Genre genre) {
     genres.remove(genre);
@@ -173,12 +169,10 @@ public class Ambience implements Comparable<Ambience> {
     if (getGenres().size() == 0) {
       return "";
     }
-
     StringBuilder out = new StringBuilder();
     for (Genre s : getGenres()) {
       out.append(s.getName2()).append(',');
     }
-
     return out.substring(0, out.length() - 1); // remove trailling ,
   }
 
@@ -195,7 +189,7 @@ public class Ambience implements Comparable<Ambience> {
   /**
    * Equals method.
    * 
-   * @param o DOCUMENT_ME
+   * @param o 
    * 
    * @return true if ambience have the same same and contains the same genres
    */
@@ -227,7 +221,7 @@ public class Ambience implements Comparable<Ambience> {
   /**
    * Compare to method : alphabetical.
    * 
-   * @param ambience DOCUMENT_ME
+   * @param ambience 
    * 
    * @return the int
    */
@@ -237,7 +231,6 @@ public class Ambience implements Comparable<Ambience> {
     if (ambience == null) {
       return -1;
     }
-
     // otherwise just compare on the name
     return this.getName().compareToIgnoreCase(ambience.getName());
   }
@@ -252,12 +245,10 @@ public class Ambience implements Comparable<Ambience> {
     if (getGenres().size() == 0) {
       return "";
     }
-
     StringBuilder s = new StringBuilder();
     for (Genre genre : getGenres()) {
       s.append(genre.getID()).append(',');
     }
-
     return s.substring(0, s.length() - 1); // remove last coma
   }
 }
diff --git a/src/main/java/org/jajuk/services/dj/AmbienceDigitalDJ.java b/src/main/java/org/jajuk/services/dj/AmbienceDigitalDJ.java
index 8f9d057..2c137c0 100644
--- a/src/main/java/org/jajuk/services/dj/AmbienceDigitalDJ.java
+++ b/src/main/java/org/jajuk/services/dj/AmbienceDigitalDJ.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.util.ArrayList;
@@ -33,14 +32,13 @@ import org.jajuk.util.Messages;
  * Ambience DJ.
  */
 public class AmbienceDigitalDJ extends DigitalDJ {
-
   /** Used ambience. */
   private Ambience ambience;
 
   /**
    * The Constructor.
    * 
-   * @param sID DOCUMENT_ME
+   * @param sID 
    */
   public AmbienceDigitalDJ(String sID) {
     super(sID);
@@ -83,10 +81,8 @@ public class AmbienceDigitalDJ extends DigitalDJ {
     }
     // Select by rate if needed
     filterFilesByRate(out);
-
     // finally ensure that we don't select more than the max number of tracks
     filterFilesByMaxTrack(out);
-
     return out;
   }
 
@@ -124,5 +120,4 @@ public class AmbienceDigitalDJ extends DigitalDJ {
   public void setAmbience(Ambience ambience) {
     this.ambience = ambience;
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/dj/AmbienceManager.java b/src/main/java/org/jajuk/services/dj/AmbienceManager.java
index 63ad9c1..9b1e088 100644
--- a/src/main/java/org/jajuk/services/dj/AmbienceManager.java
+++ b/src/main/java/org/jajuk/services/dj/AmbienceManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.util.ArrayList;
@@ -49,10 +48,8 @@ import org.jajuk.util.log.Log;
  * Ambience manager.
  */
 public final class AmbienceManager implements Observer {
-
   /** Ambience id-> ambience. */
   private final Map<String, Ambience> ambiences = new HashMap<String, Ambience>(10);
-
   /** Self instance. */
   private static AmbienceManager self = new AmbienceManager();
 
@@ -68,6 +65,7 @@ public final class AmbienceManager implements Observer {
    * 
    * @see org.jajuk.events.Observer#getRegistrationKeys()
    */
+  @Override
   public Set<JajukEvents> getRegistrationKeys() {
     Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
     eventSubjectSet.add(JajukEvents.GENRE_NAME_CHANGED);
@@ -187,6 +185,7 @@ public final class AmbienceManager implements Observer {
    * 
    * @see org.jajuk.ui.Observer#update(java.lang.String)
    */
+  @Override
   public void update(JajukEvent event) {
     JajukEvents subject = event.getSubject();
     if (JajukEvents.GENRE_NAME_CHANGED.equals(subject)) {
@@ -306,5 +305,4 @@ public final class AmbienceManager implements Observer {
     AmbienceManager.getInstance().registerAmbience(
         new Ambience("13", Messages.getString("Ambience.13"), genresLatin));
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/dj/DigitalDJ.java b/src/main/java/org/jajuk/services/dj/DigitalDJ.java
index 9b671f2..5c16b01 100644
--- a/src/main/java/org/jajuk/services/dj/DigitalDJ.java
+++ b/src/main/java/org/jajuk/services/dj/DigitalDJ.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.util.HashSet;
@@ -35,23 +34,16 @@ import org.jajuk.util.Const;
  * Digital DJ.
  */
 public abstract class DigitalDJ implements Comparable<DigitalDJ> {
-
   /** DJ unique ID. */
   private final String sID;
-
   /** DJ name. */
   protected String sName;
-
   /** Rating floor. */
   protected int iRatingLevel = 0;
-
   /** Fading duration in sec. */
   protected int iFadingDuration = 0;
-
   /** Track unicity. */
   protected boolean bUnicity = false;
-
-  /** DOCUMENT_ME. */
   private int iMaxTracks = -1;
 
   /**
@@ -76,7 +68,7 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
   /**
    * Compare to method, sorted alphaticaly.
    * 
-   * @param other DOCUMENT_ME
+   * @param other 
    * 
    * @return the int
    */
@@ -86,7 +78,6 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
     if (other == null) {
       return -1;
     }
-
     return this.sName.compareTo(other.getName());
   }
 
@@ -119,7 +110,7 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
   /**
    * Filter by rate and remove duplicates (unicity).
    * 
-   * @param files DOCUMENT_ME
+   * @param files 
    */
   void filterFilesByRate(List<File> files) {
     // this set stores already used tracks
@@ -141,9 +132,9 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
 
   /**
    * Filter files by max track.
-   * DOCUMENT_ME
    * 
-   * @param files DOCUMENT_ME
+   * 
+   * @param files 
    */
   void filterFilesByMaxTrack(List<File> files) {
     // cut off some tracks if less are selected for queuing
@@ -152,7 +143,6 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
       if (iMaxTracks > files.size()) {
         return;
       }
-
       // remove until we have less than max tracks
       while (files.size() > iMaxTracks) {
         files.remove(files.size() - 1);
@@ -172,7 +162,7 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
   /**
    * equals method.
    * 
-   * @param other DOCUMENT_ME
+   * @param other 
    * 
    * @return whether two object are equals
    */
@@ -197,7 +187,7 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
   /**
    * Sets the name.
    * 
-   * @param name DOCUMENT_ME
+   * @param name 
    */
   public void setName(String name) {
     this.sName = name;
@@ -215,7 +205,7 @@ public abstract class DigitalDJ implements Comparable<DigitalDJ> {
   /**
    * Sets the fading duration.
    * 
-   * @param fadingDuration DOCUMENT_ME
+   * @param fadingDuration 
    */
   public void setFadingDuration(int fadingDuration) {
     this.iFadingDuration = fadingDuration;
diff --git a/src/main/java/org/jajuk/services/dj/DigitalDJManager.java b/src/main/java/org/jajuk/services/dj/DigitalDJManager.java
index 7b47fc8..17d57ef 100644
--- a/src/main/java/org/jajuk/services/dj/DigitalDJManager.java
+++ b/src/main/java/org/jajuk/services/dj/DigitalDJManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.io.BufferedWriter;
@@ -66,13 +65,10 @@ import org.xml.sax.helpers.DefaultHandler;
  * </p>.
  */
 public final class DigitalDJManager implements Observer {
-
   /** List of registrated DJs ID->DJ. */
   private final Map<String, DigitalDJ> djs;
-
   /** self instance. */
   private static DigitalDJManager dj = new DigitalDJManager();
-
   /** Currently selected DJ. */
   private static DigitalDJ current;
 
@@ -141,7 +137,7 @@ public final class DigitalDJManager implements Observer {
   /**
    * Gets the dj by name.
    * 
-   * @param sName DOCUMENT_ME
+   * @param sName 
    * 
    * @return DJ by name
    */
@@ -157,7 +153,7 @@ public final class DigitalDJManager implements Observer {
   /**
    * Gets the dj by id.
    * 
-   * @param sID DOCUMENT_ME
+   * @param sID 
    * 
    * @return DJ by ID
    */
@@ -168,7 +164,7 @@ public final class DigitalDJManager implements Observer {
   /**
    * Commit given dj on disk.
    * 
-   * @param dj DOCUMENT_ME
+   * @param dj 
    */
   public static void commit(DigitalDJ dj) {
     try {
@@ -186,7 +182,7 @@ public final class DigitalDJManager implements Observer {
   /**
    * Remove a DJ.
    * 
-   * @param dj DOCUMENT_ME
+   * @param dj 
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    */
@@ -206,7 +202,7 @@ public final class DigitalDJManager implements Observer {
   /**
    * Register a DJ.
    * 
-   * @param dj DOCUMENT_ME
+   * @param dj 
    */
   public void register(DigitalDJ dj) {
     djs.put(dj.getID(), dj);
@@ -260,7 +256,6 @@ public final class DigitalDJManager implements Observer {
               return false;
             }
           });
-
       // read each of the files
       for (File element : files) {
         try { // try each DJ to continue others if one fails
@@ -296,43 +291,32 @@ public final class DigitalDJManager implements Observer {
   public static void setCurrentDJ(DigitalDJ dj) {
     current = dj;
   }
-
 }
 
 /**
  * This class is responsible for creating different factories
  */
 abstract class DigitalDJFactory extends DefaultHandler {
-
   /** Factory type (class name) */
   private static String factoryType;
-
   /** DJ type (class name) */
   protected String type;
-
   /** DJ name */
   protected String name;
-
   /** DJ ID */
   protected String id;
-
   /** DJ Fade duration */
   protected int fadeDuration;
-
   /** Rating level */
   protected int iRatingLevel;
-
   /** Startup genre */
   protected Genre startupGenre;
-
   /** Track unicity */
   protected boolean bTrackUnicity = false;
-
   protected int maxTracks;
 
   /** General parameters handlers */
   abstract class GeneralDefaultHandler extends DefaultHandler {
-
     /**
      * Called when we start an element
      * 
@@ -351,7 +335,6 @@ abstract class DigitalDJFactory extends DefaultHandler {
             .getIndex(Const.XML_DJ_RATING_LEVEL)));
         fadeDuration = Integer.parseInt(attributes.getValue(attributes
             .getIndex(Const.XML_DJ_FADE_DURATION)));
-
         // keep older DJs without this attribute usable
         if (attributes.getValue(attributes.getIndex(Const.XML_DJ_MAX_TRACKS)) != null) {
           maxTracks = Integer.parseInt(attributes.getValue(attributes
@@ -433,7 +416,6 @@ abstract class DigitalDJFactory extends DefaultHandler {
    *          DJ file
    */
   abstract DigitalDJ getDJ(File file) throws Exception;
-
 }
 
 /**
@@ -441,26 +423,22 @@ abstract class DigitalDJFactory extends DefaultHandler {
  * 
  */
 class DigitalDJFactoryProportionImpl extends DigitalDJFactory {
-
   /** Intermediate genres variable used during parsing */
   private String genres;
-
   /** Intermediate proportion variable used during parsing */
   private float proportion;
-
   private final List<Proportion> proportions = new ArrayList<Proportion>(5);
 
   @Override
   DigitalDJ getDJ(File file) throws Exception {
     // Parse XML file to populate the DJ
     DefaultHandler handler = new GeneralDefaultHandler() {
-
       @Override
       protected void othersTags(String sQname, Attributes attributes) {
         if (Const.XML_DJ_PROPORTION.equals(sQname)) {
           genres = attributes.getValue(attributes.getIndex(Const.XML_DJ_GENRES));
-          proportion = Float.parseFloat(attributes
-              .getValue(attributes.getIndex(Const.XML_DJ_VALUE)));
+          proportion = Float
+              .parseFloat(attributes.getValue(attributes.getIndex(Const.XML_DJ_VALUE)));
           StringTokenizer st = new StringTokenizer(genres, ",");
           Ambience ambience = new Ambience(Long.toString(System.currentTimeMillis()), "");
           while (st.hasMoreTokens()) {
@@ -468,7 +446,6 @@ class DigitalDJFactoryProportionImpl extends DigitalDJFactory {
           }
           proportions.add(new Proportion(ambience, proportion));
         }
-
       }
     };
     SAXParserFactory spf = SAXParserFactory.newInstance();
@@ -490,7 +467,6 @@ class DigitalDJFactoryProportionImpl extends DigitalDJFactory {
  * Ambience dj factory
  */
 class DigitalDJFactoryAmbienceImpl extends DigitalDJFactory {
-
   private Ambience ambience;
 
   @Override
@@ -525,7 +501,6 @@ class DigitalDJFactoryAmbienceImpl extends DigitalDJFactory {
  * 
  */
 class DigitalDJFactoryTransitionImpl extends DigitalDJFactory {
-
   /** Intermediate transition list */
   private final List<Transition> transitions = new ArrayList<Transition>(10);
 
@@ -557,7 +532,6 @@ class DigitalDJFactoryTransitionImpl extends DigitalDJFactory {
     SAXParserFactory spf = SAXParserFactory.newInstance();
     SAXParser saxParser = spf.newSAXParser();
     saxParser.parse(file, handler);
-
     TransitionDigitalDJ dj = new TransitionDigitalDJ(id);
     setGeneralProperties(dj);
     dj.setTransitions(transitions);
diff --git a/src/main/java/org/jajuk/services/dj/Proportion.java b/src/main/java/org/jajuk/services/dj/Proportion.java
index a1c06a5..e36cecf 100644
--- a/src/main/java/org/jajuk/services/dj/Proportion.java
+++ b/src/main/java/org/jajuk/services/dj/Proportion.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.util.Set;
@@ -29,17 +28,15 @@ import org.jajuk.base.Genre;
  * Represent a genre proportion (used by digital DJs).
  */
 public class Proportion {
-
   /** genres. */
   private Ambience ambience;
-
   /** Proportion*. */
   private float proportion;
 
   /**
    * Constructor.
    *
-   * @param ambience DOCUMENT_ME
+   * @param ambience 
    * @param proportion genre proportion in %. Ex: 0.1
    */
   public Proportion(Ambience ambience, float proportion) {
@@ -58,7 +55,7 @@ public class Proportion {
   /**
    * equals method.
    * 
-   * @param other DOCUMENT_ME
+   * @param other 
    * 
    * @return whether two object are equals
    */
@@ -94,7 +91,7 @@ public class Proportion {
   /**
    * Add a genre.
    * 
-   * @param genre DOCUMENT_ME
+   * @param genre 
    */
   public void addGenre(Genre genre) {
     ambience.addGenre(genre);
diff --git a/src/main/java/org/jajuk/services/dj/ProportionDigitalDJ.java b/src/main/java/org/jajuk/services/dj/ProportionDigitalDJ.java
index f294f1f..4739160 100644
--- a/src/main/java/org/jajuk/services/dj/ProportionDigitalDJ.java
+++ b/src/main/java/org/jajuk/services/dj/ProportionDigitalDJ.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.util.ArrayList;
@@ -38,14 +37,13 @@ import org.jajuk.util.UtilSystem;
  * A proportion (10% JAZZ, 20% ROCK...) digital DJ
  */
 public class ProportionDigitalDJ extends DigitalDJ {
-
   /** Set of proportions. */
   private List<Proportion> proportions;
 
   /**
    * The Constructor.
    * 
-   * @param sID DOCUMENT_ME
+   * @param sID 
    */
   public ProportionDigitalDJ(String sID) {
     super(sID);
@@ -124,10 +122,8 @@ public class ProportionDigitalDJ extends DigitalDJ {
     }
     // shuffle selection
     Collections.shuffle(out, UtilSystem.getRandom());
-
     // finally ensure that we don't select more than the max number of tracks
     filterFilesByMaxTrack(out);
-
     return out;
   }
 
diff --git a/src/main/java/org/jajuk/services/dj/Transition.java b/src/main/java/org/jajuk/services/dj/Transition.java
index 1916492..ab89197 100644
--- a/src/main/java/org/jajuk/services/dj/Transition.java
+++ b/src/main/java/org/jajuk/services/dj/Transition.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import org.jajuk.base.Genre;
@@ -28,13 +27,10 @@ import org.jajuk.util.UtilFeatures;
  * Represents a transition from one genre to another (used by digital DJs).
  */
 public class Transition {
-
   /** From genres. */
   private Ambience from;
-
   /** To genres. */
   private Ambience to;
-
   /** Nb of tracks. */
   private int nb;
 
@@ -65,7 +61,7 @@ public class Transition {
   /**
    * equals method.
    * 
-   * @param other DOCUMENT_ME
+   * @param other 
    * 
    * @return whether two object are equals
    */
@@ -150,9 +146,9 @@ public class Transition {
 
   /**
    * Adds the from genre.
-   * DOCUMENT_ME
    * 
-   * @param genre DOCUMENT_ME
+   * 
+   * @param genre 
    */
   public void addFromGenre(Genre genre) {
     from.addGenre(genre);
@@ -161,7 +157,7 @@ public class Transition {
   /**
    * Removes the from genre.
    * 
-   * @param genre DOCUMENT_ME
+   * @param genre 
    */
   public void removeFromGenre(Genre genre) {
     from.removeGenre(genre);
@@ -169,9 +165,9 @@ public class Transition {
 
   /**
    * Adds the to genre.
-   * DOCUMENT_ME
    * 
-   * @param genre DOCUMENT_ME
+   * 
+   * @param genre 
    */
   public void addToGenre(Genre genre) {
     to.addGenre(genre);
@@ -180,7 +176,7 @@ public class Transition {
   /**
    * Removes the to genre.
    * 
-   * @param genre DOCUMENT_ME
+   * @param genre 
    */
   public void removeToGenre(Genre genre) {
     to.removeGenre(genre);
diff --git a/src/main/java/org/jajuk/services/dj/TransitionDigitalDJ.java b/src/main/java/org/jajuk/services/dj/TransitionDigitalDJ.java
index eb0065c..8bce108 100644
--- a/src/main/java/org/jajuk/services/dj/TransitionDigitalDJ.java
+++ b/src/main/java/org/jajuk/services/dj/TransitionDigitalDJ.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.dj;
 
 import java.util.ArrayList;
@@ -40,14 +39,13 @@ import org.jajuk.util.filters.JajukPredicates;
  * Type description.
  */
 public class TransitionDigitalDJ extends DigitalDJ {
-
   /** List of transitions, need to be a list, not a set for offset. */
   private List<Transition> transitions;
 
   /**
    * The Constructor.
    * 
-   * @param sID DOCUMENT_ME
+   * @param sID 
    */
   public TransitionDigitalDJ(String sID) {
     super(sID);
@@ -66,7 +64,7 @@ public class TransitionDigitalDJ extends DigitalDJ {
   /**
    * Delete a transition at given offset.
    * 
-   * @param offset DOCUMENT_ME
+   * @param offset 
    */
   public void deleteTransition(int offset) {
     this.transitions.remove(offset);
@@ -75,8 +73,8 @@ public class TransitionDigitalDJ extends DigitalDJ {
   /**
    * Add a transition.
    * 
-   * @param transition DOCUMENT_ME
-   * @param offset DOCUMENT_ME
+   * @param transition 
+   * @param offset 
    */
   public void addTransition(Transition transition, int offset) {
     this.transitions.add(offset, transition);
@@ -85,7 +83,7 @@ public class TransitionDigitalDJ extends DigitalDJ {
   /**
    * Gets the transition.
    * 
-   * @param ambience DOCUMENT_ME
+   * @param ambience 
    * 
    * @return transition mapping this FROM ambience or null if none maps it
    */
@@ -107,7 +105,6 @@ public class TransitionDigitalDJ extends DigitalDJ {
   @Override
   public List<File> generatePlaylist() {
     List<File> out = new ArrayList<File>(500);
-
     // get a global shuffle selection
     List<File> global = FileManager.getInstance().getGlobalShufflePlaylist();
     // Select by rate if needed
@@ -125,7 +122,6 @@ public class TransitionDigitalDJ extends DigitalDJ {
       // several times the same files
       items = Const.MIN_TRACKS_NUMBER_WITHOUT_UNICITY;
     }
-
     // Get first track
     for (File file : global) {
       if (transitions.get(0).getFrom().getGenres().contains(file.getTrack().getGenre())) {
@@ -143,7 +139,6 @@ public class TransitionDigitalDJ extends DigitalDJ {
     if (out.size() == 0) {
       return out;
     }
-
     // initialize current ambience with first track ambience (can be null for
     // unsorted tracks)
     Ambience currentAmbience = getAmbience(out.get(0).getTrack().getGenre());
@@ -173,7 +168,6 @@ public class TransitionDigitalDJ extends DigitalDJ {
       } else { // no more tracks for this ambience ? leave
         // finally ensure that we don't select more than the max number of tracks
         filterFilesByMaxTrack(out);
-
         return out;
       }
       if (currentTransition != null) {
@@ -182,10 +176,8 @@ public class TransitionDigitalDJ extends DigitalDJ {
         break;
       }
     }
-
     // finally ensure that we don't select more than the max number of tracks
     filterFilesByMaxTrack(out);
-
     return out;
   }
 
@@ -220,7 +212,7 @@ public class TransitionDigitalDJ extends DigitalDJ {
   /**
    * Gets the ambience.
    * 
-   * @param genre DOCUMENT_ME
+   * @param genre 
    * 
    * @return ambience associated with a genre known in transitions or null if
    * none
@@ -265,5 +257,4 @@ public class TransitionDigitalDJ extends DigitalDJ {
   public void setTransitions(List<Transition> transitions) {
     this.transitions = transitions;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/dj/package.html b/src/main/java/org/jajuk/services/dj/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/dj/package.html
+++ b/src/main/java/org/jajuk/services/dj/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/lastfm/LastFmManager.java b/src/main/java/org/jajuk/services/lastfm/LastFmManager.java
index 24f876b..561f2d4 100644
--- a/src/main/java/org/jajuk/services/lastfm/LastFmManager.java
+++ b/src/main/java/org/jajuk/services/lastfm/LastFmManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.lastfm;
 
 import ext.services.lastfm.LastFmService;
@@ -34,8 +33,6 @@ import org.jajuk.events.ObservationManager;
 import org.jajuk.events.Observer;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
-import org.jajuk.util.DownloadManager;
-import org.jajuk.util.UtilString;
 import org.jajuk.util.log.Log;
 
 /**
@@ -46,10 +43,8 @@ import org.jajuk.util.log.Log;
  * </p>
  */
 public final class LastFmManager implements Observer, Const {
-
   /** Self instance. */
   private static LastFmManager self = new LastFmManager();
-
   /** Lastfm service. */
   private LastFmService service;
 
@@ -59,10 +54,8 @@ public final class LastFmManager implements Observer, Const {
   private LastFmManager() {
     // Register on the list for subject we are interested in
     ObservationManager.register(this);
-
     // Create the service
     service = LastFmService.getInstance();
-
   }
 
   /**
@@ -96,10 +89,15 @@ public final class LastFmManager implements Observer, Const {
     if (Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE)
         && JajukEvents.FILE_FINISHED == event.getSubject()
         && !Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS)) {
+      final File file = (File) event.getDetails().get(Const.DETAIL_CURRENT_FILE);
+      if (!file.getTrack().getBooleanValue(XML_TRACK_SCROBBLE)) {
+        Log.debug("Track scrobble property unset, not submitted to last.fm : "
+            + file.getTrack().getID());
+        return;
+      }
       new Thread("LastFM Update Thread") {
         @Override
         public void run() {
-          File file = (File) event.getDetails().get(Const.DETAIL_CURRENT_FILE);
           long playedTime = (Long) event.getDetails().get(Const.DETAIL_CONTENT);
           // Last.FM rule : only submit >= 30secs playbacks
           if (playedTime >= 30000) {
@@ -129,5 +127,4 @@ public final class LastFmManager implements Observer, Const {
       Log.error(e);
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/lastfm/package.html b/src/main/java/org/jajuk/services/lastfm/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/lastfm/package.html
+++ b/src/main/java/org/jajuk/services/lastfm/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/lyrics/LyricsService.java b/src/main/java/org/jajuk/services/lyrics/LyricsService.java
index d2654b2..8c1633e 100644
--- a/src/main/java/org/jajuk/services/lyrics/LyricsService.java
+++ b/src/main/java/org/jajuk/services/lyrics/LyricsService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.lyrics;
 
 import java.util.ArrayList;
@@ -44,22 +43,16 @@ import org.jajuk.util.log.Log;
  * user. For now the lyrics providers list is static and stored directly in this class.
  */
 public final class LyricsService {
-
-  /** DOCUMENT_ME. */
   private static List<ILyricsProvider> providers = null;
-
-  /** DOCUMENT_ME. */
   private static ILyricsProvider current = null;
-
-  /** DOCUMENT_ME. */
   private static List<ILyricsPersister> persisters = null;
-
   /** Providers list. */
   private static String[] providersClasses = new String[] {
-      "org.jajuk.services.lyrics.providers.TagLyricsProvider",
-      "org.jajuk.services.lyrics.providers.TxtLyricsProvider",
-      "org.jajuk.services.lyrics.providers.LyricWikiWebLyricsProvider", };
-
+    "org.jajuk.services.lyrics.providers.TagLyricsProvider",
+    "org.jajuk.services.lyrics.providers.TxtLyricsProvider",
+    "org.jajuk.services.lyrics.providers.AzLyricsWebLyricsProvider",
+    "org.jajuk.services.lyrics.providers.LyricsManiaWebLyricsProvider",
+    "org.jajuk.services.lyrics.providers.LyricsWikiaWebLyricsProvider", };
   /** Persisters list. */
   private static String[] persisterClasses = new String[] {
       "org.jajuk.services.lyrics.persisters.TagPersister",
@@ -69,7 +62,6 @@ public final class LyricsService {
    * Empty private constructor to avoid instantiating utility class.
    */
   private LyricsService() {
-
   }
 
   /**
@@ -99,7 +91,7 @@ public final class LyricsService {
 
   /**
    * Load persisters.
-   * DOCUMENT_ME
+   * 
    */
   @SuppressWarnings("unchecked")
   public static void loadPersisters() {
@@ -121,7 +113,7 @@ public final class LyricsService {
   /**
    * Cycles through lyrics providers to return the best matching lyrics.
    * 
-   * @param audioFile DOCUMENT_ME
+   * @param audioFile 
    * 
    * @return the song's lyrics
    */
@@ -178,7 +170,7 @@ public final class LyricsService {
   /**
    * Delete lyrics from any persister support.
    * 
-   * @param provider DOCUMENT_ME
+   * @param provider 
    * 
    * @throws LyricsPersistenceException if the lyrics cannot be removed
    */
@@ -202,7 +194,6 @@ public final class LyricsService {
       throw new LyricsPersistenceException("Lyrics could not be deleted from "
           + provider.getFile().getName());
     }
-
   }
 
   /**
@@ -237,5 +228,4 @@ public final class LyricsService {
     }
     return persisters;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/package.html b/src/main/java/org/jajuk/services/lyrics/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/lyrics/package.html
+++ b/src/main/java/org/jajuk/services/lyrics/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/lyrics/persisters/ILyricsPersister.java b/src/main/java/org/jajuk/services/lyrics/persisters/ILyricsPersister.java
index 1cb62a1..fbe0815 100644
--- a/src/main/java/org/jajuk/services/lyrics/persisters/ILyricsPersister.java
+++ b/src/main/java/org/jajuk/services/lyrics/persisters/ILyricsPersister.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.lyrics.persisters;
 
 import org.jajuk.base.File;
@@ -27,7 +26,6 @@ import org.jajuk.base.File;
  * Interface for lyrics persisters to be used by the modified LyricsService.
  */
 public interface ILyricsPersister {
-
   /**
    * Sets the audio file to set lyrics to.
    * 
@@ -39,8 +37,8 @@ public interface ILyricsPersister {
    * Commit lyrics for a given filename <br>
    * Returns true if commited correctly, false otherwise.
    *
-   * @param artist DOCUMENT_ME
-   * @param title DOCUMENT_ME
+   * @param artist 
+   * @param title 
    * @param lyrics lyrics as a string
    * @return true if OK, false otherwise
    */
@@ -61,5 +59,4 @@ public interface ILyricsPersister {
    * @return the destination file
    */
   java.io.File getDestinationFile();
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/persisters/TagPersister.java b/src/main/java/org/jajuk/services/lyrics/persisters/TagPersister.java
index e0a6e45..705e9ff 100644
--- a/src/main/java/org/jajuk/services/lyrics/persisters/TagPersister.java
+++ b/src/main/java/org/jajuk/services/lyrics/persisters/TagPersister.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.lyrics.persisters;
 
@@ -29,7 +29,6 @@ import org.jajuk.util.log.Log;
  * Class to read/write lyrics to Tag of Track.
  */
 public class TagPersister implements ILyricsPersister {
-
   /** Audio file to set lyrics to. */
   private File file = null;
 
@@ -43,8 +42,7 @@ public class TagPersister implements ILyricsPersister {
       g.setLyrics(lyrics);
       return true;
     } catch (JajukException e) {
-      Log.error(e);
-      Log.warn(e.getMessage());
+      Log.error(155, file.getFIO().getAbsolutePath(), e);
       return false;
     }
   }
@@ -80,5 +78,4 @@ public class TagPersister implements ILyricsPersister {
   public void setAudioFile(File file) {
     this.file = file;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/persisters/TxtPersister.java b/src/main/java/org/jajuk/services/lyrics/persisters/TxtPersister.java
index 7369c76..5f45bc5 100644
--- a/src/main/java/org/jajuk/services/lyrics/persisters/TxtPersister.java
+++ b/src/main/java/org/jajuk/services/lyrics/persisters/TxtPersister.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,10 +16,11 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.lyrics.persisters;
 
+import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
@@ -31,13 +32,6 @@ import org.jajuk.util.log.Log;
  * Class to read/write lyrics to TXT file.
  */
 public class TxtPersister implements ILyricsPersister {
-
-  /** DOCUMENT_ME. */
-  private java.io.File lyricsFile = null;
-
-  /** DOCUMENT_ME. */
-  private Writer lyricsWriter = null;
-
   /** Audio file to set lyrics to. */
   private org.jajuk.base.File file = null;
 
@@ -46,8 +40,10 @@ public class TxtPersister implements ILyricsPersister {
     */
   @Override
   public boolean commitLyrics(String artist, String title, String lyrics) {
+    File lyricsFile = getDestinationFile();
+    Writer lyricsWriter = null;
     try {
-      lyricsWriter = getLyricsWriter();
+      lyricsWriter = new FileWriter(lyricsFile);
       lyricsWriter.write("# This is a Jajuk generated lyrics file\n");
       lyricsWriter.write("# Artist:\t" + artist + "\n");
       lyricsWriter.write("# Title:\t" + title + "\n#");
@@ -66,8 +62,16 @@ public class TxtPersister implements ILyricsPersister {
       }
       lyricsFile = null;
       return false;
+    } finally {
+      if (lyricsWriter != null) {
+        try {
+          lyricsWriter.flush();
+          lyricsWriter.close();
+        } catch (IOException e) {
+          Log.error(e);
+        }
+      }
     }
-
   }
 
   /* (non-Javadoc)
@@ -75,9 +79,8 @@ public class TxtPersister implements ILyricsPersister {
    */
   @Override
   public boolean deleteLyrics() {
-    lyricsFile = getDestinationFile();
     try {
-      UtilSystem.deleteFile(lyricsFile);
+      UtilSystem.deleteFile(getDestinationFile());
       return true;
     } catch (IOException e) {
       Log.error(e);
@@ -92,25 +95,7 @@ public class TxtPersister implements ILyricsPersister {
    */
   @Override
   public java.io.File getDestinationFile() {
-    if (lyricsFile == null) {
-      lyricsFile = new java.io.File(UtilSystem.removeExtension(file.getAbsolutePath()) + ".txt");
-    }
-    return lyricsFile;
-  }
-
-  /**
-   * Gets the lyrics writer.
-   * 
-   * @return the lyrics writer
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
-   */
-  private Writer getLyricsWriter() throws IOException {
-    lyricsFile = getDestinationFile();
-    if (lyricsWriter == null) {
-      lyricsWriter = new FileWriter(lyricsFile);
-    }
-    return lyricsWriter;
+    return new java.io.File(UtilSystem.removeExtension(file.getAbsolutePath()) + ".txt");
   }
 
   /* (non-Javadoc)
@@ -120,5 +105,4 @@ public class TxtPersister implements ILyricsPersister {
   public void setAudioFile(org.jajuk.base.File file) {
     this.file = file;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/persisters/package.html b/src/main/java/org/jajuk/services/lyrics/persisters/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/lyrics/persisters/package.html
+++ b/src/main/java/org/jajuk/services/lyrics/persisters/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/AzLyricsWebLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/AzLyricsWebLyricsProvider.java
new file mode 100644
index 0000000..e001df2
--- /dev/null
+++ b/src/main/java/org/jajuk/services/lyrics/providers/AzLyricsWebLyricsProvider.java
@@ -0,0 +1,155 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.services.lyrics.providers;
+
+import ext.services.network.NetworkUtils;
+
+import java.net.MalformedURLException;
+
+import org.apache.commons.lang.StringUtils;
+import org.jajuk.util.Const;
+import org.jajuk.util.log.Log;
+
+/**
+ * Lyrics Provider extracting lyrics from azlyrics.com
+ */
+public class AzLyricsWebLyricsProvider extends GenericWebLyricsProvider {
+  /** URL pattern used by jajuk to retrieve lyrics. */
+  private static final String URL = "http://www.azlyrics.com/lyrics/%artist/%title.html";
+  /** URL pattern to web page (see ILyricsProvider interface for details). */
+  private static final String WEB_URL = "http://www.azlyrics.com/lyrics/%artist/%title.html";
+
+  /**
+   * Instantiates a new azlyrics web lyrics provider.
+   */
+  public AzLyricsWebLyricsProvider() {
+    super(URL);
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see ext.services.lyrics.providers.GenericProvider#getLyrics(java.lang.String,
+   * java.lang.String)
+   */
+  @Override
+  public String getLyrics(final String artist, final String title) {
+    try {
+      String lyrics = null;
+      if (StringUtils.isNotBlank(artist) && StringUtils.isNotBlank(title)) {
+        // Specific rule : lowercase, no space, remove "the " par ex for "The Beatles "
+        String formattedArtist = artist.toLowerCase().replace(" ", "").replaceFirst("the ", "").replace("/", "").replace("&","");
+        // Specific rule : lowercase, no space, no extra signs ()'-,
+        String formattedTitle = title.replace(" ", "");
+        formattedTitle = formattedTitle.replace("(", "");
+        formattedTitle = formattedTitle.replace(")", "");
+        formattedTitle = formattedTitle.replace("´", "");
+        formattedTitle = formattedTitle.replace("-", "");
+        formattedTitle = formattedTitle.replace(",", "");
+        formattedTitle = formattedTitle.replace("'", "").toLowerCase();
+        String html = callProvider(formattedArtist, formattedTitle);
+        if (StringUtils.isNotBlank(html)) {
+          // Remove html part
+          lyrics = cleanLyrics(html);
+        } else {
+          Log.debug("Empty return from callProvider().");
+        }
+      }
+      return lyrics;
+    } catch (Exception e) {
+      Log.debug("Cannot fetch lyrics for: {{" + artist + "/" + title + "}}");
+      return null;
+    }
+  }
+
+  /**
+   * Extracts lyrics from the HTML page. The correct subsection is to be
+   * extracted first, before being cleaned and stripped from useless HTML tags.
+   * 
+   * @param html 
+   * 
+   * @return the lyrics
+   */
+  private String cleanLyrics(final String html) {
+    String ret = null;
+    if (html != null) {
+      String searchStart = "Sorry about that. -->";
+      int startIndex = html.indexOf(searchStart);
+      if (startIndex > -1) {
+        ret = html.substring(startIndex + searchStart.length());
+        int stopIndex = ret.indexOf("</div>");
+        if (stopIndex > -1) {
+          ret = ret.substring(0, stopIndex);
+          ret += "\n<-- AZLyrics -->";
+          return cleanHtml(ret);
+        } else {
+          ret = null;
+        }
+      }
+    }
+    return ret;
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
+   */
+  @Override
+  public String getResponseEncoding() {
+    return "UTF-8";
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getWebURL(java.lang .String,
+   * java.lang.String)
+   */
+  @Override
+  public java.net.URL getWebURL(final String pArtist, final String pTitle) {
+    String queryString = WEB_URL;
+    // Replace spaces by _
+    String artist = pArtist.replaceAll(" ", "").toLowerCase();
+    String title = pTitle.replaceAll(" ", "").replace("(", "").replace(")", "").toLowerCase();
+    queryString = queryString.replace(Const.PATTERN_ARTIST,
+        (artist != null) ? NetworkUtils.encodeString(artist) : "");
+    queryString = queryString.replace(Const.PATTERN_TRACKNAME,
+        (title != null) ? NetworkUtils.encodeString(title) : "");
+    java.net.URL out = null;
+    try {
+      out = new java.net.URL(queryString);
+    } catch (MalformedURLException e) {
+      Log.error(e);
+    }
+    return out;
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
+   */
+  @Override
+  public String getLyrics() {
+    return getLyrics(audioFile.getTrack().getArtist().getName2(), audioFile.getTrack().getName());
+  }
+}
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/GenericWebLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/GenericWebLyricsProvider.java
index d48a5a6..86ee37b 100644
--- a/src/main/java/org/jajuk/services/lyrics/providers/GenericWebLyricsProvider.java
+++ b/src/main/java/org/jajuk/services/lyrics/providers/GenericWebLyricsProvider.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.lyrics.providers;
 
 import ext.services.network.NetworkUtils;
@@ -41,37 +40,28 @@ import org.jajuk.util.log.Log;
  * specific providers.
  */
 public abstract class GenericWebLyricsProvider implements ILyricsProvider {
-
-  /** DOCUMENT_ME. */
   private String source = null;
-
-  /** DOCUMENT_ME. */
   private String queryUrlTemplate = null;
-
   /** audio file we search lyrics for. */
   File audioFile = null;
 
   /**
    * Instantiates a new generic web lyrics provider.
    * 
-   * @param queryUrlTemplate DOCUMENT_ME
+   * @param queryUrlTemplate 
    */
   public GenericWebLyricsProvider(final String queryUrlTemplate) {
     this.queryUrlTemplate = queryUrlTemplate;
   }
 
-  /*
-   * Call the provider @artist non encoded artist @title non encoded title
-   * @return query return or null if query fails
-   */
   /**
-   * Call provider.
-   * DOCUMENT_ME
+   * Call the provider @artist non encoded artist @title non encoded title.
+   * 
    * 
-   * @param artist DOCUMENT_ME
-   * @param title DOCUMENT_ME
+   * @param artist 
+   * @param title 
    * 
-   * @return the string
+   * @return query return or null if query fails
    */
   public String callProvider(final String artist, final String title) {
     String text = null;
@@ -79,7 +69,8 @@ public abstract class GenericWebLyricsProvider implements ILyricsProvider {
       URL url = getActualURL(artist, title);
       text = DownloadManager.getTextFromCachedFile(url, getResponseEncoding());
     } catch (final Exception e) {
-      Log.warn("Could not retrieve URL {{" + getProviderHostname() + "}}", e.getMessage());
+      Log.warn("Could not retrieve URL {{" + getProviderHostname() + "}}", "{{" + e.getMessage()
+          + "}}");
     }
     return text;
   }
@@ -118,15 +109,13 @@ public abstract class GenericWebLyricsProvider implements ILyricsProvider {
    * 
    * @return URL the final url
    */
-  URL getActualURL(final String artist, final String title) {
+  public URL getActualURL(final String artist, final String title) {
     try {
       String queryString = getQueryURLTemplate();
-
-      queryString = queryString.replace(Const.PATTERN_ARTIST, (artist != null) ? NetworkUtils
-          .encodeString(artist) : "");
-      queryString = queryString.replace(Const.PATTERN_TRACKNAME, (title != null) ? NetworkUtils
-          .encodeString(title) : "");
-
+      queryString = queryString.replace(Const.PATTERN_ARTIST,
+          (artist != null) ? NetworkUtils.encodeString(artist) : "");
+      queryString = queryString.replace(Const.PATTERN_TRACKNAME,
+          (title != null) ? NetworkUtils.encodeString(title) : "");
       return new URL(queryString);
     } catch (MalformedURLException e) {
       Log.error(e);
@@ -142,8 +131,8 @@ public abstract class GenericWebLyricsProvider implements ILyricsProvider {
    * corresponding URL) and a Web page (this is this URL that is returned from
    * this method).
    * 
-   * @param artist DOCUMENT_ME
-   * @param title DOCUMENT_ME
+   * @param artist 
+   * @param title 
    * 
    * @return the Web URL or null if a problem occurred
    */
@@ -152,23 +141,24 @@ public abstract class GenericWebLyricsProvider implements ILyricsProvider {
   /**
    * Gets the lyrics.
    * 
-   * @param artist DOCUMENT_ME
-   * @param title DOCUMENT_ME
+   * @param artist 
+   * @param title 
    * 
    * @return the lyrics
    */
   public abstract String getLyrics(String artist, String title);
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
    */
   @Override
   public String getLyrics() {
-    // TODO Auto-generated method stub
     return null;
   }
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#setAudioFile(org.jajuk.base.File)
    */
   @Override
@@ -176,13 +166,39 @@ public abstract class GenericWebLyricsProvider implements ILyricsProvider {
     this.audioFile = file;
   }
 
-  /* (non-Javadoc)
-  * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getSourceAddress()
-  */
+  /**
+   * {@inheritDoc}
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getSourceAddress()
+   */
   @Override
   public String getSourceAddress() {
     Track track = audioFile.getTrack();
     return getWebURL(track.getArtist().getName2(), track.getName()).toString();
   }
-
+  
+  /**
+   * Remove HTML entities from the text.
+   * @param lyrics the lyrics in HTML text
+   * @return text
+   */
+  String cleanHtml(String lyrics) {
+    String ret = lyrics.replaceAll("<br />", "\n");
+    ret = ret.replaceAll("<br/>", "\n");
+    ret = ret.replaceAll("<br>", "\n");
+    ret = ret.replaceAll("’", "'");
+    ret = ret.replaceAll("–", "-");
+    ret = ret.replaceAll("\u0092", "'");
+    ret = ret.replaceAll("\u009c", "oe");
+    ret = ret.replaceAll("<p>", "\n");
+    ret = ret.replaceAll("<i>", "");
+    ret = ret.replaceAll("</i>", "");
+    ret = ret.replaceAll("<b>", "");
+    ret = ret.replaceAll("</b>", "");
+    ret = ret.replaceAll("\t", "");
+    ret = ret.replaceAll(""", "'");
+    ret = ret.replaceAll("'", "'");
+    ret = ret.replaceAll("’", "'");
+    ret = ret.replaceAll("…", "…");
+    return ret;
+  }
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/ILyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/ILyricsProvider.java
index 6ab298f..41db6c2 100644
--- a/src/main/java/org/jajuk/services/lyrics/providers/ILyricsProvider.java
+++ b/src/main/java/org/jajuk/services/lyrics/providers/ILyricsProvider.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.lyrics.providers;
 
 import org.jajuk.base.File;
@@ -27,7 +26,6 @@ import org.jajuk.base.File;
  * Interface for lyrics providers to be used by the modified LyricsService.
  */
 public interface ILyricsProvider {
-
   /**
    * Return lyrics for given audio file <br>
    * Returns null if none lyrics found or technical error.
@@ -59,5 +57,4 @@ public interface ILyricsProvider {
    * @return the lyrics source address
    */
   String getSourceAddress();
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/JajukLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/JajukLyricsProvider.java
index d1adb46..fa3aa74 100644
--- a/src/main/java/org/jajuk/services/lyrics/providers/JajukLyricsProvider.java
+++ b/src/main/java/org/jajuk/services/lyrics/providers/JajukLyricsProvider.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.lyrics.providers;
 
@@ -26,29 +26,17 @@ import org.jajuk.base.File;
  * Class container of lyrics written by user from Jajuk GUI itself.
  */
 public class JajukLyricsProvider implements ILyricsProvider {
-
-  /** DOCUMENT_ME. */
   private String sLyrics = null;
-
-  /** DOCUMENT_ME. */
   private String sArtist = null;
-
-  /** DOCUMENT_ME. */
   private String sTitle = null;
-
-  /** DOCUMENT_ME. */
   private File audioFile = null;
 
   /**
    * Instantiates a new jajuk lyrics provider.
    */
   public JajukLyricsProvider() {
-
   }
 
-  /* (non-Javadoc)
-   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
-   */
   /**
    * Gets the lyrics.
    * 
@@ -59,9 +47,6 @@ public class JajukLyricsProvider implements ILyricsProvider {
     return sLyrics;
   }
 
-  /* (non-Javadoc)
-   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
-   */
   /**
    * Gets the response encoding.
    * 
@@ -97,7 +82,6 @@ public class JajukLyricsProvider implements ILyricsProvider {
    */
   public File getFile() {
     return audioFile;
-
   }
 
   /**
@@ -109,7 +93,8 @@ public class JajukLyricsProvider implements ILyricsProvider {
     this.sLyrics = sLyrics;
   }
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#setAudioFile(org.jajuk.base.File)
    */
   @Override
@@ -119,12 +104,12 @@ public class JajukLyricsProvider implements ILyricsProvider {
     sTitle = this.audioFile.getTrack().getName();
   }
 
-  /* (non-Javadoc)
-  * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getSourceAddress()
-  */
+  /**
+   * {@inheritDoc}
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getSourceAddress()
+   */
   @Override
   public String getSourceAddress() {
     return "<Jajuk>";
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/LyricWikiWebLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/LyricWikiWebLyricsProvider.java
deleted file mode 100644
index 2dca98e..0000000
--- a/src/main/java/org/jajuk/services/lyrics/providers/LyricWikiWebLyricsProvider.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-
-package org.jajuk.services.lyrics.providers;
-
-import ext.services.network.NetworkUtils;
-
-import java.net.MalformedURLException;
-import java.util.StringTokenizer;
-
-import org.apache.commons.lang.StringUtils;
-import org.jajuk.util.Const;
-import org.jajuk.util.log.Log;
-
-/**
- * Lyrics Provider extracting lyrics from lyricwiki.org
- */
-public class LyricWikiWebLyricsProvider extends GenericWebLyricsProvider {
-
-  /** URL pattern used by jajuk to retrieve lyrics. */
-  private static final String URL = "http://lyrics.wikia.com/%artist:%title";
-
-  /** URL pattern to web page (see ILyricsProvider interface for details). */
-  private static final String WEB_URL = "http://lyrics.wikia.com/%artist:%title";
-
-  /**
-   * Instantiates a new lyric wiki web lyrics provider.
-   */
-  public LyricWikiWebLyricsProvider() {
-    super(URL);
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see ext.services.lyrics.providers.GenericProvider#getLyrics(java.lang.String,
-   * java.lang.String)
-   */
-  @Override
-  public String getLyrics(final String artist, final String title) {
-    try {
-      // This provider waits for '_' instead of regular '+' for spaces in URL
-      String formattedArtist = artist.replaceAll(" ", "_");
-      String formattedTitle = title.replaceAll(" ", "_");
-      String html = callProvider(formattedArtist, formattedTitle);
-      if (StringUtils.isBlank(html)) {
-        Log.debug("Empty return from callProvider().");
-        return null;
-      }
-      // Remove html part
-      html = cleanLyrics(html);
-      // From oct 2009, lyrics wiki returns lyrics encoded as HTML chars
-      // like Sha ...
-      StringBuffer sbFinalHtml = new StringBuffer(1000);
-      StringTokenizer st = new StringTokenizer(html, "&#");
-      while (st.hasMoreTokens()) {
-        String token = st.nextToken();
-        // Remove trailing ';'
-        if (token.endsWith("\n")) {
-          String trailing = token.substring(token.indexOf(';') + 1);
-          token = token.substring(0, token.indexOf(';'));
-          sbFinalHtml.append((char) Integer.parseInt(token, 10));
-          // Re-add carriage returns
-          sbFinalHtml.append(trailing);
-        } else {
-          token = token.substring(0, token.length() - 1);
-          sbFinalHtml.append((char) Integer.parseInt(token, 10));
-        }
-      }
-      return sbFinalHtml.toString();
-    } catch (Exception e) {
-      Log.debug("Cannot fetch lyrics for: {{" + artist + "/" + title + "}}");
-      return null;
-    }
-  }
-
-  /**
-   * Extracts lyrics from the HTML page. The correct subsection is to be
-   * extracted first, before being cleaned and stripped from useless HTML tags.
-   * 
-   * @param html DOCUMENT_ME
-   * 
-   * @return the lyrics
-   */
-  private String cleanLyrics(final String html) {
-    String ret = html;
-    // LyricWiki uses this with and without blank sometimes, maybe we should use
-    // a regular expression instead...
-    if (ret.contains("<div class='lyricbox' >") || ret.contains("<div class='lyricbox'>")) {
-      int startIndex = html.indexOf("<div class='lyricbox' >");
-      if (startIndex == -1) {
-        startIndex = html.indexOf("<div class='lyricbox'>");
-        ret = html.substring(startIndex + 22);
-
-        // LyricWiki added some additional div class now...
-        if (ret.startsWith("<div class='rtMatcher'>")) {
-          startIndex = ret.indexOf("</div>");
-          ret = ret.substring(startIndex + 6);
-        }
-      } else {
-        ret = html.substring(startIndex + 23);
-      }
-      int stopIndex = ret.indexOf("<!--");
-      ret = ret.substring(0, stopIndex);
-      ret = ret.replaceAll("<br />", "\n");
-      ret = ret.replaceAll("’", "'");
-      ret = ret.replaceAll("–", "-");
-      ret = ret.replaceAll("\u0092", "'");
-      ret = ret.replaceAll("\u009c", "oe");
-      ret = ret.replaceAll("<p>", "\n");
-      ret = ret.replaceAll("<i>", "");
-      ret = ret.replaceAll("</i>", "");
-      ret = ret.replaceAll("<b>", "");
-      ret = ret.replaceAll("</b>", "");
-      return ret;
-
-    } else {
-      return null;
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
-   */
-  @Override
-  public String getResponseEncoding() {
-    return "UTF-8";
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getWebURL(java.lang .String,
-   * java.lang.String)
-   */
-  @Override
-  public java.net.URL getWebURL(final String pArtist, final String pTitle) {
-    String queryString = WEB_URL;
-    // Replace spaces by _
-    String artist = pArtist.replaceAll(" ", "_");
-    String title = pTitle.replaceAll(" ", "_");
-
-    queryString = queryString.replace(Const.PATTERN_ARTIST, (artist != null) ? NetworkUtils
-        .encodeString(artist) : "");
-    queryString = queryString.replace(Const.PATTERN_TRACKNAME, (title != null) ? NetworkUtils
-        .encodeString(title) : "");
-
-    java.net.URL out = null;
-    try {
-      out = new java.net.URL(queryString);
-    } catch (MalformedURLException e) {
-      Log.error(e);
-    }
-    return out;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
-   */
-  @Override
-  public String getLyrics() {
-    return getLyrics(audioFile.getTrack().getArtist().getName2(), audioFile.getTrack().getName());
-  }
-
-}
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/LyricsManiaWebLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/LyricsManiaWebLyricsProvider.java
new file mode 100644
index 0000000..8c6bca2
--- /dev/null
+++ b/src/main/java/org/jajuk/services/lyrics/providers/LyricsManiaWebLyricsProvider.java
@@ -0,0 +1,176 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.services.lyrics.providers;
+
+import ext.services.network.NetworkUtils;
+
+import java.net.MalformedURLException;
+import java.text.Normalizer;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang.StringUtils;
+import org.jajuk.util.Const;
+import org.jajuk.util.log.Log;
+
+/**
+ * Lyrics Provider extracting lyrics from lyricsmania.com
+ */
+public class LyricsManiaWebLyricsProvider extends GenericWebLyricsProvider {
+  /** URL pattern used by jajuk to retrieve lyrics. */
+  private static final String URL = "http://www.lyricsmania.com/%title_lyrics_%artist.html";
+  /** URL pattern to web page (see ILyricsProvider interface for details). */
+  private static final String WEB_URL = "http://www.lyricsmania.com/%title_lyrics_%artist.html";
+
+  /**
+   * Instantiates a new lyricsmania web lyrics provider.
+   */
+  public LyricsManiaWebLyricsProvider() {
+    super(URL);
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see ext.services.lyrics.providers.GenericProvider#getLyrics(java.lang.String,
+   * java.lang.String)
+   */
+  @Override
+  public String getLyrics(final String artist, final String title) {
+    try {
+      String lyrics = null;
+      if (StringUtils.isNotBlank(artist) && StringUtils.isNotBlank(title)) {
+        // Specific rule for artist : lowercase, no space, no accent 
+        String formattedArtist = removeAccent(artist).replace(" ", "_").toLowerCase();
+        // Specific rule for title : lowercas, no space with accent
+        String formattedTitle = title.replace(" ", "_").replace("(", "").replace(")", "");
+        formattedTitle = formattedTitle.replace("'", "").toLowerCase();
+        String html = callProvider(formattedArtist, formattedTitle);
+        String result = cleanLyrics(html);
+        if (StringUtils.isNotBlank(result)) {
+          lyrics = result;
+        } else {
+            // Another trial without accent on title
+            formattedTitle = removeAccent(title).replaceAll(" ", "_").replace("(", "");
+            formattedTitle = formattedTitle.replace(")", "").replace("'", "").toLowerCase();
+            html = callProvider(formattedArtist, formattedTitle);
+            if (StringUtils.isNotBlank(html)) {
+              lyrics = cleanLyrics(html);  
+            } else {
+              Log.debug("Empty return from callProvider().");
+            }
+        }
+      }
+      return lyrics;
+    } catch (Exception e) {
+      Log.debug("Cannot fetch lyrics for: {{" + artist + "/" + title + "}}");
+      return null;
+    }
+  }
+
+  /**
+   * Extracts lyrics from the HTML page. The correct subsection is to be
+   * extracted first, before being cleaned and stripped from useless HTML tags.
+   * 
+   * @param html 
+   * 
+   * @return the lyrics
+   */
+  private String cleanLyrics(final String html) {
+    String ret = null;
+    if (html != null) {
+      String searchString = "<div class=\"lyrics-body\"";
+      int startIndex = html.indexOf(searchString);
+      if (startIndex > -1) {
+        ret = html.substring(startIndex + searchString.length());
+        int secondIndex = ret.indexOf("</strong>");
+        if (secondIndex > -1) {
+          ret = ret.substring(secondIndex + 10);
+          int stopIndex = ret.indexOf("</div>");
+          ret = ret.substring(0, stopIndex);
+          ret = ret.replace('\r', '\n');
+          ret = ret.replace("<div class=\"p402_premium\">", "");
+          ret += "\n<-- LyricsMania -->";
+          ret = cleanHtml(ret);
+        } else {
+          ret = null;
+        }
+      }
+    }
+    return ret;
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
+   */
+  @Override
+  public String getResponseEncoding() {
+    return "UTF-8";
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getWebURL(java.lang .String,
+   * java.lang.String)
+   */
+  @Override
+  public java.net.URL getWebURL(final String pArtist, final String pTitle) {
+    String queryString = WEB_URL;
+    // Replace spaces by _
+    String artist = removeAccent(pArtist).replaceAll(" ", "").toLowerCase();
+    String title = removeAccent(pTitle).replaceAll(" ", "").replace("(", "").replace(")", "")
+        .toLowerCase();
+    queryString = queryString.replace(Const.PATTERN_ARTIST,
+        (artist != null) ? NetworkUtils.encodeString(artist) : "");
+    queryString = queryString.replace(Const.PATTERN_TRACKNAME,
+        (title != null) ? NetworkUtils.encodeString(title) : "");
+    java.net.URL out = null;
+    try {
+      out = new java.net.URL(queryString);
+    } catch (MalformedURLException e) {
+      Log.error(e);
+    }
+    return out;
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
+   */
+  @Override
+  public String getLyrics() {
+    return getLyrics(audioFile.getTrack().getArtist().getName2(), audioFile.getTrack().getName());
+  }
+
+  /**
+   * Replace each accent in the string with the non accent character.
+   * @param s the string to process
+   * @return the string without accents
+   */
+  public String removeAccent(String s) {
+    String strTemp = Normalizer.normalize(s, Normalizer.Form.NFD);
+    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
+    return pattern.matcher(strTemp).replaceAll("");
+  }
+}
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/LyricsWikiaWebLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/LyricsWikiaWebLyricsProvider.java
new file mode 100644
index 0000000..b5d1950
--- /dev/null
+++ b/src/main/java/org/jajuk/services/lyrics/providers/LyricsWikiaWebLyricsProvider.java
@@ -0,0 +1,151 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.services.lyrics.providers;
+
+import ext.services.network.NetworkUtils;
+
+import java.net.MalformedURLException;
+
+import org.apache.commons.lang.StringUtils;
+import org.jajuk.util.Const;
+import org.jajuk.util.log.Log;
+
+/**
+ * Lyrics Provider extracting lyrics from lyrics.wikia.com
+ */
+public class LyricsWikiaWebLyricsProvider extends GenericWebLyricsProvider {
+  /** URL pattern used by jajuk to retrieve lyrics. */
+  private static final String URL = "http://lyrics.wikia.com/api.php?action=lyrics&artist=%artist&song=%title";
+  /** URL pattern to web page (see ILyricsProvider interface for details). */
+  private static final String WEB_URL = "http://lyrics.wikia.com/api.php?action=lyrics&artist=%artist&song=%title";
+
+  /**
+   * Instantiates a new lyric wiki web lyrics provider.
+   */
+  public LyricsWikiaWebLyricsProvider() {
+    super(URL);
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see ext.services.lyrics.providers.GenericProvider#getLyrics(java.lang.String,
+   * java.lang.String)
+   */
+  @Override
+  public String getLyrics(final String artist, final String title) {
+    try {
+      String lyrics = null;
+      if (StringUtils.isNotBlank(artist) && StringUtils.isNotBlank(title)) {
+        // This provider waits for '_' instead of regular '+' for spaces in URL
+        String formattedArtist = artist.replaceAll(" ", "_");
+        String formattedTitle = title.replaceAll(" ", "_").replace(",", "_");
+        String html = callProvider(formattedArtist, formattedTitle);
+        if (StringUtils.isNotBlank(html)) {
+          // Remove html part
+          lyrics = cleanLyrics(html);
+        } else {
+          Log.debug("Empty return from callProvider().");
+        }
+      }
+      return lyrics;
+    } catch (Exception e) {
+      Log.debug("Cannot fetch lyrics for: {{" + artist + "/" + title + "}}");
+      return null;
+    }
+  }
+
+  /**
+   * Extracts lyrics from the HTML page. The correct subsection is to be
+   * extracted first, before being cleaned and stripped from useless HTML tags.
+   * 
+   * @param html 
+   * 
+   * @return the lyrics
+   */
+  private String cleanLyrics(final String html) {
+    String ret = null;
+    if (html != null) {
+      int startIndex = html.indexOf("<pre>");
+      if (startIndex > -1) {
+        ret = html.substring(startIndex + 5);
+        int stopIndex = ret.indexOf("</pre>");
+        if (stopIndex > -1) {
+          ret = ret.substring(0, stopIndex);
+          if (ret.length()<15) {
+            return null;
+          } else {
+            ret += "\n<-- LyricsWikia -->";
+        	ret = cleanHtml(ret);
+          }
+        }
+      } else {
+        ret = null;
+      }
+    }
+    return ret;
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
+   */
+  @Override
+  public String getResponseEncoding() {
+    return "UTF-8";
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getWebURL(java.lang .String,
+   * java.lang.String)
+   */
+  @Override
+  public java.net.URL getWebURL(final String pArtist, final String pTitle) {
+    String queryString = WEB_URL;
+    // Replace spaces by _
+    String artist = pArtist.replaceAll(" ", "_");
+    String title = pTitle.replaceAll(" ", "_");
+    queryString = queryString.replace(Const.PATTERN_ARTIST,
+        (artist != null) ? NetworkUtils.encodeString(artist) : "");
+    queryString = queryString.replace(Const.PATTERN_TRACKNAME,
+        (title != null) ? NetworkUtils.encodeString(title) : "");
+    java.net.URL out = null;
+    try {
+      out = new java.net.URL(queryString);
+    } catch (MalformedURLException e) {
+      Log.error(e);
+    }
+    return out;
+  }
+
+  /**
+   * {@inheritDoc}
+   * 
+   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
+   */
+  @Override
+  public String getLyrics() {
+    return getLyrics(audioFile.getTrack().getArtist().getName2(), audioFile.getTrack().getName());
+  }
+}
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/TagLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/TagLyricsProvider.java
index 2938a27..c52546d 100644
--- a/src/main/java/org/jajuk/services/lyrics/providers/TagLyricsProvider.java
+++ b/src/main/java/org/jajuk/services/lyrics/providers/TagLyricsProvider.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.lyrics.providers;
 
@@ -27,14 +27,14 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * Lyrics provider from the tag information of the audio file.
  */
 public class TagLyricsProvider implements ILyricsProvider {
-
   /** audio file we search lyrics for. */
   private File audioFile = null;
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
    */
   @Override
@@ -54,7 +54,8 @@ public class TagLyricsProvider implements ILyricsProvider {
     return lyrics;
   }
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
    */
   @Override
@@ -62,7 +63,8 @@ public class TagLyricsProvider implements ILyricsProvider {
     return "UTF-8";
   }
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#setAudioFile(org.jajuk.base.File)
    */
   @Override
@@ -70,12 +72,12 @@ public class TagLyricsProvider implements ILyricsProvider {
     this.audioFile = file;
   }
 
-  /* (non-Javadoc)
+  /**
+  * {@inheritDoc}
   * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getSourceAddress()
   */
   @Override
   public String getSourceAddress() {
     return audioFile.getAbsolutePath();
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/TxtLyricsProvider.java b/src/main/java/org/jajuk/services/lyrics/providers/TxtLyricsProvider.java
index 22d3803..8431990 100644
--- a/src/main/java/org/jajuk/services/lyrics/providers/TxtLyricsProvider.java
+++ b/src/main/java/org/jajuk/services/lyrics/providers/TxtLyricsProvider.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.lyrics.providers;
 
@@ -31,20 +31,16 @@ import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * Lyrics provide from text file in the same directory of the audio file.
  */
 public class TxtLyricsProvider implements ILyricsProvider {
-
-  /** DOCUMENT_ME. */
   private BufferedReader lyricsReader = null;
-
-  /** DOCUMENT_ME. */
   private String readerPath = null;
-
   /** audio file we search lyrics for. */
   private File audioFile = null;
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getLyrics()
    */
   @Override
@@ -65,7 +61,6 @@ public class TxtLyricsProvider implements ILyricsProvider {
       }
       lyricsReader.close();
       lyricsReader = null; // So it will be instanced new
-
       if (StringUtils.isBlank(lyrics)) {
         return null;
       }
@@ -79,7 +74,8 @@ public class TxtLyricsProvider implements ILyricsProvider {
     }
   }
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getResponseEncoding()
    */
   @Override
@@ -101,7 +97,8 @@ public class TxtLyricsProvider implements ILyricsProvider {
     return lyricsReader;
   }
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#setAudioFile(org.jajuk.base.File)
    */
   @Override
@@ -109,12 +106,12 @@ public class TxtLyricsProvider implements ILyricsProvider {
     this.audioFile = file;
   }
 
-  /* (non-Javadoc)
+  /**
+   * {@inheritDoc}
    * @see org.jajuk.services.lyrics.providers.ILyricsProvider#getSourceAddress()
    */
   @Override
   public String getSourceAddress() {
     return UtilSystem.removeExtension(audioFile.getAbsolutePath()) + ".txt";
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/lyrics/providers/package.html b/src/main/java/org/jajuk/services/lyrics/providers/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/lyrics/providers/package.html
+++ b/src/main/java/org/jajuk/services/lyrics/providers/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/notification/INotificator.java b/src/main/java/org/jajuk/services/notification/INotificator.java
index 9b826e1..ddaa1a9 100644
--- a/src/main/java/org/jajuk/services/notification/INotificator.java
+++ b/src/main/java/org/jajuk/services/notification/INotificator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -35,7 +35,6 @@ import org.jajuk.services.webradio.WebRadio;
  * Base interface for multiple different notification services that we can use.
  */
 public interface INotificator {
-
   /**
    * Indicates if this notificator is available on the current platform.
    * 
@@ -51,7 +50,7 @@ public interface INotificator {
    * 
    * This method should only be called if @link isAvailable() returns true!
    * 
-   * @param webradio DOCUMENT_ME
+   * @param webradio 
    */
   void notify(WebRadio webradio);
 
@@ -62,14 +61,14 @@ public interface INotificator {
    * 
    * This method should only be called if @link isAvailable() returns true!
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    */
   void notify(File file);
 
   /**
    * Ask the notificator to provide some arbitrary status information.
    *
-   * @param title DOCUMENT_ME
+   * @param title 
    * @param status The string to print.
    */
   void notify(String title, String status);
diff --git a/src/main/java/org/jajuk/services/notification/JavaBalloonNotificator.java b/src/main/java/org/jajuk/services/notification/JavaBalloonNotificator.java
index 448abf5..5f93a8e 100644
--- a/src/main/java/org/jajuk/services/notification/JavaBalloonNotificator.java
+++ b/src/main/java/org/jajuk/services/notification/JavaBalloonNotificator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,12 +16,13 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
 import java.awt.TrayIcon;
 
+import org.jajuk.base.Album;
 import org.jajuk.base.File;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.windows.JajukSystray;
@@ -41,9 +42,7 @@ import org.jajuk.util.log.Log;
  */
 public class JavaBalloonNotificator implements INotificator {
   // the Systray is used to display the notification
-  /** DOCUMENT_ME. */
   TrayIcon trayIcon;
-
   /** Self instance *. */
   private static JavaBalloonNotificator self = new JavaBalloonNotificator();
 
@@ -94,6 +93,9 @@ public class JavaBalloonNotificator implements INotificator {
    */
   @Override
   public void notify(File file) {
+    // Force any new cover search before displaying it if the album is set "none" cover
+    Album album = file.getTrack().getAlbum();
+    album.resetCoverCache();
     String title = Messages.getString("Notificator.track_change.track_title");
     String pattern = Conf.getString(Const.CONF_PATTERN_BALLOON_NOTIFIER);
     String text;
diff --git a/src/main/java/org/jajuk/services/notification/NotificatorFactory.java b/src/main/java/org/jajuk/services/notification/NotificatorFactory.java
index d941d37..2f7937f 100644
--- a/src/main/java/org/jajuk/services/notification/NotificatorFactory.java
+++ b/src/main/java/org/jajuk/services/notification/NotificatorFactory.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -29,8 +29,6 @@ import org.jajuk.util.log.Log;
  * Factory returning a INotifictor according to user choice.
  */
 public class NotificatorFactory {
-
-  /** DOCUMENT_ME. */
   private static INotificator notificator;
 
   /**
@@ -42,13 +40,11 @@ public class NotificatorFactory {
    * @return the notificator
    */
   public synchronized static INotificator getNotificator() {
-
     // first check show balloon option and return null
     String optionValue = Conf.getString(Const.CONF_UI_NOTIFICATOR_TYPE);
     if (StringUtils.isBlank(optionValue) || NotificatorTypes.NONE.name().equals(optionValue)) {
       return null;
     }
-
     // Balloon
     if (NotificatorTypes.BALLOON.name().equals(optionValue)) {
       // Try the NotifySend implementation first
@@ -69,13 +65,10 @@ public class NotificatorFactory {
         }
       }
     }
-
     // Animated popup
     else if (NotificatorTypes.TOAST.name().equals(optionValue)) {
       notificator = ToastNotificator.getInstance();
-      if (notificator.isAvailable()) {
-        Log.debug("JajukInformationDialog implementation is available for system notifications.");
-      } else {
+      if (!notificator.isAvailable()) {
         notificator = null;
       }
     } else {
@@ -84,5 +77,4 @@ public class NotificatorFactory {
     }
     return notificator;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/notification/NotificatorTypes.java b/src/main/java/org/jajuk/services/notification/NotificatorTypes.java
index fa69378..8ccc19c 100644
--- a/src/main/java/org/jajuk/services/notification/NotificatorTypes.java
+++ b/src/main/java/org/jajuk/services/notification/NotificatorTypes.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -24,16 +24,11 @@ package org.jajuk.services.notification;
  * List of all known notificators types.
  */
 public enum NotificatorTypes {
-
   // None
-  /** DOCUMENT_ME. */
   NONE,
   // System (can map either javaSystrayNotificator or JajukBallooNotificator
   // according to system capabilities)
-  /** DOCUMENT_ME. */
   BALLOON,
   // Full album view with animation
-  /** DOCUMENT_ME. */
   TOAST
-
 }
diff --git a/src/main/java/org/jajuk/services/notification/NotifySendBalloonNotificator.java b/src/main/java/org/jajuk/services/notification/NotifySendBalloonNotificator.java
index 79bf8d3..1a3e581 100644
--- a/src/main/java/org/jajuk/services/notification/NotifySendBalloonNotificator.java
+++ b/src/main/java/org/jajuk/services/notification/NotifySendBalloonNotificator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -46,13 +46,10 @@ import org.jajuk.util.log.Log;
  * </p>
  */
 public class NotifySendBalloonNotificator implements INotificator {
-
   /** The number of milliseconds to display the note. */
   private static final String DISPLAY_TIME_MSECS = "8000";
-
   /** Self instance *. */
   private static NotifySendBalloonNotificator self = new NotifySendBalloonNotificator();
-
   /** Availability state [perf] *. */
   private boolean availability = false;
 
@@ -92,40 +89,32 @@ public class NotifySendBalloonNotificator implements INotificator {
       availability = false;
       return;
     }
-
     // check if we have "notify-send"
     List<String> list = new ArrayList<String>();
     list.add("notify-send");
     list.add("--help");
-
     // create streams for catching stdout and stderr
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     ByteArrayOutputStream err = new ByteArrayOutputStream();
-
     int ret = 0;
     final ProcessLauncher launcher = new ProcessLauncher(out, err, 10000);
     try {
       ret = launcher.exec(list.toArray(new String[list.size()]));
     } catch (IOException e) {
       ret = -1;
-      Log
-          .debug("Exception while checking for 'notify-send', cannot use notification functionality: "
-              + e.getMessage());
+      Log.debug("Exception while checking for 'notify-send', cannot use notification functionality: "
+          + e.getMessage());
     }
-
     // if we do not find the application or if we got an error, log some details
     // and disable notification support
     if (ret != 0) {
       // log out the results
       Log.debug("notify-send command returned to out(" + ret + "): " + out.toString());
       Log.debug("notify-send command returned to err: " + err.toString());
-
-      Log
-          .info("Cannot use notify-send functionality, application 'notify-send' seems to be not available correctly.");
+      Log.info("Cannot use notify-send functionality, application 'notify-send' seems to be not available correctly.");
       availability = false;
       return;
     }
-
     // notify-send is enabled and seems to be supported by the OS
     availability = true;
   }
@@ -134,18 +123,16 @@ public class NotifySendBalloonNotificator implements INotificator {
    * Notification from two strings (code shared between webradio and track notifications)
    */
   /**
-   * Notify. DOCUMENT_ME
+   * Notify. 
    * 
-   * @param title DOCUMENT_ME
-   * @param pText DOCUMENT_ME
+   * @param title 
+   * @param pText 
    */
   @Override
   public void notify(String title, String pText) {
     // workaround: notify-send cannot handle IMG-SRC with "file:"
     String text = pText.replace("<img src='file:/", "<img src='/");
-
     // first build the commandline for "notify-send"
-
     // see http://www.galago-project.org/specs/notification/0.9/x344.html
     // and the manual page of "notify-send"
     List<String> list = new ArrayList<String>();
@@ -156,22 +143,18 @@ public class NotifySendBalloonNotificator implements INotificator {
     // events
     list.add("--category=music.started");
     list.add("--urgency=normal");
-
     // not sure if this works, it would disable any system-sound for this as it
     // is useless to play additional sound in this case, but it is just a hint
     // anyway,
     // Furthermore it should be "boolean" according to the spec, but Ubuntu
     // reports an error if I try to use that...
     list.add("--hint=byte:suppress-sound:1");
-
     // now add the actual information to the commandline
     list.add(title);
     list.add(text);
-
     // create streams for catching stdout and stderr
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     ByteArrayOutputStream err = new ByteArrayOutputStream();
-
     int ret = 0;
     Log.debug("Using this notify-send command: {{" + list.toString() + "}}");
     final ProcessLauncher launcher = new ProcessLauncher(out, err, 10000);
@@ -181,14 +164,12 @@ public class NotifySendBalloonNotificator implements INotificator {
       ret = -1;
       Log.error(e);
     }
-
     // log out the results
     if (!out.toString().isEmpty()) {
       Log.debug("notify-send command returned to out(" + ret + "): " + out.toString());
     } else if (ret != 0) {
       Log.debug("notify-send command returned: " + ret);
     }
-
     if (!err.toString().isEmpty()) {
       Log.debug("notify-send command returned to err: " + err.toString());
     }
diff --git a/src/main/java/org/jajuk/services/notification/ToastNotificator.java b/src/main/java/org/jajuk/services/notification/ToastNotificator.java
index 8009b00..1deb3e9 100644
--- a/src/main/java/org/jajuk/services/notification/ToastNotificator.java
+++ b/src/main/java/org/jajuk/services/notification/ToastNotificator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,16 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
+import org.jajuk.base.Album;
 import org.jajuk.base.File;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.widgets.JajukToast;
-import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
 
 /**
  * Notificator that displays a full Swing album toast (notification frame that
@@ -36,7 +35,6 @@ import org.jajuk.util.UtilGUI;
  * </p>
  */
 public class ToastNotificator implements INotificator {
-
   /** Self instance *. */
   private static ToastNotificator self = new ToastNotificator();
 
@@ -83,13 +81,7 @@ public class ToastNotificator implements INotificator {
    * @param text toast text
    */
   private void displayToast(String text) {
-    // Useful for #1582 ([Linux] Void entry in task bar for information dialog)
-    if (UtilGUI.getActiveWindow() != null // null if none window displayed
-        && UtilGUI.getActiveWindow().equals(JajukMainWindow.getInstance())) {
-      new JajukToast(text, null).display();
-    } else {
-      new JajukToast(text, UtilGUI.getActiveWindow()).display();
-    }
+    new JajukToast(text).display();
   }
 
   /*
@@ -99,6 +91,9 @@ public class ToastNotificator implements INotificator {
    */
   @Override
   public void notify(File file) {
+    // Force any new cover search before displaying it if the album is set "none" cover
+    Album album = file.getTrack().getAlbum();
+    album.resetCoverCache();
     String text = file.getHTMLFormatText();
     displayToast(text);
   }
diff --git a/src/main/java/org/jajuk/services/notification/package.html b/src/main/java/org/jajuk/services/notification/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/notification/package.html
+++ b/src/main/java/org/jajuk/services/notification/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/players/AbstractMPlayerImpl.java b/src/main/java/org/jajuk/services/players/AbstractMPlayerImpl.java
index 9947663..a08939c 100644
--- a/src/main/java/org/jajuk/services/players/AbstractMPlayerImpl.java
+++ b/src/main/java/org/jajuk/services/players/AbstractMPlayerImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -37,28 +37,23 @@ import org.jajuk.util.log.Log;
  * Mplayer player implementation.
  */
 public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
-
   /** Stored Volume. */
   float fVolume;
-
   /** Mplayer process. */
   volatile Process proc;
-
   /** End of file flag *. */
   volatile boolean bEOF = false;
-
   /** File is opened flag *. */
   volatile boolean bOpening = false;
-
   /** Stop position thread flag. */
   volatile boolean bStop = false;
-
   /** Fading state. */
   volatile boolean bFading = false;
-
   /** pause flag *. */
   protected volatile boolean bPaused = false;
- 
+  /** Whether the track has been started in bitperfect mode **/
+  boolean bitPerfect = false;
+
   /*
    *
    * Kill abruptly the mplayer process (this way, killing is synchronous, and
@@ -91,7 +86,6 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
          * mplayer processes die gracefully. I guess the destroy() method
          * internally also tries to use -9 and so both pids are never killed.
          */
-
         Field field = proc.getClass().getDeclaredField("pid");
         field.setAccessible(true);
         int pid = field.getInt(proc);
@@ -115,6 +109,13 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
   @Override
   public void setVolume(float fVolume) {
     this.fVolume = fVolume;
+    // Fix for a issue under Linux (at least with pulseaudio) : if a track is started in bitperfect mode (no volume specified), then 
+    // the mode is unset when the same track is playing. When the fade out occurs, the volume commands sent to mplayer are propagated for some reasons
+    // directly to the pulsaudio mixer and the next track sound volume is affected (muted most of times).
+    if (bitPerfect) {
+      Log.warn("This track was started in bit-perfect mode, even if the mode has been disabled, it can apply only to next track");
+      return;
+    }
     sendCommand("volume " + (int) (100 * fVolume) + " 2");
     // Not not log this when fading, generates too much logs
     if (!bFading) {
@@ -125,27 +126,25 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
   /**
    * Send a command to mplayer slave.
    * 
-   * @param command DOCUMENT_ME
+   * @param command 
    */
   protected void sendCommand(String command) {
     if (proc != null) {
       PrintStream out = new PrintStream(proc.getOutputStream());
-
       // Do not use println() : it doesn't work under windows
       out.print(command + '\n');
       out.flush();
-
       // don't close out here otherwise the output stream of the Process
-      // will be closed as well and subsequent sendCommant() calls will silently
+      // will be closed as well and subsequent sendCommand() calls will silently
       // fail!!
     }
   }
 
-   /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.players.IPlayerImpl#getCurrentVolume()
-   */
+  /*
+  * (non-Javadoc)
+  * 
+  * @see org.jajuk.players.IPlayerImpl#getCurrentVolume()
+  */
   @Override
   public float getCurrentVolume() {
     return fVolume;
@@ -154,11 +153,12 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
   /**
    * Build the mplayer command line.
    * 
-   * @param url to play
+   * @param url the url to play
+   * @param startPositionSec the position in the track when starting in secs (0 means we plat from the begining)
    * 
    * @return command line as a String array
    */
-  List<String> buildCommand(String url) {
+  List<String> buildCommand(String url, int startPositionSec) {
     String sCommand = "mplayer";
     // Use any forced mplayer path
     String forced = Conf.getString(Const.CONF_MPLAYER_PATH_FORCED);
@@ -175,17 +175,23 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
     // Build command
     List<String> cmd = new ArrayList<String>(10);
     cmd.add(sCommand);
+    // Start at given position
+    cmd.add("-ss");
+    cmd.add(Integer.toString(startPositionSec));
     // quiet: less traces
     cmd.add("-quiet");
     // slave: slave mode (control with stdin)
     cmd.add("-slave");
-    // -af volume: Use volnorm to limit gain to max
-    // If mute, use -200db otherwise, use a linear scale
-    cmd.add("-af");
-    cmd.add(buildAudioFilters());
-    // -softvol : use soft mixer, allows to set volume only to this mplayer
-    // instance, not others programs
-    cmd.add("-softvol");
+    // No af options if bit perfect is enabled
+    if (!Conf.getBoolean(CONF_BIT_PERFECT)) {
+      // -af volume: Use volnorm to limit gain to max
+      // If mute, use -200db otherwise, use a linear scale
+      cmd.add("-af");
+      cmd.add(buildAudioFilters());
+      // -softvol : use soft mixer, allows to set volume only to this mplayer
+      // instance, not others programs
+      cmd.add("-softvol");
+    }
     // Define a cache. It is useful to avoid sound gliches but also to
     // overide a local mplayer large cache configuration in
     // ~/.mplayer/config file. User can set a large cache for video for ie.
@@ -204,8 +210,11 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
       }
     }
     // If it is a playlist, add the -playlist option, must be the last option
-    // because options after -playlist are ignored (see mplayer man page)
-    if (url.matches("http://.*")) {
+    // because options after -playlist are ignored (see mplayer man page).
+    // Moreover, we only use this option if we are about to play line-based stream like m3u or the playback will fail.
+    if (url.matches(".*://.*")
+        && (url.toLowerCase().endsWith(".m3u") || url.toLowerCase().endsWith(".asx") || url
+            .toLowerCase().endsWith(".pls"))) {
       cmd.add("-playlist");
     }
     cmd.add(url);
@@ -232,7 +241,6 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
       volume = (int) (10 * Math.log(fVolume));
     }
     audiofilters.append("volume=" + volume);
-
     // Add karaoke state if required
     if (Conf.getBoolean(CONF_STATE_KARAOKE)) {
       audiofilters.append(",karaoke");
@@ -247,7 +255,6 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
    */
   @Override
   public long getDurationSec() {
-
     return 0;
   }
 
@@ -258,7 +265,6 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
    */
   @Override
   public float getCurrentPosition() {
-
     return 0;
   }
 
@@ -269,7 +275,6 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
    */
   @Override
   public long getElapsedTimeMillis() {
-
     return 0;
   }
 
@@ -329,12 +334,11 @@ public abstract class AbstractMPlayerImpl implements IPlayerImpl, Const {
    */
   @Override
   public void resume() throws Exception {
-    // This test is required because we in case of volume change, mplayer is
+    // This test is required because in case of volume change, mplayer is
     // already resumed and we don't want to send another pause command
     if (bPaused) {
       bPaused = false;
       sendCommand("pause");
     }
   }
-  
 }
diff --git a/src/main/java/org/jajuk/services/players/IPlayerImpl.java b/src/main/java/org/jajuk/services/players/IPlayerImpl.java
index 9dc19f3..cd8581d 100644
--- a/src/main/java/org/jajuk/services/players/IPlayerImpl.java
+++ b/src/main/java/org/jajuk/services/players/IPlayerImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -27,7 +27,6 @@ import org.jajuk.services.webradio.WebRadio;
  * Minimum methods required for all Player implementations.
  */
 public interface IPlayerImpl {
-
   /**
    * Launches player.
    * 
@@ -45,8 +44,8 @@ public interface IPlayerImpl {
   /**
    * Play a web radio stream.
    * 
-   * @param radio DOCUMENT_ME
-   * @param fVolume DOCUMENT_ME
+   * @param radio 
+   * @param fVolume 
    * 
    * @throws Exception the exception
    */
@@ -75,12 +74,12 @@ public interface IPlayerImpl {
    * @return elapsed time (ms) for this player
    */
   long getElapsedTimeMillis();
-  
-   /**
-   * Gets the actually played time (including rewinds and forward, pause not included)
-   * 
-   * @return actually played time (ms) for this player
-   */
+
+  /**
+  * Gets the actually played time (including rewinds and forward, pause not included)
+  * 
+  * @return actually played time (ms) for this player
+  */
   long getActuallyPlayedTimeMillis();
 
   /**
@@ -100,7 +99,7 @@ public interface IPlayerImpl {
   /**
    * Seek to a given position in %. ex : 0.2 for 20%
    * 
-   * @param fPosition DOCUMENT_ME
+   * @param fPosition 
    */
   void seek(float fPosition);
 
@@ -131,5 +130,4 @@ public interface IPlayerImpl {
    * @return the state
    */
   int getState();
-
 }
diff --git a/src/main/java/org/jajuk/services/players/JavaLayerPlayerImpl.java b/src/main/java/org/jajuk/services/players/JavaLayerPlayerImpl.java
index add0007..61406db 100644
--- a/src/main/java/org/jajuk/services/players/JavaLayerPlayerImpl.java
+++ b/src/main/java/org/jajuk/services/players/JavaLayerPlayerImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -33,6 +33,9 @@ import org.jajuk.base.Track;
 import org.jajuk.base.TrackManager;
 import org.jajuk.base.Type;
 import org.jajuk.base.TypeManager;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -45,60 +48,41 @@ import org.jajuk.util.log.Log;
  * Jajuk player implementation based on javazoom BasicPlayer.
  */
 public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListener {
-
-  /** The Constant AUDIO_LENGTH_BYTES.  DOCUMENT_ME */
+  /** The Constant AUDIO_LENGTH_BYTES.   */
   private static final String AUDIO_LENGTH_BYTES = "audio.length.bytes";
-
   /** Current player. */
   private BasicPlayer player;
-
   /** Time elapsed in ms. */
   private long lTime = 0;
-
   /** Actually played time */
   private long actuallyPlayedTimeMillis = 0l;
-
   private long lastPlayTimeUpdate = System.currentTimeMillis();
-
   /** Date of last elapsed time update. */
   private long lDateLastUpdate = System.currentTimeMillis();
-
   /** current track info. */
   private Map<String, Object> mPlayingData;
-
   /** Current position in %. */
   private float fPos;
-
   /** Length to be played in secs. */
   private long length;
-
   /** Stored Volume. */
   private float fVolume;
-
   /** Current track estimated duration in ms. */
   private long lDuration;
-
   /** Cross fade duration in ms. */
   int iFadeDuration = 0;
-
   /** Fading state. */
   boolean bFading = false;
-
   /** Progress step in ms, do not set less than 300 or 400 to avoid using too much CPU. */
   private static final int PROGRESS_STEP = 500;
-
   /** Total play time is refreshed every TOTAL_PLAYTIME_UPDATE_INTERVAL times. */
   private static final int TOTAL_PLAYTIME_UPDATE_INTERVAL = 2;
-
   /** Volume when starting fade. */
   private float fadingVolume;
-
   /** current file. */
   private org.jajuk.base.File fCurrent;
-
   /** Inc rating flag. */
   private boolean bHasBeenRated = false;
-
   /** Used to compute total played time. */
   private int comp = 0;
 
@@ -157,6 +141,8 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
     }
     // Update track rate
     fCurrent.getTrack().updateRate();
+    // Force immediate rating refresh (without using the rating manager)
+    ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
   }
 
   /*
@@ -167,7 +153,11 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
   @Override
   public void setVolume(float fVolume) throws Exception {
     this.fVolume = fVolume;
-    player.setGain(fVolume * 0.6);
+    if (player.hasGainControl()) {
+      player.setGain(fVolume * 0.6);
+    } else {
+      Log.warn("Gain control not supported");
+    }
     // limit gain to avoid saturation
   }
 
@@ -285,12 +275,13 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
   /**
    * Opened listener implementation.
    * 
-   * @param arg0 DOCUMENT_ME
-   * @param arg1 DOCUMENT_ME
+   * @param arg0 
+   * @param arg1 
    */
   @Override
   @SuppressWarnings("unchecked")
-  public void opened(Object arg0, Map arg1) {
+  public void opened(Object arg0, @SuppressWarnings("rawtypes")
+  Map arg1) {
     this.mPlayingData = arg1;
     this.lDuration = UtilFeatures.getTimeLengthEstimation(mPlayingData);
     lastPlayTimeUpdate = System.currentTimeMillis();
@@ -299,14 +290,15 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
   /**
    * Progress listener implementation. Called several times by sec
    * 
-   * @param iBytesread DOCUMENT_ME
-   * @param lMicroseconds DOCUMENT_ME
-   * @param bPcmdata DOCUMENT_ME
-   * @param mProperties DOCUMENT_ME
+   * @param iBytesread 
+   * @param lMicroseconds 
+   * @param bPcmdata 
+   * @param mProperties 
    */
   @Override
-  @SuppressWarnings("unchecked")
-  public void progress(int iBytesread, long lMicroseconds, byte[] bPcmdata, Map mProperties) {
+  public void progress(int iBytesread, long lMicroseconds, byte[] bPcmdata,
+      @SuppressWarnings("rawtypes")
+      Map mProperties) {
     if ((System.currentTimeMillis() - lDateLastUpdate) > PROGRESS_STEP) {
       lDateLastUpdate = System.currentTimeMillis();
       this.iFadeDuration = 1000 * Conf.getInt(Const.CONF_FADE_DURATION);
@@ -341,14 +333,13 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
       if (mPlayingData.containsKey(AUDIO_LENGTH_BYTES)) {
         int byteslength = ((Integer) mPlayingData.get(AUDIO_LENGTH_BYTES)).intValue();
         fPos = (byteslength != 0) ? (float) iBytesread / (float) byteslength : 0;
-        Conf.setProperty(Const.CONF_STARTUP_LAST_POSITION, Float.toString(fPos));
+        UtilFeatures.storePersistedPlayingPosition(fPos);
         lTime = (long) (lDuration * fPos);
         // update actually played duration
         if (lastPlayTimeUpdate > 0 && player.getStatus() != BasicPlayer.PAUSED) {
           actuallyPlayedTimeMillis += (System.currentTimeMillis() - lastPlayTimeUpdate);
         }
         lastPlayTimeUpdate = System.currentTimeMillis();
-
       }
       // check if the track get rate increasing level (INC_RATE_TIME
       // secs or intro length)
@@ -376,6 +367,8 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
               QueueModel.finished();
               // Update track rate
               fCurrent.getTrack().updateRate();
+              // Force immediate rating refresh (without using the rating manager)
+              ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
             }
           }.start();
         }
@@ -389,6 +382,8 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
           public void run() {
             QueueModel.finished();
             fCurrent.getTrack().updateRate();
+            // Force immediate rating refresh (without using the rating manager)
+            ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
           }
         }.start();
       }
@@ -398,7 +393,7 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
   /**
    * State updated implementation.
    * 
-   * @param bpe DOCUMENT_ME
+   * @param bpe 
    */
   @Override
   public void stateUpdated(BasicPlayerEvent bpe) {
@@ -426,7 +421,7 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
   /**
    * Set controler implementation.
    * 
-   * @param arg0 DOCUMENT_ME
+   * @param arg0 
    */
   @Override
   public void setController(BasicController arg0) {
@@ -445,7 +440,7 @@ public class JavaLayerPlayerImpl implements IPlayerImpl, Const, BasicPlayerListe
 
   /**
    * Scrobble.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the int
    */
diff --git a/src/main/java/org/jajuk/services/players/MPlayerPlayerImpl.java b/src/main/java/org/jajuk/services/players/MPlayerPlayerImpl.java
index 1888b68..df92a37 100644
--- a/src/main/java/org/jajuk/services/players/MPlayerPlayerImpl.java
+++ b/src/main/java/org/jajuk/services/players/MPlayerPlayerImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -28,11 +28,15 @@ import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
 import org.jajuk.base.Track;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.JajukActions;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
+import org.jajuk.util.UtilFeatures;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
@@ -41,64 +45,39 @@ import org.jajuk.util.log.Log;
  * Jajuk player implementation based on Mplayer.
  */
 public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
-
   /** Time elapsed in ms. */
   private long lTime = 0;
-
   /** Actually played time */
   private long actuallyPlayedTimeMillis = 0l;
-
   private long lastPlayTimeUpdate = System.currentTimeMillis();
-
   /** Length to be played in secs. */
   private long length;
-
   /** Starting position. */
   private float fPosition;
-
   /** Current track estimated total duration in ms. */
   private long lDuration;
-
   /** Volume when starting fade. */
   private float fadingVolume;
-
   /** Cross fade duration in ms. */
   int iFadeDuration = 0;
-
   /** Time track started *. */
   private long dateStart;
-
   /** Pause time correction *. */
   private long pauseCount = 0;
-
-  /** DOCUMENT_ME. */
   private long pauseCountStamp = -1;
-
-  /** Does the user made a seek in current track ?*. */
-  private boolean seeked;
-
   /** Is the play is in error. */
   private boolean bInError = false;
-
-  /** VBR correction. VBR MP3 files are confusing for mplayer that shows wrong length and seek position. This value is the correction computed with id3 tag when available */
-  float vbrCorrection = 1.0f;
-
   /** Progress step in ms, do not set less than 300 or 400 to avoid using too much CPU. */
   private static final int PROGRESS_STEP = 500;
-
   /** Total play time is refreshed every TOTAL_PLAYTIME_UPDATE_INTERVAL times. */
   private static final int TOTAL_PLAYTIME_UPDATE_INTERVAL = 2;
-
   /** Current file. */
   private org.jajuk.base.File fCurrent;
-
   /** [Windows only] Force use of shortnames. */
   private boolean bForcedShortnames = false;
-
   /** English-specific end of file pattern */
   private Pattern patternEndOfFileEnglish = Pattern
       .compile("Exiting\\x2e\\x2e\\x2e.*\\(End of file\\)");
-
   /** Language-agnostic end of file pattern */
   private Pattern patternEndOfFileGeneric = Pattern.compile(".*\\x2e\\x2e\\x2e.*\\(.*\\)");
 
@@ -106,19 +85,19 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
    * Position and elapsed time getter.
    */
   private class PositionThread extends Thread {
-
     /**
-    * Instantiates a new position thread.
-    * 
-    * @param name DOCUMENT_ME
-    */
+     * Instantiates a new position thread.
+     *
+     * @param name 
+     */
     public PositionThread(String name) {
       super(name);
+      setDaemon(true);
     }
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see java.lang.Thread#run()
      */
     @Override
@@ -136,12 +115,10 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
           if (bPaused) {
             pauseCountStamp = System.currentTimeMillis();
           }
-
           if (!bPaused) {
             // Do not call a get_percent_pos if paused, it resumes the player
             // (mplayer issue)
             sendCommand("get_time_pos");
-
             // Get track length if required. Do not launch "get_time_length" only 
             // once because some fast computer makes mplayer start too fast and
             // the slave mode is not yet opened so this command is not token into account.
@@ -166,7 +143,6 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
         } catch (Exception e) {
           Log.error(e);
         }
-
       }
     }
   }
@@ -175,19 +151,19 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
    * Reader : read information from mplayer like position.
    */
   private class ReaderThread extends Thread {
-
     /**
      * Instantiates a new reader thread.
-     * 
-     * @param name DOCUMENT_ME
+     *
+     * @param name 
      */
     public ReaderThread(String name) {
       super(name);
+      setDaemon(true);
     }
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see java.lang.Thread#run()
      */
     @Override
@@ -212,47 +188,29 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
             }
             // Very verbose :
             //Log.debug("Output from MPlayer: " + line);
-
             // Detect mplayer language
             if (line.indexOf("Starting playback") != -1) {
               patternEndOfFile = patternEndOfFileEnglish;
             } else if (line.indexOf("ANS_TIME_POSITION") != -1) {
               // Stream is actually opened now
               bOpening = false;
-
               StringTokenizer st = new StringTokenizer(line, "=");
               st.nextToken();
-              // We need to compute the elapsed time. The issue here is the fact
-              // that mplayer sometimes returns false getPos() values (for vbr).
-              // The other problem is that the user can seek forward or rewind
-              // in the track so we can't just count the system time.
-              // The solution we got is :
-              // - If user never seeked into the current track, compute the
-              // elapsed time upon real system date.
-              // - If user seeked, take the mplayer time but use a vbr
-              // correction.
-              // Note however that the resulting time, while being better than
-              // the raw mplayer time can be pretty wrong (10 secs or more in some
-              // cases)
-              if (seeked) {
+              try {
                 lTime = (int) (Float.parseFloat(st.nextToken()) * 1000);
-                // VBR correction
-                lTime = (long) (lTime * vbrCorrection);
-                pauseCount = 0;
-                pauseCountStamp = -1;
-              } else {
-                lTime = System.currentTimeMillis() - dateStart - pauseCount;
+              } catch (NumberFormatException nfe) {
+                Log.error(nfe);
+                lTime = 0l;
               }
+              pauseCount = 0;
+              pauseCountStamp = -1;
               // update actually played duration
               if (lastPlayTimeUpdate > 0 && !bPaused) {
                 actuallyPlayedTimeMillis += (System.currentTimeMillis() - lastPlayTimeUpdate);
               }
               lastPlayTimeUpdate = System.currentTimeMillis();
-
               // Store current position for use at next startup
-              Conf.setProperty(Const.CONF_STARTUP_LAST_POSITION,
-                  Float.toString(getCurrentPosition()));
-
+              UtilFeatures.storePersistedPlayingPosition(getCurrentPosition());
               // Cross-Fade test
               if (!bFading && iFadeDuration > 0
               // Length = 0 for some buggy audio headers
@@ -260,7 +218,9 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
                   // Does fading time happened ?
                   && lTime > (lDuration - iFadeDuration)
                   // Do not fade if the track is very short
-                  && (lDuration > 3 * iFadeDuration)) {
+                  && (lDuration > 3 * iFadeDuration)
+                  //Do not fade if bit perfect mode
+                  && !Conf.getBoolean(CONF_BIT_PERFECT)) {
                 bFading = true;
                 fadingVolume = fVolume;
                 // Call finish (do not leave thread to allow cross fading)
@@ -310,14 +270,17 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
                */
               StringTokenizer st = new StringTokenizer(line, "=");
               st.nextToken();
-              long mplayerDuration = (long) (Float.parseFloat(st.nextToken()) * 1000);
+              long mplayerDuration = 0l;
+              try {
+                mplayerDuration = (long) (Float.parseFloat(st.nextToken()) * 1000);
+              } catch (NumberFormatException nfe) {
+                Log.error(nfe);
+              }
               long tagDuration = fCurrent.getTrack().getDuration() * 1000;
               if (tagDuration <= 0) {
                 lDuration = mplayerDuration;
               } else {
                 lDuration = tagDuration;
-                // Save VBR correction, used after seeking
-                vbrCorrection = ((float) tagDuration) / mplayerDuration;
               }
             }
             // End of file
@@ -326,8 +289,9 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
               // Update track rate if it has been opened
               if (!bOpening) {
                 fCurrent.getTrack().updateRate();
+                // Force immediate rating refresh (without using the rating manager)
+                ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
               }
-
               // Launch next track
               try {
                 // Do not launch next track if not opening: it means
@@ -339,7 +303,6 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
                   bInError = true;
                   break;
                 }
-
                 // If fading, ignore end of file
                 if (!bFading) {
                   // Call finish and terminate current thread
@@ -367,36 +330,37 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.services.players.AbstractMPlayerImpl#stop()
    */
   @Override
   public void stop() throws Exception {
     // Call generic stop
     super.stop();
-
     // Update track rate
     fCurrent.getTrack().updateRate();
+    // Force immediate rating refresh (without using the rating manager)
+    ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.players.IPlayerImpl#play(org.jajuk.base.File, float, long, float)
    */
   @Override
   public void play(org.jajuk.base.File file, float fPosition, long length, float fVolume)
       throws IOException, JajukException {
-
     this.fVolume = fVolume;
     this.length = length;
     this.fPosition = fPosition;
     this.fCurrent = file;
+    this.bitPerfect = Conf.getBoolean(Const.CONF_BIT_PERFECT);
     // Reset all states
     reset();
     // Try to launch mplayer
-    launchMplayer();
-
+    int startPos = (int) (fPosition * file.getTrack().getDuration());
+    launchMplayer(startPos);
     // If under windows and the launch failed, try once again
     // with other short names configuration (see #1267)
     if (bInError && UtilSystem.isUnderWindows()) {
@@ -404,17 +368,12 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
       Log.warn("Force shortname filename scheme" + " for : " + file.getAbsolutePath());
       // Reset any state changed by the previous reader thread
       reset();
-      launchMplayer();
+      launchMplayer(startPos);
       // Disable forced shortnames because the shortnames converter takes a while (2 secs)
       bForcedShortnames = false;
     }
-
     // Check the file has been property opened
-    if (!bOpening && !bEOF) {
-      if (fPosition > 0.0f) {
-        seek(fPosition);
-      }
-    } else {
+    if (bOpening || bEOF) {
       // try to kill the mplayer process if still alive
       if (proc != null) {
         Log.warn("OOT Mplayer process, try to kill it");
@@ -436,21 +395,20 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
     this.bStop = false;
     this.bOpening = true;
     this.bEOF = false;
-    this.vbrCorrection = 1.0f;
     this.iFadeDuration = 1000 * Conf.getInt(Const.CONF_FADE_DURATION);
     this.dateStart = System.currentTimeMillis();
     this.pauseCount = 0;
     this.pauseCountStamp = -1;
-    this.seeked = false;
   }
 
   /**
    * Launch mplayer.
-   * DOCUMENT_ME
    * 
+     * @param startPositionSec the position in the track when starting in secs (0 means we plat from the begining)
    * @throws IOException Signals that an I/O exception has occurred.
+   * 
    */
-  private void launchMplayer() throws IOException {
+  private void launchMplayer(int startPositionSec) throws IOException {
     // Build the file url. Under windows, we convert path to short
     // version to fix a mplayer bug when reading some pathnames including
     // special characters (see #1267)
@@ -458,7 +416,7 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
     if (UtilSystem.isUnderWindows() && bForcedShortnames) {
       pathname = UtilSystem.getShortPathNameW(pathname);
     }
-    ProcessBuilder pb = new ProcessBuilder(buildCommand(pathname));
+    ProcessBuilder pb = new ProcessBuilder(buildCommand(pathname, startPositionSec));
     Log.debug("Using this Mplayer command: {{" + pb.command() + "}}");
     // Set all environment variables format: var1=xxx var2=yyy
     try {
@@ -523,7 +481,7 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.players.IPlayerImpl#seek(float) Ogg vorbis seek not yet supported
    */
   @Override
@@ -545,13 +503,14 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
     // save current position
     String command = "seek " + (int) (100 * posValue) + " 1";
     sendCommand(command);
-    setVolume(fVolume); // need this because a seek reset volume
-    this.seeked = true;
+    if (!Conf.getBoolean(CONF_BIT_PERFECT)) {
+      setVolume(fVolume); // need this because a seek reset volume
+    }
   }
 
   /**
    * Gets the state.
-   * 
+   *
    * @return player state, -1 if player is null.
    */
   @Override
@@ -575,7 +534,7 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.players.AbstractMPlayerImpl#play(org.jajuk.base.WebRadio, float)
    */
   @Override
@@ -585,7 +544,7 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.IPlayerImpl#setVolume(float)
    */
   @Override
@@ -599,14 +558,16 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.services.players.AbstractMPlayerImpl#resume()
    */
   @Override
   public void resume() throws Exception {
     lastPlayTimeUpdate = System.currentTimeMillis();
     super.resume();
-    setVolume(fVolume);
+    if (!Conf.getBoolean(CONF_BIT_PERFECT)) {
+      setVolume(fVolume);
+    }
   }
 
   /**
@@ -624,6 +585,5 @@ public class MPlayerPlayerImpl extends AbstractMPlayerImpl {
         QueueModel.finished();
       }
     }.start();
-
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/jajuk/services/players/Player.java b/src/main/java/org/jajuk/services/players/Player.java
index 9140a2d..2ab2ac1 100644
--- a/src/main/java/org/jajuk/services/players/Player.java
+++ b/src/main/java/org/jajuk/services/players/Player.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,14 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
 import java.util.Properties;
 
 import javax.sound.sampled.LineUnavailableException;
+import javax.swing.JOptionPane;
 
 import javazoom.jlgui.basicplayer.BasicPlayer;
 
@@ -36,34 +37,27 @@ import org.jajuk.ui.widgets.InformationJPanel;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
+import org.jajuk.util.error.JajukRuntimeException;
 import org.jajuk.util.log.Log;
 
 /**
  * abstract class for music player, independent from real implementation.
  */
 public final class Player {
-
-  /** The Constant PLAYER_0.  DOCUMENT_ME */
+  /** The Constant PLAYER_0.   */
   private static final String PLAYER_0 = "Player.0";
-
   /** Current file read. */
   private static File fCurrent;
-
   /** Current player used. */
   private static IPlayerImpl playerImpl;
-
   /** Current player used nb 1. */
   private static IPlayerImpl playerImpl1;
-
   /** Current player used nb 2. */
   private static IPlayerImpl playerImpl2;
-
   /** Mute flag. */
   private static boolean bMute = false;
-
   /** Paused flag. */
   private static boolean bPaused = false;
-
   /** Playing ?. */
   private static boolean bPlaying = false;
 
@@ -75,17 +69,35 @@ public final class Player {
 
   /**
    * Asynchronous play for specified file with specified time interval.
-   * 
+   *
    * @param file to play
+   * @param fPosition 
    * @param length in ms
-   * @param fPosition DOCUMENT_ME
-   * 
    * @return true if play is OK
    */
   public static boolean play(final File file, final float fPosition, final long length) {
     if (file == null) {
       throw new IllegalArgumentException("Cannot play empty file.");
     }
+    // Check if the file is on a mounted device, should be tested before but not always, see #1915
+    if (!file.getDevice().isMounted()) {
+      // not mounted, ok let them a chance to mount it:
+      final String sMessage = Messages.getString("Error.025") + " ("
+          + file.getDirectory().getDevice().getName() + Messages.getString("FIFO.4");
+      int i = Messages.getChoice(sMessage, JOptionPane.YES_NO_CANCEL_OPTION,
+          JOptionPane.INFORMATION_MESSAGE);
+      if (i == JOptionPane.YES_OPTION) {
+        try {
+          file.getDevice().mount(true);
+        } catch (Exception e) {
+          Log.error(e);
+          Messages.showErrorMessage(11, file.getDevice().getName());
+          throw new JajukRuntimeException("Device not mounted");
+        }
+      } else { // "cancel" or "no"
+        throw new JajukRuntimeException("Device not mounted");
+      }
+    }
     fCurrent = file;
     try {
       // Choose the player
@@ -140,7 +152,6 @@ public final class Player {
       }
       // Save playing state    
       Conf.setProperty(Const.CONF_STARTUP_STOPPED, "false");
-
       return true;
     } catch (final Throwable t) {
       Properties pDetails = new Properties();
@@ -154,7 +165,7 @@ public final class Player {
   /**
    * Play a web radio stream.
    * 
-   * @param radio DOCUMENT_ME
+   * @param radio 
    * 
    * @return true, if play
    */
@@ -165,7 +176,6 @@ public final class Player {
         Messages.showWarningMessage(Messages.getString("Warning.4"));
         return false;
       }
-      playerImpl = null;
       // Choose the player
       Class<IPlayerImpl> cPlayer = TypeManager.getInstance().getTypeByExtension(Const.EXT_RADIO)
           .getPlayerClass();
@@ -202,7 +212,6 @@ public final class Player {
       }
       // Save playing state    
       Conf.setProperty(Const.CONF_STARTUP_STOPPED, "false");
-
       return true;
     } catch (final Throwable t) {
       Properties pDetails = new Properties();
@@ -230,30 +239,42 @@ public final class Player {
       }
       bPaused = false; // cancel any current pause
       bPlaying = false;
-
     } catch (Exception e) {
-      Log.debug(Messages.getString("Error.008") + e);
+      Log.debug(Messages.getString("Error.008"), e);
     }
   }
 
   /**
    * Alternative Mute/unmute the player.
-   * 
-   * @throws Exception    */
+   *
+   */
   public static void mute() {
-    mute(!Player.bMute);
+    // Ignore mute changes if Bit-perfect mode is enabled
+    // See code should not normally be called because we
+    // disable associated GUI
+    if (Conf.getBoolean(Const.CONF_BIT_PERFECT)) {
+      Log.warn("Bit-perfect option enabled, software mutes ignored");
+      return;
+    }
+    Player.bMute = !Player.bMute;
+    mute(Player.bMute);
   }
 
   /**
    * Mute/unmute the player.
-   * 
-   * @param pMute DOCUMENT_ME
-   * 
-   * @throws Exception    */
+   *
+   * @param pMute 
+   */
   public static void mute(boolean pMute) {
+    // Ignore mute changes if Bit-perfect mode is enabled
+    // See code should not normally be called because we
+    // disable associated GUI
+    if (Conf.getBoolean(Const.CONF_BIT_PERFECT)) {
+      Log.warn("Bit-perfect option enabled, software mutes ignored");
+      return;
+    }
     try {
-      if (playerImpl == null) { // none current player, set mute state and leave
-        Player.bMute = pMute;
+      if (playerImpl == null) { // none current player, leave
         return;
       }
       if (pMute) {
@@ -274,21 +295,26 @@ public final class Player {
 
   /**
    * Checks if is muted.
-   * 
+   *
    * @return whether the player is muted or not
-   * 
-   * @throws Exception    */
+   */
   public static boolean isMuted() {
     return bMute;
   }
 
   /**
    * Set the gain.
-   * 
-   * @param pVolume DOCUMENT_ME
-   * 
-   * @throws Exception    */
+   *
+   * @param pVolume 
+   */
   public static void setVolume(float pVolume) {
+    // Ignore volume changes if Bit-perfect mode is enabled
+    // See code should not normally be called because we
+    // disable associated GUI
+    if (Conf.getBoolean(Const.CONF_BIT_PERFECT)) {
+      Log.warn("Bit-perfect option enabled, software volume changes ignored");
+      return;
+    }
     float fVolume = pVolume;
     try {
       // if user move the volume slider, unmute
@@ -304,10 +330,8 @@ public final class Player {
       if (playerImpl != null) {
         playerImpl.setVolume(fVolume);
       }
-
       // Store the volume
       Conf.setProperty(Const.CONF_VOLUME, Float.toString(fVolume));
-
       // Require all GUI (like volume sliders) to update
       ObservationManager.notify(new JajukEvent(JajukEvents.VOLUME_CHANGED));
     } catch (Exception e) {
@@ -327,7 +351,7 @@ public final class Player {
       return 0;
     }
   }
-  
+
   /**
    * Gets the elapsed time.
    * 
@@ -368,7 +392,19 @@ public final class Player {
       if (playerImpl == null) { // none current player, leave
         return;
       }
-      playerImpl.resume();
+      if (!isMuted()) {
+        playerImpl.setVolume(Conf.getFloat(Const.CONF_VOLUME));
+      }
+      // If we are playing a webradio, we stop and restart because players 
+      // like mplayer can't deal with resuming a stream (it cant restart under 
+      // mplayer when the resume is done after the end of the buffer)
+      if (QueueModel.isPlayingRadio()) {
+        WebRadio radio = QueueModel.getCurrentRadio();
+        stop(true);
+        play(radio);
+      } else {
+        playerImpl.resume();
+      }
       bPaused = false;
       ObservationManager.notify(new JajukEvent(JajukEvents.PLAYER_RESUME));
     } catch (Exception e) {
@@ -388,7 +424,7 @@ public final class Player {
   /**
    * Seek to a given position in %. ex : 0.2 for 20%
    * 
-   * @param pfPosition DOCUMENT_ME
+   * @param pfPosition 
    */
   public static void seek(float pfPosition) {
     float fPosition = pfPosition;
@@ -407,7 +443,6 @@ public final class Player {
     } catch (Exception e) { // we can get some errors in unexpected cases
       Log.debug(e.toString());
     }
-
   }
 
   /**
diff --git a/src/main/java/org/jajuk/services/players/QueueController.java b/src/main/java/org/jajuk/services/players/QueueController.java
index ab99cd7..f1c1978 100644
--- a/src/main/java/org/jajuk/services/players/QueueController.java
+++ b/src/main/java/org/jajuk/services/players/QueueController.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -32,10 +32,7 @@ import org.jajuk.events.Observer;
  * FIFO convenient facilities <singleton>.
  */
 public final class QueueController implements Observer {
-
-  /** DOCUMENT_ME. */
   private static QueueController self = new QueueController();
-
   // Register this item, do not do this in the constructor as the instance is not yet available
   static {
     ObservationManager.register(self);
@@ -76,5 +73,4 @@ public final class QueueController implements Observer {
       QueueModel.clean();
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/players/QueueList.java b/src/main/java/org/jajuk/services/players/QueueList.java
index 006bbb1..18394b3 100644
--- a/src/main/java/org/jajuk/services/players/QueueList.java
+++ b/src/main/java/org/jajuk/services/players/QueueList.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -32,10 +32,8 @@ import org.jajuk.base.File;
  * Provides a container that encapsulates the normal queued items as well as the automatically planned items.
  */
 public class QueueList implements List<StackItem> {
-
   /** Fifo itself, contains jajuk File objects. */
   private static volatile List<StackItem> alQueue = new ArrayList<StackItem>(50);
-
   /** Planned tracks, played if the normal queue is exhausted. */
   private static volatile List<StackItem> alPlanned = new ArrayList<StackItem>(10);
 
@@ -281,7 +279,6 @@ public class QueueList implements List<StackItem> {
 
   // ////////////////////////////////////////////////////////////
   // Methods for Planned tracks
-
   /**
    * Number of planned items.
    * 
@@ -304,9 +301,9 @@ public class QueueList implements List<StackItem> {
 
   /**
    * Adds the planned.
-   * DOCUMENT_ME
    * 
-   * @param c DOCUMENT_ME
+   * 
+   * @param c 
    */
   public void addPlanned(Collection<? extends StackItem> c) {
     for (StackItem item : c) {
@@ -339,7 +336,7 @@ public class QueueList implements List<StackItem> {
   /**
    * Removes the planned from list.
    * 
-   * @param alFiles DOCUMENT_ME
+   * @param alFiles 
    */
   public void removePlannedFromList(List<File> alFiles) {
     for (StackItem item : alPlanned) {
@@ -350,7 +347,7 @@ public class QueueList implements List<StackItem> {
 
   /**
    * Clear planned.
-   * DOCUMENT_ME
+   * 
    */
   public void clearPlanned() {
     alPlanned.clear();
@@ -358,10 +355,9 @@ public class QueueList implements List<StackItem> {
 
   // ///////////////////////////////////////////////////////
   // Additional Methods for Queue handling
-
   /**
    * Contains repeat.
-   * DOCUMENT_ME
+   * 
    * 
    * @return true if...
    */
@@ -376,7 +372,7 @@ public class QueueList implements List<StackItem> {
 
   /**
    * Pop next planned.
-   * DOCUMENT_ME
+   * 
    * 
    * @return the stack item
    */
@@ -391,7 +387,7 @@ public class QueueList implements List<StackItem> {
 
   /**
    * Contains only repeat.
-   * DOCUMENT_ME
+   * 
    * 
    * @return true if...
    */
diff --git a/src/main/java/org/jajuk/services/players/QueueModel.java b/src/main/java/org/jajuk/services/players/QueueModel.java
index f8821eb..669733d 100644
--- a/src/main/java/org/jajuk/services/players/QueueModel.java
+++ b/src/main/java/org/jajuk/services/players/QueueModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -25,9 +25,12 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
 
 import javax.swing.JOptionPane;
 
@@ -39,6 +42,7 @@ import org.jajuk.base.FileManager;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
+import org.jajuk.services.core.ExitService;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.helpers.JajukTimer;
@@ -48,6 +52,7 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.UtilFeatures;
 import org.jajuk.util.UtilGUI;
 import org.jajuk.util.UtilString;
+import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
@@ -71,30 +76,30 @@ import org.jajuk.util.log.Log;
  * correctly handled sometimes, should be refactored into separate class
  */
 public final class QueueModel {
-
   /** Currently played track index or -1 if none playing item. */
-  private static volatile int index;
-
+  private static volatile int index = -1;
   /** Last played track. */
   static volatile StackItem itemLast;
-
-  /** The Fifo itself, contains jajuk File objects. This also includes an optional bunch of planned tracks which are accessible with separate methods. */
+  /**
+   * The Fifo itself, contains jajuk File objects. This also includes an
+   * optional bunch of planned tracks which are accessible with separate
+   * methods.
+   */
   private static volatile QueueList queue = new QueueList();
-
   /** Stop flag*. */
   private static volatile boolean bStop = true;
-
   /** First played file flag. */
   private static boolean bFirstFile = true;
-
   /** Whether we are currently playing radio. */
   private static volatile boolean playingRadio = false;
-
   /** Current played radio. */
   private static volatile WebRadio currentRadio;
-
   /** Last played track actually played duration in ms before a stop. */
   private static long lastDuration;
+  /** Should be stop after current track playback ?. */
+  private static boolean bStopAfter;
+  /** Whether a required stop comes from jajuk */
+  private static boolean bInternalStop;
 
   /**
    * Gets the last duration.
@@ -114,7 +119,8 @@ public final class QueueModel {
   /**
    * FIFO total re-initialization.
    * 
-   * Do not set  itemLast to null as we need to keep this information in some places
+   * Do not set itemLast to null as we need to keep this information in some
+   * places
    */
   public static void reset() {
     clear();
@@ -125,8 +131,8 @@ public final class QueueModel {
   }
 
   /**
-   * Clears the fifo, for example when we want to add a group of files stopping
-   * previous plays.
+   * Clears the fifo, for example when we want to add a group of files
+   * stopping previous plays.
    */
   public static void clear() {
     queue.clear();
@@ -135,33 +141,37 @@ public final class QueueModel {
   }
 
   /**
-   * Remove all items from the given album just before and after the given
+   * Remove current item (it is always removed independently of its album) and all items from the given album just before and after the given
    * index, i.e. remove all tracks before and after the current one that have
    * the same album.
    * 
-   * @param index The index from where to remove.
-   * @param album The album to remove.
+   * @param index
+   *            The index from where to remove.
+   * @param album
+   *            The album to remove.
    */
   public static void resetAround(int index, Album album) {
-    int begin = 0;
-    int end = 0;
+    Set<Integer> indexesToRemove = new TreeSet<Integer>();
+    // Add provided index, this one is always removed
+    indexesToRemove.add(index);
     for (int i = index; i >= 0; i--) {
       if (queue.get(i).getFile().getTrack().getAlbum().equals(album)) {
-        begin = i;
+        indexesToRemove.add(i);
       }
     }
     for (int i = index; i < queue.size(); i++) {
       if (queue.get(i).getFile().getTrack().getAlbum().equals(album)) {
-        end = i;
+        indexesToRemove.add(i);
       }
     }
-    remove(begin, end);
+    remove(indexesToRemove);
   }
 
   /**
    * Set given repeat mode to all in FIFO.
    * 
-   * @param bRepeat True, if repeat mode should be turned on, false otherwise.
+   * @param bRepeat
+   *            True, if repeat mode should be turned on, false otherwise.
    */
   public static void setRepeatModeToAll(boolean bRepeat) {
     for (StackItem item : queue) {
@@ -173,8 +183,10 @@ public final class QueueModel {
    * Asynchronous version of push (needed to perform long-task out of awt
    * dispatcher thread).
    * 
-   * @param alItems The list of items to push.
-   * @param bKeepPrevious keep previous files or stop them to start a new one ?
+   * @param alItems
+   *            The list of items to push.
+   * @param bKeepPrevious
+   *            keep previous files or stop them to start a new one ?
    */
   public static void push(final List<StackItem> alItems, final boolean bKeepPrevious) {
     push(alItems, bKeepPrevious, false);
@@ -184,14 +196,18 @@ public final class QueueModel {
    * Asynchronous version of push (needed to perform long-task out of awt
    * dispatcher thread).
    * 
-   * @param alItems The list of items to push.
-   * @param bKeepPrevious keep previous files or stop them to start a new one ?
-   * @param bPushNext whether the selection is added after playing track (mutual
-   * exclusive with simple push)
+   * @param alItems
+   *            The list of items to push.
+   * @param bKeepPrevious
+   *            keep previous files or stop them to start a new one ?
+   * @param bPushNext
+   *            whether the selection is added after playing track (mutual
+   *            exclusive with simple push)
    */
   public static void push(final List<StackItem> alItems, final boolean bKeepPrevious,
       final boolean bPushNext) {
-    Thread t = new Thread("Queue Push Thread") { // do it in a thread to make
+    Thread t = new Thread("Queue Push Thread") { // do it in a thread to
+      // make
       // UI more reactive
       @Override
       public void run() {
@@ -215,8 +231,10 @@ public final class QueueModel {
    * Asynchronous version of push (needed to perform long-task out of awt
    * dispatcher thread).
    * 
-   * @param item The item to push.
-   * @param bKeepPrevious keep previous files or stop them to start a new one ?
+   * @param item
+   *            The item to push.
+   * @param bKeepPrevious
+   *            keep previous files or stop them to start a new one ?
    */
   public static void push(final StackItem item, final boolean bKeepPrevious) {
     push(item, bKeepPrevious, false);
@@ -226,10 +244,13 @@ public final class QueueModel {
    * Asynchronous version of push (needed to perform long-task out of awt
    * dispatcher thread).
    * 
-   * @param item The item to push.
-   * @param bKeepPrevious keep previous files or stop them to start a new one ?
-   * @param bPushNext whether the selection is added after playing track (mutual
-   * exclusive with simple push)
+   * @param item
+   *            The item to push.
+   * @param bKeepPrevious
+   *            keep previous files or stop them to start a new one ?
+   * @param bPushNext
+   *            whether the selection is added after playing track (mutual
+   *            exclusive with simple push)
    */
   public static void push(final StackItem item, final boolean bKeepPrevious, final boolean bPushNext) {
     Thread t = new Thread("Queue Push Thread") {
@@ -255,16 +276,17 @@ public final class QueueModel {
   /**
    * Launch a web radio.
    * 
-   * @param radio webradio to launch
+   * @param radio
+   *            webradio to launch
    */
   public static void launchRadio(WebRadio radio) {
     try {
       UtilGUI.waiting();
       /**
-       * Force buttons to opening mode by default, then if they start correctly,
-       * a PLAYER_PLAY event will be notified to update to final state. We
-       * notify synchronously to make sure the order between these two events
-       * will be correct*
+       * Force buttons to opening mode by default, then if they start
+       * correctly, a PLAYER_PLAY event will be notified to update to
+       * final state. We notify synchronously to make sure the order
+       * between these two events will be correct*
        */
       ObservationManager.notifySync(new JajukEvent(JajukEvents.PLAY_OPENING));
       currentRadio = radio;
@@ -275,10 +297,20 @@ public final class QueueModel {
         playingRadio = true;
         // Store current radio for next startup
         Conf.setProperty(Const.CONF_DEFAULT_WEB_RADIO, radio.getName());
-        // Send an event that a track has been launched
+        // Send an event that a webradio has been launched        
         Properties pDetails = new Properties();
         pDetails.put(Const.DETAIL_CONTENT, radio);
         ObservationManager.notify(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED, pDetails));
+        //If Webradio info had been updated for current station by WebRadioPlayerImpl then notify again with the updated info
+        Properties webradioInfoUpdatedEvent = ObservationManager
+            .getDetailsLastOccurence(JajukEvents.WEBRADIO_INFO_UPDATED);
+        if (webradioInfoUpdatedEvent != null) {
+          WebRadio updatedWebRadio = (WebRadio) webradioInfoUpdatedEvent.get(Const.DETAIL_CONTENT);
+          if (radio.getName().equals(updatedWebRadio.getName())) {
+            ObservationManager.notify(new JajukEvent(JajukEvents.WEBRADIO_INFO_UPDATED,
+                webradioInfoUpdatedEvent));
+          }
+        }
         bStop = false;
       }
     } catch (Throwable t) {// catch even Errors (OutOfMemory for example)
@@ -292,10 +324,13 @@ public final class QueueModel {
   /**
    * Push some files in the fifo.
    * 
-   * @param item , item to be played
-   * @param bKeepPrevious keep previous files or stop them to start a new one ?
-   * @param bPushNext whether the selection is added after playing track (mutual
-   * exclusive with simple push)
+   * @param item
+   *            , item to be played
+   * @param bKeepPrevious
+   *            keep previous files or stop them to start a new one ?
+   * @param bPushNext
+   *            whether the selection is added after playing track (mutual
+   *            exclusive with simple push)
    */
   private static void pushCommand(StackItem item, boolean bKeepPrevious, final boolean bPushNext) {
     List<StackItem> alFiles = new ArrayList<StackItem>(1);
@@ -306,9 +341,12 @@ public final class QueueModel {
   /**
    * Push some stack items in the fifo.
    * 
-   * @param alItems , list of items to be played
-   * @param bKeepPrevious keep previous files or stop them to start a new one ?
-   * @param bPushNext whether the selection is added in first in queue
+   * @param alItems
+   *            , list of items to be played
+   * @param bKeepPrevious
+   *            keep previous files or stop them to start a new one ?
+   * @param bPushNext
+   *            whether the selection is added in first in queue
    */
   private static void pushCommand(List<StackItem> alItems, boolean bKeepPrevious,
       final boolean bPushNext) {
@@ -329,21 +367,25 @@ public final class QueueModel {
           if (!bNoMount) {
             // not mounted, ok let them a chance to mount it:
             final String sMessage = Messages.getString("Error.025") + " ("
-                + item.getFile().getDirectory().getDevice().getName()
-                + Messages.getString("FIFO.4");
+                + item.getFile().getDevice().getName() + Messages.getString("FIFO.4");
             int i = Messages.getChoice(sMessage, JOptionPane.YES_NO_CANCEL_OPTION,
                 JOptionPane.INFORMATION_MESSAGE);
             if (i == JOptionPane.YES_OPTION) {
               try {
-                item.getFile().getDirectory().getDevice().mount(true);
+                item.getFile().getDevice().mount(true);
               } catch (Exception e) {
                 it.remove();
                 Log.error(e);
-                Messages.showErrorMessage(11, item.getFile().getDirectory().getDevice().getName());
+                Messages.showErrorMessage(11, item.getFile().getDevice().getName());
                 return;
               }
             } else if (i == JOptionPane.NO_OPTION) {
               bNoMount = true; // do not ask again
+              // If only a single track was pushed and user decided not to 
+              // mount its device, do not display another error message about void selection
+              if (alItems.size() == 1) {
+                return;
+              }
               it.remove();
             } else if (i == JOptionPane.CANCEL_OPTION) {
               return;
@@ -359,10 +401,19 @@ public final class QueueModel {
           Messages.showWarningMessage(Messages.getString("Warning.6"));
           return;
         }
-
+        // clear queue if selection contains some repeat items and we are not in repeat all mode
+        if (!Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL)) {
+          for (StackItem item : alItems) {
+            if (item.isRepeat()) {
+              clear();
+              break;
+            }
+          }
+        }
+        // Reset repeat state for all previous items
+        setRepeatModeToAll(false);
         // Position of insert into the queue
         int pos = (queue.size() == 0) ? 0 : queue.size();
-
         // OK, stop current track if no append
         if (!bKeepPrevious && !bPushNext) {
           index = pos;
@@ -376,7 +427,6 @@ public final class QueueModel {
         else if (bKeepPrevious && queue.size() > 0) {
           pos = queue.size();
         }
-
         // add required tracks in the FIFO
         for (StackItem item : alItems) {
           if (pos >= queue.size()) {
@@ -406,7 +456,8 @@ public final class QueueModel {
   /**
    * Contains repeated item.
    * 
-   * @param items The items to check for repeat.
+   * @param items
+   *            The items to check for repeat.
    * 
    * @return whether a stack item list contains a least one repeated item
    */
@@ -430,7 +481,7 @@ public final class QueueModel {
 
   /**
    * Finished method, called by the PlayerImpl when the track is finished or
-   * should be finished (in case of intro mode or crass fade).
+   * should be finished (in case of intro mode or cross fade).
    */
   public static void finished() {
     finished(false);
@@ -438,52 +489,31 @@ public final class QueueModel {
 
   /**
    * Finished method, called by the PlayerImpl when the track is finished or
-   * should be finished (in case of intro mode, crass fade, previous/next track ...).
+   * should be finished (in case of intro mode, crass fade, previous/next
+   * track ...).
    * 
-   * @param forceNext whether to play the next track, even in single repeat.
+   * @param forceNext
+   *            whether to play the next track, even in single repeat.
    */
   public static void finished(boolean forceNext) {
     try {
+      // Tell jajuk not to enable fade-out for this kind of stop request
+      bInternalStop = true;
       // If no playing item, just leave
       StackItem current = getCurrentItem();
       if (current == null) {
         return;
       }
-      if (getPlayingFile() != null) {
-        Properties details = new Properties();
-        details.put(Const.DETAIL_CURRENT_FILE, getPlayingFile());
-        details.put(Const.DETAIL_CONTENT, Player.getActuallyPlayedTimeMillis());
-        ObservationManager.notify(new JajukEvent(JajukEvents.FILE_FINISHED, details));
-      }
-
-      if (current.isRepeat()) {
-        // if the track was in repeat mode, don't remove it from the
-        // fifo but inc index
-        // find the next item is in repeat mode if any
-        if (index < queue.size() - 1) {
-          StackItem itemNext = queue.get(index + 1);
-          // if next track is repeat, inc index
-          if (itemNext.isRepeat() || forceNext) {
-            index++;
-          }
-        } else { // We reached end of fifo
-          // make to shuffle the fifo before playing back repeated selection if any
-          if (Conf.getBoolean(Const.CONF_STATE_SHUFFLE) && queue.containsOnlyRepeat()) {
-            UtilFeatures.forcedShuffle(queue);
-          }
-          StackItem itemNext = queue.get(0);
-          // if next track is repeat, inc index, otherwise we keep the current index
-          if (itemNext.isRepeat() || forceNext) {
-            index = 0;
-          }
-        }
-      } else if (index < queue.size()) {
-        StackItem item = queue.get(index);
-        JajukTimer.getInstance().removeTrackTime(item.getFile());
-        index++;
+      notifyFinishedIfRequired();
+      computeNewIndex(forceNext, current);
+      unsetRepeatModeIfRequired(current);
+      // Leave if stop after current track option is set
+      if (bStopAfter) {
+        bStopAfter = false;
+        stopRequest();
+        return;
       }
-
-      // Nothing more to play ? check if we in continue mode
+      // Nothing more to play ? check if we are in continue mode
       if (queue.size() == 0 || index >= queue.size()) {
         if (Conf.getBoolean(Const.CONF_STATE_CONTINUE) && itemLast != null) {
           final StackItem item = queue.popNextPlanned();
@@ -510,32 +540,81 @@ public final class QueueModel {
         // something more in FIFO
         launch();
       }
-
-      // Clean up trailing tracks in CONF_DROP_PLAYED_TRACKS_FROM_QUEUE mode
-      if (index > 0 && Conf.getBoolean(Const.CONF_DROP_PLAYED_TRACKS_FROM_QUEUE)) {
-        int lastItemtoRemove = -1;
-        for (int i = 0; i < index; i++) {
-          if (!getItem(i).isRepeat()) {
-            lastItemtoRemove = i;
-          }
-        }
-        remove(0, lastItemtoRemove);
-      }
       // computes planned tracks
       computesPlanned(false);
     } catch (Exception e) {
       Log.error(e);
     } finally {
+      bInternalStop = false;
       // refresh playlist editor
       ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
     }
   }
 
   /**
+   * Drop the repeat properties of single tracks in single repeat mode to make
+   *  sure already played tracks are no longer in repeat mode 
+   * @param current
+   */
+  private static void unsetRepeatModeIfRequired(StackItem current) {
+    if (Conf.getBoolean(Const.CONF_STATE_REPEAT) && current.isRepeat()) {
+      current.setRepeat(false);
+    }
+  }
+
+  /**
+   * Set a new value for the index. Note that this method has to be synchronized to handle concurrency from push
+   * @param forceNext
+   * @param current
+   */
+  private static synchronized void computeNewIndex(boolean forceNext, StackItem current) {
+    if (Conf.getBoolean(Const.CONF_STATE_SHUFFLE) && queue.size() > 1
+    // In repeat mode, shuffle has no effect
+        && !Conf.getBoolean(Const.CONF_STATE_REPEAT)) {
+      index = UtilSystem.getRandom().nextInt(queue.size() - 1);
+    } else if (current.isRepeat()) {
+      // if the track was in repeat mode, don't remove it from the
+      // fifo but increment the index
+      if (index < queue.size() - 1) {
+        StackItem itemNext = queue.get(index + 1);
+        // if next track is repeat, inc index
+        if (itemNext.isRepeat() || forceNext) {
+          index++;
+        }
+      } else { // We reached end of fifo
+        StackItem itemNext = queue.get(0);
+        // if next track is repeat, inc index, otherwise we keep the
+        // current index
+        if (itemNext.isRepeat() || forceNext) {
+          index = 0;
+        }
+      }
+    } else if (index < queue.size()) {
+      index++;
+    }
+  }
+
+  private static void notifyFinishedIfRequired() {
+    if (getPlayingFile() != null) {
+      Properties details = new Properties();
+      details.put(Const.DETAIL_CURRENT_FILE, getPlayingFile());
+      details.put(Const.DETAIL_CONTENT, Player.getActuallyPlayedTimeMillis());
+      ObservationManager.notify(new JajukEvent(JajukEvents.FILE_FINISHED, details));
+    }
+  }
+
+  /**
+   * @return the bInternalStop
+   */
+  public static boolean isInternalStop() {
+    return bInternalStop || ExitService.isExiting();
+  }
+
+  /**
    * To do when nothing more is to played,.
    */
   private static void endOfQueueReached() {
-    reset();
+    stopRequest();
     if (queue.size() > 0) {
       ObservationManager.notify(new JajukEvent(JajukEvents.PLAYER_STOP));
     } else {
@@ -555,47 +634,46 @@ public final class QueueModel {
       UtilGUI.waiting();
       File toPlay = getItem(index).getFile();
       /**
-       * Force buttons to opening mode by default, then if they start correctly,
-       * a PLAYER_PLAY event will be notified to update to final state. We
-       * notify synchronously to make sure the order between these two events
-       * will be correct*
+       * Force buttons to opening mode by default, then if they start
+       * correctly, a PLAYER_PLAY event will be notified to update to
+       * final state. We notify synchronously to make sure the order
+       * between these two events will be correct*
        */
       ObservationManager.notifySync(new JajukEvent(JajukEvents.PLAY_OPENING));
-
-      // Check if we are in single repeat mode, transfer it to new launched
-      // track
+      // Check if we are in single repeat mode, transfer it to new
+      // launched track
       if (Conf.getBoolean(Const.CONF_STATE_REPEAT)) {
-        setRepeatModeToAll(false);
         getCurrentItem().setRepeat(true);
         ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
       }
-
       boolean bPlayOK = false;
-
-      // bfirstFile flag is used to set a offset (in %) if required (if we are playing the last item at given position) 
-      // Known limitation : if the last session's last played item is no more available, the offset is applied
-      // to another file. We think that it doesn't worth making things more complicated.
+      // bfirstFile flag is used to set a offset (in %) if required (if we
+      // are playing the last item at given position)
+      // Known limitation : if the last session's last played item is no
+      // more available, the offset is applied
+      // to another file. We think that it doesn't worth making things
+      // more complicated.
       if (bFirstFile && !Conf.getBoolean(Const.CONF_STATE_INTRO)
           && Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_LAST_KEEP_POS)) {
         // if it is the first played file of the session and we are in
         // startup mode keep position
-        float fPos = Conf.getFloat(Const.CONF_STARTUP_LAST_POSITION);
+        float fPos = UtilFeatures.readPersistedPlayingPosition();
         // play it
         bPlayOK = Player.play(toPlay, fPos, Const.TO_THE_END);
       } else {
         if (Conf.getBoolean(Const.CONF_STATE_INTRO)) {
           // intro mode enabled
-          bPlayOK = Player.play(toPlay, Float.parseFloat(Conf
-              .getString(Const.CONF_OPTIONS_INTRO_BEGIN)) / 100, 1000 * Integer.parseInt(Conf
-              .getString(Const.CONF_OPTIONS_INTRO_LENGTH)));
+          bPlayOK = Player.play(toPlay,
+              Float.parseFloat(Conf.getString(Const.CONF_OPTIONS_INTRO_BEGIN)) / 100,
+              1000 * Integer.parseInt(Conf.getString(Const.CONF_OPTIONS_INTRO_LENGTH)));
         } else {
           // normal mode
           bPlayOK = Player.play(toPlay, 0.0f, Const.TO_THE_END);
         }
       }
-
       if (bPlayOK) {
-        // notify to devices like commandJPanel to update UI when the play
+        // notify to devices like commandJPanel to update UI when the
+        // play
         // button has been pressed
         ObservationManager.notify(new JajukEvent(JajukEvents.PLAYER_PLAY));
         Log.debug("Now playing :" + toPlay);
@@ -607,22 +685,21 @@ public final class QueueModel {
         pDetails.put(Const.DETAIL_CURRENT_FILE_ID, toPlay.getID());
         pDetails.put(Const.DETAIL_CURRENT_DATE, Long.valueOf(System.currentTimeMillis()));
         ObservationManager.notify(new JajukEvent(JajukEvents.FILE_LAUNCHED, pDetails));
-        // Save the last played track (even files in error are stored here as
-        // we need this for computes next track to launch after an error)
-        // We have to set this line here as we make directory change analyze
-        // before for cover change
+        // Save the last played track (even files in error are stored
+        // here as we need this for computes next track to launch after an
+        // error)
+        // We have to set this line here as we make directory change
+        // analyze before for cover change
         itemLast = (StackItem) getCurrentItem().clone();
         playingRadio = false;
         bFirstFile = false;
         // add hits number
         toPlay.getTrack().incHits(); // inc hits number
-
         // recalculate the total time left
         JajukTimer.getInstance().reset();
         for (int i = index; i < queue.size(); i++) {
           JajukTimer.getInstance().addTrackTime(queue.get(i).getFile());
         }
-
       } else {
         // Problem launching the track, try next one
         UtilGUI.stopWaiting();
@@ -632,15 +709,16 @@ public final class QueueModel {
         } catch (InterruptedException e) {
           Log.error(e);
         }
-        // save the last played track (even files in error are stored here as
-        // we need this for computes next track to launch after an error)
+        // save the last played track (even files in error are stored
+        // here as we need this for computes next track to launch after an
+        // error)
         if (getCurrentItem() != null) {
           itemLast = (StackItem) getCurrentItem().clone();
         } else {
           itemLast = null;
         }
-
-        // We test if user required stop. Must be done here to make a chance to
+        // We test if user required stop. Must be done here to make a
+        // chance to
         // stop before starting a new track
         if (!bStop) {
           finished();
@@ -656,71 +734,49 @@ public final class QueueModel {
   /**
    * Computes planned tracks.
    * 
-   * @param bClear : clear planned tracks stack
+   * @param bClear
+   *            : clear planned tracks stack
    */
   public static void computesPlanned(boolean bClear) {
     // Check if we are in continue mode and we have some tracks in FIFO, if
     // not : no planned tracks
-    if (!Conf.getBoolean(Const.CONF_STATE_CONTINUE) || containsRepeat() || queue.size() == 0) {
+    if (!Conf.getBoolean(Const.CONF_STATE_CONTINUE) || containsRepeat() || queue.size() == 0
+        || Conf.getBoolean(Const.CONF_STATE_SHUFFLE)) {
       queue.clearPlanned();
       return;
     }
     if (bClear) {
       queue.clearPlanned();
     }
-
     int missingPlannedSize = Conf.getInt(Const.CONF_OPTIONS_VISIBLE_PLANNED) - queue.sizePlanned();
-
-    /*
-     * To compute missing planned tracks in shuffle state, we get a global shuffle list and we sub
-     * list it. This avoid calling a getShuffle() on file manager file by file because it is very
-     * costly
-     */
-    if (Conf.getBoolean(Const.CONF_STATE_SHUFFLE)) {
-      // first get a list of "candidates"
-      List<File> alFiles = FileManager.getInstance().getGlobalShufflePlaylist();
-
-      // then remove already planned tracks from the list
-      queue.removePlannedFromList(alFiles);
-
-      // cut down list to the number of files that are missing
-      if (alFiles.size() >= missingPlannedSize) {
-        alFiles = alFiles.subList(0, missingPlannedSize - 1);
+    for (int i = 0; i < missingPlannedSize; i++) {
+      StackItem item = null;
+      StackItem siLast = null; // last item in fifo or planned
+      // if planned stack contains yet some tracks
+      if (queue.sizePlanned() > 0) {
+        siLast = queue.getPlanned(queue.sizePlanned() - 1); // last
+        // one
+      } else if (queue.size() > 0) { // if fifo contains yet some
+        // tracks to play
+        siLast = queue.get(queue.size() - 1); // last one
       }
-
-      // wrap the Files in StackItems and add them as planned items.
-      List<StackItem> missingPlanned = UtilFeatures.createStackItems(alFiles, Conf
-          .getBoolean(Const.CONF_STATE_REPEAT_ALL), false);
-      queue.addPlanned(missingPlanned);
-    } else {
-      for (int i = 0; i < missingPlannedSize; i++) {
-        StackItem item = null;
-        StackItem siLast = null; // last item in fifo or planned
-        // if planned stack contains yet some tracks
-        if (queue.sizePlanned() > 0) {
-          siLast = queue.getPlanned(queue.sizePlanned() - 1); // last one
-        } else if (queue.size() > 0) { // if fifo contains yet some
-          // tracks to play
-          siLast = queue.get(queue.size() - 1); // last one
-        }
-        try {
-          // if fifo contains yet some tracks to play
-          if (siLast != null) {
-            item = new StackItem(FileManager.getInstance().getNextFile(siLast.getFile()), false);
-          } else { // nothing in fifo, take first files in
-            // collection
-            List<File> files = FileManager.getInstance().getFiles();
-            item = new StackItem(files.get(0), false);
-          }
-          // Tell it is a planned item
-          item.setPlanned(true);
-          // add the new item
-          queue.addPlanned(item);
-        } catch (JajukException je) {
-          // can be thrown if FileManager return a null file (like when
-          // reaching end of collection)
-          break;
+      try {
+        // if fifo contains yet some tracks to play
+        if (siLast != null) {
+          item = new StackItem(FileManager.getInstance().getNextFile(siLast.getFile()), false);
+        } else { // nothing in fifo, take first files in
+          // collection
+          List<File> files = FileManager.getInstance().getFiles();
+          item = new StackItem(files.get(0), false);
         }
+        // Tell it is a planned item
+        item.setPlanned(true);
+        // add the new item
+        queue.addPlanned(item);
+      } catch (JajukException je) {
+        // can be thrown if FileManager return a null file (like
+        // when reaching the end of the collection)
+        break;
       }
     }
   }
@@ -750,6 +806,10 @@ public final class QueueModel {
       if (index > 0) {
         index--;
       }
+      // Except if we are in full repeat, then we jump to last item
+      else if (Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL)) {
+        index = queue.size() - 1;
+      }
       launch();
     } catch (Exception e) {
       Log.error(e);
@@ -835,18 +895,15 @@ public final class QueueModel {
   public static void playNextAlbum() {
     try {
       bStop = false;
-
       // if playing, stop all playing players
       if (Player.isPlaying()) {
         Player.stop(true);
       }
-
       // we don't support album navigation inside repeated tracks
       if (getQueueSize() > 0 && getItem(0).isRepeat()) {
         playNext();
         return;
       }
-
       int indexFirstItem = -1;
       if (getPlayingFile() != null) {
         // ref directory
@@ -876,7 +933,8 @@ public final class QueueModel {
         List<File> files = UtilFeatures.getPlayableFiles(album);
         List<StackItem> stack = UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
             Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL), true);
-        // Find index to go to (first index with a file whose dir is different
+        // Find index to go to (first index with a file whose dir is
+        // different
         // from current one)
         int index = getIndex();
         Directory currentDir = null;
@@ -924,7 +982,6 @@ public final class QueueModel {
       }
       return title;
     }
-
     return null;
   }
 
@@ -944,12 +1001,13 @@ public final class QueueModel {
   /**
    * Get an item at given index in FIFO.
    * 
-   * @param lIndex : index
+   * @param index
+   *            : index
    * 
    * @return stack item
    */
-  public static StackItem getItem(int lIndex) {
-    return queue.get(lIndex);
+  public static StackItem getItem(int index) {
+    return queue.get(index);
   }
 
   /**
@@ -975,7 +1033,8 @@ public final class QueueModel {
    * Return true if none file is playing or planned to play for the given
    * device.
    * 
-   * @param device device to unmount
+   * @param device
+   *            device to unmount
    * 
    * @return true, if can unmount
    */
@@ -987,13 +1046,15 @@ public final class QueueModel {
       // is current track on this device?
       return false;
     }
-    Iterator<StackItem> it = queue.iterator();
+    // work on a queue copy to avoid the concurrent access issues
+    List<StackItem> copy = new ArrayList<StackItem>(queue);
+    Iterator<StackItem> it = copy.iterator();
     // are next tracks in fifo on this device?
     while (it.hasNext()) {
       StackItem item = it.next();
       File file = item.getFile();
       if (file.getDirectory().getDevice().equals(device)) {
-        return false;
+        queue.remove(item);
       }
     }
     return true;
@@ -1027,7 +1088,7 @@ public final class QueueModel {
   /**
    * Gets the queue.
    * 
-   * @return Returns a shallow copy of the fifo
+   * @return Returns a defensive copy of the fifo
    */
   public static List<StackItem> getQueue() {
     return queue.getQueue();
@@ -1043,29 +1104,12 @@ public final class QueueModel {
   }
 
   /**
-   * Shuffle the FIFO, used when user select the Random mode.
-   */
-  public static void shuffle() {
-    if (queue.size() > 1) {
-      StackItem currentItem = null;
-      if (index >= 0) {
-        queue.get(index);
-      }
-      UtilFeatures.forcedShuffle(queue);
-      if (currentItem != null) {
-        index = queue.indexOf(currentItem);
-      }
-      // Refresh Queue View
-      ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
-    }
-    queue.clearPlanned(); // force recomputes planned tracks
-  }
-
-  /**
    * Insert a file to play in FIFO at specified position.
    * 
-   * @param iPos The position where the item is inserted.
-   * @param item the item to insert.
+   * @param item
+   *            the item to insert.
+   * @param iPos
+   *            The position where the item is inserted.
    */
   public static void insert(StackItem item, int iPos) {
     List<StackItem> alStack = new ArrayList<StackItem>(1);
@@ -1074,11 +1118,13 @@ public final class QueueModel {
   }
 
   /**
-   * Insert a file at specified position, any existing item at this position is
-   * shifted on the right.
+   * Insert a file at specified position, any existing item at this position
+   * is shifted on the right.
    * 
-   * @param iPos The position where the items are inserted.
-   * @param alFiles The list of items to insert.
+   * @param alFiles
+   *            The list of items to insert.
+   * @param iPos
+   *            The position where the items are inserted.
    */
   public static void insert(List<StackItem> alFiles, int iPos) {
     if (iPos <= queue.size()) {
@@ -1099,7 +1145,8 @@ public final class QueueModel {
   /**
    * Put up an item from given index to index-1.
    * 
-   * @param lIndex The index to move up in the queue.
+   * @param lIndex
+   *            The index to move up in the queue.
    */
   public static void up(int lIndex) {
     if (lIndex == 0 || lIndex >= queue.size()) {
@@ -1121,11 +1168,13 @@ public final class QueueModel {
   /**
    * Put down an item from given index to index+1.
    * 
-   * @param lIndex The index to move down in the queue.
+   * @param lIndex
+   *            The index to move down in the queue.
    */
   public static void down(int lIndex) {
     if (lIndex >= queue.size() - 1) {
-      // Can't put down last track in FIFO. This should be already made by ui behavior
+      // Can't put down last track in FIFO. This should be already made by
+      // ui behavior
       return;
     }
     StackItem item = queue.get(lIndex);
@@ -1139,17 +1188,13 @@ public final class QueueModel {
   /**
    * Go to given index and launch it.
    * 
-   * @param pIndex The index to go to in the queue.
+   * @param pIndex
+   *            The index to go to in the queue.
    */
   public static void goTo(final int pIndex) {
     bStop = false;
     try {
-      if (Conf.getBoolean(Const.CONF_DROP_PLAYED_TRACKS_FROM_QUEUE)) {
-        remove(0, pIndex - 1);
-        index = 0;
-      } else {
-        index = pIndex;
-      }
+      index = pIndex;
       // need to stop before launching! this fixes a
       // wrong EOM event in BasicPlayer
       Player.stop(false);
@@ -1160,26 +1205,81 @@ public final class QueueModel {
   }
 
   /**
-   * Remove files at specified positions.
+   * Remove a track at specified index from the queue model.
    * 
-   * @param iStart Position from where to start removing.
-   * @param iStop Position from up to where items are removed.
+   * @param int index
+   *            index of the item to remove
+   *               
+   **/
+  public static void remove(final int index) {
+    Set<Integer> indexes = new HashSet<Integer>(1);
+    indexes.add(index);
+    remove(indexes);
+  }
+
+  /**
+   * Remove files at specified indexes.
+     * @param Set<Integer> indexes
+   *            set of index to drop. We expect the array to contain integers sorted by ascendent order. The set may be void (a warning is then logged) but not null
    */
-  public static void remove(int iStart, int iStop) {
-    if (iStart <= iStop && iStart >= 0 && iStop < queue.size() + queue.sizePlanned()) {
-      // check size drop items from the end to the beginning
-      for (int i = iStop; i >= iStart; i--) {
-        StackItem item = queue.get(i);
-        JajukTimer.getInstance().removeTrackTime(item.getFile());
-        // remove this file from fifo
-        queue.remove(i);
-        if (i <= index) {
-          index--;
+  public static void remove(final Set<Integer> initialIndexes) {
+    List<Integer> indexes = new ArrayList<Integer>(initialIndexes);
+    // controls indexes
+    if (indexes.size() == 0) {
+      Log.warn("Removal required for a void list of indexes");
+      return;
+    }
+    for (int indexToRemove : indexes) {
+      if (indexToRemove < 0 || indexToRemove >= queue.size()) {
+        throw new IllegalStateException("Illegal removal index : " + index + " / " + queue.size()
+            + " / " + queue.sizePlanned());
+      }
+    }
+    boolean removePlayedTrack = isPlayingTrack() && initialIndexes.contains(QueueModel.index);
+    boolean removePlayedTrackThatIsLastInQueue = removePlayedTrack
+        && indexes.get(indexes.size() - 1) == (queue.size() - 1);
+    StackItem firstPlannedTrack = null;
+    List<StackItem> plannedQueue = QueueModel.getPlanned();
+    if (plannedQueue.size() > 0) {
+      firstPlannedTrack = plannedQueue.get(0);
+      firstPlannedTrack.setPlanned(false);
+    }
+    for (int indexToRemove : indexes) {
+      // Remove this file from fifo and recompute current index if required.
+      // We have to decrement current index if we drop tracks prior current or 
+      // if we dropped the last item.
+      queue.remove(indexToRemove);
+      if (indexToRemove < index || removePlayedTrackThatIsLastInQueue) {
+        index--;
+      }
+      // Recompute indexes to remove to take into account the offset created by the removal.
+      // First indexes may become negative, this is not an issue as they are already processed.
+      int comp = 0;
+      for (int i : indexes) {
+        if (i >= indexToRemove) {
+          indexes.set(comp, i - 1);
         }
-        // Recomputes all planned tracks from last file in fifo
-        computesPlanned(true);
+        comp++;
+      }
+    }
+    // Take launcher actions due to removals
+    // If this is the playing track, stop it before dropping it
+    // However, we have an issue if we remove the last file of the queue if it is playing : the new first 
+    // planned track of the new queue is the removed file itself so we would replay the removed track again. 
+    // To avoid this, we store the first planned track and we force it.  
+    if (removePlayedTrack) {
+      if (removePlayedTrackThatIsLastInQueue) {
+        if (firstPlannedTrack != null) { // null is not in continue mode
+          push(firstPlannedTrack, false);
+        } else {
+          stopRequest();
+        }
+      } else {
+        goTo(index);
       }
     }
+    // Recomputes all planned tracks from last file in fifo
+    computesPlanned(true);
   }
 
   /**
@@ -1228,7 +1328,7 @@ public final class QueueModel {
   /**
    * Gets the planned.
    * 
-   * @return Returns a shallow copy of planned files
+   * @return Returns a defensive copy of planned files
    */
   public static List<StackItem> getPlanned() {
     return queue.getPlanned();
@@ -1237,17 +1337,24 @@ public final class QueueModel {
   /**
    * Store current FIFO as a list.
    * 
-   * @throws IOException Signals that an I/O exception has occurred.
+   * @throws IOException
+   *             Signals that an I/O exception has occurred.
    */
   public static void commit() throws IOException {
-    java.io.File file = SessionService.getConfFileByPath(Const.FILE_FIFO);
-    PrintWriter writer = new PrintWriter(
-        new BufferedOutputStream(new FileOutputStream(file, false)));
+    java.io.File out = SessionService.getConfFileByPath(Const.FILE_FIFO + "."
+        + Const.FILE_SAVING_FILE_EXTENSION);
+    PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(out, false)));
     for (StackItem st : queue) {
       writer.println(st.getFile().getID());
     }
     writer.flush();
     writer.close();
+    //Store index
+    Conf.setProperty(Const.CONF_STARTUP_QUEUE_INDEX, Integer.toString(index));
+    // Override initial file
+    java.io.File finalFile = SessionService.getConfFileByPath(Const.FILE_FIFO);
+    UtilSystem.saveFileWithRecoverySupport(finalFile);
+    Log.debug("Queue commited to : " + finalFile.getAbsolutePath());
   }
 
   /**
@@ -1286,7 +1393,19 @@ public final class QueueModel {
     String title = null;
     File file = getPlayingFile();
     if (isPlayingRadio()) {
-      title = getCurrentRadio().getName();
+      Properties webradioInfoUpdatedEvent = ObservationManager
+          .getDetailsLastOccurence(JajukEvents.WEBRADIO_INFO_UPDATED);
+      // TODO Strange but we experienced NPE here coming from a call from tray/mouseMoved, so we perform sanity check, to be investigated
+      if (webradioInfoUpdatedEvent != null) {
+        WebRadio updatedWebRadio = (WebRadio) webradioInfoUpdatedEvent.get(Const.DETAIL_CONTENT);
+        if (getCurrentRadio().getName().equals(updatedWebRadio.getName())) {
+          title = (String) webradioInfoUpdatedEvent.get(Const.CURRENT_RADIO_TRACK);
+        } else {
+          title = getCurrentRadio().getName();
+        }
+      } else {
+        title = Messages.getString("JajukWindow.18");
+      }
     } else if (file != null && !isStopped()) {
       title = file.getHTMLFormatText();
     } else {
@@ -1317,11 +1436,21 @@ public final class QueueModel {
   /**
    * Force FIFO index.
    * 
-   * @param index DOCUMENT_ME
+   * @param index
+   *            
    * 
    * @pram index index to set
    */
   public static synchronized void setIndex(int index) {
     QueueModel.index = index;
   }
-}
\ No newline at end of file
+
+  /**
+   * Sets the stop after.
+   * 
+   * @param stopAfter Whether we should stop after current track playback
+   */
+  public static void setStopAfter(boolean stopAfter) {
+    QueueModel.bStopAfter = stopAfter;
+  }
+}
diff --git a/src/main/java/org/jajuk/services/players/StackItem.java b/src/main/java/org/jajuk/services/players/StackItem.java
index 93e82a4..a528926 100644
--- a/src/main/java/org/jajuk/services/players/StackItem.java
+++ b/src/main/java/org/jajuk/services/players/StackItem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.players;
 
 import org.jajuk.base.File;
@@ -29,16 +28,12 @@ import org.jajuk.util.log.Log;
  * A FIFO item.
  */
 public class StackItem implements Cloneable {
-
   /** Associated file. */
   private final File file;
-
   /** Repeat flag. */
   private boolean bRepeat = false;
-
   /** User launch flag. */
   private boolean bUserLaunch = false;
-
   /** Planned track ?. */
   private boolean bPlanned = false;
 
@@ -59,8 +54,8 @@ public class StackItem implements Cloneable {
   /**
    * Constructor.
    * 
-   * @param file DOCUMENT_ME
-   * @param bUserLauched DOCUMENT_ME
+   * @param file 
+   * @param bUserLauched 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -71,9 +66,9 @@ public class StackItem implements Cloneable {
   /**
    * Constructor.
    *
-   * @param file DOCUMENT_ME
-   * @param bRepeat DOCUMENT_ME
-   * @param bUserLauched DOCUMENT_ME
+   * @param file 
+   * @param bRepeat 
+   * @param bUserLauched 
    * @throws JajukException the jajuk exception
    */
   public StackItem(File file, boolean bRepeat, boolean bUserLauched) throws JajukException {
@@ -161,7 +156,6 @@ public class StackItem implements Cloneable {
     try {
       StackItem item = new StackItem(file, bRepeat, bUserLaunch);
       item.setPlanned(bPlanned);
-
       return item;
     } catch (JajukException je) { // can be thrown if FileManager return a
       // null file
@@ -173,7 +167,7 @@ public class StackItem implements Cloneable {
   /**
    * Equals method.
    * 
-   * @param o DOCUMENT_ME
+   * @param o 
    * 
    * @return whether both items are equals. Condition : file is the same and
    * planned flag is the same
@@ -184,13 +178,11 @@ public class StackItem implements Cloneable {
     if (!(o instanceof StackItem)) {
       return false;
     }
-
     StackItem itemOther = (StackItem) o;
     File fOther = itemOther.getFile();
     if (fOther == null || file == null) {
       return false;
     }
-
     return (fOther.equals(file) && itemOther.isPlanned() == isPlanned());
   }
 
@@ -215,5 +207,4 @@ public class StackItem implements Cloneable {
   public String toString() {
     return file.toString();
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/players/WebRadioPlayerImpl.java b/src/main/java/org/jajuk/services/players/WebRadioPlayerImpl.java
index 9ed74df..0207a1c 100644
--- a/src/main/java/org/jajuk/services/players/WebRadioPlayerImpl.java
+++ b/src/main/java/org/jajuk/services/players/WebRadioPlayerImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -24,10 +24,14 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.Map;
+import java.util.Properties;
 import java.util.StringTokenizer;
 
 import org.apache.commons.lang.StringUtils;
 import org.jajuk.base.File;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -39,12 +43,10 @@ import org.jajuk.util.log.Log;
  * Jajuk web radio player implementation based on Mplayer.
  */
 public class WebRadioPlayerImpl extends AbstractMPlayerImpl {
-
   /**
    * Reader : read information from mplayer like position.
    */
   private class ReaderThread extends Thread {
-
     /**
      * Implemented to set a useful thread name.
      */
@@ -65,6 +67,32 @@ public class WebRadioPlayerImpl extends AbstractMPlayerImpl {
           if (line == null) {
             break;
           }
+          if (line.startsWith(("ICY Info:"))) {
+            //Send an event that web radio info has been updated
+            Properties pDetails = new Properties();
+            String radioTrackDetail = "";
+            // Some stations doesn't include the StreamUrl in the ICY line. Sample :
+            //ICY Info: StreamTitle='-- Now On Air: URB Non-Stop :: Playing: xxx Cilmi - Sweet About Me :: Email the station xxx at yyy.uk --';
+            if (line.contains("';StreamUrl")) {
+              radioTrackDetail = line.substring(line.indexOf("StreamTitle='") + 13,
+                  line.indexOf("';StreamUrl"));
+              // Otherwise, the line should ends with ','
+            } else if (line.endsWith("';")) {
+              radioTrackDetail = line.substring(line.indexOf("StreamTitle='") + 13,
+                  line.length() - 2);
+            } else {
+              // Just in case, we also handle the case where the line doesn't ends with ';
+              radioTrackDetail = line.substring(line.indexOf("StreamTitle='") + 13,
+                  line.length() - 2);
+            }
+            String currentRadioTrack = QueueModel.getCurrentRadio().getName();
+            if (StringUtils.isNotEmpty(radioTrackDetail)) {
+              currentRadioTrack += ":: " + radioTrackDetail;
+            }
+            pDetails.put(Const.DETAIL_CONTENT, QueueModel.getCurrentRadio());
+            pDetails.put(Const.CURRENT_RADIO_TRACK, currentRadioTrack);
+            ObservationManager.notify(new JajukEvent(JajukEvents.WEBRADIO_INFO_UPDATED, pDetails));
+          }
           bOpening = false;
           // Search for Exiting (...) pattern
           if (line.matches(".*\\x2e\\x2e\\x2e.*\\(.*\\).*")) {
@@ -84,8 +112,8 @@ public class WebRadioPlayerImpl extends AbstractMPlayerImpl {
   /**
    * (non-Javadoc).
    * 
-   * @param radio DOCUMENT_ME
-   * @param fVolume DOCUMENT_ME
+   * @param radio 
+   * @param fVolume 
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    * @throws JajukException the jajuk exception
@@ -98,8 +126,9 @@ public class WebRadioPlayerImpl extends AbstractMPlayerImpl {
     this.fVolume = fVolume;
     this.bOpening = true;
     this.bEOF = false;
+    this.bitPerfect = Conf.getBoolean(Const.CONF_BIT_PERFECT);
     // Start
-    ProcessBuilder pb = new ProcessBuilder(buildCommand(radio.getUrl()));
+    ProcessBuilder pb = new ProcessBuilder(buildCommand(radio.getUrl(), 0));
     Log.debug("Using this Mplayer command: {{" + pb.command() + "}}");
     // Set all environment variables format: var1=xxx var2=yyy
     try {
@@ -150,6 +179,8 @@ public class WebRadioPlayerImpl extends AbstractMPlayerImpl {
     if (bEOF) {
       throw new JajukException(7);
     }
+    // Get track length
+    sendCommand("get_time_length");
   }
 
   /*
@@ -171,5 +202,4 @@ public class WebRadioPlayerImpl extends AbstractMPlayerImpl {
     // makes no sense for webradios
     return 0;
   }
-
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/jajuk/services/reporting/Exporter.java b/src/main/java/org/jajuk/services/reporting/Exporter.java
index fa8a03f..6346f06 100644
--- a/src/main/java/org/jajuk/services/reporting/Exporter.java
+++ b/src/main/java/org/jajuk/services/reporting/Exporter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.reporting;
 
 import java.io.File;
@@ -31,13 +30,10 @@ import org.jajuk.util.UtilSystem;
  * The base abstract class for exporting music contents to different formats.
  */
 public abstract class Exporter {
-
   /** Public Constants. */
   public static final int PHYSICAL_COLLECTION = 0;
-
-  /** The Constant LOGICAL_COLLECTION.  DOCUMENT_ME */
+  /** The Constant LOGICAL_COLLECTION.   */
   public static final int LOGICAL_COLLECTION = 1;
-
   /** Cache file (used to handle concurrency issues), set by child classes. */
   protected File cache;
 
@@ -83,5 +79,4 @@ public abstract class Exporter {
   public File getCacheFile() {
     return this.cache;
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/reporting/ExporterFactory.java b/src/main/java/org/jajuk/services/reporting/ExporterFactory.java
index 23302f9..5f59528 100644
--- a/src/main/java/org/jajuk/services/reporting/ExporterFactory.java
+++ b/src/main/java/org/jajuk/services/reporting/ExporterFactory.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,17 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.reporting;
 
 import java.io.IOException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public final class ExporterFactory {
-
   /**
    * private constructor to avoid instantiating utility class.
    */
@@ -36,7 +35,7 @@ public final class ExporterFactory {
   /**
    * This methods returns an instance of Exporter.
    * 
-   * @param extension DOCUMENT_ME
+   * @param extension 
    * 
    * @return Returns an instance of XMLExporter.
    * 
@@ -48,6 +47,5 @@ public final class ExporterFactory {
     } else {
       return new XMLExporter();
     }
-
   }
 }
diff --git a/src/main/java/org/jajuk/services/reporting/HTMLExporter.java b/src/main/java/org/jajuk/services/reporting/HTMLExporter.java
index d5fc6ca..7fceadd 100644
--- a/src/main/java/org/jajuk/services/reporting/HTMLExporter.java
+++ b/src/main/java/org/jajuk/services/reporting/HTMLExporter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.reporting;
 
 import java.io.File;
@@ -39,11 +38,9 @@ import org.jajuk.util.UtilSystem;
  * This class exports music contents to HTML.
  */
 public class HTMLExporter extends Exporter {
-
   /**
    * PUBLIC METHODS.
    */
-
   public HTMLExporter() {
     cache = SessionService.getConfFileByPath(Const.FILE_REPORTING_CACHE_FILE + "_html_"
         + System.currentTimeMillis());
@@ -52,7 +49,7 @@ public class HTMLExporter extends Exporter {
   /**
    * Process collection.
    * 
-   * @param type DOCUMENT_ME
+   * @param type 
    * 
    * @throws Exception the exception
    * 
diff --git a/src/main/java/org/jajuk/services/reporting/XMLExporter.java b/src/main/java/org/jajuk/services/reporting/XMLExporter.java
index 48c627b..502509c 100644
--- a/src/main/java/org/jajuk/services/reporting/XMLExporter.java
+++ b/src/main/java/org/jajuk/services/reporting/XMLExporter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.reporting;
 
 import java.io.BufferedWriter;
@@ -52,16 +51,11 @@ import org.jajuk.util.UtilString;
  * This class exports music contents to XML.
  */
 public class XMLExporter extends Exporter {
-
   /** Private Constants. */
   private static final String NEWLINE = "\n";
-
-  /** The Constant XML_HEADER.  DOCUMENT_ME */
+  /** The Constant XML_HEADER.   */
   private static final String XML_HEADER = "<?xml version='1.0' encoding='UTF-8'?>";
-
-  /** DOCUMENT_ME. */
   private final BufferedWriter writer;
-
   /** Do we want to export tracks ?*. */
   private boolean showTracks = true;
 
@@ -70,7 +64,6 @@ public class XMLExporter extends Exporter {
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    */
-
   public XMLExporter() throws IOException {
     cache = SessionService.getConfFileByPath(Const.FILE_REPORTING_CACHE_FILE + "_XML_"
         + System.currentTimeMillis());
@@ -208,7 +201,7 @@ public class XMLExporter extends Exporter {
   /**
    * Process collection.
    * 
-   * @param type DOCUMENT_ME
+   * @param type 
    * 
    * @throws Exception the exception
    * 
@@ -230,12 +223,11 @@ public class XMLExporter extends Exporter {
   /**
    * PRIVATE HELPER METHODS.
    * 
-   * @param level DOCUMENT_ME
-   * @param directory DOCUMENT_ME
+   * @param level 
+   * @param directory 
    * 
    * @throws Exception the exception
    */
-
   private void exportDirectoryHelper(int level, Directory directory) throws Exception {
     // Get the children
     List<Directory> children = new ArrayList<Directory>(directory.getDirectories());
@@ -260,10 +252,10 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag file.
-   * DOCUMENT_ME
    * 
-   * @param file DOCUMENT_ME
-   * @param level DOCUMENT_ME
+   * 
+   * @param file 
+   * @param level 
    * 
    * @throws Exception the exception
    */
@@ -283,9 +275,9 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag directory.
-   * DOCUMENT_ME
    * 
-   * @param directory DOCUMENT_ME
+   * 
+   * @param directory 
    * 
    * @throws Exception the exception
    */
@@ -296,12 +288,10 @@ public class XMLExporter extends Exporter {
       String sName = UtilString.formatXML(directory.getName());
       String sPath = UtilString.formatXML(directory.getAbsolutePath());
       String sID = directory.getID();
-
       // Tag directory data.
       writer.write(addTabs(1) + Tag.tagData(Const.XML_ID, sID) + NEWLINE);
       writer.write(addTabs(1) + Tag.tagData(Const.XML_NAME, sName) + NEWLINE);
       writer.write(addTabs(1) + Tag.tagData(Const.XML_PATH, sPath) + NEWLINE);
-
       // Tag directory children data.
       for (Directory d : new ArrayList<Directory>(directory.getDirectories())) {
         exportDirectoryHelper(1, d);
@@ -316,9 +306,9 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag device.
-   * DOCUMENT_ME
    * 
-   * @param device DOCUMENT_ME
+   * 
+   * @param device 
    * 
    * @throws Exception the exception
    */
@@ -332,7 +322,7 @@ public class XMLExporter extends Exporter {
         + Tag.tagData(Const.XML_TYPE, UtilString.formatXML(device.getDeviceTypeS())) + NEWLINE);
     writer.write(addTabs(1) + Tag.tagData(Const.XML_URL, UtilString.formatXML(device.getUrl()))
         + NEWLINE);
-    Directory dir = DirectoryManager.getInstance().getDirectoryForIO(device.getFio(), device);
+    Directory dir = DirectoryManager.getInstance().getDirectoryForIO(device.getFIO(), device);
     // check void devices
     if (dir != null) {
       // Tag children directories of device.
@@ -340,8 +330,8 @@ public class XMLExporter extends Exporter {
         exportDirectoryHelper(1, directory);
       }
       // Tag children files of device.
-      for (org.jajuk.base.File file : DirectoryManager.getInstance().getDirectoryForIO(
-          device.getFio(), device).getFiles()) {
+      for (org.jajuk.base.File file : DirectoryManager.getInstance()
+          .getDirectoryForIO(device.getFIO(), device).getFiles()) {
         tagFile(file, 1);
       }
     }
@@ -350,10 +340,10 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag track.
-   * DOCUMENT_ME
    * 
-   * @param track DOCUMENT_ME
-   * @param level DOCUMENT_ME
+   * 
+   * @param track 
+   * @param level 
    * 
    * @throws Exception the exception
    */
@@ -389,10 +379,10 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag album.
-   * DOCUMENT_ME
    * 
-   * @param album DOCUMENT_ME
-   * @param level DOCUMENT_ME
+   * 
+   * @param album 
+   * @param level 
    * 
    * @throws Exception the exception
    */
@@ -426,10 +416,10 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag artist.
-   * DOCUMENT_ME
    * 
-   * @param artist DOCUMENT_ME
-   * @param level DOCUMENT_ME
+   * 
+   * @param artist 
+   * @param level 
    * 
    * @throws Exception the exception
    */
@@ -448,10 +438,10 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag year.
-   * DOCUMENT_ME
    * 
-   * @param year DOCUMENT_ME
-   * @param level DOCUMENT_ME
+   * 
+   * @param year 
+   * @param level 
    * 
    * @throws Exception the exception
    */
@@ -470,10 +460,10 @@ public class XMLExporter extends Exporter {
 
   /**
    * Tag genre.
-   * DOCUMENT_ME
    * 
-   * @param genre DOCUMENT_ME
-   * @param level DOCUMENT_ME
+   * 
+   * @param genre 
+   * @param level 
    * 
    * @throws Exception the exception
    */
@@ -496,9 +486,9 @@ public class XMLExporter extends Exporter {
 
   /**
    * Adds the tabs.
-   * DOCUMENT_ME
    * 
-   * @param num DOCUMENT_ME
+   * 
+   * @param num 
    * 
    * @return the string
    */
@@ -534,41 +524,40 @@ public class XMLExporter extends Exporter {
       writer.write(Tag.openTag("i18n"));
       int i = 1;
       while (Messages.contains("ReportAction." + i)) {
-        writer.write('\t' + Tag.tagData("ReportAction." + i, Messages
-            .getString("ReportAction." + i)));
+        writer.write('\t' + Tag.tagData("ReportAction." + i,
+            Messages.getString("ReportAction." + i)));
         i++;
       }
-      writer.write('\t' + Tag.tagData("ReportAction.name", Messages
-          .getHumanPropertyName(Const.XML_NAME)));
-      writer.write('\t' + Tag.tagData("ReportAction.artist", Messages
-          .getHumanPropertyName(Const.XML_ARTIST)));
-      writer.write('\t' + Tag.tagData("ReportAction.genre", Messages
-          .getHumanPropertyName(Const.XML_GENRE)));
-      writer.write('\t' + Tag.tagData("ReportAction.order", Messages
-          .getHumanPropertyName(Const.XML_TRACK_ORDER)));
-      writer.write('\t' + Tag.tagData("ReportAction.track", Messages
-          .getHumanPropertyName(Const.XML_TRACK)));
-      writer.write('\t' + Tag.tagData("ReportAction.album", Messages
-          .getHumanPropertyName(Const.XML_ALBUM)));
-      writer.write('\t' + Tag.tagData("ReportAction.length", Messages
-          .getHumanPropertyName(Const.XML_TRACK_LENGTH)));
-      writer.write('\t' + Tag.tagData("ReportAction.year", Messages
-          .getHumanPropertyName(Const.XML_YEAR)));
-      writer.write('\t' + Tag.tagData("ReportAction.rate", Messages
-          .getHumanPropertyName(Const.XML_TRACK_RATE)));
-      writer.write('\t' + Tag.tagData("ReportAction.url", Messages
-          .getHumanPropertyName(Const.XML_URL)));
-      writer.write('\t' + Tag.tagData("ReportAction.type", Messages
-          .getHumanPropertyName(Const.XML_TYPE)));
-      writer.write('\t' + Tag.tagData("ReportAction.comment", Messages
-          .getHumanPropertyName(Const.XML_TRACK_COMMENT)));
+      writer.write('\t' + Tag.tagData("ReportAction.name",
+          Messages.getHumanPropertyName(Const.XML_NAME)));
+      writer.write('\t' + Tag.tagData("ReportAction.artist",
+          Messages.getHumanPropertyName(Const.XML_ARTIST)));
+      writer.write('\t' + Tag.tagData("ReportAction.genre",
+          Messages.getHumanPropertyName(Const.XML_GENRE)));
+      writer.write('\t' + Tag.tagData("ReportAction.order",
+          Messages.getHumanPropertyName(Const.XML_TRACK_ORDER)));
+      writer.write('\t' + Tag.tagData("ReportAction.track",
+          Messages.getHumanPropertyName(Const.XML_TRACK)));
+      writer.write('\t' + Tag.tagData("ReportAction.album",
+          Messages.getHumanPropertyName(Const.XML_ALBUM)));
+      writer.write('\t' + Tag.tagData("ReportAction.length",
+          Messages.getHumanPropertyName(Const.XML_TRACK_LENGTH)));
+      writer.write('\t' + Tag.tagData("ReportAction.year",
+          Messages.getHumanPropertyName(Const.XML_YEAR)));
+      writer.write('\t' + Tag.tagData("ReportAction.rate",
+          Messages.getHumanPropertyName(Const.XML_TRACK_RATE)));
+      writer.write('\t' + Tag.tagData("ReportAction.url",
+          Messages.getHumanPropertyName(Const.XML_URL)));
+      writer.write('\t' + Tag.tagData("ReportAction.type",
+          Messages.getHumanPropertyName(Const.XML_TYPE)));
+      writer.write('\t' + Tag.tagData("ReportAction.comment",
+          Messages.getHumanPropertyName(Const.XML_TRACK_COMMENT)));
       writer.write(Tag.closeTag("i18n"));
       writer.write(Tag.closeTag(Const.XML_COLLECTION));
     } finally {
       writer.flush();
       writer.close();
     }
-
   }
 
   /**
@@ -579,7 +568,6 @@ public class XMLExporter extends Exporter {
   protected void setShowTracks(boolean showTracks) {
     this.showTracks = showTracks;
   }
-
 }
 
 /**
diff --git a/src/main/java/org/jajuk/services/reporting/XMLTransformer.java b/src/main/java/org/jajuk/services/reporting/XMLTransformer.java
index e0a4e27..6a0ad74 100644
--- a/src/main/java/org/jajuk/services/reporting/XMLTransformer.java
+++ b/src/main/java/org/jajuk/services/reporting/XMLTransformer.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.reporting;
 
 import java.io.BufferedInputStream;
@@ -45,7 +44,6 @@ import org.xml.sax.SAXException;
  * This class will take a XML file and either convert it to HTML or PDF.
  */
 public final class XMLTransformer {
-
   /**
    * Private constructor to prevent instantiation of utility class.
    */
@@ -68,18 +66,14 @@ public final class XMLTransformer {
       SAXException, IOException, TransformerException {
     Source source = new SAXSource(
         new InputSource(new BufferedInputStream(new FileInputStream(xml))));
-
     // Create output file
     Result result = new StreamResult(html);
-
     // Transformer configuration
     TransformerFactory transformerFactory = TransformerFactory.newInstance();
     StreamSource genresource = new StreamSource(xsl.openStream());
     Transformer transformer = transformerFactory.newTransformer(genresource);
     transformer.setOutputProperty(OutputKeys.METHOD, "html");
-
     // Transformation
     transformer.transform(source, result);
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/reporting/package.html b/src/main/java/org/jajuk/services/reporting/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/reporting/package.html
+++ b/src/main/java/org/jajuk/services/reporting/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/startup/StartupAsyncService.java b/src/main/java/org/jajuk/services/startup/StartupAsyncService.java
index faff84e..ba95a27 100644
--- a/src/main/java/org/jajuk/services/startup/StartupAsyncService.java
+++ b/src/main/java/org/jajuk/services/startup/StartupAsyncService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,21 +16,25 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.startup;
 
 import org.jajuk.base.AlbumManager;
+import org.jajuk.base.Device;
 import org.jajuk.base.DeviceManager;
 import org.jajuk.base.ItemManager;
 import org.jajuk.services.alarm.AlarmManager;
+import org.jajuk.services.core.CleanupService;
 import org.jajuk.services.core.ExitService;
-import org.jajuk.services.core.RatingManager;
+import org.jajuk.services.core.PersistenceService;
+import org.jajuk.services.core.RatingService;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.services.dbus.DBusManager;
 import org.jajuk.services.lastfm.LastFmManager;
 import org.jajuk.services.players.QueueController;
 import org.jajuk.ui.thumbnails.ThumbnailManager;
+import org.jajuk.ui.wizard.FirstTimeWizard;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
@@ -41,8 +45,7 @@ import org.jajuk.util.log.Log;
  * Startup facilities of asynchronous tasks
  * <p>Called after collection loading<p>.
  */
-public class StartupAsyncService {
-
+public final class StartupAsyncService {
   /**
    * Instantiates a new startup async service.
    */
@@ -53,41 +56,29 @@ public class StartupAsyncService {
   /**
    * Asynchronous tasks executed at startup at the same time (for perf).
    * 
-   * @param bCollectionLoadRecover DOCUMENT_ME
+   * @param bCollectionLoadRecover 
    */
-  public static void startupAsyncAfterCollectionLoad(final boolean bCollectionLoadRecover) {
+  public static void startupAsyncAfterCollectionLoad() {
     Thread startup = new Thread("Startup Async After Collection Load Thread") {
       @Override
       public void run() {
         try {
-
           // start exit hook
           final ExitService exit = new ExitService();
           exit.setPriority(Thread.MAX_PRIORITY);
           Runtime.getRuntime().addShutdownHook(exit);
-
-          // backup the collection if no parsing error occurred
-          if (!bCollectionLoadRecover) {
-            UtilSystem.backupFile(SessionService.getConfFileByPath(Const.FILE_COLLECTION), Conf
-                .getInt(Const.CONF_BACKUP_SIZE));
-          }
-
           // Register FIFO manager
           QueueController.getInstance();
-
           // Refresh max album rating
           AlbumManager.getInstance().refreshMaxRating();
-
           // Sort albums cache. We do it before the sleep because there's a
           // chance that user launch an album as soon as the GUI is painted
           AlbumManager.getInstance().orderCache();
-
           // Force Thumbnail manager to check for thumbs presence. Must be done
           // before catalog view refresh to avoid useless thumbs creation
           for (int size = 50; size <= 300; size += 50) {
             ThumbnailManager.populateCache(size);
           }
-
           // try to start up D-Bus support if available. Currently this is only
           // implemented on Linux
           if (UtilSystem.isUnderLinux()) {
@@ -99,33 +90,40 @@ public class StartupAsyncService {
               Log.error(e);
             }
           }
-
           // Wait few secs to avoid GUI startup perturbations
           Thread.sleep(5000);
-         
+          // Start persistence service
+          PersistenceService.getInstance().start();
+          // Startup cleanup thread
+          CleanupService.getInstance().start();
           // Switch to sorted mode, must be done before starting auto-refresh
           // thread !
           ItemManager.switchAllManagersToOrderState();
-
+          // Refresh any new device from first Time Wizard
+          Device newDevice = FirstTimeWizard.getNewDevice();
+          try {
+            // Refresh device asynchronously
+            if (newDevice != null) {
+              newDevice.refresh(true, false, false, null);
+            }
+          } catch (final Exception e2) {
+            Log.error(112, newDevice.getName(), e2);
+            Messages.showErrorMessage(112, newDevice.getName());
+          }
           // Clear covers images cache
           SessionService.clearCache();
-
           // Launch auto-refresh thread
           DeviceManager.getInstance().startAutoRefreshThread();
-
           // Start rating manager thread
-          RatingManager.getInstance().start();
-
+          RatingService.getInstance().start();
           // Start alarm clock
           if (Conf.getBoolean(Const.CONF_ALARM_ENABLED)) {
             AlarmManager.getInstance();
           }
-
           // Submit any LastFM submission cache
           if (Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE)) {
             LastFmManager.getInstance().submitCache();
           }
-
         } catch (final Exception e) {
           Log.error(e);
         }
@@ -134,5 +132,4 @@ public class StartupAsyncService {
     startup.setPriority(Thread.MIN_PRIORITY);
     startup.start();
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/startup/StartupCollectionService.java b/src/main/java/org/jajuk/services/startup/StartupCollectionService.java
index 7909b36..7bdfb4c 100644
--- a/src/main/java/org/jajuk/services/startup/StartupCollectionService.java
+++ b/src/main/java/org/jajuk/services/startup/StartupCollectionService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.startup;
 
@@ -31,9 +31,6 @@ import java.util.Iterator;
 import java.util.List;
 
 import javax.swing.JOptionPane;
-import javax.xml.parsers.ParserConfigurationException;
-
-import net.miginfocom.layout.LinkHandler;
 
 import org.apache.commons.lang.StringUtils;
 import org.jajuk.base.AlbumArtistManager;
@@ -49,33 +46,23 @@ import org.jajuk.base.PlaylistManager;
 import org.jajuk.base.TrackManager;
 import org.jajuk.base.TypeManager;
 import org.jajuk.base.YearManager;
-import org.jajuk.services.core.ExitService;
 import org.jajuk.services.core.SessionService;
-import org.jajuk.services.tags.Tag;
+import org.jajuk.services.webradio.WebRadioManager;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.DownloadManager;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UpgradeManager;
 import org.jajuk.util.UtilSystem;
-import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
-import org.xml.sax.SAXException;
 
 /**
  * Startup facilities of the collection.
  */
-public class StartupCollectionService {
-
-  /** Mplayer state. */
+public final class StartupCollectionService {
+  /** MPlayer state. */
   private static UtilSystem.MPlayerStatus mplayerStatus;
 
-  /** Does a collection parsing error occurred ? *. */
-  private static boolean bCollectionLoadRecover = true;
-
-  /** Lock used to trigger a first time wizard device creation and refresh *. */
-  static short[] canLaunchRefresh = new short[0];
-
   /**
    * Instantiates a new startup collection service.
    */
@@ -84,23 +71,14 @@ public class StartupCollectionService {
   }
 
   /**
-   * Register device types*.
-   */
-  public static void registerDevicesTypes() {
-    for (final String deviceTypeId : DeviceManager.DEVICE_TYPES) {
-      DeviceManager.getInstance().registerDeviceType(Messages.getString(deviceTypeId));
-    }
-  }
-
-  /**
-   * Register all the different managers for the types of items that we know
-   * about.
-   */
+  * Register all the different managers for the types of items that we know
+  * about.
+  */
   public static void registerItemManagers() {
     ItemManager.registerItemManager(org.jajuk.base.Album.class, AlbumManager.getInstance());
     ItemManager.registerItemManager(org.jajuk.base.Artist.class, ArtistManager.getInstance());
-    ItemManager.registerItemManager(org.jajuk.base.AlbumArtist.class, AlbumArtistManager
-        .getInstance());
+    ItemManager.registerItemManager(org.jajuk.base.AlbumArtist.class,
+        AlbumArtistManager.getInstance());
     ItemManager.registerItemManager(org.jajuk.base.Device.class, DeviceManager.getInstance());
     ItemManager.registerItemManager(org.jajuk.base.File.class, FileManager.getInstance());
     ItemManager.registerItemManager(org.jajuk.base.Directory.class, DirectoryManager.getInstance());
@@ -109,6 +87,8 @@ public class StartupCollectionService {
     ItemManager.registerItemManager(org.jajuk.base.Track.class, TrackManager.getInstance());
     ItemManager.registerItemManager(org.jajuk.base.Type.class, TypeManager.getInstance());
     ItemManager.registerItemManager(org.jajuk.base.Year.class, YearManager.getInstance());
+    ItemManager.registerItemManager(org.jajuk.services.webradio.WebRadio.class,
+        WebRadioManager.getInstance());
   }
 
   /**
@@ -129,7 +109,7 @@ public class StartupCollectionService {
             // make sure to delete corrupted mplayer in case of
             // download problem
             if (fMPlayer.length() != Const.MPLAYER_WINDOWS_EXE_SIZE) {
-              if (!fMPlayer.delete()) {
+              if (!fMPlayer.delete()) { //NOSONAR
                 Log.warn("Could not delete file " + fMPlayer);
               }
               mplayerStatus = UtilSystem.MPlayerStatus.MPLAYER_STATUS_JNLP_DOWNLOAD_PBM;
@@ -148,7 +128,7 @@ public class StartupCollectionService {
             DownloadManager.download(new URL(Const.URL_MPLAYER_OSX), fMPlayer);
             fMPlayer.setExecutable(true);
             if (fMPlayer.length() != Const.MPLAYER_OSX_EXE_SIZE) {
-              if (!fMPlayer.delete()) {
+              if (!fMPlayer.delete()) { //NOSONAR
                 Log.warn("Could not delete file " + fMPlayer);
               }
               mplayerStatus = UtilSystem.MPlayerStatus.MPLAYER_STATUS_JNLP_DOWNLOAD_PBM;
@@ -205,32 +185,6 @@ public class StartupCollectionService {
     }
   }
 
-  /** Auto commit thread. */
-  private static Thread tAutoCommit = new Thread("Auto Commit Thread") {
-    @Override
-    public void run() {
-      while (!ExitService.isExiting()) {
-        try {
-          Thread.sleep(Const.AUTO_COMMIT_DELAY);
-          Log.debug("Auto commit");
-
-          // call the overall "commit" to store things like Queue and
-          // configuration periodically as well
-          ExitService.commit(false);
-
-          // workaround to free space in MigLayout
-          // see http://migcalendar.com/forum/viewtopic.php?f=8&t=3236&p=7012
-          LinkHandler.getValue("", "", 1); // simulated read
-
-          // Clear the tag cache to avoid growing memory usage over time
-          Tag.clearCache();
-        } catch (Exception e) {
-          Log.error(e);
-        }
-      }
-    }
-  };
-
   /**
    * Load persisted collection file.
    */
@@ -240,130 +194,13 @@ public class StartupCollectionService {
       return;
     }
     final File fCollection = SessionService.getConfFileByPath(Const.FILE_COLLECTION);
-    final File fCollectionExit = SessionService.getConfFileByPath(Const.FILE_COLLECTION_EXIT);
-    final File fCollectionExitProof = SessionService
-        .getConfFileByPath(Const.FILE_COLLECTION_EXIT_PROOF);
-    boolean bParsingOK = false;
-
-    // Keep this complex proof / multiple collection file code, it is required
-    // (see #1362)
-    // The problem is that a bad shutdown can write down corrupted collection
-    // file that would overwrite at exit good collection.xml automatically
-    // commited during last jajuk session
     try {
-      if (fCollectionExit.exists() && fCollectionExitProof.exists()) {
-        // delete this file created just
-        // after collection exit commit
-        UtilSystem.deleteFile(fCollectionExitProof);
-        Collection.load(fCollectionExit);
-        // Remove the collection (required by renameTo next line under
-        // Windows)
-        UtilSystem.deleteFile(fCollection);
-        // parsing of collection exit ok, use this collection file as
-        // final collection
-        if (!fCollectionExit.renameTo(fCollection)) {
-          Log.warn("Cannot rename collection file");
-        }
-        bCollectionLoadRecover = false;
-        bParsingOK = true;
-      } else {
-        bCollectionLoadRecover = true;
-        throw new JajukException(5);
-      }
+      Collection.load(fCollection);
+      backupCollectionFileAsynchronously();
     } catch (final Exception e) {
-      Log.error(5, fCollectionExit.getAbsolutePath(), e);
-      Log.debug("Jajuk was not closed properly during previous session, "
-          + "we try to load a backup file");
-      // Remove the corrupted collection file
-      if (fCollectionExit.exists()) {
-        try {
-          UtilSystem.deleteFile(fCollectionExit);
-        } catch (IOException e1) {
-          Log.error(e1);
-        }
-      }
-
-    }
-    // If regular collection_exit.xml file parsing failed, try to parse
-    // collection.xml. should be OK but not
-    // always up-to-date.
-    if (!bParsingOK) {
-      try {
-        Collection.load(fCollection);
-        bParsingOK = true;
-      } catch (final SAXException e1) {
-        Log.error(5, fCollection.getAbsolutePath(), e1);
-        bParsingOK = false;
-      } catch (final ParserConfigurationException e1) {
-        Log.error(5, fCollection.getAbsolutePath(), e1);
-        bParsingOK = false;
-      } catch (final JajukException e1) {
-        Log.error(5, fCollection.getAbsolutePath(), e1);
-        bParsingOK = false;
-      } catch (final IOException e1) {
-        Log.error(5, fCollection.getAbsolutePath(), e1);
-        bParsingOK = false;
-      }
-    }
-
-    // If even final collection file parsing failed
-    // (very unlikely), try to restore a backup file
-    if (!bParsingOK) {
-      // try to restore a backup file
-      final File[] fBackups = SessionService.getConfFileByPath("").listFiles(new FilenameFilter() {
-        @Override
-        public boolean accept(File dir, String name) {
-          if (name.indexOf("backup") != -1) {
-            return true;
-          }
-          return false;
-        }
-      });
-      final List<File> alBackupFiles = new ArrayList<File>(Arrays.asList(fBackups));
-      Collections.sort(alBackupFiles); // sort alphabetically (newest
-      // last)
-      Collections.reverse(alBackupFiles); // newest first now
-      final Iterator<File> it = alBackupFiles.iterator();
-      // parse all backup files, newest first
-      while (!bParsingOK && it.hasNext()) {
-        final File file = it.next();
-        try {
-          // Clear all previous collection
-          Collection.clearCollection();
-          // Load the backup file
-          Collection.load(file);
-          bParsingOK = true;
-          // Show a message telling user that we use a backup file
-          final int i = Messages.getChoice(Messages.getString("Error.133") + ":\n"
-              + file.getAbsolutePath(), JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
-          if (i == JOptionPane.CANCEL_OPTION) {
-            System.exit(-1);
-          }
-          break;
-        } catch (final SAXException e2) {
-          Log.error(5, file.getAbsolutePath(), e2);
-        } catch (final ParserConfigurationException e2) {
-          Log.error(5, file.getAbsolutePath(), e2);
-        } catch (final JajukException e2) {
-          Log.error(5, file.getAbsolutePath(), e2);
-        } catch (final IOException e2) {
-          Log.error(5, file.getAbsolutePath(), e2);
-        }
-      }
-    }
-
-    // Still not better? ok, commit a void
-    // collection (and a void collection is loaded)
-    if (!bParsingOK) {
-      Collection.clearCollection();
-      System.gc();
-      try {
-        Collection.commit(SessionService.getConfFileByPath(Const.FILE_COLLECTION));
-      } catch (final Exception e2) {
-        Log.error(e2);
-      }
+      handleCollectionParsingError(fCollection, e);
+      tryToParseABackupFile();
     }
-
     Log.debug("Loaded " + FileManager.getInstance().getElementCount() + " files with "
         + TrackManager.getInstance().getElementCount() + " tracks, "
         + AlbumManager.getInstance().getElementCount() + " albums, "
@@ -371,32 +208,62 @@ public class StartupCollectionService {
         + AlbumArtistManager.getInstance().getElementCount() + " album-artists, "
         + PlaylistManager.getInstance().getElementCount() + " playlists in "
         + DirectoryManager.getInstance().getElementCount() + " directories on "
-        + DeviceManager.getInstance().getElementCount() + "devices.");
-
-    // start auto commit thread
-    tAutoCommit.start();
+        + DeviceManager.getInstance().getElementCount() + " devices.");
   }
 
-  /**
-   * Wait until user selected a device path in first time wizard.
-   */
-  public static void waitForLaunchRefresh() {
-    synchronized (canLaunchRefresh) {
+  private static void tryToParseABackupFile() {
+    final File[] fBackups = SessionService.getConfFileByPath("").listFiles(new FilenameFilter() {
+      @Override
+      public boolean accept(File dir, String name) {
+        if (name.indexOf("backup") != -1) {
+          return true;
+        }
+        return false;
+      }
+    });
+    final List<File> alBackupFiles = new ArrayList<File>(Arrays.asList(fBackups));
+    Collections.sort(alBackupFiles); // sort alphabetically (newest
+    // last)
+    Collections.reverse(alBackupFiles); // newest first now
+    final Iterator<File> it = alBackupFiles.iterator();
+    // parse all backup files, newest first
+    boolean parsingOK = false;
+    while (!parsingOK && it.hasNext()) {
+      final File file = it.next();
       try {
-        canLaunchRefresh.wait();
-      } catch (final InterruptedException e) {
-        Log.error(e);
+        // Clear all previous collection
+        Collection.clearCollection();
+        // Load the backup file
+        Collection.load(file);
+        parsingOK = true;
+        // Show a message telling user that we use a backup file
+        final int i = Messages.getChoice(
+            Messages.getString("Error.133") + ":\n" + file.getAbsolutePath(),
+            JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
+        if (i == JOptionPane.CANCEL_OPTION) {
+          System.exit(-1); //NOSONAR
+        }
+        break;
+      } catch (final Exception e2) {
+        Log.error(5, file.getAbsolutePath(), e2);
       }
     }
   }
 
-  /**
-   * Checks if is collection load recover.
-   * 
-   * @return true, if is collection load recover
-   */
-  public static boolean isCollectionLoadRecover() {
-    return bCollectionLoadRecover;
+  private static void handleCollectionParsingError(final File fCollection, final Exception e) {
+    Log.error(5, fCollection.getAbsolutePath(), e);
+    Log.debug("Jajuk was not closed properly during previous session, "
+        + "we try to load a backup file");
+    Messages.showErrorMessage(5, e.getMessage());
   }
 
+  private static void backupCollectionFileAsynchronously() {
+    new Thread() {
+      @Override
+      public void run() {
+        UtilSystem.backupFile(SessionService.getConfFileByPath(Const.FILE_COLLECTION),
+            Conf.getInt(Const.CONF_BACKUP_SIZE));
+      }
+    }.start();
+  }
 }
diff --git a/src/main/java/org/jajuk/services/startup/StartupControlsService.java b/src/main/java/org/jajuk/services/startup/StartupControlsService.java
index 13aa8a4..4831c3a 100644
--- a/src/main/java/org/jajuk/services/startup/StartupControlsService.java
+++ b/src/main/java/org/jajuk/services/startup/StartupControlsService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.startup;
 
@@ -37,9 +37,8 @@ import org.jajuk.util.log.Log;
 /**
  * Startup facilities for configuration controls.
  */
-public class StartupControlsService {
-
-  /** The Constant DIR_CHECKS.  DOCUMENT_ME */
+public final class StartupControlsService {
+  /** The Constant DIR_CHECKS.   */
   private static final String[] DIR_CHECKS = {
       // internal pictures cache directory
       Const.FILE_CACHE + '/' + Const.FILE_INTERNAL_CACHE,
@@ -69,7 +68,6 @@ public class StartupControlsService {
   public static void initialCheckups() throws IOException, InterruptedException {
     // Populate workspace path
     SessionService.discoverWorkspace();
-
     // check for jajuk directory
     final File fWorkspace = new File(SessionService.getWorkspace());
     if (!fWorkspace.exists() && !fWorkspace.mkdirs()) { // create the
@@ -82,7 +80,7 @@ public class StartupControlsService {
     final File fCache = SessionService.getConfFileByPath(Const.FILE_CACHE);
     if (!fCache.exists()) {
       if (!fCache.mkdirs()) {
-        Log.warn("Could not cretae directory structure " + fCache.toString());
+        Log.warn("Could not create directory structure " + fCache.toString());
       }
     } else {
       // Empty cache if age > CACHE_MAX_AGE
@@ -94,25 +92,14 @@ public class StartupControlsService {
         }
       }
     }
-
-    // checking preference file
-    File file = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION);
-    if (!file.exists()) {
-      // if config file doesn't exit, create
-      // it with default values
-      Log.warn("Create missing preference file");
-      org.jajuk.util.Conf.commit();
-    }
-
     // checking required history file
-    file = SessionService.getConfFileByPath(Const.FILE_HISTORY);
+    File file = SessionService.getConfFileByPath(Const.FILE_HISTORY);
     if (!file.exists()) {
       // if config file doesn't exit, create
       // it with default values
       Log.warn("Create missing history file");
       History.commit();
     }
-
     // checking required internal directories
     for (final String check : DIR_CHECKS) {
       final File dir = SessionService.getConfFileByPath(check);
@@ -120,7 +107,6 @@ public class StartupControlsService {
         Log.warn("Could not create missing required directory [" + check + "]");
       }
     }
-
     // Extract star icons (used by some HTML panels)
     for (int i = 0; i <= 4; i++) {
       final File star = SessionService.getConfFileByPath("cache/internal/star" + i + "_16x16.png");
@@ -150,5 +136,4 @@ public class StartupControlsService {
       }
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/startup/StartupEngineService.java b/src/main/java/org/jajuk/services/startup/StartupEngineService.java
index ded800f..752156c 100644
--- a/src/main/java/org/jajuk/services/startup/StartupEngineService.java
+++ b/src/main/java/org/jajuk/services/startup/StartupEngineService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.startup;
 
@@ -39,7 +39,6 @@ import org.jajuk.base.SearchResult.SearchResultType;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
-import org.jajuk.services.bookmark.History;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.services.dj.Ambience;
 import org.jajuk.services.dj.AmbienceManager;
@@ -57,19 +56,15 @@ import org.jajuk.util.log.Log;
 /**
  * Startup facilities for sound engine.
  */
-public class StartupEngineService {
-
+public final class StartupEngineService {
   /** List of items to play at startup. */
   private static List<org.jajuk.base.File> alToPlay = new ArrayList<org.jajuk.base.File>();
-
   /** File to play. */
   private static org.jajuk.base.File fileToPlay;
-
   /** Web radio to play. */
   private static WebRadio radio;
-
   /** Index in the queue of the startup file. */
-  private static int index = 0;
+  private static int index = -1;
 
   /**
    * Instantiates a new startup engine service.
@@ -82,43 +77,48 @@ public class StartupEngineService {
    * Launch initial track at startup.
    */
   public static void launchInitialTrack() {
-    String startupMode = Conf.getString(Const.CONF_STARTUP_MODE);
-
-    // User explicitely required nothing to start or he left jajuk stopped
-    boolean doNotStartAnything = Const.STARTUP_MODE_NOTHING.equals(startupMode)
-        || Conf.getBoolean(Const.CONF_STARTUP_STOPPED)
-        //  CONF_STARTUP_ITEM is void at first jajuk session and until user launched an item
-        || (Const.STARTUP_MODE_ITEM.equals(startupMode) && StringUtils.isBlank(Conf
-            .getString(Const.CONF_STARTUP_ITEM)))
-        // Void collection
-        || FileManager.getInstance().getElementCount() == 0;
-
-    // Populate item to be started and load the stored queue
-    populateStartupItems();
-
-    // Check that the file to play is not null and try to mount its device if required 
-    if (!doNotStartAnything && !isWebradioStartup()) {
-      checkFileToPlay();
-    }
-    // Set the index of the file to play within the queue.
-    // We still need to compute index of file to play even if we play nothing or a radio
-    // because user may do a "play" and the next file index must be ready.
-    // However, we don't need to test file availability with checkFileToPlay() method.
-    setIndex();
-
-    // Push the new queue
-    boolean bRepeat = Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL)
-        || Conf.getBoolean(Const.CONF_STATE_REPEAT);
-    QueueModel.insert(UtilFeatures.createStackItems(alToPlay, bRepeat, false), 0);
-    // Force queue index because insert increase it so it would be set to queue size after the insert
-    QueueModel.setIndex(index);
-
-    // Start the file or the radio
-    // If user leaved jajuk in stopped mode, do nothing
-    if (!doNotStartAnything && isWebradioStartup() && radio != null) {
-      launchRadio();
-    } else if (!doNotStartAnything && fileToPlay != null) {
-      launchFile();
+    try {
+      String startupMode = Conf.getString(Const.CONF_STARTUP_MODE);
+      final File fifo = SessionService.getConfFileByPath(Const.FILE_FIFO);
+      // Restore if required
+      UtilSystem.recoverFileIfRequired(fifo);
+      // User explicitly required nothing to start or he left jajuk stopped
+      boolean doNotStartAnything = Const.STARTUP_MODE_NOTHING.equals(startupMode)
+          || Conf.getBoolean(Const.CONF_STARTUP_STOPPED)
+          //  CONF_STARTUP_ITEM is void at first jajuk session and until user launched an item
+          || (Const.STARTUP_MODE_ITEM.equals(startupMode) && StringUtils.isBlank(Conf
+              .getString(Const.CONF_STARTUP_ITEM)))
+          // Void collection
+          || FileManager.getInstance().getElementCount() == 0
+          // FIFO void or not exists
+          || (!fifo.exists() || fifo.length() == 0);
+      // Populate item to be started and load the stored queue
+      populateStartupItems();
+      // Check that the file to play is not null and try to mount its device if required 
+      if (!doNotStartAnything && !isWebradioStartup()) {
+        checkFileToPlay();
+      }
+      // Set the index of the file to play within the queue.
+      // We still need to compute index of file to play even if we play nothing or a radio
+      // because user may do a "play" and the next file index must be ready.
+      // However, we don't need to test file availability with checkFileToPlay() method.
+      updateIndex();
+      // Push the new queue
+      boolean bRepeat = Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL);
+      QueueModel.insert(UtilFeatures.createStackItems(alToPlay, bRepeat, false), 0);
+      // Force queue index because insert increase it so it would be set to queue size after the insert
+      QueueModel.setIndex(index);
+      // Start the file or the radio
+      // If user leaved jajuk in stopped mode, do nothing
+      if (!doNotStartAnything && isWebradioStartup() && radio != null) {
+        launchRadio();
+      } else if (!doNotStartAnything && fileToPlay != null) {
+        launchFile();
+      }
+    } catch (Exception e) {
+      Log.error(e);
+      Messages.getChoice(Messages.getErrorMessage(23), JOptionPane.DEFAULT_OPTION,
+          JOptionPane.WARNING_MESSAGE);
     }
   }
 
@@ -146,7 +146,6 @@ public class StartupEngineService {
             .equals(startupMode))) {
       return true;
     }
-
     if (Const.STARTUP_MODE_ITEM.equals(startupMode)) {
       String conf = Conf.getString(Const.CONF_STARTUP_ITEM);
       if (conf.matches(SearchResultType.WEBRADIO.name() + ".*")) {
@@ -161,12 +160,17 @@ public class StartupEngineService {
    */
   private static void restoreQueue() {
     final File fifo = SessionService.getConfFileByPath(Const.FILE_FIFO);
+    try {
+      UtilSystem.recoverFileIfRequired(fifo);
+    } catch (IOException e) {
+      Log.error(e);
+    }
     if (!fifo.exists()) {
       Log.debug("No fifo file");
     } else {
       try {
-        final BufferedReader br = new BufferedReader(new FileReader(SessionService
-            .getConfFileByPath(Const.FILE_FIFO)));
+        final BufferedReader br = new BufferedReader(new FileReader(
+            SessionService.getConfFileByPath(Const.FILE_FIFO)));
         try {
           String s = null;
           for (;;) {
@@ -194,7 +198,6 @@ public class StartupEngineService {
   private static void populateStartupItems() {
     String startupMode = Conf.getString(Const.CONF_STARTUP_MODE);
     Ambience ambience = AmbienceManager.getInstance().getSelectedAmbience();
-
     // an item (track or radio) has been forced by user
     if (Const.STARTUP_MODE_ITEM.equals(startupMode)) {
       String conf = Conf.getString(Const.CONF_STARTUP_ITEM);
@@ -211,29 +214,27 @@ public class StartupEngineService {
         }
       }
     }
-
     // We play last item
     else if (Const.STARTUP_MODE_LAST.equals(startupMode)
         || Const.STARTUP_MODE_LAST_KEEP_POS.equals(startupMode)) {
-
+      //Restore the queue in these cases
+      restoreQueue();
       // If we were playing a webradio when leaving, launch it
       if (Conf.getBoolean(Const.CONF_WEBRADIO_WAS_PLAYING)) {
         radio = WebRadioManager.getInstance().getWebRadioByName(
             Conf.getString(Const.CONF_DEFAULT_WEB_RADIO));
       }
       // last file from beginning or last file keep position
-      else if (History.getInstance().getHistory().size() > 0) {
-        fileToPlay = FileManager.getInstance().getFileByID(History.getInstance().getLastFile());
+      else {
+        index = Conf.getInt(Const.CONF_STARTUP_QUEUE_INDEX);
+        if (index >= 0 && index < alToPlay.size()) {
+          fileToPlay = alToPlay.get(index);
+        }
       }
+    } else if (Const.STARTUP_MODE_NOTHING.equals(startupMode)) {
       //Restore the queue in these cases
       restoreQueue();
     }
-
-    else if (Const.STARTUP_MODE_NOTHING.equals(startupMode)) {
-      //Restore the queue in these cases
-      restoreQueue();
-    }
-
     // Shuffle mode
     else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_SHUFFLE)) {
       // Filter files by ambience or if none ambience matches, perform a global shuffle 
@@ -246,7 +247,6 @@ public class StartupEngineService {
       if (alToPlay != null && alToPlay.size() > 0) {
         fileToPlay = alToPlay.get(0);
       }
-
       // Best of mode
     } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_BESTOF)) {
       // Filter files by ambience or if none ambience matches, perform a global best-of selection 
@@ -259,7 +259,6 @@ public class StartupEngineService {
       if (alToPlay != null && alToPlay.size() > 0) {
         fileToPlay = alToPlay.get(0);
       }
-
       // Novelties mode
     } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_NOVELTIES)) {
       // Filter files by ambience or if none ambience matches, perform a global novelties selection 
@@ -279,7 +278,6 @@ public class StartupEngineService {
             InformationJPanel.MessageType.ERROR);
       }
     }
-
     // If the queue was empty and a file to play is provided, build a new queue
     // with this track alone
     if (alToPlay.size() == 0 && fileToPlay != null) {
@@ -327,7 +325,11 @@ public class StartupEngineService {
   /**
    * Set index of fileToPlay among alToPlay list.
    */
-  private static void setIndex() {
+  private static void updateIndex() {
+    // keep index from configuration if already set
+    if (index != -1) {
+      return;
+    }
     // fileToPlay is null if nothing has to be played, then we keep default index value (0)
     if (fileToPlay != null) {
       // find the index of last played track
@@ -373,5 +375,4 @@ public class StartupEngineService {
       }
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/startup/StartupGUIService.java b/src/main/java/org/jajuk/services/startup/StartupGUIService.java
index e238a59..081dfb2 100644
--- a/src/main/java/org/jajuk/services/startup/StartupGUIService.java
+++ b/src/main/java/org/jajuk/services/startup/StartupGUIService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.startup;
 
@@ -27,12 +27,14 @@ import java.lang.reflect.InvocationTargetException;
 
 import javax.swing.SwingUtilities;
 
+import org.jajuk.base.DeviceManager;
 import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.JajukActions;
 import org.jajuk.ui.helpers.FontManager;
 import org.jajuk.ui.helpers.FontManager.JajukFont;
 import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.ui.windows.JajukSystray;
+import org.jajuk.ui.wizard.SimpleDeviceWizard;
 import org.jajuk.ui.wizard.TipOfTheDayWizard;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -43,11 +45,9 @@ import org.jajuk.util.log.Log;
 /**
  * Startup facilities for GUI part.
  */
-public class StartupGUIService {
-
+public final class StartupGUIService {
   /** default perspective to choose, if null, we take the configuration one. */
   private static String sPerspective;
-
   /** splash screen. */
   private static JSplash sc;
 
@@ -60,7 +60,7 @@ public class StartupGUIService {
 
   /**
    * Gets the default perspective.
-   * 
+   *
    * @return Returns the sPerspective.
    */
   public static String getDefaultPerspective() {
@@ -69,7 +69,7 @@ public class StartupGUIService {
 
   /**
    * Sets the default perspective.
-   * 
+   *
    * @param perspective The sPerspective to set.
    */
   public static void setDefaultPerspective(final String perspective) {
@@ -78,8 +78,8 @@ public class StartupGUIService {
 
   /**
    * Launch splash screen.
-   * DOCUMENT_ME
    * 
+   *
    * @throws InterruptedException the interrupted exception
    * @throws InvocationTargetException the invocation target exception
    */
@@ -104,7 +104,7 @@ public class StartupGUIService {
 
   /**
    * Fire step one over.
-   * DOCUMENT_ME
+   * 
    */
   public static void fireStepOneOver() {
     if (sc != null) {
@@ -119,7 +119,7 @@ public class StartupGUIService {
 
   /**
    * Fire step two over.
-   * DOCUMENT_ME
+   * 
    */
   public static void fireStepTwoOver() {
     if (sc != null) {
@@ -134,7 +134,7 @@ public class StartupGUIService {
 
   /**
    * Fire step three over.
-   * DOCUMENT_ME
+   * 
    */
   public static void fireStepThreeOver() {
     if (sc != null) {
@@ -149,20 +149,21 @@ public class StartupGUIService {
 
   /**
    * Startup over.
-   * DOCUMENT_ME
+   *
    */
   public static void startupOver() {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        if (sc != null) {
+    if (sc != null) {
+      SwingUtilities.invokeLater(new Runnable() {
+        @Override
+        public void run() {
+          // Display progress
           sc.setProgress(100);
           sc.splashOff();
+          // free resources
           sc = null;
         }
-      }
-    });
-
+      });
+    }
   }
 
   /**
@@ -176,10 +177,10 @@ public class StartupGUIService {
         try {
           // Start up action manager
           ActionManager.getInstance();
-
           // Display progress
-          sc.setProgress(80, Messages.getString("SplashScreen.3"));
-
+          if (sc != null) {
+            sc.setProgress(80, Messages.getString("SplashScreen.3"));
+          }
           // show window according to startup mode
           if (Conf.getInt(Const.CONF_STARTUP_DISPLAY) == Const.DISPLAY_MODE_MAIN_WINDOW) {
             JajukMainWindow mainWindow = JajukMainWindow.getInstance();
@@ -192,7 +193,9 @@ public class StartupGUIService {
             // important that the fs frame is shown on the correct display
             JajukMainWindow.getInstance().applyStoredSize();
             // Display progress
-            sc.setProgress(80, Messages.getString("SplashScreen.3"));
+            if (sc != null) {
+              sc.setProgress(80, Messages.getString("SplashScreen.3"));
+            }
             ActionManager.getAction(JajukActions.FULLSCREEN_JAJUK).perform(null);
           }
           // Start the slimbar if required
@@ -205,6 +208,14 @@ public class StartupGUIService {
             JajukSystray tray = JajukSystray.getInstance();
             tray.getWindowStateDecorator().display(true);
           }
+          // Display simple device wizard if user didn't yet created any device
+          if (DeviceManager.getInstance().getDevices().size() == 0
+              && !UpgradeManager.isFirstSession()) {
+            SimpleDeviceWizard wizard = new SimpleDeviceWizard();
+            wizard.pack();
+            wizard.setLocationRelativeTo(JajukMainWindow.getInstance());
+            wizard.setVisible(true);
+          }
           // Display tip of the day if required (not at the first
           // session to avoid displaying too many windows once)
           if (Conf.getBoolean(Const.CONF_SHOW_TIP_ON_STARTUP) && !UpgradeManager.isFirstSession()) {
@@ -216,23 +227,8 @@ public class StartupGUIService {
           // last chance to catch any error for
           // logging purpose
           Log.error(106, e);
-        } finally {
-          if (sc != null) {
-            // Display progress
-            sc.setProgress(100);
-            sc.splashOff();
-
-            // free resources
-            sc = null;
-          }
-          // Notify any first time wizard to startup refresh
-          synchronized (StartupCollectionService.canLaunchRefresh) {
-            StartupCollectionService.canLaunchRefresh.notify();
-          }
         }
       }
     });
-
   }
-
 }
diff --git a/src/main/java/org/jajuk/services/startup/package.html b/src/main/java/org/jajuk/services/startup/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/startup/package.html
+++ b/src/main/java/org/jajuk/services/startup/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/services/tags/ITagImpl.java b/src/main/java/org/jajuk/services/tags/ITagImpl.java
index a9eb7cb..dcf861e 100644
--- a/src/main/java/org/jajuk/services/tags/ITagImpl.java
+++ b/src/main/java/org/jajuk/services/tags/ITagImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,20 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.tags;
 
 import java.util.List;
 
 import org.jajuk.services.covers.Cover;
-import org.jaudiotagger.tag.FieldDataInvalidException;
-import org.jaudiotagger.tag.KeyNotFoundException;
 
 /**
  * Mandatory methods required for all tag implementations.
  */
 public interface ITagImpl {
+  /**
+   * Whether the file contains a tag
+   * @return whether the file contains a tag
+   */
+  boolean isTagAvailable();
 
   /**
    * Gets the track name.
@@ -142,7 +145,7 @@ public interface ITagImpl {
   /**
    * Sets the track name.
    * 
-   * @param sTrackName DOCUMENT_ME
+   * @param sTrackName 
    * 
    * @throws Exception the exception
    */
@@ -151,7 +154,7 @@ public interface ITagImpl {
   /**
    * Sets the album name.
    * 
-   * @param sAlbumName DOCUMENT_ME
+   * @param sAlbumName 
    * 
    * @throws Exception the exception
    */
@@ -160,7 +163,7 @@ public interface ITagImpl {
   /**
    * Sets the artist name.
    * 
-   * @param sArtistName DOCUMENT_ME
+   * @param sArtistName 
    * 
    * @throws Exception the exception
    */
@@ -169,7 +172,7 @@ public interface ITagImpl {
   /**
    * Sets the album artist.
    * 
-   * @param sAlbumArtist DOCUMENT_ME
+   * @param sAlbumArtist 
    * 
    * @throws Exception the exception
    */
@@ -178,7 +181,7 @@ public interface ITagImpl {
   /**
    * Sets the disc number.
    * 
-   * @param discnumber DOCUMENT_ME
+   * @param discnumber 
    * 
    * @throws Exception the exception
    */
@@ -187,7 +190,7 @@ public interface ITagImpl {
   /**
    * Sets the genre name.
    * 
-   * @param genre DOCUMENT_ME
+   * @param genre 
    * 
    * @throws Exception the exception
    */
@@ -196,7 +199,7 @@ public interface ITagImpl {
   /**
    * Sets the year.
    * 
-   * @param sYear DOCUMENT_ME
+   * @param sYear 
    * 
    * @throws Exception the exception
    */
@@ -205,7 +208,7 @@ public interface ITagImpl {
   /**
    * Sets the comment.
    * 
-   * @param sComment DOCUMENT_ME
+   * @param sComment 
    * 
    * @throws Exception the exception
    */
@@ -214,7 +217,7 @@ public interface ITagImpl {
   /**
    * Sets the lyrics.
    * 
-   * @param sLyrics DOCUMENT_ME
+   * @param sLyrics 
    * 
    * @throws Exception the exception
    */
@@ -230,7 +233,7 @@ public interface ITagImpl {
   /**
    * Set current file to work with.
    * 
-   * @param fio DOCUMENT_ME
+   * @param fio 
    * 
    * @throws Exception the exception
    */
@@ -239,7 +242,7 @@ public interface ITagImpl {
   /**
    * Set track order.
    * 
-   * @param lOrder DOCUMENT_ME
+   * @param lOrder 
    * 
    * @throws Exception the exception
    */
@@ -255,7 +258,7 @@ public interface ITagImpl {
   /**
    * Get value of tagFieldKey.
    * 
-   * @param tagFieldKey DOCUMENT_ME
+   * @param tagFieldKey 
    * 
    * @return the tag field
    * 
@@ -265,12 +268,9 @@ public interface ITagImpl {
 
   /**
    * Set value of tagFieldKey.
-   * 
-   * @param tagFieldKey DOCUMENT_ME
-   * @param tagFieldValue DOCUMENT_ME
-   * 
-   * @throws FieldDataInvalidException the field data invalid exception
-   * @throws KeyNotFoundException the key not found exception
+   *
+   * @param tagFieldKey 
+   * @param tagFieldValue 
    * @throws Exception the exception
    */
   public void setTagField(String tagFieldKey, String tagFieldValue) throws Exception;
@@ -281,12 +281,12 @@ public interface ITagImpl {
    * @return the supported tag fields
    */
   public List<String> getSupportedTagFields();
-  
+
   /**
-   * Gets the embedded covers. 
-   * 
+   * Gets the embedded covers.
+   *
    * @return the covers or a void list if none.
+   * @throws Exception the exception
    */
   public List<Cover> getCovers() throws Exception;
-
 }
diff --git a/src/main/java/org/jajuk/services/tags/JAudioTaggerTagImpl.java b/src/main/java/org/jajuk/services/tags/JAudioTaggerTagImpl.java
index b760348..d45bae5 100644
--- a/src/main/java/org/jajuk/services/tags/JAudioTaggerTagImpl.java
+++ b/src/main/java/org/jajuk/services/tags/JAudioTaggerTagImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.tags;
 
@@ -26,6 +26,8 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.logging.LogManager;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.imageio.ImageIO;
 
@@ -45,27 +47,28 @@ import org.jaudiotagger.tag.FieldKey;
 import org.jaudiotagger.tag.KeyNotFoundException;
 import org.jaudiotagger.tag.Tag;
 import org.jaudiotagger.tag.TagField;
-import org.jaudiotagger.tag.datatype.Artwork;
 import org.jaudiotagger.tag.id3.ID3v1Tag;
 import org.jaudiotagger.tag.id3.ID3v24Tag;
+import org.jaudiotagger.tag.images.Artwork;
 
 /**
+ * .
+ *
  * {@link ITagImpl} Implementation based on <a
  * href="https://jaudiotagger.dev.java.net">JAudiotagger</a>
+ * 
+ * We expect that tag is not null when calling getXXX() methods
  */
 public class JAudioTaggerTagImpl implements ITagImpl, Const {
-
-  /** DOCUMENT_ME. */
   private static List<String> tagFieldKeyArrayList = new ArrayList<String>();
-
+  private static final Pattern PATTERN_NON_DIGIT = Pattern.compile(".*[^0-9].*");
+  private static final Pattern PATTERN_FOUR_DIGITS = Pattern.compile("\\D*(\\d{4})\\D*");
   static {
     try {
       // Disable Jaudiotagger logs
       LogManager.getLogManager().readConfiguration(
           new ByteArrayInputStream("org.jaudiotagger.level = OFF".getBytes()));
-
       // get supported tags
-
       FieldKey[] tagFieldKeys = FieldKey.values();
       for (FieldKey tfk : tagFieldKeys) {
         if (!tfk.equals(FieldKey.DISC_NO) && !tfk.equals(FieldKey.ALBUM)
@@ -80,68 +83,51 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
       Log.error(e);
     }
   }
-
   /** the current audio file instance (set by {@link #setFile(File)}).<br> */
   private AudioFile audioFile;
-
   /** the current {@linkplain Tag tag} ( {@link AudioFile#getTag()} ) set by {@link #setFile(File)}.<br> */
   private Tag tag;
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#commit()
-   */
   @Override
   public void commit() throws Exception {
     this.audioFile.commit();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getAlbumName()
-   */
   @Override
   public String getAlbumName() throws Exception {
     return this.tag.getFirst(FieldKey.ALBUM);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getArtistName()
-   */
   @Override
   public String getArtistName() throws Exception {
     return this.tag.getFirst(FieldKey.ARTIST);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getComment()
-   */
+  @Override
+  public String getLyrics() throws Exception {
+    String lyrics = tag.getFirst(FieldKey.LYRICS);
+    if (StringUtils.isBlank(lyrics)) {
+      return "";
+    } else {
+      return lyrics;
+    }
+  }
+
+  @Override
+  public String getAlbumArtist() throws Exception {
+    return this.tag.getFirst(FieldKey.ALBUM_ARTIST);
+  }
+
   @Override
   public String getComment() throws Exception {
     return this.tag.getFirst(FieldKey.COMMENT);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getLength()
-   */
   @Override
   public long getLength() throws Exception {
     return this.audioFile.getAudioHeader().getTrackLength();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getOrder()
-   */
   @Override
   public long getOrder() throws Exception {
     String sOrder = this.tag.getFirst(FieldKey.TRACK);
@@ -154,21 +140,11 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
     return Long.parseLong(sOrder);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getQuality()
-   */
   @Override
   public long getQuality() throws Exception {
     return this.audioFile.getAudioHeader().getBitRateAsNumber();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getGenreName()
-   */
   @Override
   public String getGenreName() throws Exception {
     String result = this.tag.getFirst(FieldKey.GENRE);
@@ -197,85 +173,50 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
     return result;
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getTrackName()
-   */
   @Override
   public String getTrackName() throws Exception {
     return this.tag.getFirst(FieldKey.TITLE);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getYear()
-   */
   @Override
   public String getYear() throws Exception {
     String result = this.tag.getFirst(FieldKey.YEAR);
     if (StringUtils.isBlank(result)) {
-      result = "0";
-    } else {
-      Long.parseLong(result);
+      return "0";
     }
-    return result;
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getLyrics()
-   */
-  @Override
-  public String getLyrics() throws Exception {
-    String lyrics = tag.getFirst(FieldKey.LYRICS);
-    if (StringUtils.isBlank(lyrics)) {
-      return "";
+    // The string contains at least a single character other than a digit, 
+    // then try to parse the first four digits if any 
+    if (PATTERN_NON_DIGIT.matcher(result).matches()) {
+      Matcher matcher = PATTERN_FOUR_DIGITS.matcher(result);
+      if (matcher.find()) {
+        return matcher.group(1);
+      } else {
+        throw new NumberFormatException("Wrong year or date format");
+      }
     } else {
-      return lyrics;
+      // Only digits
+      return result;
     }
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setAlbumName(java.lang.String)
-   */
   @Override
   public void setAlbumName(String albumName) throws Exception {
     createTagIfNeeded();
     this.tag.setField(FieldKey.ALBUM, albumName);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setArtistName(java.lang.String)
-   */
   @Override
   public void setArtistName(String artistName) throws Exception {
     createTagIfNeeded();
     this.tag.setField(FieldKey.ARTIST, artistName);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setComment(java.lang.String)
-   */
   @Override
   public void setComment(String comment) throws Exception {
     createTagIfNeeded();
     this.tag.setField(FieldKey.COMMENT, comment);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setLyrics(java.lang.String)
-   */
   @Override
   public void setLyrics(String sLyrics) throws Exception {
     createTagIfNeeded();
@@ -284,22 +225,12 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
     commit();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#deleteLyrics()
-   */
   @Override
   public void deleteLyrics() throws Exception {
     tag.deleteField(FieldKey.LYRICS);
     commit();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setFile(java.io.File)
-   */
   @Override
   public void setFile(File fio) throws Exception {
     try {
@@ -343,81 +274,43 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
       newTag.setField(FieldKey.GENRE, tag.getFirst(FieldKey.GENRE));
       newTag.setField(FieldKey.YEAR, tag.getFirst(FieldKey.YEAR));
       newTag.setField(FieldKey.ALBUM_ARTIST, tag.getFirst(FieldKey.ALBUM_ARTIST));
-
       // only set the discnumber if we have a useful one
       String discno = tag.getFirst(FieldKey.DISC_NO);
       if (StringUtils.isNotEmpty(discno) && StringUtils.isNumeric(discno)) {
         newTag.setField(FieldKey.DISC_NO, discno);
       }
-
       // Delete the id3 V1 tag
       AudioFileIO.delete(audioFile);
       // Add the new one
       audioFile.setTag(newTag);
       this.tag = newTag;
     }
-
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setOrder(long)
-   */
   @Override
   public void setOrder(long order) throws Exception {
     createTagIfNeeded();
     this.tag.setField(FieldKey.TRACK, Long.toString(order));
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setGenreName(java.lang.String)
-   */
   @Override
   public void setGenreName(String genre) throws Exception {
     createTagIfNeeded();
     this.tag.setField(FieldKey.GENRE, genre);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setTrackName(java.lang.String)
-   */
   @Override
   public void setTrackName(String trackName) throws Exception {
     createTagIfNeeded();
     this.tag.setField(FieldKey.TITLE, trackName);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setYear(java.lang.String)
-   */
   @Override
   public void setYear(String year) throws Exception {
     createTagIfNeeded();
     this.tag.setField(FieldKey.YEAR, year);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getAlbumArtist()
-   */
-  @Override
-  public String getAlbumArtist() throws Exception {
-    return this.tag.getFirst(FieldKey.ALBUM_ARTIST);
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setTagField(java.lang.String, java.lang.String)
-   */
   @Override
   public void setTagField(String tagFieldKey, String tagFieldValue) {
     try {
@@ -439,24 +332,13 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
     return tagFieldKeyArrayList;
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getTagField(java.lang.String)
-   */
   @Override
   public String getTagField(String tagFieldKey) throws Exception {
     return this.tag.getFirst(FieldKey.valueOf(tagFieldKey));
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#getDiscNumber()
-   */
   @Override
   public long getDiscNumber() throws Exception {
-
     String sDiscNumber = this.tag.getFirst(FieldKey.DISC_NO);
     if (StringUtils.isBlank(sDiscNumber)) {
       return 01;
@@ -467,31 +349,18 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
     return Long.parseLong(sDiscNumber);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setAlbumArtist(java.lang.String)
-   */
   @Override
   public void setAlbumArtist(String albumArtist) throws Exception {
     createTagIfNeeded();
     tag.setField(FieldKey.ALBUM_ARTIST, albumArtist);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.services.tags.ITagImpl#setDiscNumber(int)
-   */
   @Override
   public void setDiscNumber(long discnumber) throws Exception {
     createTagIfNeeded();
     tag.setField(FieldKey.DISC_NO, Long.toString(discnumber));
   }
 
-  /* (non-Javadoc)
-   * @see org.jajuk.services.tags.ITagImpl#getCovers()
-   */
   @Override
   public List<Cover> getCovers() throws Exception {
     List<Cover> covers = new ArrayList<Cover>(1);
@@ -510,8 +379,11 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
           }
         }
       }
-      Cover cover = new Cover(coverFile, CoverType.TAG_COVER);
-      covers.add(cover);
+      // test if the cover has actually been created, it is not if the tag image was corrupted
+      if (coverFile.exists()) {
+        Cover cover = new Cover(coverFile, CoverType.TAG_COVER);
+        covers.add(cover);
+      }
       index++;
     }
     return covers;
@@ -535,4 +407,8 @@ public class JAudioTaggerTagImpl implements ITagImpl, Const {
     return coverFile;
   }
 
+  @Override
+  public boolean isTagAvailable() {
+    return (tag != null);
+  }
 }
diff --git a/src/main/java/org/jajuk/services/tags/NoTagsTagImpl.java b/src/main/java/org/jajuk/services/tags/NoTagsTagImpl.java
index 221bfd0..892b110 100644
--- a/src/main/java/org/jajuk/services/tags/NoTagsTagImpl.java
+++ b/src/main/java/org/jajuk/services/tags/NoTagsTagImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.tags;
 
 import java.io.File;
@@ -39,14 +38,10 @@ import org.jajuk.util.UtilFeatures;
  * Tagger implementation for formats without tags and read by BasicPlayer API.
  */
 public class NoTagsTagImpl implements ITagImpl {
-
   /** Analyzed file. */
   private File fio;
-
   /** Current file data. */
   private Map<String, Object> mapInfo;
-
-  /** DOCUMENT_ME. */
   private static List<String> tagFieldKeyArrayList = new ArrayList<String>();
 
   /*
@@ -104,13 +99,13 @@ public class NoTagsTagImpl implements ITagImpl {
     BasicPlayer player = new BasicPlayer();
     player.addBasicPlayerListener(new BasicPlayerListener() {
       @Override
-      @SuppressWarnings( { "unchecked", "rawtypes" })
+      @SuppressWarnings({ "unchecked", "rawtypes" })
       public void opened(Object arg0, Map mProperties) {
         NoTagsTagImpl.this.mapInfo = mProperties;
       }
 
       @Override
-      @SuppressWarnings( { "rawtypes", "unchecked" })
+      @SuppressWarnings({ "rawtypes" })
       public void progress(int iBytesread, long lMicroseconds, byte[] bPcmdata, Map mProperties) {
         // required by interface, but nothing to do here...
       }
@@ -367,7 +362,15 @@ public class NoTagsTagImpl implements ITagImpl {
    */
   @Override
   public List<Cover> getCovers() throws Exception {
-    return new ArrayList<Cover>(1);
+    // TODO Auto-generated method stub
+    return null;
   }
 
+  /* (non-Javadoc)
+   * @see org.jajuk.services.tags.ITagImpl#isTagAvailable()
+   */
+  @Override
+  public boolean isTagAvailable() {
+    return true;
+  }
 }
diff --git a/src/main/java/org/jajuk/services/tags/Tag.java b/src/main/java/org/jajuk/services/tags/Tag.java
index cb1817e..bcb1276 100644
--- a/src/main/java/org/jajuk/services/tags/Tag.java
+++ b/src/main/java/org/jajuk/services/tags/Tag.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.tags;
 
@@ -44,39 +44,39 @@ import org.jajuk.util.log.Log;
  * abstract tag, independent from real implementation.
  */
 public class Tag {
-
   /** Current tag impl*. */
   private ITagImpl tagImpl;
-
   /** Current file*. */
   private File fio;
-
   /** Is this tag corrupted ?. */
   private boolean bCorrupted = false;
-
   /** File -> tag cache This is required by the autocommit=false operations. */
   static private Map<File, Tag> tagsCache = new HashMap<File, Tag>(10);
-
-  /** DOCUMENT_ME. */
   private static List<String> supportedTagFields = null;
 
   /**
    * Tag constructor.
    * 
-   * @param fio DOCUMENT_ME
-   * @param bIgnoreErrors DOCUMENT_ME
+   * @param fio 
+   * @param bIgnoreErrors ignore error and keep instance anyway
    * 
    * @throws JajukException the jajuk exception
    * 
-   * @bIgnoreError : ignore error and keep instance
    */
   public Tag(java.io.File fio, boolean bIgnoreErrors) throws JajukException {
     try {
       this.fio = fio;
       Type type = TypeManager.getInstance().getTypeByExtension(UtilSystem.getExtension(fio));
+      if (type == null) {
+        constructionError(fio, bIgnoreErrors, "No type for file: ");
+        return;
+      }
       tagImpl = type.getTagImpl();
+      if (tagImpl == null) {
+        constructionError(fio, bIgnoreErrors, "No TagImpl for file: ");
+        return;
+      }
       tagImpl.setFile(fio);
-      bCorrupted = false;
     } catch (Exception e) {
       bCorrupted = true;
       if (!bIgnoreErrors) {
@@ -86,6 +86,19 @@ public class Tag {
   }
 
   /**
+   * @param fio
+   * @param bIgnoreErrors
+   * @throws JajukException
+   */
+  private final void constructionError(java.io.File fio, boolean bIgnoreErrors, String error)
+      throws JajukException {
+    if (!bIgnoreErrors) {
+      throw new JajukException(103, error + (fio == null ? "<null>" : fio.getName()));
+    }
+    bCorrupted = true;
+  }
+
+  /**
    * Gets the track name.
    * 
    * @return track name as defined in tags are file name otherwise
@@ -93,10 +106,9 @@ public class Tag {
   public String getTrackName() {
     // by default, track name is the file name without extension
     String sTrackName = UtilSystem.removeExtension(fio.getName());
-    if (tagImpl == null) { // if the type doesn't support tags ( like wav )
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return sTrackName;
     }
-
     try {
       String sTemp = tagImpl.getTrackName().trim();
       if (!"".equals(sTemp)) {
@@ -115,7 +127,7 @@ public class Tag {
    * @return album name
    */
   public String getAlbumName() {
-    if (tagImpl == null) { // if the type doesn't support tags ( like wav )
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       if (Conf.getBoolean(Const.CONF_TAGS_USE_PARENT_DIR)) {
         return fio.getParentFile().getName();
         // if album is not found, take current directory as album name
@@ -137,7 +149,6 @@ public class Tag {
     } catch (Exception e) {
       Log.info("Wrong album name:{{" + fio.getName() + "}}");
     }
-
     if (sAlbumlName == null) { // album tag cannot be found
       if (Conf.getBoolean(Const.CONF_TAGS_USE_PARENT_DIR)) {
         sAlbumlName = fio.getParentFile().getName();
@@ -159,7 +170,7 @@ public class Tag {
   public String getArtistName() {
     String sArtistName = Const.UNKNOWN_ARTIST;
     // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return sArtistName;
     }
     try {
@@ -187,10 +198,9 @@ public class Tag {
   public String getAlbumArtist() {
     String sAlbumArtist = Const.UNKNOWN_ARTIST;
     // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return sAlbumArtist;
     }
-
     try {
       String sTemp = tagImpl.getAlbumArtist().trim();
       if (Messages.getString(Const.UNKNOWN_ARTIST).equals(sTemp)) {
@@ -203,7 +213,6 @@ public class Tag {
     }
     // We internalize the artist name for memory saving reasons
     return sAlbumArtist.intern();
-
   }
 
   /**
@@ -213,11 +222,9 @@ public class Tag {
    */
   public String getGenreName() {
     String genre = Const.UNKNOWN_GENRE;
-    // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return genre;
     }
-
     try {
       String sTemp = tagImpl.getGenreName().trim();
       if (Messages.getString(Const.UNKNOWN_GENRE).equals(sTemp)) {
@@ -236,7 +243,6 @@ public class Tag {
     }
     // We internalize the genre name for memory saving reasons
     return genre.intern();
-
   }
 
   /**
@@ -246,8 +252,7 @@ public class Tag {
    */
   public long getLength() {
     long length = 0;
-    // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return 0;
     }
     try {
@@ -265,14 +270,13 @@ public class Tag {
    */
   public long getDiscNumber() {
     long l = 0l;
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
+      return l;
+    }
     try {
       l = tagImpl.getDiscNumber();
-
     } catch (Exception e) {
-      // just debug, no warn because wrong order are too often and
-      // generate too much traces
       Log.info("Wrong disc number:{{" + fio.getName() + "}}");
-      l = 01;
     }
     return l;
   }
@@ -284,8 +288,7 @@ public class Tag {
    */
   public String getYear() {
     String year = "0";
-    // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return year;
     }
     try {
@@ -295,7 +298,6 @@ public class Tag {
     }
     // We internalize the year name for memory saving reasons
     return year.intern();
-
   }
 
   /**
@@ -305,8 +307,7 @@ public class Tag {
    */
   public long getQuality() {
     long lQuality = 0l;
-    // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return lQuality;
     }
     try {
@@ -324,11 +325,9 @@ public class Tag {
    */
   public String getComment() {
     String sComment = "";
-    // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return sComment;
     }
-
     try {
       String sTemp = tagImpl.getComment();
       if (sTemp != null && !sTemp.equals("")) {
@@ -347,19 +346,20 @@ public class Tag {
    * @return comment
    */
   public long getOrder() {
-    long l = 0l;
+    long order = 0l;
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
+      return order;
+    }
     try {
-      l = tagImpl.getOrder();
-      if (l < 0) {
+      order = tagImpl.getOrder();
+      if (order < 0) {
         throw new Exception("Negative Order");
       }
     } catch (Exception e) {
-      // just debug, no warn because wrong order are too often and
-      // generate too much traces
       Log.info("Wrong order:{{" + fio.getName() + "}}");
-      l = 0;
+      order = 0;
     }
-    return l;
+    return order;
   }
 
   /**
@@ -369,17 +369,14 @@ public class Tag {
    */
   public String getLyrics() {
     String sLyrics = "";
-    // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return sLyrics;
     }
-
     try {
       sLyrics = tagImpl.getLyrics();
     } catch (Exception e) {
       Log.info("Wrong lyrics:{{" + fio.getName() + "}}");
     }
-
     return sLyrics;
   }
 
@@ -391,7 +388,7 @@ public class Tag {
   public List<Cover> getCovers() {
     List<Cover> covers = new ArrayList<Cover>(1);
     // if the type doesn't support tags ( like wav )
-    if (tagImpl == null) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
       return covers;
     }
     try {
@@ -408,7 +405,7 @@ public class Tag {
   /**
    * Sets the track name.
    * 
-   * @param sTrackName DOCUMENT_ME
+   * @param sTrackName 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -423,7 +420,7 @@ public class Tag {
   /**
    * Sets the album name.
    * 
-   * @param sAlbumName DOCUMENT_ME
+   * @param sAlbumName 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -438,7 +435,7 @@ public class Tag {
   /**
    * Sets the artist name.
    * 
-   * @param sArtistName DOCUMENT_ME
+   * @param sArtistName 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -453,7 +450,7 @@ public class Tag {
   /**
    * Sets the album artist.
    * 
-   * @param sAlbumArtist DOCUMENT_ME
+   * @param sAlbumArtist 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -468,7 +465,7 @@ public class Tag {
   /**
    * Sets the genre name.
    * 
-   * @param genre DOCUMENT_ME
+   * @param genre 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -483,7 +480,7 @@ public class Tag {
   /**
    * Sets the order.
    * 
-   * @param lOrder DOCUMENT_ME
+   * @param lOrder 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -498,7 +495,7 @@ public class Tag {
   /**
    * Sets the year.
    * 
-   * @param sYear DOCUMENT_ME
+   * @param sYear 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -513,7 +510,7 @@ public class Tag {
   /**
    * Sets the disc number.
    * 
-   * @param discnumber DOCUMENT_ME
+   * @param discnumber 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -528,7 +525,7 @@ public class Tag {
   /**
    * Sets the comment.
    * 
-   * @param sComment DOCUMENT_ME
+   * @param sComment 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -559,7 +556,7 @@ public class Tag {
   }
 
   /**
-   * Delete lyrics. DOCUMENT_ME
+   * Delete lyrics. 
    * 
    * @throws JajukException the jajuk exception
    */
@@ -582,6 +579,9 @@ public class Tag {
       if (Log.isDebugEnabled() && !(tagImpl.getClass().equals(NoTagsTagImpl.class))) {
         Log.debug(Messages.getString("PropertiesWizard.11") + " {{" + fio.getAbsolutePath() + "}}");
       }
+      // Store file date, can be 0 if a problem occurs
+      long dateLastChange = fio.lastModified();
+      // Actual commit
       tagImpl.commit();
       // Display written file full path. Note that we use a limited string for
       // parent to make sure the file name itself is visible in information
@@ -590,7 +590,10 @@ public class Tag {
           Messages.getString("PropertiesWizard.11") + " "
               + UtilString.getLimitedString(fio.getParentFile().getAbsolutePath(), 60)
               + File.separatorChar + fio.getName(), InformationJPanel.MessageType.INFORMATIVE);
-
+      //Keep last change date if required
+      if (Conf.getBoolean(Const.CONF_PRESERVE_FILE_DATES) && dateLastChange != 0) {
+        fio.setLastModified(dateLastChange);
+      }
     } catch (Exception e) {
       // reset information panel to avoid leaving with a "writting xxx message"
       InformationJPanel.getInstance().setMessage("", InformationJPanel.MessageType.INFORMATIVE);
@@ -635,7 +638,14 @@ public class Tag {
     if (!(other instanceof Tag)) {
       return false;
     }
-    return this.fio.equals(((Tag) other).getFio());
+    Tag otherTag = (Tag) other;
+    if (fio == null && otherTag.fio == null) {
+      return true;
+    }
+    if (fio == null || otherTag.fio == null) {
+      return false;
+    }
+    return this.fio.equals(otherTag.getFio());
   }
 
   /*
@@ -645,7 +655,8 @@ public class Tag {
    */
   @Override
   public int hashCode() {
-    return fio.getAbsolutePath().hashCode();
+    // use an arbitrary primary number for hashCode if fio is null...
+    return fio == null ? 13 : fio.getAbsolutePath().hashCode();
   }
 
   /*
@@ -655,14 +666,14 @@ public class Tag {
    */
   @Override
   public String toString() {
-    return "Tag of : " + fio.getAbsolutePath();
+    return "Tag of : " + (fio == null ? "<null>" : fio.getAbsolutePath());
   }
 
   /**
    * Return cached tag or new tag if non already in cache.
    * 
    * @param fio the audio file containing the tag
-   * @param bIgnoreErrors DOCUMENT_ME
+   * @param bIgnoreErrors 
    * 
    * @return cached tag or new tag if non already in cache
    * 
@@ -690,20 +701,38 @@ public class Tag {
   /**
    * Gets the tag field.
    * 
-   * @param tagFieldKey DOCUMENT_ME
+   * @param tagFieldKey 
    * 
    * @return the tag field
    */
   public String getTagField(String tagFieldKey) {
+    if (tagImpl == null || !tagImpl.isTagAvailable()) {
+      return "";
+    }
     try {
       return tagImpl.getTagField(tagFieldKey).trim();
     } catch (Exception e) {
-      // this file does not support this tag, so we do nothing
+      Log.error(e);
     }
     return "";
   }
 
   /**
+  * Set the tag field.
+  * 
+  * @param tagFieldKey 
+  * @param tagFieldValue
+  * 
+  */
+  public void setTagField(String tagFieldKey, String tagFieldValue) {
+    try {
+      tagImpl.setTagField(tagFieldKey, tagFieldValue);
+    } catch (Exception e) {
+      Log.error(e);
+    }
+  }
+
+  /**
    * Gets the supported tag fields.
    * 
    * @return the supported tag fields
@@ -711,7 +740,6 @@ public class Tag {
   public static List<String> getSupportedTagFields() {
     if (supportedTagFields == null) {
       supportedTagFields = new ArrayList<String>();
-
       // get all available tag impls
       List<ITagImpl> tagImplList = new ArrayList<ITagImpl>(2);
       for (Type t : TypeManager.getInstance().getAllMusicTypes()) {
@@ -725,7 +753,6 @@ public class Tag {
           }
         }
       }
-
       for (ITagImpl t : tagImplList) {
         for (String s : t.getSupportedTagFields()) {
           if (!supportedTagFields.contains(s)) {
@@ -734,7 +761,6 @@ public class Tag {
         }
       }
     }
-
     return supportedTagFields;
   }
 
@@ -744,9 +770,7 @@ public class Tag {
    * @return the activatedExtraTags
    */
   public static List<String> getActivatedExtraTags() {
-
     List<String> activeExtraTagsArrayList = new ArrayList<String>();
-
     // check all custom properties
     for (PropertyMetaInformation m : TrackManager.getInstance().getCustomProperties()) {
       if (getSupportedTagFields().contains(m.getName())) {
diff --git a/src/main/java/org/jajuk/services/webradio/CustomRadiosPersistenceHelper.java b/src/main/java/org/jajuk/services/webradio/CustomRadiosPersistenceHelper.java
new file mode 100644
index 0000000..a9cbaef
--- /dev/null
+++ b/src/main/java/org/jajuk/services/webradio/CustomRadiosPersistenceHelper.java
@@ -0,0 +1,140 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.webradio;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+
+import org.jajuk.services.core.SessionService;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.UtilSystem;
+import org.jajuk.util.log.Log;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+   * Preset radios parser
+   */
+public class CustomRadiosPersistenceHelper extends DefaultHandler {
+  /** In radio tag. */
+  private boolean inRadio;
+
+  /**
+   * Called when we start an element.
+   * 
+   * @param sUri 
+   * @param s 
+   * @param sQName 
+   * @param attributes 
+   * 
+   * @throws SAXException the SAX exception
+   */
+  @Override
+  public void startElement(String sUri, String s, String sQName, Attributes attributes)
+      throws SAXException {
+    try {
+      if (Const.XML_STREAM.equals(sQName)) {
+        String name = attributes.getValue(attributes.getIndex(Const.XML_NAME));
+        String url = attributes.getValue(attributes.getIndex(Const.XML_URL));
+        String keywords = attributes.getValue(attributes.getIndex(Const.XML_KEYWORDS));
+        String genre = attributes.getValue(attributes.getIndex(Const.XML_GENRE));
+        String bitrate = attributes.getValue(attributes.getIndex(Const.XML_BITRATE));
+        String frequency = attributes.getValue(attributes.getIndex(Const.XML_FREQUENCY));
+        String label = attributes.getValue(attributes.getIndex(Const.XML_DESC));
+        WebRadio radio = WebRadioManager.getInstance().registerWebRadio(name);
+        radio.setProperty(Const.XML_URL, url);
+        if (!UtilString.isEmpty(label)) {
+          radio.setProperty(Const.XML_DESC, label);
+        }
+        if (!UtilString.isEmpty(bitrate)) {
+          radio.setProperty(Const.XML_BITRATE, Long.parseLong(bitrate));
+        }
+        if (!UtilString.isEmpty(frequency)) {
+          radio.setProperty(Const.XML_FREQUENCY, Long.parseLong(frequency));
+        }
+        if (!UtilString.isEmpty(keywords)) {
+          radio.setProperty(Const.XML_KEYWORDS, keywords);
+        }
+        if (!UtilString.isEmpty(genre)) {
+          radio.setProperty(Const.XML_GENRE, genre);
+        }
+        // It is a custom webradio as we are in this class
+        radio.setProperty(Const.XML_ORIGIN, WebRadioOrigin.CUSTOM);
+      }
+    } catch (Exception e) {
+      Log.error(e);
+    }
+  }
+
+  /**
+  * Write down custom webradios for persistence between sessions.
+  * 
+  * @throws IOException Signals that an I/O exception has occurred.
+  */
+  public static void commit() throws IOException {
+    WebRadioManager manager = WebRadioManager.getInstance();
+    File out = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_CUSTOM + "."
+        + Const.FILE_SAVING_FILE_EXTENSION);
+    String sCharset = Conf.getString(Const.CONF_COLLECTION_CHARSET);
+    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out),
+        sCharset), 1000000);
+    try {
+      // If optional attribute is void, don't write it down
+      bw.write("<?xml version='1.0' encoding='" + sCharset + "'?>\n");
+      bw.write("<" + Const.XML_STREAMS + " " + Const.XML_VERSION + "='" + Const.JAJUK_VERSION
+          + "'>\n");
+      // Manage each stream
+      for (WebRadio radio : manager.getWebRadiosByOrigin(WebRadioOrigin.CUSTOM)) {
+        bw.write("\t<" + Const.XML_STREAM + " "
+        // Name
+            + Const.XML_NAME + "='" + UtilString.formatXML(radio.getName()) + "' "
+            //URL
+            + Const.XML_URL + "='" + UtilString.formatXML(radio.getUrl()) + "' "
+            //Label
+            + Const.XML_DESC + "='" + UtilString.formatXML(radio.getDescription()) + "' "
+            //keywords
+            + Const.XML_KEYWORDS + "='" + UtilString.formatXML(radio.getKeywords()) + "' "
+            //genre
+            + Const.XML_GENRE + "='" + UtilString.formatXML(radio.getGenre()) + "' "
+            //Bitrate
+            + Const.XML_BITRATE + "='" + radio.getValue(Const.XML_BITRATE) + "' "
+            //Frequency
+            + Const.XML_FREQUENCY + "='" + radio.getValue(Const.XML_FREQUENCY) + "' "
+            //End of line
+            + "/>\n");
+      }
+      // close
+      bw.write("</" + Const.XML_STREAMS + ">\n");
+      bw.flush();
+    } finally {
+      bw.close();
+    }
+    File finalFile = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_CUSTOM);
+    UtilSystem.saveFileWithRecoverySupport(finalFile);
+    Log.debug("Custom webradios list commited to : " + finalFile.getAbsolutePath());
+  }
+}
diff --git a/src/main/java/org/jajuk/services/webradio/PresetRadiosPersistenceHelper.java b/src/main/java/org/jajuk/services/webradio/PresetRadiosPersistenceHelper.java
new file mode 100644
index 0000000..4e5a873
--- /dev/null
+++ b/src/main/java/org/jajuk/services/webradio/PresetRadiosPersistenceHelper.java
@@ -0,0 +1,224 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.webradio;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+
+import org.jajuk.services.core.SessionService;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.UtilSystem;
+import org.jajuk.util.log.Log;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+   * Preset radios parser
+   */
+public class PresetRadiosPersistenceHelper extends DefaultHandler {
+  /** Temporary buffer. */
+  private StringBuilder buffer;
+  /** Radio name */
+  private String radioName;
+  /** Radio url */
+  private String radioUrl;
+  /** Radio label. */
+  private String radioLabel;
+  /** Radio genre  */
+  private String genre;
+  /** Radio keywords */
+  private String keywords;
+  /** Radio bitrate */
+  private String radioBitrate;
+  /** Radio frequency. */
+  private String radioFrequency;
+  /** Is the radio removed and should be ignored ? */
+  private String isRemoved;
+  // Preset file format XML tags (different tag set from jajuk webradio format)
+  private static final String TAG_NAME = "name";
+  private static final String TAG_URL = "url";
+  private static final String TAG_LABEL = "label";
+  private static final String TAG_BITRATE = "bitrate";
+  private static final String TAG_FREQUENCY = "frequency";
+  private static final String TAG_RADIO = "Radio";
+  private static final String TAG_LIST = "list";
+  private static final String TAG_REMOVED = "isRemoved";
+  private static final String TAG_GENRE = "genre";
+
+  /**
+   * Called when we start an element.
+   * 
+   * @param sUri 
+   * @param s 
+   * @param sQName 
+   * @param attributes 
+   * 
+   * @throws SAXException the SAX exception
+   */
+  @Override
+  public void startElement(String sUri, String s, String sQName, Attributes attributes)
+      throws SAXException {
+    buffer = new StringBuilder();
+    if (TAG_RADIO.equals(sQName)) {
+      keywords = attributes.getValue(attributes.getIndex(Const.XML_KEYWORDS));
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
+   */
+  @Override
+  public void characters(char[] ch, int start, int length) throws SAXException {
+    String s = new String(ch, start, length);
+    if (buffer != null) {
+      buffer.append(s);
+    }
+  }
+
+  /**
+   * End element in order to read from aTunes radio list.
+   * 
+   * @param uri 
+   * @param localName 
+   * @param qName 
+   * 
+   * @throws SAXException the SAX exception
+   */
+  @Override
+  public void endElement(String uri, String localName, String qName) throws SAXException {
+    if (Const.XML_RADIO.equals(qName)) {
+      // Ignore preset radio whose isRemoved tag is set
+      if (!UtilString.isEmpty(isRemoved) && "true".equals(isRemoved.toLowerCase())) {
+        return;
+      }
+      // End of radio element, add to list
+      WebRadio radio = WebRadioManager.getInstance().registerWebRadio(radioName);
+      radio.setProperty(Const.XML_URL, radioUrl);
+      if (!UtilString.isEmpty(radioLabel)) {
+        radio.setProperty(Const.XML_DESC, radioLabel);
+      }
+      if (!UtilString.isEmpty(radioBitrate)) {
+        radio.setProperty(Const.XML_BITRATE, Long.parseLong(radioBitrate));
+      }
+      if (!UtilString.isEmpty(radioFrequency)) {
+        radio.setProperty(Const.XML_FREQUENCY, Long.parseLong(radioFrequency));
+      }
+      if (!UtilString.isEmpty(keywords)) {
+        radio.setProperty(Const.XML_KEYWORDS, keywords);
+      }
+      if (!UtilString.isEmpty(genre)) {
+        radio.setProperty(Const.XML_GENRE, genre);
+      }
+      // It is a preset webradio as we are in this class
+      radio.setProperty(Const.XML_ORIGIN, WebRadioOrigin.PRESET);
+    } else if (TAG_NAME.equals(qName)) {
+      radioName = buffer.toString();
+    } else if (TAG_URL.equals(qName)) {
+      radioUrl = buffer.toString();
+    } else if (TAG_LABEL.equals(qName)) {
+      radioLabel = buffer.toString();
+    } else if (Const.XML_KEYWORDS.equals(qName)) {
+      keywords = buffer.toString();
+    } else if (TAG_BITRATE.equals(qName)) {
+      radioBitrate = buffer.toString();
+    } else if (TAG_FREQUENCY.equals(qName)) {
+      radioFrequency = buffer.toString();
+    } else if (TAG_REMOVED.equals(qName)) {
+      isRemoved = buffer.toString();
+    } else if (TAG_GENRE.equals(qName)) {
+      genre = buffer.toString();
+    }
+  }
+
+  /**
+  * Write down presets webradios for persistence between sessions.
+  * Note that final file is almost identical to the one downloaded from
+  * Assembla website but is augmented with Jajuk-specific concepts like keywords.
+  * 
+  * @throws IOException Signals that an I/O exception has occurred.
+  */
+  public static void commit() throws IOException {
+    WebRadioManager manager = WebRadioManager.getInstance();
+    File out = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET + "."
+        + Const.FILE_SAVING_FILE_EXTENSION);
+    String sCharset = Conf.getString(Const.CONF_COLLECTION_CHARSET);
+    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out),
+        sCharset), 1000000);
+    try {
+      // If optional attribute is void, don't write it down
+      bw.write("<?xml version='1.0' encoding='" + sCharset + "'?>\n");
+      bw.write("<" + TAG_LIST + " version='1.0'>\n");
+      // Manage each stream
+      /**Sample radio : 
+       * <Radio keywords='foo;bar'>
+          <name>Buureradio</name>
+          <url>http://live-three.dmd2.ch/listen.pls</url>
+          <label>Switzerland</label>
+          <keywords>cool;fine</keywords>
+          <isRemoved>false</isRemoved>
+          <bitrate>128</bitrate>
+          <frequency>44100</frequency>
+          <genre>Pop</genre>
+        </Radio>
+       */
+      for (WebRadio radio : manager.getWebRadiosByOrigin(WebRadioOrigin.PRESET)) {
+        // Note that we don't write down the isRemoved tag, not used by jajuk
+        bw.write("\t<" + TAG_RADIO);
+        if (UtilString.isNotEmpty(radio.getKeywords())) {
+          bw.write(" " + Const.XML_KEYWORDS + "='" + UtilString.formatXML(radio.getKeywords())
+              + "'");
+        }
+        bw.write(">\n");
+        bw.write("\t\t<" + TAG_NAME + ">" + UtilString.formatXML(radio.getName()) + "</" + TAG_NAME
+            + ">\n");
+        bw.write("\t\t<" + TAG_URL + ">" + UtilString.formatXML(radio.getUrl()) + "</" + TAG_URL
+            + ">\n");
+        bw.write("\t\t<" + TAG_LABEL + ">" + UtilString.formatXML(radio.getDescription()) + "</"
+            + TAG_LABEL + ">\n");
+        bw.write("\t\t<" + Const.XML_KEYWORDS + ">" + UtilString.formatXML(radio.getKeywords())
+            + "</" + Const.XML_KEYWORDS + ">\n");
+        bw.write("\t\t<" + TAG_GENRE + ">" + UtilString.formatXML(radio.getGenre()) + "</"
+            + TAG_GENRE + ">\n");
+        bw.write("\t\t<" + TAG_BITRATE + ">" + radio.getLongValue(Const.XML_BITRATE) + "</"
+            + TAG_BITRATE + ">\n");
+        bw.write("\t\t<" + TAG_FREQUENCY + ">" + radio.getLongValue(Const.XML_FREQUENCY) + "</"
+            + TAG_FREQUENCY + ">\n");
+        bw.write("\t</" + TAG_RADIO + ">\n");
+      }
+      // close
+      bw.write("</" + TAG_LIST + ">\n");
+      bw.flush();
+    } finally {
+      bw.close();
+    }
+    File finalFile = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
+    UtilSystem.saveFileWithRecoverySupport(finalFile);
+    Log.debug("Preset webradios list commited to : " + finalFile.getAbsolutePath());
+  }
+}
diff --git a/src/main/java/org/jajuk/services/webradio/WebRadio.java b/src/main/java/org/jajuk/services/webradio/WebRadio.java
index 2fdbca8..ab82f8f 100644
--- a/src/main/java/org/jajuk/services/webradio/WebRadio.java
+++ b/src/main/java/org/jajuk/services/webradio/WebRadio.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,40 +16,30 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.webradio;
 
+import javax.swing.ImageIcon;
+
+import org.jajuk.base.PhysicalItem;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+
 /**
  * A web Radio.
  */
-public class WebRadio implements Comparable<WebRadio> {
-
-  /** DOCUMENT_ME. */
-  private String name;
-
-  /** DOCUMENT_ME. */
-  private String url;
-
+public class WebRadio extends PhysicalItem implements Comparable<WebRadio> {
   /**
-   * Instantiates a new web radio.
-   * 
-   * @param name DOCUMENT_ME
-   * @param url DOCUMENT_ME
-   */
-  public WebRadio(String name, String url) {
-    this.name = name;
-    this.url = url;
-  }
-
-  /**
-   * Gets the name.
-   * 
-   * @return the name
-   */
-  public String getName() {
-    return this.name;
+  * Instantiates a new web radio.
+  * 
+  * @param name 
+  * @param url 
+  */
+  WebRadio(String sId, String sName) {
+    super(sId, sName);
   }
 
   /**
@@ -58,27 +48,25 @@ public class WebRadio implements Comparable<WebRadio> {
    * @return the url
    */
   public String getUrl() {
-    return this.url;
+    return getStringValue(XML_URL);
   }
 
-  /* (non-Javadoc)
-   * @see java.lang.Object#equals(java.lang.Object)
+  /**
+   * Gets the genre.
+   * 
+   * @return the url
    */
-  @Override
-  public boolean equals(Object other) {
-    if (!(other instanceof WebRadio)) {
-      return false;
-    }
-    return name.equals(((WebRadio) other).getName());
+  public String getGenre() {
+    return getStringValue(XML_GENRE);
   }
 
-  /* (non-Javadoc)
-   * @see java.lang.Object#hashCode()
+  /**
+   * Gets the webradio description.
+   * 
+   * @return the descrption
    */
-  @Override
-  public int hashCode() {
-    // equals only compares on Name, therefore use the same for the hashcode
-    return name.hashCode();
+  public String getDescription() {
+    return getStringValue(Const.XML_DESC);
   }
 
   /* (non-Javadoc)
@@ -86,11 +74,17 @@ public class WebRadio implements Comparable<WebRadio> {
    */
   @Override
   public int compareTo(WebRadio other) {
-    // make null url web radio to appear first (useful for the wizard)
-    if (getUrl() == null) {
-      return -1;
+    // We must ensure that compareTo is consistent with equals because this kind of items are used in Tree Sets
+    if (this.equals(other)) {
+      return 0;
+    }
+    if (other == null) {
+      return 1;
     }
-    return name.compareToIgnoreCase(other.getName());
+    if (getName().equals(other.getName())) {
+      return getID().compareTo(other.getID());
+    }
+    return getName().compareToIgnoreCase(other.getName());
   }
 
   /* (non-Javadoc)
@@ -98,25 +92,45 @@ public class WebRadio implements Comparable<WebRadio> {
    */
   @Override
   public String toString() {
-    return name + " (" + url + ")";
+    return getProperties().toString();
   }
 
   /**
-   * Sets the name.
-   * 
-   * @param name the new name
+   * @return the origin
    */
-  public void setName(String name) {
-    this.name = name;
+  public WebRadioOrigin getOrigin() {
+    return (WebRadioOrigin) getValue(XML_ORIGIN);
   }
 
   /**
-   * Sets the url.
-   * 
-   * @param url the new url
+   * @return the keywords
+   */
+  public String getKeywords() {
+    return getStringValue(XML_KEYWORDS);
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getDesc()
    */
-  public void setUrl(String url) {
-    this.url = url;
+  @Override
+  public String getTitle() {
+    return Messages.getString("WebRadioView.1");
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getLabel()
+   */
+  @Override
+  public String getXMLTag() {
+    // Label not used as we don't persist webradio using collection code.   
+    return null;
   }
 
+  /* (non-Javadoc)
+   * @see org.jajuk.base.Item#getIconRepresentation()
+   */
+  @Override
+  public ImageIcon getIconRepresentation() {
+    return IconLoader.getIcon(JajukIcons.WEBRADIO);
+  }
 }
diff --git a/src/main/java/org/jajuk/services/webradio/WebRadioHelper.java b/src/main/java/org/jajuk/services/webradio/WebRadioHelper.java
new file mode 100644
index 0000000..d0b8aa3
--- /dev/null
+++ b/src/main/java/org/jajuk/services/webradio/WebRadioHelper.java
@@ -0,0 +1,190 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.webradio;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Locale;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.jajuk.base.FileManager;
+import org.jajuk.base.SearchResult;
+import org.jajuk.services.core.SessionService;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.DownloadManager;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.UtilSystem;
+import org.jajuk.util.log.Log;
+import org.xml.sax.SAXException;
+
+/**
+ * Persistence and various helper methods for webradios.
+ */
+public class WebRadioHelper {
+  /** Custom webradios  file */
+  private static File fCustom = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_CUSTOM);
+  /** Presets webradios file */
+  private static File fPresets = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
+  /** Reference to the WebRadiomanager */
+  private static WebRadioManager manager = WebRadioManager.getInstance();
+
+  /** utility class, no instantiation */
+  private WebRadioHelper() {
+  }
+
+  /**
+   * Gets the current web radio tooltip.
+   * 
+   * @return Current webradio tooltip text
+   */
+  public static String getCurrentWebRadioTooltip() {
+    String tooltipWebRadio = Messages.getString("CommandJPanel.25");
+    String defaultRadio = Conf.getString(Const.CONF_DEFAULT_WEB_RADIO);
+    if (manager.getWebRadioByName(defaultRadio) != null) {
+      tooltipWebRadio = "<html>" + tooltipWebRadio + "<p><b>" + defaultRadio + "</b></html>";
+    }
+    return tooltipWebRadio;
+  }
+
+  /**
+   * Perform a search in all files names with given criteria.
+   * 
+   * @param sCriteria 
+   * 
+   * @return the set< search result>
+   */
+  public static Set<SearchResult> search(String sCriteria) {
+    synchronized (FileManager.getInstance()) {
+      Set<SearchResult> tsResu = new TreeSet<SearchResult>();
+      for (WebRadio radio : manager.getWebRadios()) {
+        if (radio.getName().toLowerCase(Locale.getDefault())
+            .indexOf(sCriteria.toLowerCase(Locale.getDefault())) != -1) {
+          String desc = radio.getName();
+          if (UtilString.isNotEmpty(radio.getDescription())) {
+            desc += " (" + radio.getUrl() + ")";
+          }
+          tsResu.add(new SearchResult(radio, desc));
+        }
+      }
+      return tsResu;
+    }
+  }
+
+  /**
+   * Load an existing repository.
+   * @throws IOException 
+   * @throws SAXException 
+   * @throws ParserConfigurationException 
+   */
+  public static void loadCustomRadios() throws SAXException, IOException,
+      ParserConfigurationException {
+    // Attempt a recovery if crash during previous commit
+    File customFile = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_CUSTOM);
+    UtilSystem.recoverFileIfRequired(customFile);
+    // Parse the file
+    SAXParserFactory spf = SAXParserFactory.newInstance();
+    spf.setValidating(false);
+    spf.setNamespaceAware(false);
+    SAXParser saxParser = spf.newSAXParser();
+    saxParser.parse(fCustom, new CustomRadiosPersistenceHelper());
+  }
+
+  /**
+   * Load a presets list.
+   * @param preset file to load
+   * @throws IOException 
+   * @throws SAXException 
+   * @throws ParserConfigurationException 
+   */
+  public static void loadPresetsRadios(File presetToLoad) throws SAXException, IOException,
+      ParserConfigurationException {
+    //cleanup existing presets
+    for (WebRadio radio : WebRadioManager.getInstance().getWebRadiosByOrigin(WebRadioOrigin.PRESET)) {
+      WebRadioManager.getInstance().removeItem(radio);
+    }
+    // Attempt a recovery if crash during previous commit
+    File presetFile = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
+    UtilSystem.recoverFileIfRequired(presetFile);
+    // Parse the file
+    SAXParserFactory spf = SAXParserFactory.newInstance();
+    spf.setValidating(false);
+    spf.setNamespaceAware(false);
+    SAXParser saxParser = spf.newSAXParser();
+    saxParser.parse(presetToLoad, new PresetRadiosPersistenceHelper());
+  }
+
+  private static void handleFileCorrupted(File file, Exception e) {
+    Log.error(137, "Webradio file corrupted: " + file.getAbsolutePath(), e);
+    // Remove file if it is corrupted so it will be created again the
+    // next time
+    if (!fCustom.delete()) {
+      Log.warn("Could not delete file " + file.getAbsolutePath());
+    }
+  }
+
+  /**
+   * Download and load webradio files.
+   */
+  public static void loadWebRadios() {
+    // Try to load custom radios first, then presets
+    fCustom = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_CUSTOM);
+    fPresets = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
+    if (fCustom.exists()) {
+      try {
+        loadCustomRadios();
+      } catch (Exception e) {
+        handleFileCorrupted(fPresets, e);
+      }
+    } else {
+      Log.info("No custom webradio file found.");
+    }
+    if (!fPresets.exists()) {
+      // download the stream list and load it asynchronously to avoid
+      // freezing offline sessions.
+      new Thread("WebRadio Download Thread") {
+        @Override
+        public void run() {
+          try {
+            DownloadManager.download(new URL(Const.URL_WEBRADIO_PRESETS),
+                SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET));
+            loadPresetsRadios(fPresets);
+          } catch (Exception e) {
+            Log.error(e);
+          }
+        }
+      }.start();
+    } else {
+      try {
+        loadPresetsRadios(fPresets);
+      } catch (Exception e) {
+        handleFileCorrupted(fPresets, e);
+      }
+    }
+  }
+}
diff --git a/src/main/java/org/jajuk/services/webradio/WebRadioManager.java b/src/main/java/org/jajuk/services/webradio/WebRadioManager.java
index 7ff7a86..2f6f10b 100644
--- a/src/main/java/org/jajuk/services/webradio/WebRadioManager.java
+++ b/src/main/java/org/jajuk/services/webradio/WebRadioManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,37 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.services.webradio;
 
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.net.URL;
-import java.util.Locale;
-import java.util.Set;
-import java.util.TreeSet;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
+import java.util.Iterator;
+import java.util.List;
 
-import org.jajuk.base.FileManager;
-import org.jajuk.base.SearchResult;
-import org.jajuk.services.core.SessionService;
-import org.jajuk.util.Conf;
+import org.jajuk.base.ItemManager;
+import org.jajuk.base.PropertyMetaInformation;
 import org.jajuk.util.Const;
-import org.jajuk.util.DownloadManager;
-import org.jajuk.util.Messages;
-import org.jajuk.util.UtilString;
-import org.jajuk.util.log.Log;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
+import org.jajuk.util.MD5Processor;
+import org.jajuk.util.ReadOnlyIterator;
+import org.jajuk.util.UtilSystem;
 
 /**
  * Stores webradios configurated by user
@@ -54,325 +36,170 @@ import org.xml.sax.helpers.DefaultHandler;
  * Singleton
  * </p>.
  */
-public final class WebRadioManager extends DefaultHandler {
-
-  /** DOCUMENT_ME. */
-  private static Set<WebRadio> webradios = new TreeSet<WebRadio>();
-
+public final class WebRadioManager extends ItemManager {
   /** Self instance. */
   private static WebRadioManager self = new WebRadioManager();
 
-  /** DOCUMENT_ME. */
-  private StringBuilder buffer;
-
-  /** DOCUMENT_ME. */
-  private boolean inRadio;
-
-  /** DOCUMENT_ME. */
-  private String radioName;
-
-  /** DOCUMENT_ME. */
-  private String radioUrl;
-
-  // Webradio file XML tags static strings
-  /** The Constant XML_RADIO.  DOCUMENT_ME */
-  private static final String XML_RADIO = "Radio";
-  // private static final String XML_URL = "url";
-  // private static final String XML_NAME = "name";
-
-  /** DOCUMENT_ME. */
-  File fwebradios;
-
   /**
    * Instantiates a new web radio manager.
    */
   private WebRadioManager() {
     super();
-
-    // check for webradio repository file
-    fwebradios = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_REPOS);
-    if (!fwebradios.exists()) {
-      // download the stream list and load it asynchronously to avoid
-      // freezing unconnected people
-      new Thread("WebRadio Download Thread") {
-        @Override
-        public void run() {
-          downloadRepository();
-        }
-      }.start();
-    }
-    // Load repository if it exists
-    else {
-      loadRepository();
-    }
-
+    // ---register properties---
+    // ID
+    registerProperty(new PropertyMetaInformation(Const.XML_ID, false, true, false, false, false,
+        String.class, null));
+    // Name
+    registerProperty(new PropertyMetaInformation(Const.XML_NAME, false, true, true, true, false,
+        String.class, null));
+    //Description
+    registerProperty(new PropertyMetaInformation(Const.XML_DESC, false, false, true, true, false,
+        String.class, null));
+    // URL
+    registerProperty(new PropertyMetaInformation(Const.XML_URL, false, false, true, true, false,
+        String.class, null));
+    // Origin
+    registerProperty(new PropertyMetaInformation(Const.XML_ORIGIN, false, false, true, false, true,
+        String.class, null));
+    // Bitrate
+    registerProperty(new PropertyMetaInformation(Const.XML_BITRATE, false, false, true, true, true,
+        Long.class, null));
+    //Frequency
+    registerProperty(new PropertyMetaInformation(Const.XML_FREQUENCY, false, false, true, true,
+        true, Long.class, null));
+    // Keywords
+    registerProperty(new PropertyMetaInformation(Const.XML_KEYWORDS, false, false, true, true,
+        false, String.class, null));
+    // Genre
+    registerProperty(new PropertyMetaInformation(Const.XML_GENRE, false, false, true, true, true,
+        String.class, null));
   }
 
   /**
-   * Load repository.
-   * DOCUMENT_ME
-   */
-  private void loadRepository() {
-    try {
-      SAXParserFactory spf = SAXParserFactory.newInstance();
-      spf.setValidating(false);
-      spf.setNamespaceAware(false);
-      SAXParser saxParser = spf.newSAXParser();
-      saxParser.parse(fwebradios.toURI().toURL().toString(), this);
-    } catch (IOException e) {
-      Log.error(e);
-      // Remove file if it is corrupted so it will be downloaded again
-      // next time
-      if (!fwebradios.delete()) {
-        Log.warn("Could not delete file " + fwebradios.toString());
-      }
-    } catch (SAXException e) {
-      Log.error(e);
-      // Remove file if it is corrupted so it will be downloaded again
-      // next time
-      if (!fwebradios.delete()) {
-        Log.warn("Could not delete file " + fwebradios.toString());
-      }
-    } catch (ParserConfigurationException e) {
-      Log.error(e);
-      // Remove file if it is corrupted so it will be downloaded again
-      // next time
-      if (!fwebradios.delete()) {
-        Log.warn("Could not delete file " + fwebradios.toString());
-      }
-    }
+  * Get web radio hashcode (ID).
+  * 
+  * @param name
+  * 
+  * @return radio ID
+  */
+  protected static String createID(String sName) {
+    // The webradio id is simply a shuffle number because we want to allow
+    // name change. We accept several webradios with the same name;
+    // We don't use date or time for this id because time can go backward (winter time)
+    // and we could get twice the same number.
+    return MD5Processor.hash(Long.toString(UtilSystem.getRandom().nextLong()));
   }
 
   /**
-   * Download asynchronously the default streams list.
-   * 
-   * @return the download thread
-   */
-  private void downloadRepository() {
-    // try to download the default directory (from jajuk SVN trunk
-    // directly)
-    try {
-      DownloadManager.download(new URL(Const.URL_DEFAULT_WEBRADIOS), SessionService
-          .getConfFileByPath(Const.FILE_WEB_RADIOS_REPOS));
-    } catch (Exception e) {
-      Log.error(e);
-    }
-    // Load repository if any
-    if (fwebradios.exists()) {
-      loadRepository();
-    }
-
+  * Register a web radio.
+  * 
+  * @param web radio name
+  * 
+  * @return the web radio.
+  */
+  public WebRadio registerWebRadio(String name) {
+    String sId = createID(name);
+    return registerWebRadio(sId, name);
   }
 
   /**
-   * Gets the single instance of WebRadioManager.
-   * 
-   * @return single instance of WebRadioManager
-   */
-  public static WebRadioManager getInstance() {
-    return self;
-  }
-
-  /**
-   * Adds the web radio.
-   * DOCUMENT_ME
-   * 
-   * @param radio DOCUMENT_ME
-   */
-  public void addWebRadio(WebRadio radio) {
-    webradios.add(radio);
+  * Register a web radio.
+  *
+  * @param id
+  * @param web radio name
+  * 
+  * @return the web radio.
+  */
+  private WebRadio registerWebRadio(String sId, String name) {
+    WebRadio radio = getWebRadioByID(sId);
+    if (radio != null) {
+      return radio;
+    }
+    radio = new WebRadio(sId, name);
+    registerItem(radio);
+    return radio;
   }
 
   /**
-   * Removes the web radio.
-   * DOCUMENT_ME
+   * Gets the radio by id.
    * 
-   * @param radio DOCUMENT_ME
-   */
-  public void removeWebRadio(WebRadio radio) {
-    webradios.remove(radio);
-  }
-
-  /**
-   * Write current repository for persistence between sessions.
+   * @param sID Item ID
    * 
-   * @throws IOException Signals that an I/O exception has occurred.
+   * @return Element
    */
-  public void commit() throws IOException {
-    // If none radio recorded, do not commit to allow next session
-    // to download the default covers again
-    if (webradios.size() == 0) {
-      return;
-    }
-    File out = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_REPOS);
-    String sCharset = Conf.getString(Const.CONF_COLLECTION_CHARSET);
-    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out),
-        sCharset), 1000000);
-    try {
-      bw.write("<?xml version='1.0' encoding='" + sCharset + "'?>\n");
-      bw.write("<" + Const.XML_STREAMS + " " + Const.XML_VERSION + "='" + Const.JAJUK_VERSION
-          + "'>\n");
-      // Manage each stream
-      for (WebRadio radio : webradios) {
-        bw.write("\t<" + Const.XML_STREAM + " " + Const.XML_NAME + "='"
-            + UtilString.formatXML(radio.getName()) + "' " + Const.XML_URL + "='"
-            + UtilString.formatXML(radio.getUrl()) + "'/>\n");
-      }
-      // close
-      bw.write("</" + Const.XML_STREAMS + ">\n");
-      bw.flush();
-    } finally {
-      bw.close();
-    }
+  WebRadio getWebRadioByID(String sID) {
+    return (WebRadio) getItemByID(sID);
   }
 
   /**
-   * Copy the default radio file to the current repository file.
+   * Gets the single instance of WebRadioManager.
    * 
-   * @throws IOException Signals that an I/O exception has occurred.
+   * @return single instance of WebRadioManager
    */
-  public void restore() throws IOException {
-    // Clear existing radios
-    webradios.clear();
-    // Download repository
-    downloadRepository();
-    // Check file now exists and not void
-    File out = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_REPOS);
-    if (!out.exists() || out.length() == 0) {
-      // show an "operation failed' message to users
-      throw new IOException("Cannot download or parse webradio repository");
-    }
+  public static WebRadioManager getInstance() {
+    return self;
   }
 
   /**
-   * Called when we start an element.
-   * 
-   * @param sUri DOCUMENT_ME
-   * @param s DOCUMENT_ME
-   * @param sQName DOCUMENT_ME
-   * @param attributes DOCUMENT_ME
-   * 
-   * @throws SAXException the SAX exception
-   */
-  @Override
-  public void startElement(String sUri, String s, String sQName, Attributes attributes)
-      throws SAXException {
-
-    try {
-      if (XML_RADIO.equals(sQName)) {
-        inRadio = true;
-      } else if (Const.XML_STREAM.equals(sQName)) {
-        String name = attributes.getValue(attributes.getIndex(Const.XML_NAME));
-        String url = attributes.getValue(attributes.getIndex(Const.XML_URL));
-        WebRadio radio = new WebRadio(name, url);
-        webradios.add(radio);
-      } else if (inRadio) {
-        if (Const.XML_NAME.equals(sQName)) {
-          buffer = new StringBuilder();
-        } else if (Const.XML_URL.equals(sQName)) {
-          buffer = new StringBuilder();
-        }
+  * Gets the first webradio found with the provided name.
+  * 
+  * @param name web radio name
+  * 
+  * @return WebRadio for a given name or null if no match
+  */
+  public WebRadio getWebRadioByName(String name) {
+    for (WebRadio radio : getWebRadios()) {
+      if (radio.getName().equals(name)) {
+        return radio;
       }
-
-    } catch (Exception e) {
-      Log.error(e);
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
-   */
-  @Override
-  public void characters(char[] ch, int start, int length) throws SAXException {
-    String s = new String(ch, start, length);
-    if (buffer != null) {
-      buffer.append(s);
     }
+    return null;
   }
 
-  /**
-   * End element in order to read from aTunes radio list.
-   * 
-   * @param uri DOCUMENT_ME
-   * @param localName DOCUMENT_ME
-   * @param qName DOCUMENT_ME
-   * 
-   * @throws SAXException the SAX exception
-   */
+  /* (non-Javadoc)
+  * @see org.jajuk.base.ItemManager#getXMLTag()
+  */
   @Override
-  public void endElement(String uri, String localName, String qName) throws SAXException {
-    if (XML_RADIO.equals(qName)) {
-      // End of radio element, add to list
-      WebRadio radio = new WebRadio(radioName, radioUrl);
-      webradios.add(radio);
-      inRadio = false;
-    } else if (Const.XML_NAME.equals(qName)) {
-      radioName = buffer.toString();
-    } else if (Const.XML_URL.equals(qName)) {
-      radioUrl = buffer.toString();
-    }
-  }
-
-  /**
-   * Perform a search in all files names with given criteria.
-   * 
-   * @param sCriteria DOCUMENT_ME
-   * 
-   * @return the set< search result>
-   */
-  public Set<SearchResult> search(String sCriteria) {
-    synchronized (FileManager.getInstance()) {
-      Set<SearchResult> tsResu = new TreeSet<SearchResult>();
-      for (WebRadio radio : webradios) {
-        if (radio.getName().toLowerCase(Locale.getDefault()).indexOf(
-            sCriteria.toLowerCase(Locale.getDefault())) != -1) {
-          tsResu.add(new SearchResult(radio, radio.toString()));
-        }
-      }
-      return tsResu;
-    }
+  public String getXMLTag() {
+    // Not used here, webradios have their own storage system.
+    return null;
   }
 
   /**
-   * Gets the web radios.
-   * 
-   * @return All webradios filled (copy)
-   */
+  * Gets the web radios.
+  * 
+  * @return webradios list
+  */
   @SuppressWarnings("unchecked")
-  public Set<WebRadio> getWebRadios() {
-    return (Set<WebRadio>) ((TreeSet<WebRadio>) webradios).clone();
+  public List<WebRadio> getWebRadios() {
+    return (List<WebRadio>) getItems();
   }
 
   /**
-   * Gets the web radio by name.
-   * 
-   * @param name DOCUMENT_ME
-   * 
-   * @return WebRadio for a given name or null if no match
-   */
-  public WebRadio getWebRadioByName(String name) {
-    for (WebRadio radio : webradios) {
-      if (radio.getName().equals(name)) {
-        return radio;
+  * Gets a subset of web radios by Origin.
+  * @param origin
+  * @return webradios list
+  */
+  public List<WebRadio> getWebRadiosByOrigin(WebRadioOrigin origin) {
+    @SuppressWarnings("unchecked")
+    List<WebRadio> radios = (List<WebRadio>) getItems();
+    Iterator<WebRadio> itRadios = radios.iterator();
+    while (itRadios.hasNext()) {
+      WebRadio radio = itRadios.next();
+      if (radio.getOrigin() != origin) {
+        itRadios.remove();
       }
     }
-    return null;
+    return radios;
   }
 
   /**
-   * Gets the current web radio tooltip.
+   * Gets the web radios iterator.
    * 
-   * @return Current webradio tooltip text
+   * @return web radios iterator
    */
-  public static String getCurrentWebRadioTooltip() {
-    String tooltipWebRadio = Messages.getString("CommandJPanel.25");
-    String defaultRadio = Conf.getString(Const.CONF_DEFAULT_WEB_RADIO);
-    if (WebRadioManager.getInstance().getWebRadioByName(defaultRadio) != null) {
-      tooltipWebRadio = "<html>" + tooltipWebRadio + "<p><b>" + defaultRadio + "</b></html>";
-    }
-    return tooltipWebRadio;
+  @SuppressWarnings("unchecked")
+  public ReadOnlyIterator<WebRadio> getWebRadioIterator() {
+    return new ReadOnlyIterator<WebRadio>((Iterator<WebRadio>) getItemsIterator());
   }
-
 }
diff --git a/src/main/java/org/qdwizard/ClearPoint.java b/src/main/java/org/jajuk/services/webradio/WebRadioOrigin.java
similarity index 72%
rename from src/main/java/org/qdwizard/ClearPoint.java
rename to src/main/java/org/jajuk/services/webradio/WebRadioOrigin.java
index 99a169f..6f9ff4e 100644
--- a/src/main/java/org/qdwizard/ClearPoint.java
+++ b/src/main/java/org/jajuk/services/webradio/WebRadioOrigin.java
@@ -1,31 +1,31 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.qdwizard;
-
-/**
- * Screens needing to clear wizard cache (values filled up in different screens)
- * should implement this interface.
- * 
- * @author Bertrand Florat
- */
-public interface ClearPoint {
-
-}
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.webradio;
+
+/**
+ * Webradio origin
+ */
+public enum WebRadioOrigin {
+  /** Webradio created by the user himself*/
+  CUSTOM,
+  /** Webradio fetched from the jajuk online repository */
+  PRESET,
+}
diff --git a/src/main/java/org/jajuk/services/webradio/package.html b/src/main/java/org/jajuk/services/webradio/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/services/webradio/package.html
+++ b/src/main/java/org/jajuk/services/webradio/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/actions/ActionManager.java b/src/main/java/org/jajuk/ui/actions/ActionManager.java
index 944dcaa..85b5f74 100644
--- a/src/main/java/org/jajuk/ui/actions/ActionManager.java
+++ b/src/main/java/org/jajuk/ui/actions/ActionManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -39,14 +39,11 @@ import org.jajuk.util.UtilSystem;
  * </p>
  */
 public final class ActionManager {
-
-  /** The Constant MAP.  DOCUMENT_ME */
+  /** The Constant MAP.   */
   private static final EnumMap<JajukActions, JajukAction> MAP = new EnumMap<JajukActions, JajukAction>(
       JajukActions.class);
-
-  /** The Constant STROKE_LIST.  DOCUMENT_ME */
+  /** The Constant STROKE_LIST.   */
   private static final List<KeyStroke> STROKE_LIST = new ArrayList<KeyStroke>();
-
   /** Self instance. */
   private static ActionManager self = new ActionManager();
 
@@ -61,6 +58,7 @@ public final class ActionManager {
 
   /**
    * Instantiates a new action manager.
+   * To enable a shortcut globally, add it in WindowGlobalKeystrokeManager.globalActions
    */
   private ActionManager() {
     // Private constructor to disallow instantiation.
@@ -71,7 +69,6 @@ public final class ActionManager {
     installAction(JajukActions.CONTINUE_MODE, new ContinueModeAction(), false);
     installAction(JajukActions.INTRO_MODE, new IntroModeAction(), false);
     installAction(JajukActions.KARAOKE_MODE, new KaraokeModeAction(), false);
-
     // CommandJPanel: Special Functions Panel
     installAction(JajukActions.SHUFFLE_GLOBAL, new GlobalRandomAction(), false);
     installAction(JajukActions.BEST_OF, new BestOfAction(), false);
@@ -79,7 +76,6 @@ public final class ActionManager {
     installAction(JajukActions.NOVELTIES, new NoveltiesAction(), false);
     installAction(JajukActions.FINISH_ALBUM, new FinishAlbumAction(), false);
     installAction(JajukActions.WEB_RADIO, new WebRadioAction(), false);
-
     // CommandJPanel: Play Panel
     installAction(JajukActions.PREVIOUS_TRACK, new PreviousTrackAction(), true);
     installAction(JajukActions.REPLAY_ALBUM, new ReplayAlbumAction(), true);
@@ -91,31 +87,24 @@ public final class ActionManager {
     installAction(JajukActions.STOP_TRACK, new StopTrackAction(), true);
     installAction(JajukActions.FORWARD_TRACK, new ForwardTrackAction(), true);
     installAction(JajukActions.INC_RATE, new ChangeTrackPreferenceAction(), true);
-
     // CommandJPanel: Volume control
     installAction(JajukActions.DECREASE_VOLUME, new DecreaseVolumeAction(), true);
     installAction(JajukActions.INCREASE_VOLUME, new IncreaseVolumeAction(), true);
     installAction(JajukActions.MUTE_STATE, new MuteAction(), true);
-
     // JajukJMenuBar: File Menu
     installAction(JajukActions.EXIT, new ExitAction(), false);
-
     // JajukJMenuBar: views
     installAction(JajukActions.VIEW_RESTORE_DEFAULTS, new RestoreViewsAction(), false);
     installAction(JajukActions.ALL_VIEW_RESTORE_DEFAULTS, new RestoreAllViewsAction(), false);
-
     // JajukJMenuBar: attributes
     installAction(JajukActions.CUSTOM_PROPERTIES_ADD, new NewPropertyAction(), false);
     installAction(JajukActions.CUSTOM_PROPERTIES_REMOVE, new RemovePropertyAction(), false);
-
     // JajukJMenuBar: configuration
     installAction(JajukActions.CONFIGURE_DJS, new DJConfigurationAction(), false);
-    installAction(JajukActions.CONFIGURE_WEBRADIOS, new WebRadioConfigurationAction(), false);
     installAction(JajukActions.CONFIGURE_AMBIENCES, new AmbienceConfigurationAction(), false);
     installAction(JajukActions.SIMPLE_DEVICE_WIZARD, new SimpleDeviceWizardAction(), false);
     installAction(JajukActions.OPTIONS, new ConfigurationRequiredAction(), false);
     installAction(JajukActions.UNMOUNTED, new HideShowMountedDevicesAction(), false);
-
     // JajukJMenuBar: Help Menu
     installAction(JajukActions.HELP_REQUIRED, new HelpRequiredAction(), false);
     installAction(JajukActions.SHOW_DONATE, new ShowDonateAction(), false);
@@ -129,10 +118,8 @@ public final class ActionManager {
     installAction(JajukActions.SHOW_TRACES, new DebugLogAction(), false);
     installAction(JajukActions.TIP_OF_THE_DAY, new TipOfTheDayAction(), false);
     installAction(JajukActions.CHECK_FOR_UPDATES, new CheckForUpdateAction(), false);
-
     // Export
     installAction(JajukActions.CREATE_REPORT, new ReportAction(), false);
-
     // File Actions
     installAction(JajukActions.CUT, new CutAction(), false);
     installAction(JajukActions.COPY, new CopyAction(), false);
@@ -140,22 +127,22 @@ public final class ActionManager {
     installAction(JajukActions.PASTE, new PasteAction(), false);
     installAction(JajukActions.RENAME, new RenameAction(), false);
     installAction(JajukActions.NEW_FOLDER, new NewFolderAction(), false);
-
     // MISC
     installAction(JajukActions.FIND_DUPLICATE_FILES, new FindDuplicateTracksAction(), false);
     installAction(JajukActions.COPY_TO_CLIPBOARD, new CopyClipboardAction(), false);
     installAction(JajukActions.OPEN_EXPLORER, new OpenExplorerAction(), false);
     installAction(JajukActions.REFRESH, new RefreshAction(), false);
     installAction(JajukActions.ALARM_CLOCK, new AlarmClockAction(), false);
+    // To enable a shortcut globally, add it in WindowGlobalKeystrokeManager.globalActions !!
     installAction(JajukActions.SHOW_ALBUM_DETAILS, new ShowAlbumDetailsAction(), false);
     installAction(JajukActions.SLIM_JAJUK, new SlimbarAction(), false);
-    installAction(JajukActions.COMMIT, new CommitAction(), false);
     installAction(JajukActions.GC, new GCAction(), false);
     installAction(JajukActions.QUEUE_TO_SLIM, new SlimBarQueueAction(), false);
     // Install full screen actions only if supported
     installAction(JajukActions.FULLSCREEN_JAJUK, new FullscreenAction(), false);
     installAction(JajukActions.PREPARE_PARTY, new PreparePartyAction(), false);
-
+    installAction(JajukActions.EXPORT_RATINGS, new ExportRatingsAction(), false);
+    installAction(JajukActions.IMPORT_RATINGS, new ImportRatingsAction(), false);
     // Selection actions
     installAction(JajukActions.SHOW_PROPERTIES, new ShowPropertiesAction(), true);
     installAction(JajukActions.PLAY_SELECTION, new PlaySelectionAction(), false);
@@ -170,7 +157,7 @@ public final class ActionManager {
     installAction(JajukActions.CDDB_SELECTION, new CDDBSelectionAction(), false);
     installAction(JajukActions.SAVE_AS, new SaveAsAction(), false);
     installAction(JajukActions.SYNC_TREE_TABLE, new SyncTreeTableAction(), false);
-
+    installAction(JajukActions.SHOW_CURRENTLY_PLAYING, new ShowCurrentlyPlayingAction(), false);
     // Preferences
     installAction(JajukActions.BAN, new BanCurrentAction(), false);
     installAction(JajukActions.BAN_SELECTION, new BanSelectionAction(), false);
@@ -187,10 +174,8 @@ public final class ActionManager {
     if (UtilSystem.isBrowserSupported()) {
       installAction(JajukActions.LAUNCH_IN_BROWSER, new LaunchInBrowserAction(), false);
     }
-
     // Uninstall Look and feel keystrokes if required
     uninstallStrokes();
-
   }
 
   /**
@@ -221,7 +206,6 @@ public final class ActionManager {
    */
   private static void installAction(JajukActions name, JajukAction action, boolean removeFromLAF) {
     MAP.put(name, action);
-
     if (removeFromLAF) {
       KeyStroke stroke = (KeyStroke) action.getValue(Action.ACCELERATOR_KEY);
       if (stroke != null) {
@@ -249,8 +233,8 @@ public final class ActionManager {
   /**
    * Enable or disable the action.
    *
-   * @param action DOCUMENT_ME
-   * @param enable DOCUMENT_ME
+   * @param action 
+   * @param enable 
    */
   public void enable(JajukAction action, boolean enable) {
     action.enable(enable);
diff --git a/src/main/java/org/jajuk/ui/actions/ActionUtil.java b/src/main/java/org/jajuk/ui/actions/ActionUtil.java
index 76f49f0..08f776e 100644
--- a/src/main/java/org/jajuk/ui/actions/ActionUtil.java
+++ b/src/main/java/org/jajuk/ui/actions/ActionUtil.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -32,7 +32,6 @@ import javax.swing.KeyStroke;
  * Utility class for swing actions.
  */
 public final class ActionUtil {
-
   /** The character to use as mnemonic indicator. */
   public static final char INDICATOR = '_';
 
@@ -90,7 +89,6 @@ public final class ActionUtil {
       if (stroke != null) {
         InputMap keyMap = component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
         keyMap.put(stroke, action);
-
         ActionMap actionMap = component.getActionMap();
         actionMap.put(action, action);
       }
@@ -100,8 +98,8 @@ public final class ActionUtil {
   /**
    * Return whether a key event matches the mnemonic of a provided action.
    * 
-   * @param action DOCUMENT_ME
-   * @param ke DOCUMENT_ME
+   * @param action 
+   * @param ke 
    * 
    * @return whether a key event matches the mnemonic of a provided action
    */
diff --git a/src/main/java/org/jajuk/ui/actions/AdoreSelectionAction.java b/src/main/java/org/jajuk/ui/actions/AdoreSelectionAction.java
index e5a47f8..756c5e1 100644
--- a/src/main/java/org/jajuk/ui/actions/AdoreSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/AdoreSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class AdoreSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/AlarmClockAction.java b/src/main/java/org/jajuk/ui/actions/AlarmClockAction.java
index c448249..ff0370b 100644
--- a/src/main/java/org/jajuk/ui/actions/AlarmClockAction.java
+++ b/src/main/java/org/jajuk/ui/actions/AlarmClockAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -32,7 +32,6 @@ import org.jajuk.util.error.JajukException;
  * Alarm wizard action.
  */
 public class AlarmClockAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/AmbienceConfigurationAction.java b/src/main/java/org/jajuk/ui/actions/AmbienceConfigurationAction.java
index f130b6d..d992113 100644
--- a/src/main/java/org/jajuk/ui/actions/AmbienceConfigurationAction.java
+++ b/src/main/java/org/jajuk/ui/actions/AmbienceConfigurationAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -24,7 +24,7 @@ import java.awt.event.ActionEvent;
 
 import javax.swing.SwingUtilities;
 
-import org.jajuk.ui.wizard.AmbienceWizard;
+import org.jajuk.ui.wizard.ambience.AmbienceWizard;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
@@ -33,7 +33,6 @@ import org.jajuk.util.Messages;
  * Action for configure ambiences.
  */
 public class AmbienceConfigurationAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -49,20 +48,16 @@ public class AmbienceConfigurationAction extends JajukAction {
    */
   @Override
   public void perform(ActionEvent evt) {
-
     /*
      * Display the ambience wizard in an invokeLater to allow a combo that show
      * it to close its popup
      */
     SwingUtilities.invokeLater(new Runnable() {
-
       @Override
       public void run() {
         AmbienceWizard ambience = new AmbienceWizard();
         ambience.show();
       }
-
     });
-
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/AverageSelectionAction.java b/src/main/java/org/jajuk/ui/actions/AverageSelectionAction.java
index 5a4e7f1..70d80e0 100644
--- a/src/main/java/org/jajuk/ui/actions/AverageSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/AverageSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class AverageSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/BanCurrentAction.java b/src/main/java/org/jajuk/ui/actions/BanCurrentAction.java
index 0d04527..749a72c 100644
--- a/src/main/java/org/jajuk/ui/actions/BanCurrentAction.java
+++ b/src/main/java/org/jajuk/ui/actions/BanCurrentAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class BanCurrentAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -71,5 +70,4 @@ public class BanCurrentAction extends SelectionAction {
       }
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/actions/BanSelectionAction.java b/src/main/java/org/jajuk/ui/actions/BanSelectionAction.java
index db34708..24a1d48 100644
--- a/src/main/java/org/jajuk/ui/actions/BanSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/BanSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -35,10 +35,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class BanSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/BestOfAction.java b/src/main/java/org/jajuk/ui/actions/BestOfAction.java
index 4038362..3d4908f 100644
--- a/src/main/java/org/jajuk/ui/actions/BestOfAction.java
+++ b/src/main/java/org/jajuk/ui/actions/BestOfAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -38,10 +38,9 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class BestOfAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -71,8 +70,8 @@ public class BestOfAction extends JajukAction {
           if (alToPlay.size() > 0 && alToPlay.size() > Const.NB_TRACKS_ON_ACTION) {
             alToPlay = alToPlay.subList(0, Const.NB_TRACKS_ON_ACTION);
           }
-          QueueModel.push(UtilFeatures.createStackItems(alToPlay, Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), false), false);
+          QueueModel.push(UtilFeatures.createStackItems(alToPlay,
+              Conf.getBoolean(Const.CONF_STATE_REPEAT), false), false);
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/BookmarkSelectionAction.java b/src/main/java/org/jajuk/ui/actions/BookmarkSelectionAction.java
index 2ac5a7e..ff6e6d2 100644
--- a/src/main/java/org/jajuk/ui/actions/BookmarkSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/BookmarkSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -42,7 +42,6 @@ import org.jajuk.util.log.Log;
  * </p>.
  */
 public class BookmarkSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/CDDBSelectionAction.java b/src/main/java/org/jajuk/ui/actions/CDDBSelectionAction.java
index 25b7ca9..5505d6d 100644
--- a/src/main/java/org/jajuk/ui/actions/CDDBSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/CDDBSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -44,7 +44,6 @@ import org.jajuk.util.log.Log;
  * </p>.
  */
 public class CDDBSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -72,13 +71,10 @@ public class CDDBSelectionAction extends SelectionAction {
       // - We perform here fast computation, no need to use a SwingWorker here.
       // Actual network call to freedb is done in the CDDBWizard class that uses
       // a SwingWorker.
-
       // Build a list of tracks from various items
       List<Track> tracks = TrackManager.getInstance().getAssociatedTracks(selection, true);
-
       // Remove video tracks found (clips)
       CollectionUtils.filter(tracks, new JajukPredicates.NotVideoPredicate());
-
       // Display the wizard
       new CDDBWizard(tracks);
     } catch (Exception ex) {
diff --git a/src/main/java/org/jajuk/ui/actions/ChangeTrackPreferenceAction.java b/src/main/java/org/jajuk/ui/actions/ChangeTrackPreferenceAction.java
index 2be269b..15671ca 100644
--- a/src/main/java/org/jajuk/ui/actions/ChangeTrackPreferenceAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ChangeTrackPreferenceAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -40,7 +40,6 @@ import org.jajuk.util.log.Log;
  * Manual preference change of current played track.
  */
 public class ChangeTrackPreferenceAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/CheckForUpdateAction.java b/src/main/java/org/jajuk/ui/actions/CheckForUpdateAction.java
index a4da481..56080b8 100644
--- a/src/main/java/org/jajuk/ui/actions/CheckForUpdateAction.java
+++ b/src/main/java/org/jajuk/ui/actions/CheckForUpdateAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -30,10 +30,9 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class CheckForUpdateAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/CommitAction.java b/src/main/java/org/jajuk/ui/actions/CommitAction.java
deleted file mode 100644
index 59c5d0a..0000000
--- a/src/main/java/org/jajuk/ui/actions/CommitAction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-
-package org.jajuk.ui.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.jajuk.services.core.ExitService;
-import org.jajuk.util.IconLoader;
-import org.jajuk.util.JajukIcons;
-import org.jajuk.util.Messages;
-
-/**
- * Action to run garbage collection.
- */
-public class CommitAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * Instantiates a new action.
-   */
-  CommitAction() {
-    super(Messages.getString("JajukJMenuBar.33"), IconLoader.getIcon(JajukIcons.SAVE), true);
-    setShortDescription(Messages.getString("JajukJMenuBar.33"));
-  }
-
-  /* (non-Javadoc)
-   * @see org.jajuk.ui.actions.JajukAction#perform(java.awt.event.ActionEvent)
-   */
-  @Override
-  public void perform(ActionEvent evt) throws Exception {
-    ExitService.commit(false);
-  }
-}
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/actions/ConfigurationRequiredAction.java b/src/main/java/org/jajuk/ui/actions/ConfigurationRequiredAction.java
index 64d3f5d..f6db434 100644
--- a/src/main/java/org/jajuk/ui/actions/ConfigurationRequiredAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ConfigurationRequiredAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -32,7 +32,6 @@ import org.jajuk.util.Messages;
  * Action for configurate the application.
  */
 public class ConfigurationRequiredAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/ContinueModeAction.java b/src/main/java/org/jajuk/ui/actions/ContinueModeAction.java
index 8d67ea9..f625156 100644
--- a/src/main/java/org/jajuk/ui/actions/ContinueModeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ContinueModeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -28,7 +28,6 @@ import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
-import org.jajuk.ui.widgets.JajukJMenuBar;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
@@ -37,10 +36,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class ContinueModeAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -57,23 +55,22 @@ public class ContinueModeAction extends JajukAction {
    */
   @Override
   public void perform(ActionEvent evt) throws JajukException {
-    boolean b = Conf.getBoolean(Const.CONF_STATE_CONTINUE);
-    Conf.setProperty(Const.CONF_STATE_CONTINUE, Boolean.toString(!b));
-
-    JajukJMenuBar.getInstance().setContinueSelected(!b);
-
-    if (!b) { // enabled button
+    boolean newModeState = !Conf.getBoolean(Const.CONF_STATE_CONTINUE);
+    Conf.invert(Const.CONF_STATE_CONTINUE);
+    if (newModeState) {
       if (QueueModel.isStopped()) {
         // if nothing playing, play next track if possible
         StackItem item = QueueModel.getLastPlayed();
-        if (item != null) {
+        if (item != null) { //NOSONAR
           QueueModel.push(new StackItem(FileManager.getInstance().getNextFile(item.getFile())),
               false);
         }
       }
     }
-    // computes planned tracks
+    // Computes planned tracks without clearing planned tracks if any
     QueueModel.computesPlanned(false);
+    // Refresh mode buttons
+    ObservationManager.notify(new JajukEvent(JajukEvents.MODE_STATUS_CHANGED));
     // Refresh Queue View
     ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
   }
diff --git a/src/main/java/org/jajuk/ui/actions/CopyAction.java b/src/main/java/org/jajuk/ui/actions/CopyAction.java
index ee639d1..a5c10f2 100644
--- a/src/main/java/org/jajuk/ui/actions/CopyAction.java
+++ b/src/main/java/org/jajuk/ui/actions/CopyAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -35,9 +35,7 @@ import org.jajuk.util.Messages;
 /**
  * Action class for Copy.
  */
-
 public class CopyAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -58,7 +56,6 @@ public class CopyAction extends JajukAction {
   public void perform(ActionEvent e) {
     JComponent source = (JComponent) e.getSource();
     List<Item> alSelected = (List<Item>) source.getClientProperty(Const.DETAIL_SELECTION);
-
     ItemMoveManager.getInstance().removeAll();
     ItemMoveManager.getInstance().addItems(alSelected);
     ItemMoveManager.getInstance().setAction(ItemMoveManager.MoveActions.COPY);
diff --git a/src/main/java/org/jajuk/ui/actions/CopyClipboardAction.java b/src/main/java/org/jajuk/ui/actions/CopyClipboardAction.java
index d8d17f6..fa8ef67 100644
--- a/src/main/java/org/jajuk/ui/actions/CopyClipboardAction.java
+++ b/src/main/java/org/jajuk/ui/actions/CopyClipboardAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -33,6 +33,7 @@ import org.jajuk.base.File;
 import org.jajuk.base.Item;
 import org.jajuk.base.Playlist;
 import org.jajuk.base.Track;
+import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
@@ -42,7 +43,6 @@ import org.jajuk.util.Messages;
  * Copy to clipboard the item absolute address.
  */
 public class CopyClipboardAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -82,6 +82,8 @@ public class CopyClipboardAction extends JajukAction {
         sData = ((Playlist) item).getAbsolutePath();
       } else if (item instanceof Track) {
         sData = ((Track) item).getFiles().get(0).getAbsolutePath();
+      } else if (item instanceof WebRadio) {
+        sData = ((WebRadio) item).getUrl();
       }
     } else if (o instanceof String) {
       sData = (String) o;
diff --git a/src/main/java/org/jajuk/ui/actions/CutAction.java b/src/main/java/org/jajuk/ui/actions/CutAction.java
index 6ff8e36..b613ad3 100644
--- a/src/main/java/org/jajuk/ui/actions/CutAction.java
+++ b/src/main/java/org/jajuk/ui/actions/CutAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -35,9 +35,7 @@ import org.jajuk.util.Messages;
 /**
  * Action class for Cut.
  */
-
 public class CutAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -58,10 +56,8 @@ public class CutAction extends JajukAction {
   public void perform(ActionEvent e) {
     JComponent source = (JComponent) e.getSource();
     ArrayList<Item> alSelected = (ArrayList<Item>) source.getClientProperty(Const.DETAIL_SELECTION);
-
     ItemMoveManager.getInstance().removeAll();
     ItemMoveManager.getInstance().addItems(alSelected);
     ItemMoveManager.getInstance().setAction(ItemMoveManager.MoveActions.CUT);
-
   }
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/actions/DJAction.java b/src/main/java/org/jajuk/ui/actions/DJAction.java
index ae24d34..0e32da4 100644
--- a/src/main/java/org/jajuk/ui/actions/DJAction.java
+++ b/src/main/java/org/jajuk/ui/actions/DJAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
@@ -40,10 +39,9 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class DJAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -77,8 +75,9 @@ public class DJAction extends JajukAction {
                 Messages.showErrorMessage(158);
                 return;
               }
-              QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(al), Conf
-                  .getBoolean(Const.CONF_STATE_REPEAT_ALL), false), false);
+              QueueModel.push(
+                  UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(al),
+                      Conf.getBoolean(Const.CONF_STATE_REPEAT), false), false);
             } else {
               Messages.showErrorMessage(157);
             }
diff --git a/src/main/java/org/jajuk/ui/actions/DJConfigurationAction.java b/src/main/java/org/jajuk/ui/actions/DJConfigurationAction.java
index 7025c6a..47d3b45 100644
--- a/src/main/java/org/jajuk/ui/actions/DJConfigurationAction.java
+++ b/src/main/java/org/jajuk/ui/actions/DJConfigurationAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,13 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 
-import org.jajuk.ui.wizard.DigitalDJWizard;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
@@ -31,7 +31,6 @@ import org.jajuk.util.Messages;
  * Action for configure DJs.
  */
 public class DJConfigurationAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/DebugLogAction.java b/src/main/java/org/jajuk/ui/actions/DebugLogAction.java
index 75ad123..0cc5ca2 100644
--- a/src/main/java/org/jajuk/ui/actions/DebugLogAction.java
+++ b/src/main/java/org/jajuk/ui/actions/DebugLogAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,15 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Insets;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.util.Properties;
 
 import javax.swing.JButton;
 import javax.swing.JDialog;
@@ -36,18 +40,18 @@ import net.miginfocom.swing.MigLayout;
 import org.jajuk.ui.helpers.FontManager;
 import org.jajuk.ui.helpers.FontManager.JajukFont;
 import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
-import org.jajuk.util.UtilString;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class DebugLogAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -64,22 +68,32 @@ public class DebugLogAction extends JajukAction {
    */
   @Override
   public void perform(ActionEvent evt) {
-    final JEditorPane text = new JEditorPane("text/html", getTraces());
+    final JEditorPane text = new JEditorPane("text/html", getHTMLTraces());
     text.setEditable(false);
     text.setMargin(new Insets(10, 10, 10, 10));
     text.setOpaque(true);
     text.setBackground(Color.WHITE);
     text.setForeground(Color.DARK_GRAY);
     text.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-    final JDialog dialog = new JDialog(JajukMainWindow.getInstance(), Messages
-        .getString("DebugLogAction.0"), false);
-    JButton jbRefresh = new JButton(Messages.getString("DebugLogAction.1"), IconLoader
-        .getIcon(JajukIcons.REFRESH));
+    final JDialog dialog = new JDialog(JajukMainWindow.getInstance(),
+        Messages.getString("DebugLogAction.0"), false);
+    JButton jbCopy = new JButton(Messages.getString("DebugLogAction.2"),
+        IconLoader.getIcon(JajukIcons.COPY_TO_CLIPBOARD));
+    jbCopy.addActionListener(new ActionListener() {
+      @Override
+      public void actionPerformed(ActionEvent e) {
+        StringSelection data = new StringSelection(getRawTraces());
+        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+        clipboard.setContents(data, data);
+      }
+    });
+    JButton jbRefresh = new JButton(Messages.getString("DebugLogAction.1"),
+        IconLoader.getIcon(JajukIcons.REFRESH));
     jbRefresh.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {
         // Refresh traces
-        text.setText(getTraces());
+        text.setText(getHTMLTraces());
       }
     });
     JButton jbClose = new JButton(Messages.getString("Close"), IconLoader.getIcon(JajukIcons.CLOSE));
@@ -93,7 +107,8 @@ public class DebugLogAction extends JajukAction {
     JScrollPane panel = new JScrollPane(text);
     UtilGUI.setEscapeKeyboardAction(dialog, panel);
     dialog.add(panel, "grow,wrap");
-    dialog.add(jbRefresh, "split 2,right,sg button");
+    dialog.add(jbCopy, "split 3,right,sg button");
+    dialog.add(jbRefresh, "split 3,right,sg button");
     dialog.add(jbClose, "right,sg button");
     dialog.setPreferredSize(new Dimension(800, 600));
     dialog.pack();
@@ -101,29 +116,41 @@ public class DebugLogAction extends JajukAction {
     dialog.setVisible(true);
   }
 
-  /**
-   * Gets the traces.
-   * 
-   * @return Current traces
-   */
-  private String getTraces() {
-    // Store system properties
-    StringBuilder traces = new StringBuilder("<HTML><font color='green'><b>").append(
-        cleanHTML(UtilString.getAnonymizedSystemProperties().toString())).append("<br>").append(
-        cleanHTML(UtilString.getAnonymizedJajukProperties().toString())).append("</b></font><br>");
-    // Store last traces
-    for (String line : Log.getSpool()) {
+  private String getHTMLTraces() {
+    final Properties systemProperties = System.getProperties();
+    final Properties jajukProperties = Conf.getProperties();
+    StringBuilder traces = new StringBuilder("<HTML><font color='green'><b>")
+        //Add build date in case the version was not properly set in maintenance branches (like missing 'dev' suffix)
+        .append(Const.JAJUK_VERSION).append('/').append(Const.JAJUK_VERSION_DATE).append('/')
+        .append(cleanHTML(systemProperties.toString())).append("<br>")
+        .append(cleanHTML(jajukProperties.toString())).append("</b></font><br>");
+    // Display last traces in clear
+    for (String line : Log.getSpool(false)) {
       traces.append(line).append("<br>");
     }
     traces.append("</HTML>");
+    return traces.toString();
+  }
 
+  private String getRawTraces() {
+    final Properties systemProperties = System.getProperties();
+    final Properties jajukProperties = Conf.getProperties();
+    StringBuilder traces = new StringBuilder()
+        //Add build date in case the version was not propertly set in maintenance branches (like missing 'dev' suffix)
+        .append(Const.JAJUK_VERSION).append('/').append(Const.JAJUK_VERSION_DATE).append('/')
+        .append(systemProperties.toString()).append("\n").append(jajukProperties.toString())
+        .append("\n");
+    // Display last traces in clear
+    for (String line : Log.getSpool(false)) {
+      traces.append(line).append("\n");
+    }
     return traces.toString();
   }
 
   /**
    * Replace some HTML in the properties to make them suitable for printing.
    * 
-   * @param str DOCUMENT_ME
+   * @param str 
    * 
    * @return the string
    */
diff --git a/src/main/java/org/jajuk/ui/actions/DecreaseVolumeAction.java b/src/main/java/org/jajuk/ui/actions/DecreaseVolumeAction.java
index e5141f6..a21727b 100644
--- a/src/main/java/org/jajuk/ui/actions/DecreaseVolumeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/DecreaseVolumeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -30,7 +30,6 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + DOWN ARROW</code>.
  */
 public class DecreaseVolumeAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/DeleteSelectionAction.java b/src/main/java/org/jajuk/ui/actions/DeleteSelectionAction.java
index dadc4cd..aa76820 100644
--- a/src/main/java/org/jajuk/ui/actions/DeleteSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/DeleteSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -43,6 +43,8 @@ import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
 import org.jajuk.services.players.QueueModel;
+import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioManager;
 import org.jajuk.ui.widgets.InformationJPanel;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -54,26 +56,15 @@ import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class DeleteSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private List<File> alFiles;
-
-  /** DOCUMENT_ME. */
   private List<File> rejFiles;
-
-  /** DOCUMENT_ME. */
   private List<Directory> alDirs;
-
-  /** DOCUMENT_ME. */
   private List<Directory> rejDirs;
-
-  /** DOCUMENT_ME. */
   private List<Directory> emptyDirs;
 
   /**
@@ -89,7 +80,6 @@ public class DeleteSelectionAction extends SelectionAction {
    * Called on files deletion (long task).
    */
   class FilesDeletionThread extends Thread {
-
     /**
      * Instantiates a new files deletion thread.
      */
@@ -136,7 +126,6 @@ public class DeleteSelectionAction extends SelectionAction {
    * Called on directories deletion (long task).
    */
   class DirectoriesDeletionThread extends Thread {
-
     /**
      * Instantiates a new directories deletion thread.
      */
@@ -167,7 +156,6 @@ public class DeleteSelectionAction extends SelectionAction {
       UtilGUI.stopWaiting();
       InformationJPanel.getInstance().setMessage(Messages.getString("ActionDelete.1"),
           InformationJPanel.MessageType.INFORMATIVE);
-
       if (rejDirs.size() > 0) {
         String rejString = "";
         for (Directory d : rejDirs) {
@@ -197,7 +185,6 @@ public class DeleteSelectionAction extends SelectionAction {
     alDirs = new ArrayList<Directory>(selection.size());
     rejDirs = new ArrayList<Directory>(selection.size());
     emptyDirs = new ArrayList<Directory>(selection.size());
-
     // Compute all files to move from various items list
     if (selection.size() == 0) {
       Log.debug("None item to move");
@@ -211,7 +198,10 @@ public class DeleteSelectionAction extends SelectionAction {
       }
     } else {
       for (Item item : selection) {
-        if (item instanceof File) {
+        if (item instanceof WebRadio) {
+          WebRadioManager.getInstance().removeItem(item);
+          ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
+        } else if (item instanceof File) {
           alFiles.add((File) item);
         } else if (item instanceof Track) {
           alFiles.addAll(((Track) item).getFiles());
@@ -242,7 +232,6 @@ public class DeleteSelectionAction extends SelectionAction {
     if (alFiles.size() > 0) {
       handleFiles();
     }
-
     // Now consider directories (selection can contain both files and directories)
     if (alDirs.size() > 0) {
       handleDirectories();
@@ -270,7 +259,6 @@ public class DeleteSelectionAction extends SelectionAction {
       if (iResu != JOptionPane.YES_OPTION) {
         return;
       }
-
       // Check if selection doesn't contain playing file's directory
       for (Directory dir : alDirs) {
         if (QueueModel.getPlayingFile() != null && QueueModel.getPlayingFile().hasAncestor(dir)) {
@@ -301,7 +289,6 @@ public class DeleteSelectionAction extends SelectionAction {
         return;
       }
     }
-
     // Check if selection doesn't contain playing file
     for (File f : alFiles) {
       if (QueueModel.getPlayingFile() != null && f.equals(QueueModel.getPlayingFile())) {
@@ -311,14 +298,12 @@ public class DeleteSelectionAction extends SelectionAction {
     }
     //Actual deletion
     new FilesDeletionThread().start();
-
     // Cleanup empty directories
     if (emptyDirs.size() > 0) {
       String emptyDirsString = "";
       for (Directory d : emptyDirs) {
         emptyDirsString += d.getName() + "\n";
       }
-
       int iResu = Messages.getChoice(Messages.getString("Confirmation_delete_empty_dirs")
           + " : \n\n" + emptyDirsString, JOptionPane.YES_NO_CANCEL_OPTION,
           JOptionPane.INFORMATION_MESSAGE);
@@ -347,5 +332,4 @@ public class DeleteSelectionAction extends SelectionAction {
       }
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/actions/ExitAction.java b/src/main/java/org/jajuk/ui/actions/ExitAction.java
index cb403b2..108c9ab 100644
--- a/src/main/java/org/jajuk/ui/actions/ExitAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ExitAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,17 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 
 import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
 
 import org.jajuk.services.core.ExitService;
-import org.jajuk.ui.perspectives.PerspectiveManager;
 import org.jajuk.ui.windows.JajukFullScreenWindow;
 import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.ui.windows.JajukSlimbar;
@@ -36,14 +34,11 @@ import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
-import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class ExitAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -71,42 +66,15 @@ public class ExitAction extends JajukAction {
         return;
       }
     }
-    // IMPORTANT: all the following code must be done in EDT to avoid dead
-    // locks.
-    // Not not use SwingUtilities.invokeLater method in the ExitHook Thread,
-    // this code may never be run
-
-    if (SwingUtilities.isEventDispatchThread()) {
-      // commit perspectives if no full restore
-      // engaged. Perspective should be commited before the window
-      // being closed to avoid a dead lock in VLDocking
-      if (!RestoreAllViewsAction.isFullRestore()
-          && JajukMainWindow.getInstance().getWindowStateDecorator().isDisplayed()) {
-        try {
-          PerspectiveManager.commit();
-        } catch (Exception e) {
-          Log.error(e);
-        }
-      }
-
-      // Store window/tray/slimbar configuration
-      UtilGUI.storeWindowSate();
-
-      // hide windows ASAP
-      JajukMainWindow.getInstance().getWindowStateDecorator().display(false);
-
-      // hide systray
-      JajukSystray.getInstance().getWindowStateDecorator().display(false);
-
-      // Hide slimbar
-      JajukSlimbar.getInstance().getWindowStateDecorator().display(false);
-
-      // Hide full screen
-      JajukFullScreenWindow.getInstance().getWindowStateDecorator().display(false);
-
-    }
+    // hide windows ASAP
+    JajukMainWindow.getInstance().getWindowStateDecorator().display(false);
+    // hide systray
+    JajukSystray.getInstance().getWindowStateDecorator().display(false);
+    // Hide slimbar
+    JajukSlimbar.getInstance().getWindowStateDecorator().display(false);
+    // Hide full screen
+    JajukFullScreenWindow.getInstance().getWindowStateDecorator().display(false);
     // Exit Jajuk
     ExitService.exit(0);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/actions/ExportRatingsAction.java b/src/main/java/org/jajuk/ui/actions/ExportRatingsAction.java
new file mode 100644
index 0000000..dad70a7
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/actions/ExportRatingsAction.java
@@ -0,0 +1,147 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.actions;
+
+import java.awt.event.ActionEvent;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.Date;
+import java.util.zip.ZipOutputStream;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+
+import org.jajuk.base.Track;
+import org.jajuk.base.TrackManager;
+import org.jajuk.ui.widgets.JajukFileChooser;
+import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukFileFilter;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.UtilSystem;
+import org.jajuk.util.filters.XMLFilter;
+import org.jajuk.util.log.Log;
+
+/**
+ * Export ratings
+ */
+public class ExportRatingsAction extends SelectionAction {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** The Constant TAG_CLOSE_NEWLINE.  */
+  private static final String TAG_CLOSE_NEWLINE = ">\n";
+  /** The Constant TAB_CLOSE_TAG_START.  */
+  private static final String TAB_CLOSE_TAG_START = "</";
+  private java.io.File file;
+
+  ExportRatingsAction() {
+    super(Messages.getString("ExportRatingsAction.1"), IconLoader.getIcon(JajukIcons.SAVE_AS), true);
+    setShortDescription(Messages.getString("ExportRatingsAction.2"));
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.ui.actions.SelectionAction#perform(java.awt.event.ActionEvent)
+   */
+  @Override
+  public void perform(final ActionEvent e) throws Exception {
+    final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(XMLFilter.getInstance()));
+    jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
+    jfc.setAcceptDirectories(true);
+    jfc.setDialogTitle(Messages.getString("ExportRatingsAction.3"));
+    jfc.setMultiSelectionEnabled(false);
+    jfc.setDialogType(JFileChooser.SAVE_DIALOG);
+    String date = UtilString.getAdditionDateFormatter().format(new Date());
+    jfc.setSelectedFile(new java.io.File(UtilSystem.getUserHome() + "/ratings_" + date + ".xml"));
+    final int returnVal = jfc.showSaveDialog(JajukMainWindow.getInstance());
+    if (returnVal == JFileChooser.APPROVE_OPTION) {
+      // retrieve selected directory and update it in all necessary places
+      file = jfc.getSelectedFile();
+      if (file.exists()) {
+        int iResu = Messages.getChoice(Messages.getString("Confirmation_file_overwrite")
+            + " : \n\n" + file.getName(), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
+        if (iResu != JOptionPane.YES_OPTION) {
+          return;
+        }
+      }
+      // Perform this asynchronously as it may be long
+      new Thread("ExportRatings") {
+        @Override
+        public void run() {
+          // start Export
+          try {
+            exportRatings(file);
+            Messages.showInfoMessage(Messages.getString("Success"));
+          } catch (Exception ex1) {
+            Messages.showWarningMessage(Messages.getString("Error.000") + "-" + ex1.getMessage());
+            Log.warn(0, "IOException while exporting current ratings", ex1);
+          }
+        }
+      }.start();
+    }
+  }
+
+  public void exportRatings(final File file) throws IOException {
+    Log.info("Exporting current track ratings to file {{" + file + "}}");
+    long time = System.currentTimeMillis();
+    String sCharset = Conf.getString(Const.CONF_COLLECTION_CHARSET);
+    final BufferedWriter bw;
+    if (file.getAbsolutePath().endsWith(".zip")) {
+      bw = new BufferedWriter(new OutputStreamWriter(
+          new ZipOutputStream(new FileOutputStream(file)), sCharset), 1000000);
+    } else {
+      bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), sCharset), 1000000);
+    }
+    try {
+      bw.write("<?xml version='1.0' encoding='" + sCharset + "'?>\n");
+      bw.write("<!-- Jajuk Ratings export -->\n");
+      bw.write("<" + Const.XML_TRACKS + " " + Const.XML_VERSION + "='" + Const.JAJUK_VERSION
+          + "'>\n");
+      for (Track track : TrackManager.getInstance().getTracks()) {
+        bw.write(toRatingsXml(track));
+      }
+      // end of collection
+      bw.write("</" + Const.XML_TRACKS + TAG_CLOSE_NEWLINE);
+      bw.flush();
+    } finally {
+      bw.close();
+    }
+    Log.debug("Ratings exported in " + (System.currentTimeMillis() - time) + " ms");
+  }
+
+  private String toRatingsXml(Track track) {
+    StringBuilder sb = new StringBuilder("  <").append(track.getXMLTag()).append(' ');
+    sb.append(Const.XML_ID).append("=\'").append(track.getID()).append("\' ");
+    sb.append(Const.XML_TRACK_HITS).append("=\'").append(track.getHits()).append("\' ");
+    sb.append(Const.XML_TRACK_PREFERENCE).append("=\'")
+        .append(track.getLongValue(Const.XML_TRACK_PREFERENCE)).append("\' ");
+    sb.append(Const.XML_TRACK_BANNED).append("='")
+        .append(track.getBooleanValue(Const.XML_TRACK_BANNED));
+    sb.append("'/>\n");
+    return sb.toString();
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/actions/FindDuplicateTracksAction.java b/src/main/java/org/jajuk/ui/actions/FindDuplicateTracksAction.java
index de91ac4..0cc02dc 100644
--- a/src/main/java/org/jajuk/ui/actions/FindDuplicateTracksAction.java
+++ b/src/main/java/org/jajuk/ui/actions/FindDuplicateTracksAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
@@ -52,19 +51,15 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class FindDuplicateTracksAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Result : a list of dups files for a given track. */
   List<List<File>> duplicateTracksList;
-
   /** Temporary storage during dups detection. */
   private Map<String, Set<File>> mapTrackDups;
-
   /** Track comparator. */
   TrackComparator comparator = new TrackComparator(TrackComparatorType.ALMOST_IDENTICAL);
 
@@ -80,7 +75,7 @@ public class FindDuplicateTracksAction extends JajukAction {
   /**
    * Add a dup for a given track.
    *
-   * @param track DOCUMENT_ME
+   * @param track 
    * @param files list of files
    */
   private void addDup(Track track, List<File> files) {
@@ -104,8 +99,8 @@ public class FindDuplicateTracksAction extends JajukAction {
   /**
    * Gets the next track.
    * 
-   * @param tracks DOCUMENT_ME
-   * @param index DOCUMENT_ME
+   * @param tracks 
+   * @param index 
    * 
    * @return the next track
    */
@@ -121,7 +116,7 @@ public class FindDuplicateTracksAction extends JajukAction {
    * Return either all or only mounted files for given track
    * according to OPTIONS_HIDE_UNMOUNTED option.
    * 
-   * @param track DOCUMENT_ME
+   * @param track 
    * 
    * @return either all or only mounted files for given track
    */
@@ -140,18 +135,14 @@ public class FindDuplicateTracksAction extends JajukAction {
     duplicateTracksList = new ArrayList<List<File>>();
     // Use a tree map so footprints are sorted
     mapTrackDups = new TreeMap<String, Set<File>>();
-
     List<Track> tracks = TrackManager.getInstance().getTracks();
-
     // For finding duplicate files, we don't just rely on the number of files associated with
     // a track (>1), we also find almost-identical tracks, ie based on album name, not its ID
     // because then, we can't detect identical files located in several directories with a
     // different set of files (because track uses album id in its hashcode and album id uses CDDB discid
     // computed by jajuk based on the duration of all files in a given directory)
-
     // Sort using the ALMOST-IDENTICAL
     Collections.sort(tracks, comparator);
-
     int index = 0;
     while (index <= tracks.size() - 1) {
       Track track = tracks.get(index);
@@ -167,7 +158,6 @@ public class FindDuplicateTracksAction extends JajukAction {
       }
       index++;
     }
-
     // Build final list (note that it is already sorted by track, mapTrackDups is a TreeMap)
     for (String footprint : mapTrackDups.keySet()) {
       Set<File> dups = mapTrackDups.get(footprint);
@@ -187,7 +177,6 @@ public class FindDuplicateTracksAction extends JajukAction {
   public void perform(final ActionEvent evt) throws Exception {
     UtilGUI.waiting();
     SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
-
       @Override
       protected Void doInBackground() throws Exception {
         populateDups();
@@ -201,10 +190,9 @@ public class FindDuplicateTracksAction extends JajukAction {
             Messages.showInfoMessage(Messages.getString("FindDuplicateTracksAction.0"));
           } else {
             final JOptionPane optionPane = UtilGUI.getNarrowOptionPane(100);
-            final JDialog duplicateFiles = optionPane.createDialog(null, Messages
-                .getString("FindDuplicateTracksAction.3"));
+            final JDialog duplicateFiles = optionPane.createDialog(null,
+                Messages.getString("FindDuplicateTracksAction.3"));
             duplicateFiles.setResizable(true);
-
             JButton jbClose = new JButton(Messages.getString("Close"));
             jbClose.addActionListener(new ActionListener() {
               @Override
@@ -212,13 +200,11 @@ public class FindDuplicateTracksAction extends JajukAction {
                 duplicateFiles.dispose();
               }
             });
-
             // Create and set up the content pane.
             JComponent newContentPane = new DuplicateTracksDialog(duplicateTracksList, jbClose);
             newContentPane.setOpaque(true);
             UtilGUI.setEscapeKeyboardAction(duplicateFiles, newContentPane);
             duplicateFiles.setContentPane(newContentPane);
-
             // Display the window.
             duplicateFiles.setSize(800, 600);
             duplicateFiles.setLocationRelativeTo(JajukMainWindow.getInstance());
diff --git a/src/main/java/org/jajuk/ui/actions/FinishAlbumAction.java b/src/main/java/org/jajuk/ui/actions/FinishAlbumAction.java
index 15658fb..6595fdf 100644
--- a/src/main/java/org/jajuk/ui/actions/FinishAlbumAction.java
+++ b/src/main/java/org/jajuk/ui/actions/FinishAlbumAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,21 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 import java.util.List;
-import java.util.Properties;
 
 import org.jajuk.base.Directory;
-import org.jajuk.events.JajukEvent;
-import org.jajuk.events.JajukEvents;
-import org.jajuk.events.ObservationManager;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
-import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
@@ -39,10 +34,9 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class FinishAlbumAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -69,16 +63,13 @@ public class FinishAlbumAction extends JajukAction {
           StackItem item = QueueModel.getCurrentItem();// stores
           // current item
           Directory dir = item.getFile().getDirectory();
-          List<StackItem> stack = UtilFeatures.createStackItems(dir
-              .getFilesFromFile(item.getFile()), item.isRepeat(), item.isUserLaunch());
+          List<StackItem> stack = UtilFeatures.createStackItems(
+              dir.getFilesFromFile(item.getFile()), item.isRepeat(), item.isUserLaunch());
           // Then re-add current item only if some more tracks are to be ran. Otherwise, just ignore
           // this command, better than displaying a bozing error message.
           if (stack != null && stack.size() > 0) {
             QueueModel.push(stack, true, true);
             QueueModel.computesPlanned(true); // update planned list
-            Properties properties = new Properties();
-            properties.put(Const.DETAIL_ORIGIN, Const.DETAIL_SPECIAL_MODE_NORMAL);
-            ObservationManager.notify(new JajukEvent(JajukEvents.SPECIAL_MODE, properties));
           }
         } catch (Exception e) {
           Log.error(e);
diff --git a/src/main/java/org/jajuk/ui/actions/ForwardTrackAction.java b/src/main/java/org/jajuk/ui/actions/ForwardTrackAction.java
index a3221af..f807409 100644
--- a/src/main/java/org/jajuk/ui/actions/ForwardTrackAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ForwardTrackAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -33,11 +33,9 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + ALT + RIGHT ARROW</code>.
  */
 public class ForwardTrackAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant JUMP_SIZE.  DOCUMENT_ME */
+  /** The Constant JUMP_SIZE.   */
   private static final float JUMP_SIZE = 0.1f;
 
   /**
diff --git a/src/main/java/org/jajuk/ui/actions/FullscreenAction.java b/src/main/java/org/jajuk/ui/actions/FullscreenAction.java
index 02ac984..a6c8ee3 100644
--- a/src/main/java/org/jajuk/ui/actions/FullscreenAction.java
+++ b/src/main/java/org/jajuk/ui/actions/FullscreenAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -30,10 +30,9 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class FullscreenAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1223773056757729079L;
 
@@ -52,7 +51,7 @@ public class FullscreenAction extends JajukAction {
   public void perform(ActionEvent evt) throws Exception {
     /*
      * If full screen window is visible, hide it and show the main window. Note
-     * that both main window and fsw can"t be displayed at the same time:
+     * that main window and full screen modes are mutually exclusive :
      */
     WindowStateDecorator sdFullscreen = JajukFullScreenWindow.getInstance()
         .getWindowStateDecorator();
diff --git a/src/main/java/org/jajuk/ui/actions/GCAction.java b/src/main/java/org/jajuk/ui/actions/GCAction.java
index de82748..ff1c613 100644
--- a/src/main/java/org/jajuk/ui/actions/GCAction.java
+++ b/src/main/java/org/jajuk/ui/actions/GCAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Action to run garbage collection.
  */
 public class GCAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/GlobalRandomAction.java b/src/main/java/org/jajuk/ui/actions/GlobalRandomAction.java
index a09d65a..8ea30c0 100644
--- a/src/main/java/org/jajuk/ui/actions/GlobalRandomAction.java
+++ b/src/main/java/org/jajuk/ui/actions/GlobalRandomAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -37,10 +37,9 @@ import org.jajuk.util.UtilFeatures;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class GlobalRandomAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -77,8 +76,8 @@ public class GlobalRandomAction extends JajukAction {
           alToPlay = alToPlay.subList(0, Const.NB_TRACKS_ON_ACTION);
         }
         // Push them
-        QueueModel.push(UtilFeatures.createStackItems(alToPlay, Conf
-            .getBoolean(Const.CONF_STATE_REPEAT_ALL), false), false);
+        QueueModel.push(UtilFeatures.createStackItems(alToPlay,
+            Conf.getBoolean(Const.CONF_STATE_REPEAT), false), false);
       }
     }.start();
   }
diff --git a/src/main/java/org/jajuk/ui/actions/HateSelectionAction.java b/src/main/java/org/jajuk/ui/actions/HateSelectionAction.java
index 31cecad..5ecdbd6 100644
--- a/src/main/java/org/jajuk/ui/actions/HateSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/HateSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class HateSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/HelpRequiredAction.java b/src/main/java/org/jajuk/ui/actions/HelpRequiredAction.java
index 578bdf0..0924710 100644
--- a/src/main/java/org/jajuk/ui/actions/HelpRequiredAction.java
+++ b/src/main/java/org/jajuk/ui/actions/HelpRequiredAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -33,7 +33,6 @@ import org.jajuk.util.log.Log;
  * Action for displaying the online help.
  */
 public class HelpRequiredAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -51,7 +50,7 @@ public class HelpRequiredAction extends JajukAction {
   @Override
   public void perform(ActionEvent evt) {
     try {
-      Desktop.getDesktop().browse(new URI("http://jajuk.info/index.php/Table_of_contents"));
+      Desktop.getDesktop().browse(new URI("http://www.jajuk.info/manual/main.html"));
     } catch (Exception e) {
       Messages.showErrorMessage(136);
       Log.error(e);
diff --git a/src/main/java/org/jajuk/ui/actions/HideShowMountedDevicesAction.java b/src/main/java/org/jajuk/ui/actions/HideShowMountedDevicesAction.java
index 812e5d3..d9b30f7 100644
--- a/src/main/java/org/jajuk/ui/actions/HideShowMountedDevicesAction.java
+++ b/src/main/java/org/jajuk/ui/actions/HideShowMountedDevicesAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -36,7 +36,6 @@ import org.jajuk.util.Messages;
  * Fast access to hide/show unmounted devices option.
  */
 public class HideShowMountedDevicesAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/ImportRatingsAction.java b/src/main/java/org/jajuk/ui/actions/ImportRatingsAction.java
new file mode 100644
index 0000000..6306eee
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/actions/ImportRatingsAction.java
@@ -0,0 +1,158 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.actions;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.zip.ZipInputStream;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.jajuk.base.Track;
+import org.jajuk.base.TrackManager;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.ui.widgets.JajukFileChooser;
+import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukFileFilter;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.error.JajukException;
+import org.jajuk.util.filters.XMLFilter;
+import org.jajuk.util.log.Log;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Import ratings
+ */
+public class ImportRatingsAction extends SelectionAction {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  private java.io.File file;
+
+  private class Parser extends DefaultHandler {
+    /* (non-Javadoc)
+     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
+     */
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes)
+        throws SAXException {
+      // <track id='11f89yuelwwdmzg1357yaw87j' rate='0' ban='true'/>
+      if (qName.equals(Const.XML_TRACK)) {
+        String id = attributes.getValue(Const.XML_ID);
+        String preference = attributes.getValue(Const.XML_TRACK_PREFERENCE);
+        String hits = attributes.getValue(Const.XML_TRACK_HITS);
+        String banned = attributes.getValue(Const.XML_TRACK_BANNED);
+        Track track = TrackManager.getInstance().getTrackByID(id);
+        if (track == null) {
+          Log.debug("Track no more exists : " + id);
+        }
+        track.setHits(UtilString.fastLongParser(hits));
+        track.setPreference(Long.parseLong(preference));
+        track.setProperty(Const.XML_TRACK_BANNED, Boolean.parseBoolean(banned));
+        //force final rating re-computation
+        track.updateRate();
+      }
+    }
+  }
+
+  ImportRatingsAction() {
+    super(Messages.getString("ImportRatingsAction.1"), IconLoader.getIcon(JajukIcons.LAUNCH), true);
+    setShortDescription(Messages.getString("ImportRatingsAction.2"));
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.ui.actions.SelectionAction#perform(java.awt.event.ActionEvent)
+   */
+  @Override
+  public void perform(final ActionEvent e) throws Exception {
+    final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(XMLFilter.getInstance())/*, fDir*/);
+    jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
+    jfc.setDialogTitle(Messages.getString("ImportRatingsAction.3"));
+    jfc.setMultiSelectionEnabled(false);
+    jfc.setAcceptDirectories(true);
+    final int returnVal = jfc.showOpenDialog(JajukMainWindow.getInstance());
+    if (returnVal == JFileChooser.APPROVE_OPTION) {
+      // retrieve selected directory and update it in all necessary places
+      file = jfc.getSelectedFile();
+      if (!file.exists()) {
+        Messages.showWarningMessage(Messages.getString("Error.181"));
+        return;
+      }
+      int iResu = Messages.getChoice(Messages.getString("Confirmation_reset_ratings_overwrite")
+          + " : \n\n" + file.getName(), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
+      if (iResu != JOptionPane.YES_OPTION) {
+        return;
+      }
+      // Perform this asynchronously as it may be long
+      new Thread("Import ratings") {
+        @Override
+        public void run() {
+          try {
+            importRatings(file);
+            Messages.showInfoMessage(Messages.getString("Success"));
+          } catch (Exception ex1) {
+            Messages.showWarningMessage(Messages.getString("Error.000") + "-" + ex1.getMessage());
+            Log.warn(0, "IOException while exporting current ratings", ex1);
+          }
+        }
+      }.start();
+      ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
+    }
+  }
+
+  public void importRatings(final File file) throws IOException, SAXException, JajukException,
+      ParserConfigurationException {
+    Log.info("Importing current track ratings from file {{" + file + "}}");
+    final long time = System.currentTimeMillis();
+    SAXParserFactory spf = SAXParserFactory.newInstance();
+    spf.setValidating(false);
+    spf.setNamespaceAware(false);
+    // See http://xerces.apache.org/xerces-j/features.html for details
+    spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
+    spf.setFeature("http://xml.org/sax/features/string-interning", true);
+    SAXParser saxParser = spf.newSAXParser();
+    if (!file.exists()) {
+      throw new JajukException(5, file.toString());
+    }
+    final InputSource input;
+    if (file.getAbsolutePath().endsWith(".zip")) {
+      input = new InputSource(new ZipInputStream(new FileInputStream(file)));
+    } else {
+      input = new InputSource(new FileInputStream(file));
+    }
+    saxParser.parse(input, new Parser());
+    Log.debug("Ratings exported in " + (System.currentTimeMillis() - time) + " ms");
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/actions/IncreaseVolumeAction.java b/src/main/java/org/jajuk/ui/actions/IncreaseVolumeAction.java
index ed3c572..8ae6d5f 100644
--- a/src/main/java/org/jajuk/ui/actions/IncreaseVolumeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/IncreaseVolumeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -30,7 +30,6 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + UP ARROW</code>.
  */
 public class IncreaseVolumeAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/IntroModeAction.java b/src/main/java/org/jajuk/ui/actions/IntroModeAction.java
index 983055e..e72f88c 100644
--- a/src/main/java/org/jajuk/ui/actions/IntroModeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/IntroModeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,27 +16,26 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 
-import org.jajuk.ui.widgets.JajukJMenuBar;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 
+ at SuppressWarnings("serial")
 /**
- * DOCUMENT_ME.
+ * Intro mode button action
  */
 public class IntroModeAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
   /**
    * Instantiates a new intro mode action.
    */
@@ -50,8 +49,8 @@ public class IntroModeAction extends JajukAction {
    */
   @Override
   public void perform(ActionEvent evt) {
-    boolean b = Boolean.valueOf(Conf.getString(Const.CONF_STATE_INTRO));
-    Conf.setProperty(Const.CONF_STATE_INTRO, Boolean.toString(!b));
-    JajukJMenuBar.getInstance().setIntroSelected(!b);
+    Conf.invert(Const.CONF_STATE_INTRO);
+    // Refresh mode buttons
+    ObservationManager.notify(new JajukEvent(JajukEvents.MODE_STATUS_CHANGED));
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/JajukAction.java b/src/main/java/org/jajuk/ui/actions/JajukAction.java
index 57c663b..2de3e09 100644
--- a/src/main/java/org/jajuk/ui/actions/JajukAction.java
+++ b/src/main/java/org/jajuk/ui/actions/JajukAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,12 +16,11 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
-import java.lang.reflect.InvocationTargetException;
 
 import javax.swing.AbstractAction;
 import javax.swing.Icon;
@@ -38,16 +37,12 @@ import org.jajuk.util.log.Log;
  * the {@link #actionPerformed(java.awt.event.ActionEvent)} method.
  */
 public abstract class JajukAction extends AbstractAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -2535230785022978297L;
-
   /** Is this action an hotkey ?. */
   private boolean bHotkey = false;
-
   /** enable state. */
   private boolean bEnable = true;
-
   // Instantiate a static JIntellitype object if under Windows
   // BEWARE ! don't use direct call to JIntellitype like
   // JIntellitype.isJIntellitypeSupported()) because we don't want to create a linkage
@@ -66,11 +61,11 @@ public abstract class JajukAction extends AbstractAction {
   /**
    * Construct an action with the given name, icon and accelerator keystroke.
    *
-   * @param pName DOCUMENT_ME
+   * @param pName 
    * @param icon The icon to use for visualization of the action.
    * @param stroke The keystroke to use.
    * @param enabled By default enable or disable the action.
-   * @param bHotkey DOCUMENT_ME
+   * @param bHotkey 
    */
   protected JajukAction(String pName, Icon icon, KeyStroke stroke, boolean enabled, boolean bHotkey) {
     // check hotkeys are enabled (false by default)
@@ -91,20 +86,10 @@ public abstract class JajukAction extends AbstractAction {
     if (stroke != null) {
       if (this.bHotkey) {
         try {
-          Class.forName("org.jajuk.ui.actions.WindowsHotKeyManager").getMethod("registerHotKey",
-              new Class[] { KeyStroke.class, JajukAction.class }).invoke(null,
-              new Object[] { stroke, this });
-        } catch (ClassNotFoundException e) {
-          Log.error(e);
-        } catch (IllegalArgumentException e) {
-          Log.error(e);
-        } catch (SecurityException e) {
-          Log.error(e);
-        } catch (IllegalAccessException e) {
-          Log.error(e);
-        } catch (InvocationTargetException e) {
-          Log.error(e);
-        } catch (NoSuchMethodException e) {
+          Class.forName("org.jajuk.ui.actions.WindowsHotKeyManager")
+              .getMethod("registerHotKey", new Class[] { KeyStroke.class, JajukAction.class })
+              .invoke(null, new Object[] { stroke, this });
+        } catch (Exception e) {
           Log.error(e);
         }
       }
@@ -277,7 +262,6 @@ public abstract class JajukAction extends AbstractAction {
    * @param actionCommand The action command for this action. This is used for creating the
    * <code>ActionEvent</code>.
    */
-
   public void setActionCommand(String actionCommand) {
     putValue(ACCELERATOR_KEY, actionCommand);
   }
@@ -337,7 +321,9 @@ public abstract class JajukAction extends AbstractAction {
   public final void actionPerformed(ActionEvent evt) {
     try {
       perform(evt);
-    } catch (Throwable e2) {
+    } catch (Throwable e2) {//NOSONAR
+      // We want to catch even throwables because there is no point to 
+      // throw them again, caller can't do anything anyway.
       Log.error(e2);
     }
   }
@@ -345,7 +331,7 @@ public abstract class JajukAction extends AbstractAction {
   /**
    * Perform the action.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    * 
    * @throws Exception When anything goes wrong when performing the action.
    */
@@ -358,8 +344,8 @@ public abstract class JajukAction extends AbstractAction {
    */
   public static void cleanup() throws Exception {
     if (UtilSystem.isUnderWindows()) {
-      Class.forName("org.jajuk.ui.actions.WindowsHotKeyManager").getMethod("cleanup").invoke(null,
-          (Object[]) null);
+      Class.forName("org.jajuk.ui.actions.WindowsHotKeyManager").getMethod("cleanup")
+          .invoke(null, (Object[]) null);
     }
   }
 
@@ -375,7 +361,7 @@ public abstract class JajukAction extends AbstractAction {
   /**
    * Enable or disable the action.
    * 
-   * @param enable DOCUMENT_ME
+   * @param enable 
    */
   protected void enable(boolean enable) {
     this.bEnable = enable;
@@ -389,5 +375,4 @@ public abstract class JajukAction extends AbstractAction {
   protected boolean isEnable() {
     return this.bEnable;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/actions/JajukActions.java b/src/main/java/org/jajuk/ui/actions/JajukActions.java
index 5745137..d60282e 100644
--- a/src/main/java/org/jajuk/ui/actions/JajukActions.java
+++ b/src/main/java/org/jajuk/ui/actions/JajukActions.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -25,353 +25,240 @@ package org.jajuk.ui.actions;
  * <p/>
  */
 public enum JajukActions {
-
   /** Used for application exit. */
   EXIT,
-
   /** Used when the repeat status was changed. */
   REPEAT_MODE,
-
   /** Used when the repeat all status was changed. */
   REPEAT_ALL_MODE,
-
   /** Used when the shuffle mode was changed. */
   SHUFFLE_MODE,
-
   /** Used when the continue mode was changed. */
   CONTINUE_MODE,
-
   /** Used when the intro mode was changed. */
   INTRO_MODE,
-
   /** Used when the karaoke mode was changed. */
   KARAOKE_MODE,
-
   /** Used when a new device is requested. */
   DEVICE_NEW,
-
   /** Used when a device is removed. */
   DEVICE_DELETE,
-
   /** Used when device properties are requested. */
   DEVICE_PROPERTIES,
-
   /** Used when a device mount is requested. */
   DEVICE_MOUNT,
-
   /** Used when a device unmount is requested. */
   DEVICE_UNMOUNT,
-
   /** Used when a device test is requested. */
   DEVICE_TEST,
-
   /** Used when a device refresh is requested. */
   DEVICE_REFRESH,
-
   /** Used when a device synchronization is requested. */
   DEVICE_SYNCHRO,
-
   /** Used when a view refresh is requested. This is used in device view. */
   VIEW_REFRESH_REQUEST,
-
   /** Used when a view needs to be closed. */
   VIEW_CLOSE_REQUEST,
-
   /** Used when view needs to be shown. */
   VIEW_SHOW_REQUEST,
-
   /** Used when the display status of a view needs to be changed. */
   VIEW_SHOW_STATUS_CHANGED_REQUEST,
-
   /** Used when defaults settings need to be restored. */
   VIEW_RESTORE_DEFAULTS,
-
   /** Used when defaults settings for all perspectives. */
   ALL_VIEW_RESTORE_DEFAULTS,
-
   /** Used when a command from the history is selected. */
   VIEW_COMMAND_SELECT_HISTORY_ITEM,
-
   /** Used when the help should be displayed. */
   HELP_REQUIRED,
-
   /** Used to see debug traces. */
   SHOW_TRACES,
-
   /** Used when the cover should be refreshed. */
   COVER_REFRESH,
-
   /** Used when a request for a cover change is made. */
   COVER_CHANGE,
-
   /** Used when a playlist refresh is requested. */
   PLAYLIST_REFRESH,
-
   /** Used when a playlist change is requested. */
   PLAYLIST_CHANGED,
-
   /** Used when a file has been launched by the fifo. */
   FILE_LAUNCHED,
-
   /** Used as heart beat for general use to refresh subscribers every n secs. */
   HEART_BEAT,
-
   /** Used when a reinit has is required. */
   ZERO,
-
   /** Used when a new element has been added in the history. */
   ADD_HISTORY_ITEM,
-
   /** Used when a special mode (global shuffle, novelties, bestof...) changed. */
   SPECIAL_MODE,
-
   /** Used when the global shuffle button is pressed. */
   SHUFFLE_GLOBAL,
-
   /** Used when the best of button is pressed. */
   BEST_OF,
-
   /** Used when the DJ button is pressed. */
   DJ,
-
   /** Used when the novelties button is pressed. */
   NOVELTIES,
-
   /** Used when the finish album button is pressed. Indicates the current album will play until the end. */
   FINISH_ALBUM,
-
   /** Used when an error occurred during a play. */
   PLAY_ERROR,
-
   /** Used when the mute state changed. */
   MUTE_STATE,
-
   /** Used when table and tree views need to be synchronized. */
   SYNC_TREE_TABLE,
-
   /** Used when history should be cleared. */
   CLEAR_HISTORY,
-
   /** Used when the first time wizard needs to be launched. */
   SIMPLE_DEVICE_WIZARD,
-
   /** Used to launch the quality feedback agent. */
   QUALITY,
-
   /** Used to change the volume. */
   VOLUME_CHANGED,
-
   /** Used when a new property is created. */
   CREATE_PROPERTY,
-
   /** Used when a property is deleted. */
   DELETE_PROPERTY,
-
   /** Used when a new custom property is added. */
   CUSTOM_PROPERTIES_ADD,
-
   /** Used when a custom property is removed. */
   CUSTOM_PROPERTIES_REMOVE,
-
   /** Used when a file name changes. */
   FILE_NAME_CHANGED,
-
   /** Used when file rate changes. */
   RATE_CHANGED,
-
   /** Used to display a tip of the day window. */
   TIP_OF_THE_DAY,
-
   /** Used to check for jajuk updates. */
   CHECK_FOR_UPDATES,
-
   /** Used to display an about dialog. */
   SHOW_ABOUT,
-
   /** Used to display an tag configure dialog. */
   EXTRA_TAGS_WIZARD,
-
   /** Used to jump to the previous track. */
   PREVIOUS_TRACK,
-
   /** Used to display the current queue in slim bar. */
   QUEUE_TO_SLIM,
-
   /** Replay current album. */
   REPLAY_ALBUM,
-
   /** Used to jump to the next track. */
   NEXT_TRACK,
-
   /** Used to rewind the current track. */
   REWIND_TRACK,
-
   /** Used to fast-forward the current track. */
   FORWARD_TRACK,
-
   /** Used to increase current track rate. */
   INC_RATE,
-
   /** Used to stop playing. */
   STOP_TRACK,
-
   /** Used to pause/resume playing. */
   PAUSE_RESUME_TRACK,
-
   /** Used to jump to the previous album. */
   PREVIOUS_ALBUM,
-
   /** Used to jump to the next album. */
   NEXT_ALBUM,
-
   /** Used to increase the volume. */
   INCREASE_VOLUME,
-
   /** Used to decrease the volume. */
   DECREASE_VOLUME,
-
   /** Used to configure djs. */
   CONFIGURE_DJS,
-
   /** Used to configure ambiences. */
   CONFIGURE_AMBIENCES,
-
-  /** Used to configure webradios. */
-  CONFIGURE_WEBRADIOS,
-
   /** Used to configure the application. */
   OPTIONS,
-
   /** Used to show or hide unmounted devices. */
   UNMOUNTED,
-
   /** Create a report. */
   CREATE_REPORT,
-
   /** Copy to clipboard data from UtilFeatures.copyData */
   COPY_TO_CLIPBOARD,
-
   /** Open directory in default explorer program. */
   OPEN_EXPLORER,
-
   /** Launch in an external browser the url given in UtilFeatures.url */
   LAUNCH_IN_BROWSER,
-
   /** Launch a web radio. */
   WEB_RADIO,
-
   /** Used to delete selected files/directories from disk. */
   DELETE,
-
   /** Used to move selected files and directories. */
   PASTE,
-
   /** Used to refresh a directory. */
   REFRESH,
-
   /** Used to find duplicate files. */
   FIND_DUPLICATE_FILES,
-
   /** Used to set alarm clock. */
   ALARM_CLOCK,
-
   /** Show properties on a single or a selection of items. */
   SHOW_PROPERTIES,
-
+  /** Display the currently playing track via the notification system. */
+  SHOW_CURRENTLY_PLAYING,
   /** Play a selection. */
   PLAY_SELECTION,
-
   /** Play randomly a selection. */
   PLAY_SHUFFLE_SELECTION,
-
   /** Play a selection in a loop. */
   PLAY_REPEAT_SELECTION,
-
   /** Push a selection. */
   PUSH_SELECTION,
-
   /** Push a selection to the front. */
   PUSH_FRONT_SELECTION,
-
   /** Bookmark selection. */
   BOOKMARK_SELECTION,
-
   /** Play album for selection. */
   PLAY_ALBUM_SELECTION,
-
   /** Play artist for selection. */
   PLAY_ARTIST_SELECTION,
-
   /** Play full directory for selection. */
   PLAY_DIRECTORY_SELECTION,
-
   /** Search online tags. */
   CDDB_SELECTION,
-
   /** Show album details. */
   SHOW_ALBUM_DETAILS,
-
   /** Used to cut and move Selected Items. */
   CUT,
-
   /** Used to copy and move Selected Items. */
   COPY,
-
   /** Used to rename files/directories. */
   RENAME,
-
   /** Used to create New Folder. */
   NEW_FOLDER,
-
   /** Used to create a slim interface for Jajuk. */
   SLIM_JAJUK,
-
   /** Used to perform GC. */
   GC,
-
   /** Used to manually save settings and collection. */
   COMMIT,
-
   /** Save as. */
   SAVE_AS,
-
   /** Ban current item. */
   BAN,
-
   /** Ban selection. */
   BAN_SELECTION,
-
   /** Un-Ban selection. */
   UN_BAN_SELECTION,
-
   /** Set adore preference to selection. */
   PREFERENCE_ADORE,
-
   /** Set love preference to selection. */
   PREFERENCE_LOVE,
-
   /** Set like preference to selection. */
   PREFERENCE_LIKE,
-
   /** Set average preference to selection. */
   PREFERENCE_AVERAGE,
-
   /** Set poor preference to selection. */
   PREFERENCE_POOR,
-
   /** Set hate preference to selection. */
   PREFERENCE_HATE,
-
   /** Set unset preference to selection. */
   PREFERENCE_UNSET,
-
   /** Prepare party. */
   PREPARE_PARTY,
-
-  /** fullscreen. */
+  /** Fullscreen. */
   FULLSCREEN_JAJUK,
-
-  /** display donate dialog. */
-  SHOW_DONATE
-
+  /** Display donate dialog. */
+  SHOW_DONATE,
+  /** Export ratings */
+  EXPORT_RATINGS,
+  /** Import ratings */
+  IMPORT_RATINGS
 }
diff --git a/src/main/java/org/jajuk/ui/actions/KaraokeModeAction.java b/src/main/java/org/jajuk/ui/actions/KaraokeModeAction.java
index e70cdf8..67569ff 100644
--- a/src/main/java/org/jajuk/ui/actions/KaraokeModeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/KaraokeModeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 
-import org.jajuk.ui.widgets.JajukJMenuBar;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
@@ -32,11 +34,8 @@ import org.jajuk.util.Messages;
 /**
  * Karaoke mode state change action.
  */
+ at SuppressWarnings("serial")
 public class KaraokeModeAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
   /**
    * Instantiates a new karaoke mode action.
    */
@@ -50,8 +49,8 @@ public class KaraokeModeAction extends JajukAction {
    */
   @Override
   public void perform(ActionEvent evt) {
-    boolean b = Boolean.valueOf(Conf.getString(Const.CONF_STATE_KARAOKE));
-    Conf.setProperty(Const.CONF_STATE_KARAOKE, Boolean.toString(!b));
-    JajukJMenuBar.getInstance().setKaraokeSelected(!b);
+    Conf.invert(Const.CONF_STATE_KARAOKE);
+    // Refresh mode buttons
+    ObservationManager.notify(new JajukEvent(JajukEvents.MODE_STATUS_CHANGED));
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/LaunchInBrowserAction.java b/src/main/java/org/jajuk/ui/actions/LaunchInBrowserAction.java
index b8a1024..416aaf2 100644
--- a/src/main/java/org/jajuk/ui/actions/LaunchInBrowserAction.java
+++ b/src/main/java/org/jajuk/ui/actions/LaunchInBrowserAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -39,7 +39,6 @@ import org.jajuk.util.log.Log;
  * Launch the URL from UtilFeatures.url in the default browser
  */
 public class LaunchInBrowserAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/LikeSelectionAction.java b/src/main/java/org/jajuk/ui/actions/LikeSelectionAction.java
index d147707..1da9354 100644
--- a/src/main/java/org/jajuk/ui/actions/LikeSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/LikeSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class LikeSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/LoveSelectionAction.java b/src/main/java/org/jajuk/ui/actions/LoveSelectionAction.java
index 77b501b..90f0db4 100644
--- a/src/main/java/org/jajuk/ui/actions/LoveSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/LoveSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class LoveSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/MuteAction.java b/src/main/java/org/jajuk/ui/actions/MuteAction.java
index 8c4b621..c5f1d6d 100644
--- a/src/main/java/org/jajuk/ui/actions/MuteAction.java
+++ b/src/main/java/org/jajuk/ui/actions/MuteAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -35,7 +35,6 @@ import org.jajuk.util.Messages;
  * Action of clicking on the mute button.
  */
 public class MuteAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -70,7 +69,7 @@ public class MuteAction extends JajukAction {
   /**
    * Set Volume Icon.
    * 
-   * @param fVolume DOCUMENT_ME
+   * @param fVolume 
    */
   public static void setVolumeIcon(final float fVolume) {
     if (fVolume <= 0 || Player.isMuted()) {
diff --git a/src/main/java/org/jajuk/ui/actions/NewFolderAction.java b/src/main/java/org/jajuk/ui/actions/NewFolderAction.java
index 21eda04..ae34890 100644
--- a/src/main/java/org/jajuk/ui/actions/NewFolderAction.java
+++ b/src/main/java/org/jajuk/ui/actions/NewFolderAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -41,10 +41,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class NewFolderAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -70,10 +69,8 @@ public class NewFolderAction extends JajukAction {
     final List<Item> alSelected = (ArrayList<Item>) source
         .getClientProperty(Const.DETAIL_SELECTION);
     final Item currentItem = alSelected.get(0);
-
-    final String folderName = JOptionPane.showInputDialog(null, Messages
-        .getString("NewFolderAction.1")
-        + "\n\n");
+    final String folderName = JOptionPane.showInputDialog(null,
+        Messages.getString("NewFolderAction.1") + "\n\n");
     if ((folderName != null) && (folderName.length() > 0)) {
       // If selected item is a directory, extract the associated root
       // directory
diff --git a/src/main/java/org/jajuk/ui/actions/NewPropertyAction.java b/src/main/java/org/jajuk/ui/actions/NewPropertyAction.java
index 953831b..3a1e8ff 100644
--- a/src/main/java/org/jajuk/ui/actions/NewPropertyAction.java
+++ b/src/main/java/org/jajuk/ui/actions/NewPropertyAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -29,10 +29,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class NewPropertyAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/AlarmClockAction.java b/src/main/java/org/jajuk/ui/actions/NewRadioAction.java
similarity index 74%
copy from src/main/java/org/jajuk/ui/actions/AlarmClockAction.java
copy to src/main/java/org/jajuk/ui/actions/NewRadioAction.java
index c448249..33c5d71 100644
--- a/src/main/java/org/jajuk/ui/actions/AlarmClockAction.java
+++ b/src/main/java/org/jajuk/ui/actions/NewRadioAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,32 +16,30 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 
-import org.jajuk.ui.wizard.AlarmClockDialog;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * Alarm wizard action.
+ * .
  */
-public class AlarmClockAction extends JajukAction {
-
+public class NewRadioAction extends JajukAction {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
   /**
-   * Instantiates a new alarm clock action.
+   * Instantiates a new web radio action.
    */
-  AlarmClockAction() {
-    super(Messages.getString("AlarmClock.0"), IconLoader.getIcon(JajukIcons.ALARM), true);
-    setShortDescription(Messages.getString("AlarmClock.0"));
+  NewRadioAction() {
+    super(Messages.getString("WebRadioView.8"), IconLoader.getIcon(JajukIcons.ADD), true);
+    setShortDescription(Messages.getString("WebRadioView.8"));
   }
 
   /* (non-Javadoc)
@@ -49,6 +47,6 @@ public class AlarmClockAction extends JajukAction {
    */
   @Override
   public void perform(ActionEvent evt) throws JajukException {
-    new AlarmClockDialog();
+    //TODO code the dialog
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/NextAlbumAction.java b/src/main/java/org/jajuk/ui/actions/NextAlbumAction.java
index a8dfd8f..9a176dd 100644
--- a/src/main/java/org/jajuk/ui/actions/NextAlbumAction.java
+++ b/src/main/java/org/jajuk/ui/actions/NextAlbumAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -30,7 +30,6 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + SHIFT + RIGHT ARROW</code>.
  */
 public class NextAlbumAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/NextTrackAction.java b/src/main/java/org/jajuk/ui/actions/NextTrackAction.java
index 43bd0a6..5cde7ba 100644
--- a/src/main/java/org/jajuk/ui/actions/NextTrackAction.java
+++ b/src/main/java/org/jajuk/ui/actions/NextTrackAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -37,7 +37,6 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + RIGHT ARROW</code>.
  */
 public class NextTrackAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -79,7 +78,6 @@ public class NextTrackAction extends JajukAction {
             QueueModel.launchRadio(radios.get(i));
           }
         }.start();
-
       } else {
         // Playing a track
         new Thread("Next Track Thread") {
diff --git a/src/main/java/org/jajuk/ui/actions/NoveltiesAction.java b/src/main/java/org/jajuk/ui/actions/NoveltiesAction.java
index 9ed8a04..32834d3 100644
--- a/src/main/java/org/jajuk/ui/actions/NoveltiesAction.java
+++ b/src/main/java/org/jajuk/ui/actions/NoveltiesAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -38,10 +38,9 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class NoveltiesAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -66,8 +65,9 @@ public class NoveltiesAction extends JajukAction {
           List<File> alToPlay = UtilFeatures.filterByAmbience(FileManager.getInstance()
               .getShuffleNoveltiesPlaylist(), ambience);
           if (alToPlay != null && alToPlay.size() > 0) {
-            QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(alToPlay),
-                Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL), false), false);
+            QueueModel.push(
+                UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(alToPlay),
+                    Conf.getBoolean(Const.CONF_STATE_REPEAT), false), false);
           } else { // none novelty found
             Messages.showWarningMessage(Messages.getString("Error.127"));
           }
diff --git a/src/main/java/org/jajuk/ui/actions/OpenExplorerAction.java b/src/main/java/org/jajuk/ui/actions/OpenExplorerAction.java
index 5680ca2..fa38ca4 100644
--- a/src/main/java/org/jajuk/ui/actions/OpenExplorerAction.java
+++ b/src/main/java/org/jajuk/ui/actions/OpenExplorerAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -26,7 +26,9 @@ import java.util.List;
 import javax.swing.JComponent;
 
 import org.jajuk.base.Directory;
+import org.jajuk.base.File;
 import org.jajuk.base.Item;
+import org.jajuk.base.Playlist;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
@@ -38,7 +40,6 @@ import org.jajuk.util.log.Log;
  * Open directory in default explorer program.
  */
 public class OpenExplorerAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -62,8 +63,16 @@ public class OpenExplorerAction extends JajukAction {
     JComponent source = (JComponent) e.getSource();
     try {
       List<Item> selection = (List<Item>) source.getClientProperty(Const.DETAIL_CONTENT);
-      Directory dir = (Directory) selection.get(0);
-      UtilSystem.openInExplorer(dir.getFio());
+      if (selection.get(0) instanceof Directory) {
+        Directory dir = (Directory) selection.get(0);
+        UtilSystem.openInExplorer(dir.getFio());
+      } else if (selection.get(0) instanceof File) {
+        File f = (File) selection.get(0);
+        UtilSystem.openInExplorer(f.getDirectory().getFio());
+      } else if (selection.get(0) instanceof Playlist) {
+        Playlist pl = (Playlist) selection.get(0);
+        UtilSystem.openInExplorer(pl.getDirectory().getFio());
+      }
     } catch (Exception ex) {
       Log.error(ex);
     }
diff --git a/src/main/java/org/jajuk/ui/actions/PasteAction.java b/src/main/java/org/jajuk/ui/actions/PasteAction.java
index e66595c..5f49404 100644
--- a/src/main/java/org/jajuk/ui/actions/PasteAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PasteAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -53,10 +53,9 @@ import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class PasteAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -80,24 +79,20 @@ public class PasteAction extends JajukAction {
     final List<Item> alSelected = (List<Item>) source.getClientProperty(Const.DETAIL_SELECTION);
     final List<Item> itemsToMove = ItemMoveManager.getInstance().getAll();
     final ItemMoveManager.MoveActions moveAction = ItemMoveManager.getInstance().getAction();
-
     final List<File> alFiles = new ArrayList<File>(alSelected.size());
     final List<Playlist> alPlaylists = new ArrayList<Playlist>(alSelected.size());
     final List<Directory> alDirs = new ArrayList<Directory>(alSelected.size());
-
     new Thread("Paste Thread") {
       @SuppressWarnings("cast")
       @Override
       public void run() {
         UtilGUI.waiting();
-
         // Compute all files to move from various items list
         if (itemsToMove.size() == 0) {
           Log.debug("None item to move");
           return;
         }
         Item first = itemsToMove.get(0);
-
         if (first instanceof Album || first instanceof Artist || first instanceof Genre) {
           List<Track> tracks = TrackManager.getInstance().getAssociatedTracks(itemsToMove, true);
           for (Track track : tracks) {
@@ -116,7 +111,6 @@ public class PasteAction extends JajukAction {
             }
           }
         }
-
         // Compute destination directory
         // alSelected can contain either a single Directory or a single Device
         Item item = alSelected.get(0);
@@ -132,18 +126,16 @@ public class PasteAction extends JajukAction {
           dir = ((File) item).getDirectory().getFio();
           destDir = ((File) item).getDirectory();
         }
-
         // Compute source directories
         // We need to find the highest directory in order to refresh it along
         // with the destination file to avoid phantom references
         List<Directory> srcDirs = new ArrayList<Directory>(1);
-
         for (File file : alFiles) {
           boolean parentAlreadyPresent = false;
           // We have to iterate using items index because the collection can
           // grow
           for (int i = 0; i < srcDirs.size(); i++) {
-            Directory directory = (Directory) srcDirs.get(i);
+            Directory directory = srcDirs.get(i);
             if (file.getDirectory().isChildOf(directory)) {
               parentAlreadyPresent = true;
               break;
@@ -158,7 +150,7 @@ public class PasteAction extends JajukAction {
           // We have to iterate using items index because the collection can
           // grow
           for (int i = 0; i < srcDirs.size(); i++) {
-            Directory directory = (Directory) srcDirs.get(i);
+            Directory directory = srcDirs.get(i);
             if (pl.getDirectory().isChildOf(directory)) {
               parentAlreadyPresent = true;
               break;
@@ -168,10 +160,8 @@ public class PasteAction extends JajukAction {
             srcDirs.add(pl.getDirectory());
           }
         }
-
         boolean overwriteAll = false;
         boolean bErrorOccured = false;
-
         if (moveAction == ItemMoveManager.MoveActions.CUT) {
           for (File f : alFiles) {
             if (!overwriteAll) {
@@ -223,12 +213,10 @@ public class PasteAction extends JajukAction {
                 throw new Exception("Cannot move item: " + pl.getFIO().getAbsolutePath() + " to "
                     + fileNew.getAbsolutePath());
               }
-              
               // Refresh source and destination
               destDir.refresh(false);
               // Refresh source directories as well
               for (Directory srcDir : srcDirs) {
-                srcDir.cleanRemovedFiles();
                 srcDir.refresh(false);
               }
             } catch (Exception ioe) {
@@ -237,8 +225,6 @@ public class PasteAction extends JajukAction {
               bErrorOccured = true;
             }
           }
-          
-        
           for (Directory d : alDirs) {
             try {
               java.io.File src = new java.io.File(d.getAbsolutePath());
@@ -251,13 +237,13 @@ public class PasteAction extends JajukAction {
                     + dst.getAbsolutePath());
               }
               DirectoryManager.getInstance().removeDirectory(d.getID());
+              destDir.refresh(false);
             } catch (Exception ioe) {
               Log.error(131, ioe);
               Messages.showErrorMessage(131);
               bErrorOccured = true;
             }
           }
-         
           try {
             destDir.refresh(false);
             // Refresh source directories as well
@@ -268,7 +254,6 @@ public class PasteAction extends JajukAction {
             Log.error(e1);
             bErrorOccured = true;
           }
-    
         } else if (moveAction == ItemMoveManager.MoveActions.COPY) {
           for (File f : alFiles) {
             if (!overwriteAll) {
@@ -345,14 +330,12 @@ public class PasteAction extends JajukAction {
             bErrorOccured = true;
           }
         }
-     
         ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
         UtilGUI.stopWaiting();
         if (!bErrorOccured) {
           InformationJPanel.getInstance().setMessage(Messages.getString("Success"),
               InformationJPanel.MessageType.INFORMATIVE);
         }
-      
       }
     }.start();
   }
@@ -360,12 +343,11 @@ public class PasteAction extends JajukAction {
   /**
    * Display currently copied file to information panel.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    */
   private void showMessage(java.io.File file) {
     String message = Messages.getString("Device.45");
     message += file.getAbsolutePath() + "]";
     InformationJPanel.getInstance().setMessage(message, InformationJPanel.MessageType.INFORMATIVE);
-
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/PlayAlbumSelectionAction.java b/src/main/java/org/jajuk/ui/actions/PlayAlbumSelectionAction.java
index 055fdfa..0c4ed27 100644
--- a/src/main/java/org/jajuk/ui/actions/PlayAlbumSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PlayAlbumSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -47,7 +47,6 @@ import org.jajuk.util.log.Log;
  * </p>
  */
 public class PlayAlbumSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -77,8 +76,9 @@ public class PlayAlbumSelectionAction extends SelectionAction {
           // Select all files from the first found album
           Album album = ((Track) selection.get(0)).getAlbum();
           List<File> files = UtilFeatures.getPlayableFiles(album);
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+          QueueModel.push(
+              UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), false);
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/PlayArtistSelectionAction.java b/src/main/java/org/jajuk/ui/actions/PlayArtistSelectionAction.java
index a420f2a..13f3d15 100644
--- a/src/main/java/org/jajuk/ui/actions/PlayArtistSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PlayArtistSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -47,7 +47,6 @@ import org.jajuk.util.log.Log;
  * </p>
  */
 public class PlayArtistSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -77,8 +76,9 @@ public class PlayArtistSelectionAction extends SelectionAction {
           // Select all files from the first found album
           Artist artist = ((Track) selection.get(0)).getArtist();
           List<File> files = UtilFeatures.getPlayableFiles(artist);
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+          QueueModel.push(
+              UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), false);
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/PlayDirectorySelectionAction.java b/src/main/java/org/jajuk/ui/actions/PlayDirectorySelectionAction.java
index 6b6fba4..d94d156 100644
--- a/src/main/java/org/jajuk/ui/actions/PlayDirectorySelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PlayDirectorySelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -46,7 +46,6 @@ import org.jajuk.util.log.Log;
  * </p>
  */
 public class PlayDirectorySelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -77,8 +76,9 @@ public class PlayDirectorySelectionAction extends SelectionAction {
           // Select all files from the first found directory
           Directory dir = ((File) selection.get(0)).getDirectory();
           List<File> files = UtilFeatures.getPlayableFiles(dir);
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+          QueueModel.push(
+              UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), false);
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/PlayPauseAction.java b/src/main/java/org/jajuk/ui/actions/PlayPauseAction.java
index a425094..a1b1938 100644
--- a/src/main/java/org/jajuk/ui/actions/PlayPauseAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PlayPauseAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -29,14 +29,11 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class PlayPauseAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private static boolean bAlreadyLaunching = false;
 
   /**
@@ -55,7 +52,6 @@ public class PlayPauseAction extends JajukAction {
   public void perform(ActionEvent evt) {
     // Note that we don't change here the label and icon, already done in
     // PlayerstateMediator
-
     if (QueueModel.isStopped()) {
       // We use here a flag to avoid launching the goTo() thread twice. In case
       // of playing error, this would create several looping threads trying to
diff --git a/src/main/java/org/jajuk/ui/actions/PlayRepeatSelectionAction.java b/src/main/java/org/jajuk/ui/actions/PlayRepeatSelectionAction.java
index ffa8630..4184e4d 100644
--- a/src/main/java/org/jajuk/ui/actions/PlayRepeatSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PlayRepeatSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -29,7 +29,6 @@ import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilFeatures;
-import org.jajuk.util.UtilGUI;
 import org.jajuk.util.log.Log;
 
 /**
@@ -43,7 +42,6 @@ import org.jajuk.util.log.Log;
  * </p>.
  */
 public class PlayRepeatSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -68,13 +66,9 @@ public class PlayRepeatSelectionAction extends SelectionAction {
         try {
           PlayRepeatSelectionAction.super.perform(e);
           List<File> files = UtilFeatures.getPlayableFiles(selection);
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), true,
-              true), false);
-          if (files.size() == 1) {
-            UtilGUI.setRepeatSingleGui(true);
-          } else {
-            UtilGUI.setRepeatAllGui(true);
-          }
+          QueueModel
+              .push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), true, true),
+                  false);
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/PlaySelectionAction.java b/src/main/java/org/jajuk/ui/actions/PlaySelectionAction.java
index 3a76bb5..167adab 100644
--- a/src/main/java/org/jajuk/ui/actions/PlaySelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PlaySelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -44,7 +44,6 @@ import org.jajuk.util.log.Log;
  * </p>.
  */
 public class PlaySelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -69,8 +68,9 @@ public class PlaySelectionAction extends SelectionAction {
         try {
           PlaySelectionAction.super.perform(e);
           List<File> files = UtilFeatures.getPlayableFiles(selection);
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+          QueueModel.push(
+              UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), false);
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/PlayShuffleSelectionAction.java b/src/main/java/org/jajuk/ui/actions/PlayShuffleSelectionAction.java
index ed2d04b..e17bf1b 100644
--- a/src/main/java/org/jajuk/ui/actions/PlayShuffleSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PlayShuffleSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -46,7 +46,6 @@ import org.jajuk.util.log.Log;
  * </p>.
  */
 public class PlayShuffleSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -72,8 +71,9 @@ public class PlayShuffleSelectionAction extends SelectionAction {
           PlayShuffleSelectionAction.super.perform(e);
           List<File> files = UtilFeatures.getPlayableFiles(selection);
           Collections.shuffle(files, UtilSystem.getRandom());
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+          QueueModel.push(
+              UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), false);
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/PoorSelectionAction.java b/src/main/java/org/jajuk/ui/actions/PoorSelectionAction.java
index 2ec4f1b..dd41a53 100644
--- a/src/main/java/org/jajuk/ui/actions/PoorSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PoorSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class PoorSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/PreparePartyAction.java b/src/main/java/org/jajuk/ui/actions/PreparePartyAction.java
index c9481a9..0f3b808 100644
--- a/src/main/java/org/jajuk/ui/actions/PreparePartyAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PreparePartyAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -27,7 +27,7 @@ import javax.swing.JComponent;
 
 import org.jajuk.base.Item;
 import org.jajuk.base.Playlist;
-import org.jajuk.ui.wizard.PreparePartyWizard;
+import org.jajuk.ui.wizard.prepare_party.PreparePartyWizard;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
@@ -35,10 +35,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class PreparePartyAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -58,7 +57,6 @@ public class PreparePartyAction extends JajukAction {
   @Override
   public void perform(ActionEvent e) throws JajukException {
     JComponent source = (JComponent) e.getSource();
-
     // if we get a playlist, pass it on so that the Wizard does not provide a
     // choice of where to take the tracks anymore
     Object o = source.getClientProperty(Const.DETAIL_SELECTION);
@@ -70,18 +68,14 @@ public class PreparePartyAction extends JajukAction {
       } else {
         playlist = ((Playlist) o);
       }
-
       // indicate to the Wizard that it should use the pre-built Playlist and
-      // not provide the first selection screen. We need to do this in a static
-      // method before creation because the Wizard needs to use this during
-      // construction already
-      PreparePartyWizard.setPlaylist(playlist);
-      PreparePartyWizard wizard = new PreparePartyWizard(true);
+      // not provide the first selection screen. 
+      PreparePartyWizard wizard = new PreparePartyWizard(true, playlist);
       wizard.show();
     } else {
       // without playlist, just display the general wizard that allows all kinds
       // of sources for the tracks
-      PreparePartyWizard wizard = new PreparePartyWizard(false);
+      PreparePartyWizard wizard = new PreparePartyWizard(false, null);
       wizard.show();
     }
   }
diff --git a/src/main/java/org/jajuk/ui/actions/PreviousAlbumAction.java b/src/main/java/org/jajuk/ui/actions/PreviousAlbumAction.java
index 103404a..afa4f5c 100644
--- a/src/main/java/org/jajuk/ui/actions/PreviousAlbumAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PreviousAlbumAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -30,7 +30,6 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + SHIFT + LEFT ARROW</code>.
  */
 public class PreviousAlbumAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/PreviousTrackAction.java b/src/main/java/org/jajuk/ui/actions/PreviousTrackAction.java
index 378dbe0..be0888d 100644
--- a/src/main/java/org/jajuk/ui/actions/PreviousTrackAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PreviousTrackAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -38,7 +38,6 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + LEFT ARROW</code>.
  */
 public class PreviousTrackAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -107,7 +106,6 @@ public class PreviousTrackAction extends JajukAction {
             }
           }
         }.start();
-
       }
     }
   }
diff --git a/src/main/java/org/jajuk/ui/actions/PushFrontSelectionAction.java b/src/main/java/org/jajuk/ui/actions/PushFrontSelectionAction.java
index d528840..273330e 100644
--- a/src/main/java/org/jajuk/ui/actions/PushFrontSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PushFrontSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -43,7 +43,6 @@ import org.jajuk.util.UtilFeatures;
  * </p>.
  */
 public class PushFrontSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -64,8 +63,8 @@ public class PushFrontSelectionAction extends SelectionAction {
   public void perform(ActionEvent e) throws Exception {
     super.perform(e);
     List<File> files = UtilFeatures.getPlayableFiles(selection);
-    QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-        .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), true, true);
+    QueueModel.push(
+        UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+            Conf.getBoolean(Const.CONF_STATE_REPEAT), true), true, true);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/actions/PushSelectionAction.java b/src/main/java/org/jajuk/ui/actions/PushSelectionAction.java
index c5a2a9e..4b9e3ba 100644
--- a/src/main/java/org/jajuk/ui/actions/PushSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/PushSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -44,7 +44,6 @@ import org.jajuk.util.log.Log;
  * </p>.
  */
 public class PushSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -69,8 +68,9 @@ public class PushSelectionAction extends SelectionAction {
         try {
           PushSelectionAction.super.perform(e);
           List<File> files = UtilFeatures.getPlayableFiles(selection);
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), true);
+          QueueModel.push(
+              UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), true);
         } catch (Exception e1) {
           Log.error(e1);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/QualityAction.java b/src/main/java/org/jajuk/ui/actions/QualityAction.java
index df920ff..4b378ac 100644
--- a/src/main/java/org/jajuk/ui/actions/QualityAction.java
+++ b/src/main/java/org/jajuk/ui/actions/QualityAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -40,7 +40,11 @@ import org.jajuk.util.log.Log;
  * information into the ticket.
  */
 public class QualityAction extends JajukAction {
-
+  /**
+   * Jajuk issue reporting URL
+   */
+  private static final String JAJUK_ISSUES_URL = "http://github.com/jajuk-team/jajuk/issues/new";
+  
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -62,7 +66,7 @@ public class QualityAction extends JajukAction {
     sBody.append("Version: ").append(Const.JAJUK_VERSION).append('\n');
     sBody.append(UtilString.getAnonymizedSystemProperties().toString()).append('\n');
     sBody.append(UtilString.getAnonymizedJajukProperties().toString()).append('\n');
-    for (String line : Log.getSpool()) {
+    for (String line : Log.getSpool(true)) {
       sBody.append(line).append('\n');
     }
     // if it is a bug, copy logs into the clipboard
@@ -71,13 +75,12 @@ public class QualityAction extends JajukAction {
     clipboard.setContents(data, data);
     try {
       // Show Trac ticket creation page in an external browser
-      Desktop.getDesktop().browse(new URI("http://trac.jajuk.info/newticket"));
+      Desktop.getDesktop().browse(new URI(JAJUK_ISSUES_URL));
       // Display a message
       Messages.showInfoMessage(Messages.getString("QualityFeedbackWizard.20"));
     } catch (Exception e) {
       Messages.showErrorMessage(136);
       Log.error(e);
     }
-
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/RefactorAction.java b/src/main/java/org/jajuk/ui/actions/RefactorAction.java
index 5077071..6a2dea7 100644
--- a/src/main/java/org/jajuk/ui/actions/RefactorAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RefactorAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.actions;
 
 import java.io.IOException;
@@ -46,19 +45,12 @@ import org.jajuk.util.filters.NotAudioFilter;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class RefactorAction {
-
-  /** DOCUMENT_ME. */
   private static boolean bStopAll = false;
-
-  /** DOCUMENT_ME. */
   private static String sFS = java.io.File.separator;
-
-  /** DOCUMENT_ME. */
   private final List<File> alFiles;
-
   /** [PERF] Stores directory to be refreshed to avoid rescanning them twice. */
   private final List<Directory> toBeRefreshed = new ArrayList<Directory>(1);
 
@@ -117,14 +109,12 @@ public class RefactorAction {
         sErrors += je.getMessage() + '\n';
         continue;
       }
-
       filename += "." + tCurrent.getType().getExtension();
       filename = filename.replace("/", RefactorAction.sFS);
       final java.io.File fOld = fCurrent.getFIO();
-      final String sPathname = fCurrent.getDevice().getFio().getPath() + RefactorAction.sFS
+      final String sPathname = fCurrent.getDevice().getFIO().getPath() + RefactorAction.sFS
           + filename;
       java.io.File fNew = new java.io.File(sPathname);
-
       // Confirm if destination dir already exist
       if (fNew.getParentFile().exists() && !bOKToOverwrite) {
         final int resu = Messages.getChoice(Messages.getString("Warning.5"),
@@ -139,7 +129,6 @@ public class RefactorAction {
       // file
       bOKToOverwrite = true;
       fNew.getParentFile().mkdirs();
-
       // Move file and related cover but save old Directory pathname
       // for future deletion
       try {
@@ -151,7 +140,6 @@ public class RefactorAction {
             throw new IOException("Cannot move item: " + fCover.getAbsolutePath() + " to "
                 + destFile.getAbsolutePath());
           }
-
         }
       } catch (Exception e) {
         // This exception can be thrown by instance if default cover is not
@@ -160,7 +148,6 @@ public class RefactorAction {
       }
       // Rename audio files
       boolean bRenameSuccess = false;
-
       // Test if source and target files are equals
       if (fNew.getAbsolutePath().equalsIgnoreCase(fOld.getAbsolutePath())) {
         sErrors += fCurrent.getAbsolutePath() + " (" + Messages.getString("Error.160") + ")\n";
@@ -171,29 +158,24 @@ public class RefactorAction {
             sErrors += fCurrent.getAbsolutePath() + " (" + Messages.getString("Error.154") + ")\n";
           }
           Log.debug("[Refactoring] {{" + fNew.getAbsolutePath() + "}} Success ? " + bRenameSuccess);
-
         } catch (Exception e) {
           Log.error(e);
           sErrors += fCurrent.getAbsolutePath() + " (" + Messages.getString("Error.161") + ")\n";
         }
       }
-
       // Register and scans new directories
       String sFirstDir = null;
-      final String sTest[] = sPathname.split(fCurrent.getDevice().getFio().getPath().replace("\\",
-          "\\\\"));
+      final String sTest[] = sPathname.split(fCurrent.getDevice().getFIO().getPath()
+          .replace("\\", "\\\\"));
       sFirstDir = sTest[1].split("\\" + RefactorAction.sFS)[1];
-
       final Directory dir = DirectoryManager.getInstance().registerDirectory(
           sFirstDir,
-          DirectoryManager.getInstance().getDirectoryForIO(fCurrent.getDevice().getFio(),
+          DirectoryManager.getInstance().getDirectoryForIO(fCurrent.getDevice().getFIO(),
               fCurrent.getDevice()), fCurrent.getDevice());
-
       // Ask to refresh this directory afterward
       if (!toBeRefreshed.contains(dir)) {
         toBeRefreshed.add(dir);
       }
-
       // See if old directory contain other files and move them
       final java.io.File dOld = fOld.getParentFile();
       final java.io.File[] list = dOld.listFiles(new JajukFileFilter(NotAudioFilter.getInstance()));
@@ -209,7 +191,6 @@ public class RefactorAction {
             }
             Log.debug("[Refactoring] {{" + fNew.getAbsolutePath() + "}} Success ? "
                 + bRenameSuccess);
-
           } catch (Exception e) {
             Log.error(e);
             sErrors += f.getAbsolutePath() + " (" + Messages.getString("Error.161") + ")\n";
@@ -221,7 +202,6 @@ public class RefactorAction {
       else if (list.length == 0 && dOld.delete()) {
         DirectoryManager.getInstance().removeDirectory(fOld.getParent());
       }
-
       InformationJPanel.getInstance().setMessage(
           Messages.getString("RefactorWizard.0") + sPathname,
           InformationJPanel.MessageType.INFORMATIVE);
@@ -241,7 +221,6 @@ public class RefactorAction {
       InformationJPanel.getInstance().setMessage(Messages.getString("Success"),
           InformationJPanel.MessageType.INFORMATIVE);
     }
-
   }
 
   /**
@@ -255,7 +234,7 @@ public class RefactorAction {
 
   /**
    * Reset stop all.
-   * DOCUMENT_ME
+   * 
    */
   public static void resetStopAll() {
     bStopAll = false;
diff --git a/src/main/java/org/jajuk/ui/actions/RefreshAction.java b/src/main/java/org/jajuk/ui/actions/RefreshAction.java
index d8de0af..e8dc1e4 100644
--- a/src/main/java/org/jajuk/ui/actions/RefreshAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RefreshAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class RefreshAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/RemovePropertyAction.java b/src/main/java/org/jajuk/ui/actions/RemovePropertyAction.java
index 984e5ae..c015b84 100644
--- a/src/main/java/org/jajuk/ui/actions/RemovePropertyAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RemovePropertyAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -29,10 +29,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class RemovePropertyAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/RenameAction.java b/src/main/java/org/jajuk/ui/actions/RenameAction.java
index 9cb5e21..8289055 100644
--- a/src/main/java/org/jajuk/ui/actions/RenameAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RenameAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -44,10 +44,9 @@ import org.jajuk.util.UtilGUI;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class RenameAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -72,14 +71,14 @@ public class RenameAction extends JajukAction {
     // Get required data from the tree (selected node and node type)
     final List<Item> alSelected = (List<Item>) source.getClientProperty(Const.DETAIL_SELECTION);
     final Item currentItem = alSelected.get(0);
-    // Check if file is currently played
-    if (QueueModel.getPlayingFile() != null && QueueModel.getPlayingFile().equals(currentItem)) {
-      Messages.showErrorMessage(134);
-      return;
-    }
     if (currentItem instanceof File) {
       String newName = JOptionPane.showInputDialog(null, Messages.getString("RenameAction.1")
           + "\n\n", ((File) currentItem).getName());
+      // Check if file is currently played
+      if (QueueModel.getPlayingFile() != null && QueueModel.getPlayingFile().equals(currentItem)) {
+        Messages.showErrorMessage(134);
+        return;
+      }
       if ((newName != null) && (newName.length() > 0)) {
         try {
           UtilGUI.waiting();
@@ -100,26 +99,24 @@ public class RenameAction extends JajukAction {
        * files (hopefully not the tracks ones) because we simply remove the directory and force its
        * scan again. A better implementation would clone all files recursively
        */
-
+      String newName = JOptionPane.showInputDialog(null, Messages.getString("RenameAction.2")
+          + "\n\n", ((Directory) currentItem).getName());
       // check that the directory is not an ancestor of the currently played file
       if (QueueModel.getPlayingFile() != null
           && QueueModel.getPlayingFile().hasAncestor((Directory) currentItem)) {
         Messages.showWarningMessage(Messages.getErrorMessage(172));
         return;
       }
-      String newName = JOptionPane.showInputDialog(null, Messages.getString("RenameAction.2")
-          + "\n\n", ((Directory) currentItem).getName());
       if ((newName != null) && (newName.length() > 0)) {
         try {
           UtilGUI.waiting();
           java.io.File newFile = new java.io.File(((Directory) currentItem).getParentDirectory()
-              .getAbsolutePath()
-              + "/" + newName);
+              .getAbsolutePath() + "/" + newName);
           java.io.File dir = ((Directory) currentItem).getFio();
           // For directories, we don't copy / delete, we just rename for performance reasons
           // and because the Utilsystem.move() code only works for files.
           // We check that the directory has actually been renamed.
-          if (!dir.renameTo(newFile)) {
+          if (!dir.renameTo(newFile)) { //NONAR
             throw new IOException("Cannot rename directory : " + dir.getAbsolutePath());
           }
           DirectoryManager.getInstance().removeDirectory(((Directory) currentItem).getID());
diff --git a/src/main/java/org/jajuk/ui/actions/RepeatAllModeAction.java b/src/main/java/org/jajuk/ui/actions/RepeatAllModeAction.java
index b75d7d8..4960d06 100644
--- a/src/main/java/org/jajuk/ui/actions/RepeatAllModeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RepeatAllModeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -31,16 +31,12 @@ import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
 
 /**
- * DOCUMENT_ME.
+ * Repeat All mode action
  */
+ at SuppressWarnings("serial")
 public class RepeatAllModeAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
   /**
    * Instantiates a new repeat all mode action.
    */
@@ -52,21 +48,22 @@ public class RepeatAllModeAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
-
-    boolean b = Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL);
-
-    UtilGUI.setRepeatAllGui(!b);
-
-    QueueModel.setRepeatModeToAll(!b);
-
-    // computes planned tracks
+    boolean newRepeatAllModeState = !Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL);
+    Conf.invert(Const.CONF_STATE_REPEAT_ALL);
+    if (newRepeatAllModeState) {
+      // single repeat and repeat all modes are mutually exclusive
+      Conf.setProperty(Const.CONF_STATE_REPEAT, Const.FALSE);
+    }
+    QueueModel.setRepeatModeToAll(newRepeatAllModeState);
+    // Computes planned tracks without clearing existing planned tracks if any
     QueueModel.computesPlanned(false);
+    // Refresh mode buttons
+    ObservationManager.notify(new JajukEvent(JajukEvents.MODE_STATUS_CHANGED));
     // Refresh Queue View
     ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
-
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/RepeatModeAction.java b/src/main/java/org/jajuk/ui/actions/RepeatModeAction.java
index 27ddbef..96045c7 100644
--- a/src/main/java/org/jajuk/ui/actions/RepeatModeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RepeatModeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -32,16 +32,12 @@ import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
 
 /**
- * DOCUMENT_ME.
+ * Single repeat mode action
  */
+ at SuppressWarnings("serial")
 public class RepeatModeAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
   /**
    * Instantiates a new repeat mode action.
    */
@@ -54,25 +50,27 @@ public class RepeatModeAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
-    boolean b = Conf.getBoolean(Const.CONF_STATE_REPEAT);
-    UtilGUI.setRepeatSingleGui(!b);
-    // disabling repeat for an item forced unset for all items and enabling single repeat unset
-    // repeat for all items and then set it only for current track
+    boolean newSingleRepeatState = !Conf.getBoolean(Const.CONF_STATE_REPEAT);
+    Conf.setProperty(Const.CONF_STATE_REPEAT, Boolean.toString(newSingleRepeatState));
+    //Disable repeat mode for every item (we will set it again later if required) 
     QueueModel.setRepeatModeToAll(false);
-
-    if (!b) { // enabled button
+    if (newSingleRepeatState) {
+      // single repeat and repeat all modes are mutually exclusive
+      Conf.setProperty(Const.CONF_STATE_REPEAT_ALL, Const.FALSE);
       // if FIFO is not void, repeat over current item
       StackItem item = QueueModel.getCurrentItem();
       if (item != null) {
         item.setRepeat(true);
       }
     }
-    // computes planned tracks
+    // Computes planned tracks without clearing existing planned tracks if any
     QueueModel.computesPlanned(false);
+    // Refresh mode buttons
+    ObservationManager.notify(new JajukEvent(JajukEvents.MODE_STATUS_CHANGED));
     // Refresh Queue View
     ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
   }
diff --git a/src/main/java/org/jajuk/ui/actions/ReplayAlbumAction.java b/src/main/java/org/jajuk/ui/actions/ReplayAlbumAction.java
index 4882ecd..0cc2a82 100644
--- a/src/main/java/org/jajuk/ui/actions/ReplayAlbumAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ReplayAlbumAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -36,7 +36,6 @@ import org.jajuk.util.log.Log;
  * Action class for jumping to the begining of current album.
  */
 public class ReplayAlbumAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -68,8 +67,8 @@ public class ReplayAlbumAction extends JajukAction {
                 files.add(track.getBestFile(true));
               }
               QueueModel.resetAround(QueueModel.getIndex(), current.getTrack().getAlbum());
-              QueueModel.push(UtilFeatures.createStackItems(files, Conf
-                  .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+              QueueModel.push(UtilFeatures.createStackItems(files,
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), false);
             }
           } catch (Exception e) {
             Log.error(e);
diff --git a/src/main/java/org/jajuk/ui/actions/ReportAction.java b/src/main/java/org/jajuk/ui/actions/ReportAction.java
index df5d44f..aacf168 100644
--- a/src/main/java/org/jajuk/ui/actions/ReportAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ReportAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -45,7 +45,6 @@ import org.jajuk.util.log.Log;
  * Report collection as a file.
  */
 public class ReportAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -69,8 +68,8 @@ public class ReportAction extends JajukAction {
     // Get required data from the tree (selected node and node type)
     final List<Item> alSelected = (List<Item>) source.getClientProperty(Const.DETAIL_SELECTION);
     // Display a save as dialog
-    final JajukFileFilter filter = new JajukFileFilter(XMLFilter.getInstance(), HTMLFilter
-        .getInstance());
+    final JajukFileFilter filter = new JajukFileFilter(XMLFilter.getInstance(),
+        HTMLFilter.getInstance());
     final JajukFileChooser chooser = new JajukFileChooser(filter);
     // Allow to navigate between directories
     chooser.setAcceptDirectories(true);
@@ -139,6 +138,5 @@ public class ReportAction extends JajukAction {
         }
       }.start();
     }
-
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/RestoreAllViewsAction.java b/src/main/java/org/jajuk/ui/actions/RestoreAllViewsAction.java
index 57ba951..b4e58ea 100644
--- a/src/main/java/org/jajuk/ui/actions/RestoreAllViewsAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RestoreAllViewsAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -35,16 +35,10 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .Restore default disposition of all views from every perspectives 
  */
+ at SuppressWarnings("serial")
 public class RestoreAllViewsAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
-  private static boolean fullRestore = false;
-
   /**
    * Instantiates a new restore all views action.
    */
@@ -54,49 +48,22 @@ public class RestoreAllViewsAction extends JajukAction {
     setShortDescription(Messages.getString("JajukJMenuBar.26"));
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.actions.JajukAction#perform(java.awt.event.ActionEvent)
-   */
   @Override
   public void perform(final ActionEvent e) throws JajukException {
-    new Thread("Restore All Views Thread") {
-      @Override
-      public void run() {
-        // display a confirmation message
-        int i = Messages.getChoice(Messages.getString("Confirmation_restore_all"),
-            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
-        if (i != JOptionPane.YES_OPTION) {
-          return;
-        }
-        // Drop all perspectives conf
-        for (IPerspective perspective : PerspectiveManager.getPerspectives()) {
-          File loadFile = SessionService.getConfFileByPath(perspective.getClass().getSimpleName()
-              + ".xml");
-          // Lazy deletion, this file have already been removed by a previous reset
-          loadFile.delete();
-        }
-        // Indicates to not commiting current configuration
-        fullRestore = true;
-        // Exit Jajuk
-        new Thread("Restore All Views - Exit Thread") {
-          @Override
-          public void run() {
-            ExitService.exit(0);
-          }
-        }.start();
-      }
-    }.start();
-
-  }
-
-  /**
-   * Checks if is full restore.
-   * 
-   * @return true, if is full restore
-   */
-  public static boolean isFullRestore() {
-    return fullRestore;
+    // display a confirmation message
+    int i = Messages.getChoice(Messages.getString("Confirmation_restore_all"),
+        JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
+    if (i != JOptionPane.YES_OPTION) {
+      return;
+    }
+    // Drop all perspectives conf
+    for (IPerspective perspective : PerspectiveManager.getPerspectives()) {
+      File loadFile = SessionService.getConfFileByPath(perspective.getClass().getSimpleName()
+          + ".xml");
+      // Note that this file may have already been removed by a previous reset
+      loadFile.delete();
+    }
+    // Exit Jajuk
+    ExitService.exit(0);
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/RestoreViewsAction.java b/src/main/java/org/jajuk/ui/actions/RestoreViewsAction.java
index 152fbac..145c04d 100644
--- a/src/main/java/org/jajuk/ui/actions/RestoreViewsAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RestoreViewsAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,14 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 
-import javax.swing.SwingUtilities;
-
 import org.jajuk.ui.perspectives.IPerspective;
 import org.jajuk.ui.perspectives.PerspectiveManager;
 import org.jajuk.util.IconLoader;
@@ -32,10 +30,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class RestoreViewsAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -52,16 +49,8 @@ public class RestoreViewsAction extends JajukAction {
    */
   @Override
   public void perform(final ActionEvent e) throws JajukException {
-    SwingUtilities.invokeLater(new Runnable() {
-
-      @Override
-      public void run() {
-        IPerspective perspective = PerspectiveManager.getCurrentPerspective();
-        // Restore local or global views
-        perspective.restoreDefaults();
-      }
-
-    });
-
+    IPerspective perspective = PerspectiveManager.getCurrentPerspective();
+    // Restore local or global views
+    perspective.restoreDefaults();
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/RewindTrackAction.java b/src/main/java/org/jajuk/ui/actions/RewindTrackAction.java
index be21894..5c1755d 100644
--- a/src/main/java/org/jajuk/ui/actions/RewindTrackAction.java
+++ b/src/main/java/org/jajuk/ui/actions/RewindTrackAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -33,11 +33,9 @@ import org.jajuk.util.log.Log;
  * <code>CTRL + ALT + LEFT ARROW</code>.
  */
 public class RewindTrackAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant JUMP_SIZE.  DOCUMENT_ME */
+  /** The Constant JUMP_SIZE.   */
   private static final float JUMP_SIZE = 0.1f;
 
   /**
@@ -46,7 +44,6 @@ public class RewindTrackAction extends JajukAction {
   RewindTrackAction() {
     super(IconLoader.getIcon(JajukIcons.REW), "altGraph F9", false, true);
     setShortDescription(Messages.getString("CommandJPanel.10"));
-
   }
 
   /* (non-Javadoc)
diff --git a/src/main/java/org/jajuk/ui/actions/SaveAsAction.java b/src/main/java/org/jajuk/ui/actions/SaveAsAction.java
index 77b1952..0e6573b 100644
--- a/src/main/java/org/jajuk/ui/actions/SaveAsAction.java
+++ b/src/main/java/org/jajuk/ui/actions/SaveAsAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -41,7 +41,6 @@ import org.jajuk.util.log.Log;
  * Action for saving as... an item
  */
 public class SaveAsAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -56,7 +55,7 @@ public class SaveAsAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param e DOCUMENT_ME
+   * @param e 
    */
   @Override
   @SuppressWarnings("unchecked")
diff --git a/src/main/java/org/jajuk/ui/actions/SelectionAction.java b/src/main/java/org/jajuk/ui/actions/SelectionAction.java
index 83a7f47..835fbda 100644
--- a/src/main/java/org/jajuk/ui/actions/SelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/SelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -36,30 +36,40 @@ import org.jajuk.util.Const;
  * Convenient abstract class to factorize operations on selection.
  */
 public abstract class SelectionAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -6072746800882488360L;
-
-  /** DOCUMENT_ME. */
   List<Item> selection = null;
-
   /** Whether the selection should contain the playlist itself (false) or mapped files (true). */
   boolean expandPlaylists = true;
 
   /**
    * Instantiates a new selection action.
-   * 
-   * @param msg DOCUMENT_ME
-   * @param icon DOCUMENT_ME
-   * @param enabled DOCUMENT_ME
+   *
+   * @param msg 
+   * @param icon 
+   * @param enabled 
    */
   protected SelectionAction(String msg, ImageIcon icon, boolean enabled) {
     super(msg, icon, enabled);
   }
 
+  /**
+   * Instantiates a new selection action.
+   *
+   * @param name 
+   * @param icon 
+   * @param stroke 
+   * @param enabled 
+   * @param bHotkey 
+   */
+  public SelectionAction(String name, ImageIcon icon, String stroke, boolean enabled,
+      boolean bHotkey) {
+    super(name, icon, stroke, enabled, bHotkey);
+  }
+
   /*
    * This method transforms various entries to a list of items
-   * 
+   *
    * @see org.jajuk.ui.actions.JajukAction#perform(java.awt.event.ActionEvent)
    */
   /* (non-Javadoc)
diff --git a/src/main/java/org/jajuk/ui/actions/ShowAboutAction.java b/src/main/java/org/jajuk/ui/actions/ShowAboutAction.java
index ffb3b0b..ca15ea1 100644
--- a/src/main/java/org/jajuk/ui/actions/ShowAboutAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ShowAboutAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -31,7 +31,6 @@ import org.jajuk.util.Messages;
  * Action for displaying the tip of the day.
  */
 public class ShowAboutAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -46,7 +45,7 @@ public class ShowAboutAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
diff --git a/src/main/java/org/jajuk/ui/actions/ShowActivateTagsAction.java b/src/main/java/org/jajuk/ui/actions/ShowActivateTagsAction.java
index 8d07f7e..9a5fcd5 100644
--- a/src/main/java/org/jajuk/ui/actions/ShowActivateTagsAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ShowActivateTagsAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -31,7 +31,6 @@ import org.jajuk.util.Messages;
  * Action for displaying the tip of the day.
  */
 public class ShowActivateTagsAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -46,7 +45,7 @@ public class ShowActivateTagsAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
diff --git a/src/main/java/org/jajuk/ui/actions/ShowAlbumDetailsAction.java b/src/main/java/org/jajuk/ui/actions/ShowAlbumDetailsAction.java
index 7e319bf..2965890 100644
--- a/src/main/java/org/jajuk/ui/actions/ShowAlbumDetailsAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ShowAlbumDetailsAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,10 +16,13 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
+import java.awt.Dimension;
+import java.awt.MouseInfo;
+import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.util.List;
 
@@ -43,7 +46,6 @@ import org.jajuk.util.Messages;
  * </p>
  */
 public class ShowAlbumDetailsAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -69,11 +71,12 @@ public class ShowAlbumDetailsAction extends JajukAction {
     if (o instanceof Album) {
       album = (Album) o;
     } else if (o instanceof List) {
-      album = (Album) (((List) o).get(0));
+      album = ((List<Album>) o).get(0);
     } else {
       return;
     }
-    LocalAlbumThumbnail thumb = new LocalAlbumThumbnail(album, 200, true);
-    new ThumbnailPopup(thumb.getDescription(), null, false);
+    LocalAlbumThumbnail thumb = new LocalAlbumThumbnail(album, 0, true);
+    java.awt.Point p = MouseInfo.getPointerInfo().getLocation();
+    new ThumbnailPopup(thumb.getDescription(), new Rectangle(p, new Dimension(-10, -50)), false);
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/ShowCurrentlyPlayingAction.java b/src/main/java/org/jajuk/ui/actions/ShowCurrentlyPlayingAction.java
new file mode 100644
index 0000000..4f3d439
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/actions/ShowCurrentlyPlayingAction.java
@@ -0,0 +1,77 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.actions;
+
+import java.awt.event.ActionEvent;
+
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.services.notification.INotificator;
+import org.jajuk.services.notification.NotificatorTypes;
+import org.jajuk.services.notification.ToastNotificator;
+import org.jajuk.services.players.QueueModel;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+
+/**
+ * A simple action to allow to display the currently playing track via the
+ * Notification System. This is used to have a keyboard shortcut which displays
+ * information about the current song.
+ *
+ */
+public class ShowCurrentlyPlayingAction extends SelectionAction {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * Instantiates a new show currently playing action.
+   */
+  ShowCurrentlyPlayingAction() {
+    super(Messages.getString("ShowCurrentlyPlayingAction.0"), IconLoader
+        .getIcon(JajukIcons.PLAY_16X16), "ctrl alt N", true, true);
+    setShortDescription(Messages.getString("ShowCurrentlyPlayingAction.1"));
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.ui.actions.SelectionAction#perform(java.awt.event.ActionEvent)
+   */
+  @Override
+  public void perform(ActionEvent e) throws Exception {
+    // simply invoke the necessary event via the observer mechanism.
+    // Use toast notification if user selected "No notification" in preferences view.
+    NotificatorTypes type = NotificatorTypes
+        .valueOf(Conf.getString(Const.CONF_UI_NOTIFICATOR_TYPE));
+    if (type == NotificatorTypes.NONE) {
+      INotificator notifier = ToastNotificator.getInstance();
+      if (QueueModel.getCurrentRadio() != null) {
+        notifier.notify(QueueModel.getCurrentRadio());
+      } else {
+        notifier.notify(QueueModel.getCurrentItem().getFile());
+      }
+    } else {
+      ObservationManager.notify(new JajukEvent(JajukEvents.SHOW_CURRENTLY_PLAYING));
+    }
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/actions/ShowDonateAction.java b/src/main/java/org/jajuk/ui/actions/ShowDonateAction.java
index 678647a..9e0bbe6 100644
--- a/src/main/java/org/jajuk/ui/actions/ShowDonateAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ShowDonateAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -31,7 +31,6 @@ import org.jajuk.util.Messages;
  * Action for displaying the tip of the day.
  */
 public class ShowDonateAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -46,7 +45,7 @@ public class ShowDonateAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
diff --git a/src/main/java/org/jajuk/ui/actions/ShowPropertiesAction.java b/src/main/java/org/jajuk/ui/actions/ShowPropertiesAction.java
index 02adc1b..098a48a 100644
--- a/src/main/java/org/jajuk/ui/actions/ShowPropertiesAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ShowPropertiesAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -47,7 +47,6 @@ import org.jajuk.util.Messages;
  * </p>
  */
 public class ShowPropertiesAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8078402652430413821L;
 
@@ -96,5 +95,4 @@ public class ShowPropertiesAction extends SelectionAction {
       new PropertiesDialog(selection);
     }
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/actions/ShuffleModeAction.java b/src/main/java/org/jajuk/ui/actions/ShuffleModeAction.java
index cc75574..68a1116 100644
--- a/src/main/java/org/jajuk/ui/actions/ShuffleModeAction.java
+++ b/src/main/java/org/jajuk/ui/actions/ShuffleModeAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -25,9 +25,6 @@ import java.awt.event.ActionEvent;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
-import org.jajuk.services.players.QueueModel;
-import org.jajuk.ui.widgets.CommandJPanel;
-import org.jajuk.ui.widgets.JajukJMenuBar;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
@@ -35,13 +32,10 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 
 /**
- * DOCUMENT_ME.
+ * Shuffle mode action
  */
+ at SuppressWarnings("serial")
 public class ShuffleModeAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
   /**
    * Instantiates a new shuffle mode action.
    */
@@ -54,22 +48,12 @@ public class ShuffleModeAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
-    boolean b = Conf.getBoolean(Const.CONF_STATE_SHUFFLE);
-    Conf.setProperty(Const.CONF_STATE_SHUFFLE, Boolean.toString(!b));
-
-    JajukJMenuBar.getInstance().setShuffleSelected(!b);
-    CommandJPanel.getInstance().setRandomSelected(!b);
-    if (!b) { // enabled button
-      QueueModel.shuffle(); // shuffle current selection
-    }
-    // computes planned tracks
-    QueueModel.computesPlanned(true);
-    // Refresh Queue View
-    ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
-
+    Conf.invert(Const.CONF_STATE_SHUFFLE);
+    // Refresh mode buttons
+    ObservationManager.notify(new JajukEvent(JajukEvents.MODE_STATUS_CHANGED));
   }
 }
diff --git a/src/main/java/org/jajuk/ui/actions/SimpleDeviceWizardAction.java b/src/main/java/org/jajuk/ui/actions/SimpleDeviceWizardAction.java
index d1b6b3b..e0ba50c 100644
--- a/src/main/java/org/jajuk/ui/actions/SimpleDeviceWizardAction.java
+++ b/src/main/java/org/jajuk/ui/actions/SimpleDeviceWizardAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -32,7 +32,6 @@ import org.jajuk.util.Messages;
  * Action for displaying the simple device creation wizard.
  */
 public class SimpleDeviceWizardAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -46,7 +45,7 @@ public class SimpleDeviceWizardAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
diff --git a/src/main/java/org/jajuk/ui/actions/SlimBarQueueAction.java b/src/main/java/org/jajuk/ui/actions/SlimBarQueueAction.java
index 9350565..4188ffa 100644
--- a/src/main/java/org/jajuk/ui/actions/SlimBarQueueAction.java
+++ b/src/main/java/org/jajuk/ui/actions/SlimBarQueueAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -28,10 +28,9 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class SlimBarQueueAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1223773056757729079L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/SlimbarAction.java b/src/main/java/org/jajuk/ui/actions/SlimbarAction.java
index 4c684b7..6638f98 100644
--- a/src/main/java/org/jajuk/ui/actions/SlimbarAction.java
+++ b/src/main/java/org/jajuk/ui/actions/SlimbarAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
@@ -32,13 +31,11 @@ import org.jajuk.ui.windows.WindowStateDecorator;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
 
 /**
  * Action to hide slim bar.
  */
 public class SlimbarAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -64,7 +61,6 @@ public class SlimbarAction extends JajukAction {
      */
     WindowStateDecorator sdSlimbar = JajukSlimbar.getInstance().getWindowStateDecorator();
     WindowStateDecorator sdMainWindow = JajukMainWindow.getInstance().getWindowStateDecorator();
-
     if (sdSlimbar.isDisplayed()) {
       // close the previous window before displaying the other
       sdSlimbar.display(false);
@@ -77,10 +73,6 @@ public class SlimbarAction extends JajukAction {
       // Update the icon according to status
       setIcon(IconLoader.getIcon(JajukIcons.FULL_SCREEN));
     }
-
-    // Store window-type displayed (useful for tray display/hide feature for ie.)
-    UtilGUI.storeWindowSate();
-
     // Notify that slimbar visibility change (menu bar is interested in it)
     ObservationManager.notify(new JajukEvent(JajukEvents.SLIMBAR_VISIBILTY_CHANGED));
   }
diff --git a/src/main/java/org/jajuk/ui/actions/StopTrackAction.java b/src/main/java/org/jajuk/ui/actions/StopTrackAction.java
index 5f99dba..4b321e7 100644
--- a/src/main/java/org/jajuk/ui/actions/StopTrackAction.java
+++ b/src/main/java/org/jajuk/ui/actions/StopTrackAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -31,10 +31,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class StopTrackAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -57,11 +56,9 @@ public class StopTrackAction extends JajukAction {
       public void run() {
         try {
           QueueModel.stopRequest();
-
           // Save the stopped state (do not do it in the QueueModel.stopRequest() 
           // method because it must be set only on a human request, not at jajuk engine shutdown      
           Conf.setProperty(Const.CONF_STARTUP_STOPPED, "true");
-
         } catch (Exception e) {
           Log.error(e);
         }
diff --git a/src/main/java/org/jajuk/ui/actions/SyncTreeTableAction.java b/src/main/java/org/jajuk/ui/actions/SyncTreeTableAction.java
index 555adf7..af2f8e4 100644
--- a/src/main/java/org/jajuk/ui/actions/SyncTreeTableAction.java
+++ b/src/main/java/org/jajuk/ui/actions/SyncTreeTableAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -39,7 +39,6 @@ import org.jajuk.util.Messages;
  * <br>When called against a table view, selecting an item in a tree view will filter the table accordingly.
  */
 public class SyncTreeTableAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -62,8 +61,8 @@ public class SyncTreeTableAction extends JajukAction {
     JajukToggleButton source = (JajukToggleButton) evt.getSource();
     String currentViewID = (String) (source.getClientProperty(Const.DETAIL_VIEW));
     // Store the new sync state into the view-level property
-    Conf.setProperty(Const.CONF_SYNC_TABLE_TREE + "." + currentViewID, Boolean.toString(source
-        .isSelected()));
+    Conf.setProperty(Const.CONF_SYNC_TABLE_TREE + "." + currentViewID,
+        Boolean.toString(source.isSelected()));
     // If the sync button is deselected, we force the tables to refresh to un-filtered state
     // We use the RATE_CHANGED event because this event force table views
     // refreshing but not the tree view's one.
@@ -84,5 +83,4 @@ public class SyncTreeTableAction extends JajukAction {
           .notify(new JajukEvent(JajukEvents.TREE_SELECTION_CHANGED, detailsTreeEvent));
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/actions/TipOfTheDayAction.java b/src/main/java/org/jajuk/ui/actions/TipOfTheDayAction.java
index d154321..4f2eb11 100644
--- a/src/main/java/org/jajuk/ui/actions/TipOfTheDayAction.java
+++ b/src/main/java/org/jajuk/ui/actions/TipOfTheDayAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -31,7 +31,6 @@ import org.jajuk.util.Messages;
  * Action for displaying the tip of the day.
  */
 public class TipOfTheDayAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -45,7 +44,7 @@ public class TipOfTheDayAction extends JajukAction {
   /**
    * Invoked when an action occurs.
    * 
-   * @param evt DOCUMENT_ME
+   * @param evt 
    */
   @Override
   public void perform(ActionEvent evt) {
diff --git a/src/main/java/org/jajuk/ui/actions/UnBanSelectionAction.java b/src/main/java/org/jajuk/ui/actions/UnBanSelectionAction.java
index 7e4f55e..504e802 100644
--- a/src/main/java/org/jajuk/ui/actions/UnBanSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/UnBanSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -35,10 +35,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class UnBanSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/UnsetPreferenceSelectionAction.java b/src/main/java/org/jajuk/ui/actions/UnsetPreferenceSelectionAction.java
index 8c3d88f..425ef53 100644
--- a/src/main/java/org/jajuk/ui/actions/UnsetPreferenceSelectionAction.java
+++ b/src/main/java/org/jajuk/ui/actions/UnsetPreferenceSelectionAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class UnsetPreferenceSelectionAction extends SelectionAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/actions/WebRadioAction.java b/src/main/java/org/jajuk/ui/actions/WebRadioAction.java
index 0a34236..34e4bcf 100644
--- a/src/main/java/org/jajuk/ui/actions/WebRadioAction.java
+++ b/src/main/java/org/jajuk/ui/actions/WebRadioAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,15 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.actions;
 
 import java.awt.event.ActionEvent;
 
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioHelper;
 import org.jajuk.services.webradio.WebRadioManager;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -34,10 +34,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class WebRadioAction extends JajukAction {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -46,7 +45,7 @@ public class WebRadioAction extends JajukAction {
    */
   WebRadioAction() {
     super(Messages.getString("CommandJPanel.25"), IconLoader.getIcon(JajukIcons.WEBRADIO), true);
-    setShortDescription(WebRadioManager.getCurrentWebRadioTooltip());
+    setShortDescription(WebRadioHelper.getCurrentWebRadioTooltip());
   }
 
   /* (non-Javadoc)
@@ -59,9 +58,10 @@ public class WebRadioAction extends JajukAction {
       public void run() {
         WebRadio radio = WebRadioManager.getInstance().getWebRadioByName(
             Conf.getString(Const.CONF_DEFAULT_WEB_RADIO));
-        QueueModel.launchRadio(radio);
+        if (radio != null) {
+          QueueModel.launchRadio(radio);
+        }
       }
     }.start();
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/actions/WebRadioConfigurationAction.java b/src/main/java/org/jajuk/ui/actions/WebRadioConfigurationAction.java
deleted file mode 100644
index 432d925..0000000
--- a/src/main/java/org/jajuk/ui/actions/WebRadioConfigurationAction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.jajuk.ui.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.jajuk.ui.wizard.WebRadioWizard;
-import org.jajuk.util.IconLoader;
-import org.jajuk.util.JajukIcons;
-import org.jajuk.util.Messages;
-
-/**
- * Action for configure WebRadios.
- */
-public class WebRadioConfigurationAction extends JajukAction {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * Instantiates a new web radio configuration action.
-   */
-  WebRadioConfigurationAction() {
-    super(Messages.getString("CommandJPanel.24"), IconLoader.getIcon(JajukIcons.CONFIGURATION),
-        true);
-  }
-
-  /* (non-Javadoc)
-   * @see org.jajuk.ui.actions.JajukAction#perform(java.awt.event.ActionEvent)
-   */
-  @Override
-  public void perform(ActionEvent evt) {
-    // display the wizard
-    WebRadioWizard wizard = new WebRadioWizard();
-    wizard.show();
-  }
-}
diff --git a/src/main/java/org/jajuk/ui/actions/WindowsHotKeyManager.java b/src/main/java/org/jajuk/ui/actions/WindowsHotKeyManager.java
new file mode 100644
index 0000000..0696ed5
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/actions/WindowsHotKeyManager.java
@@ -0,0 +1,154 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.actions;
+
+import com.melloware.jintellitype.HotkeyListener;
+import com.melloware.jintellitype.IntellitypeListener;
+import com.melloware.jintellitype.JIntellitype;
+import com.melloware.jintellitype.JIntellitypeConstants;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.AbstractAction;
+import javax.swing.KeyStroke;
+
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.log.Log;
+
+/**
+ * This manager contains all windows-specific code dealing with hotkeys
+ * <p>
+ * Delete this class before compiling if you want to build jajuk without
+ * Jintellitype jar
+ * </p>.
+ */
+public abstract class WindowsHotKeyManager extends AbstractAction {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = -6948447651091264530L;
+  /** Maps hotkeylisteners with the event ID. */
+  private static Map<Integer, JajukAction> hmIndexAction = new HashMap<Integer, JajukAction>(20);
+  /** Jintellitype object used for hotkeys and intellitype events management under windows only. */
+  private static JIntellitype jintellitype;
+
+  /**
+   * Register j intellitype.
+   * 
+   */
+  public static void registerJIntellitype() {
+    jintellitype = JIntellitype.getInstance();
+    // assign this class to be a IntellitypeListener
+    jintellitype.addIntellitypeListener(new IntellitypeListener() {
+      /*
+       * (non-Javadoc)
+       * 
+       * @see com.melloware.jintellitype.IntellitypeListener#onIntellitype(int)
+       */
+      @Override
+      public void onIntellitype(int aCommand) {
+        try {
+          // Perform right action according to intellitype command
+          switch (aCommand) {
+          case JIntellitypeConstants.APPCOMMAND_MEDIA_NEXTTRACK:
+            ActionManager.getAction(JajukActions.NEXT_TRACK).perform(null);
+            break;
+          case JIntellitypeConstants.APPCOMMAND_MEDIA_PLAY_PAUSE:
+            ActionManager.getAction(JajukActions.PAUSE_RESUME_TRACK).perform(null);
+            break;
+          case JIntellitypeConstants.APPCOMMAND_MEDIA_PREVIOUSTRACK:
+            ActionManager.getAction(JajukActions.PREVIOUS_TRACK).perform(null);
+            break;
+          case JIntellitypeConstants.APPCOMMAND_MEDIA_STOP:
+            ActionManager.getAction(JajukActions.STOP_TRACK).perform(null);
+            break;
+          case JIntellitypeConstants.APPCOMMAND_VOLUME_DOWN:
+            ActionManager.getAction(JajukActions.DECREASE_VOLUME).perform(null);
+            break;
+          case JIntellitypeConstants.APPCOMMAND_VOLUME_UP:
+            ActionManager.getAction(JajukActions.INCREASE_VOLUME).perform(null);
+            break;
+          case JIntellitypeConstants.APPCOMMAND_VOLUME_MUTE:
+            Log.debug("System mute");
+            // Ignore this to fix issue #1042, mute concurrency between the OS
+            // key trapper and JIntellitype
+            break;
+          default:
+            Log.debug("Undefined INTELLITYPE message caught " + Integer.toString(aCommand));
+            break;
+          }
+        } catch (Throwable e2) {
+          Log.error(e2);
+        }
+      }
+    });
+  }
+
+  /**
+   * Register hot key.
+   * 
+   * 
+   * @param stroke 
+   * @param ab 
+   */
+  public static void registerHotKey(KeyStroke stroke, final JajukAction ab) {
+    // under windows, use hotkey that can be used even when window
+    // has not the focus. Note that all keys are nor hotkeys (given
+    // by bHotkey flag)
+    int index = hmIndexAction.size() - 1;
+    jintellitype.registerSwingHotKey(index + 1, stroke.getModifiers(), stroke.getKeyCode());
+    // register the action with its index
+    hmIndexAction.put(index + 1, ab);
+    // add the listener
+    jintellitype.addHotKeyListener(new HotkeyListener() {
+      @Override
+      public void onHotKey(int key) {
+        // Leave if user disabled hotkeys
+        if (!Conf.getBoolean(Const.CONF_OPTIONS_HOTKEYS)) {
+          return;
+        }
+        // Check it is the right listener that caught the event
+        if (ab.equals(hmIndexAction.get(key))) {
+          try {
+            // Call action itself
+            ab.perform(null);
+          } catch (Throwable e2) {
+            Log.error(e2);
+          } finally {
+            ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
+          }
+        }
+      }
+    });
+  }
+
+  /**
+   * Free Jintellipad resources.
+   */
+  public static void cleanup() {
+    if (jintellitype != null) {
+      jintellitype.cleanUp();
+    }
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/actions/package.html b/src/main/java/org/jajuk/ui/actions/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/ui/actions/package.html
+++ b/src/main/java/org/jajuk/ui/actions/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/helpers/AlbumsTableModel.java b/src/main/java/org/jajuk/ui/helpers/AlbumsTableModel.java
index ca4bac8..4b630a5 100644
--- a/src/main/java/org/jajuk/ui/helpers/AlbumsTableModel.java
+++ b/src/main/java/org/jajuk/ui/helpers/AlbumsTableModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.Date;
@@ -43,7 +42,6 @@ import org.jajuk.util.Messages;
  * Table model used for albums table view.
  */
 public class AlbumsTableModel extends JajukTableModel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -58,48 +56,37 @@ public class AlbumsTableModel extends JajukTableModel {
     // for proper display in some look and feel
     vColNames.add(" ");
     idList.add(Const.XML_PLAY);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ALBUM));
     idList.add(Const.XML_ALBUM);
-
     // First track found artist. If different artists in album, will be
     // displayed in italic
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ARTIST));
     idList.add(Const.XML_ARTIST);
-
     // First track found genre. If different genres in album, will be
     // displayed in italic
     vColNames.add(Messages.getHumanPropertyName(Const.XML_GENRE));
     idList.add(Const.XML_GENRE);
-
     // First found track year, italic if different values
     vColNames.add(Messages.getHumanPropertyName(Const.XML_YEAR));
     idList.add(Const.XML_YEAR);
-
     // Album rate (average of its tracks rate)
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_RATE));
     idList.add(Const.XML_TRACK_RATE);
-
     // Total album length
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_LENGTH));
     idList.add(Const.XML_TRACK_LENGTH);
-
     // Number of tracks
     vColNames.add(Messages.getString("AlbumsTableView.1"));
     idList.add(Const.XML_TRACKS);
-
     // First found track discovery date
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_DISCOVERY_DATE));
     idList.add(Const.XML_TRACK_DISCOVERY_DATE);
-
     // Sum of all tracks hits
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_HITS));
     idList.add(Const.XML_TRACK_HITS);
-
     // Disc ID
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ALBUM_DISC_ID));
     idList.add(Const.XML_ALBUM_DISC_ID);
-
     // custom properties now
     for (PropertyMetaInformation meta : AlbumManager.getInstance().getCustomProperties()) {
       vColNames.add(meta.getName());
@@ -113,19 +100,17 @@ public class AlbumsTableModel extends JajukTableModel {
    * For now, this table will not be editable (except for custom properties) for
    * complexity reasons. This may be implemented in the future if required
    * </p>
-   * 
-   * @param sPropertyName DOCUMENT_ME
-   * @param sPattern DOCUMENT_ME
-   * @param columnsToShow DOCUMENT_ME
+   *
+   * @param sPropertyName 
+   * @param sPattern 
+   * @param columnsToShow 
    */
   @Override
-  @SuppressWarnings("unchecked")
   public void populateModel(String sPropertyName, String sPattern, List<String> columnsToShow) {
     List<Album> alToShow = AlbumManager.getInstance().getAlbums();
     // OK, begin by filtering using any provided pattern
     Filter filter = new Filter(sPropertyName, sPattern, true, Conf.getBoolean(Const.CONF_REGEXP));
-    Filter.filterItems(alToShow, filter);
-
+    alToShow = Filter.filterItems(alToShow, filter, Album.class);
     // Filter unmounted files if required
     if (Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED)) {
       Iterator<Album> it = alToShow.iterator();
@@ -136,7 +121,6 @@ public class AlbumsTableModel extends JajukTableModel {
         }
       }
     }
-
     // Sort the result
     int iColNum = iNumberStandardCols + AlbumManager.getInstance().getCustomProperties().size();
     iRowNum = alToShow.size();
@@ -146,7 +130,6 @@ public class AlbumsTableModel extends JajukTableModel {
     // Allow only custom properties edition
     bEditable = true;
     Iterator<Album> it = alToShow.iterator();
-
     // For perfs, prepare columns visibility
     boolean bAlbum = (columnsToShow != null && columnsToShow.contains(Const.XML_ALBUM));
     boolean bArtist = (columnsToShow != null && columnsToShow.contains(Const.XML_ARTIST));
@@ -160,11 +143,9 @@ public class AlbumsTableModel extends JajukTableModel {
     boolean bHits = (columnsToShow != null && columnsToShow.contains(Const.XML_TRACK_HITS));
     boolean bAlbumDiscID = (columnsToShow != null && columnsToShow
         .contains(Const.XML_ALBUM_DISC_ID));
-
     for (int iRow = 0; it.hasNext(); iRow++) {
       Album album = it.next();
       setItemAt(iRow, album);
-      Map<String, Object> properties = album.getProperties();
       // Id
       oItems[iRow] = album;
       // Play
@@ -178,7 +159,6 @@ public class AlbumsTableModel extends JajukTableModel {
       // change
       oValues[iRow][0] = il;
       bCellEditable[iRow][0] = false;
-
       // Album name
       if (bAlbum) {
         oValues[iRow][1] = album.getName2();
@@ -186,7 +166,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][1] = "";
       }
       bCellEditable[iRow][1] = false;
-
       // Artist
       if (bArtist) {
         Artist artist = album.getArtist();
@@ -199,7 +178,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][2] = "";
       }
       bCellEditable[iRow][2] = false;
-
       // Genre
       if (bGenre) {
         Genre genre = album.getGenre();
@@ -212,7 +190,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][3] = "";
       }
       bCellEditable[iRow][3] = false;
-
       // Year
       if (bYear) {
         Year year = album.getYear();
@@ -225,7 +202,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][4] = "";
       }
       bCellEditable[iRow][4] = false;
-
       // Rate
       if (bRate) {
         oValues[iRow][5] = StarsHelper.getStarIconLabel(album);
@@ -233,7 +209,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][5] = "";
       }
       bCellEditable[iRow][5] = false;
-
       // Length
       if (bLength) {
         oValues[iRow][6] = new Duration(album.getDuration());
@@ -241,7 +216,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][6] = "";
       }
       bCellEditable[iRow][6] = false;
-
       // Number of tracks
       if (bTrackNb) {
         oValues[iRow][7] = album.getNbOfTracks();
@@ -249,7 +223,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][7] = "";
       }
       bCellEditable[iRow][7] = false;
-
       // Date discovery
       if (bDiscovery) {
         oValues[iRow][8] = album.getDiscoveryDate();
@@ -257,7 +230,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][8] = "";
       }
       bCellEditable[iRow][8] = false;
-
       // Hits
       if (bHits) {
         oValues[iRow][9] = album.getHits();
@@ -265,7 +237,6 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][9] = "";
       }
       bCellEditable[iRow][9] = false;
-
       // disc id
       if (bAlbumDiscID) {
         oValues[iRow][10] = Long.toHexString(album.getDiscID());
@@ -273,11 +244,12 @@ public class AlbumsTableModel extends JajukTableModel {
         oValues[iRow][10] = "";
       }
       bCellEditable[iRow][10] = false;
-
       // Custom properties now
-      Iterator it2 = AlbumManager.getInstance().getCustomProperties().iterator();
+      Map<String, Object> properties = album.getProperties();
+      Iterator<PropertyMetaInformation> it2 = AlbumManager.getInstance().getCustomProperties()
+          .iterator();
       for (int i = 0; it2.hasNext(); i++) {
-        PropertyMetaInformation meta = (PropertyMetaInformation) it2.next();
+        PropertyMetaInformation meta = it2.next();
         Object o = properties.get(meta.getName());
         if (o != null) {
           oValues[iRow][iNumberStandardCols + i] = o;
diff --git a/src/main/java/org/jajuk/ui/helpers/CDDBTableModel.java b/src/main/java/org/jajuk/ui/helpers/CDDBTableModel.java
index 07d1415..9467903 100644
--- a/src/main/java/org/jajuk/ui/helpers/CDDBTableModel.java
+++ b/src/main/java/org/jajuk/ui/helpers/CDDBTableModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -33,10 +33,9 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.UtilString;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class CDDBTableModel extends JajukTableModel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -45,35 +44,27 @@ public class CDDBTableModel extends JajukTableModel {
    */
   public CDDBTableModel() {
     super(8);
-
     // Current Album title
     vColNames.add(Messages.getString("CDDBWizard.3"));
     idList.add("CDDBWizard.1");
-
     // Filename
     vColNames.add(Messages.getString("CDDBWizard.1"));
     idList.add("CDDBWizard.2");
-
     // Current Track title
     vColNames.add(Messages.getString("CDDBWizard.2"));
     idList.add("CDDBWizard.3");
-
     // Proposed Track Name
     vColNames.add(Messages.getString("CDDBWizard.4"));
     idList.add("CDDBWizard.4");
-
     // Proposed Track Artist
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ARTIST));
     idList.add(Const.XML_ARTIST);
-
     // Proposed Track genre
     vColNames.add(Messages.getHumanPropertyName(Const.XML_GENRE));
     idList.add(Const.XML_GENRE);
-
     // Proposed Track year
     vColNames.add(Messages.getHumanPropertyName(Const.XML_YEAR));
     idList.add(Const.XML_YEAR);
-
     // Proposed Track number
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_ORDER));
     idList.add(Const.XML_TRACK_ORDER);
@@ -82,8 +73,8 @@ public class CDDBTableModel extends JajukTableModel {
   /**
    * Fill model with tracks.
    * 
-   * @param currentTracks DOCUMENT_ME
-   * @param fdbReader DOCUMENT_ME
+   * @param currentTracks 
+   * @param fdbReader 
    */
   public void populateModel(List<CDDBTrack> currentTracks, FreedbReadResult fdbReader) {
     iRowNum = currentTracks.size();
@@ -134,5 +125,4 @@ public class CDDBTableModel extends JajukTableModel {
   public void populateModel(String property, String pattern, List<String> columnsToShow) {
     // Doesn't apply here
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/CatalogViewTransferHandler.java b/src/main/java/org/jajuk/ui/helpers/CatalogViewTransferHandler.java
index 95cab56..adaa72b 100644
--- a/src/main/java/org/jajuk/ui/helpers/CatalogViewTransferHandler.java
+++ b/src/main/java/org/jajuk/ui/helpers/CatalogViewTransferHandler.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.datatransfer.DataFlavor;
@@ -33,19 +32,15 @@ import org.jajuk.ui.thumbnails.LocalAlbumThumbnail;
 /**
  * DND handler for table.
  */
-
 public class CatalogViewTransferHandler extends TransferHandler {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private final LocalAlbumThumbnail item;
 
   /**
    * Constructor.
    * 
-   * @param item DOCUMENT_ME
+   * @param item 
    */
   public CatalogViewTransferHandler(LocalAlbumThumbnail item) {
     this.item = item;
@@ -54,7 +49,7 @@ public class CatalogViewTransferHandler extends TransferHandler {
   /**
    * Called when dragging.
    * 
-   * @param c DOCUMENT_ME
+   * @param c 
    * 
    * @return the transferable
    */
@@ -70,7 +65,7 @@ public class CatalogViewTransferHandler extends TransferHandler {
   /**
    * return action type.
    * 
-   * @param c DOCUMENT_ME
+   * @param c 
    * 
    * @return the source actions
    */
@@ -82,8 +77,8 @@ public class CatalogViewTransferHandler extends TransferHandler {
   /**
    * Called when dropping, no drop in catalog view for now.
    * 
-   * @param c DOCUMENT_ME
-   * @param t DOCUMENT_ME
+   * @param c 
+   * @param t 
    * 
    * @return true, if import data
    */
@@ -99,5 +94,4 @@ public class CatalogViewTransferHandler extends TransferHandler {
   public boolean canImport(JComponent c, DataFlavor[] flavors) {
     return false;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/DefaultMouseWheelListener.java b/src/main/java/org/jajuk/ui/helpers/DefaultMouseWheelListener.java
index a6b39ed..df925b1 100644
--- a/src/main/java/org/jajuk/ui/helpers/DefaultMouseWheelListener.java
+++ b/src/main/java/org/jajuk/ui/helpers/DefaultMouseWheelListener.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.event.MouseWheelEvent;
@@ -30,8 +29,6 @@ import javax.swing.JSlider;
  * A basic Mouse wheel listener for jsliders.
  */
 public class DefaultMouseWheelListener implements MouseWheelListener {
-
-  /** DOCUMENT_ME. */
   private JSlider js;
 
   /**
@@ -57,5 +54,4 @@ public class DefaultMouseWheelListener implements MouseWheelListener {
       js.setValue(iNew);
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/Duration.java b/src/main/java/org/jajuk/ui/helpers/Duration.java
index 98019a8..74d9730 100644
--- a/src/main/java/org/jajuk/ui/helpers/Duration.java
+++ b/src/main/java/org/jajuk/ui/helpers/Duration.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -27,8 +27,6 @@ import org.jajuk.util.UtilString;
  * tables to ease the cell renderers recognition.
  */
 public class Duration implements Comparable<Duration> {
-
-  /** DOCUMENT_ME. */
   private final long duration;
 
   /**
@@ -59,7 +57,6 @@ public class Duration implements Comparable<Duration> {
     if (obj instanceof Duration) {
       return duration == ((Duration) obj).duration;
     }
-
     return false;
   }
 
@@ -72,7 +69,6 @@ public class Duration implements Comparable<Duration> {
       // not equal if the other element is null
       return -1;
     }
-
     return (int) (duration - other.getDuration());
   }
 
diff --git a/src/main/java/org/jajuk/ui/helpers/FilesTableModel.java b/src/main/java/org/jajuk/ui/helpers/FilesTableModel.java
index 9b66e9e..2843594 100644
--- a/src/main/java/org/jajuk/ui/helpers/FilesTableModel.java
+++ b/src/main/java/org/jajuk/ui/helpers/FilesTableModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.Date;
@@ -44,16 +43,14 @@ import org.jajuk.util.Messages;
  * Table model used for physical table view.
  */
 public class FilesTableModel extends JajukTableModel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Associated view ID. */
   private String viewID;
 
   /**
    * Model constructor.
-   * 
+   *
    * @param viewID Associated view ID
    */
   public FilesTableModel(String viewID) {
@@ -65,64 +62,44 @@ public class FilesTableModel extends JajukTableModel {
     // for proper display in some look and feel
     vColNames.add(" ");
     idList.add(Const.XML_PLAY);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK));
     idList.add(Const.XML_TRACK);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ALBUM));
     idList.add(Const.XML_ALBUM);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ARTIST));
     idList.add(Const.XML_ARTIST);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ALBUM_ARTIST));
     idList.add(Const.XML_ALBUM_ARTIST);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_GENRE));
     idList.add(Const.XML_GENRE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_RATE));
     idList.add(Const.XML_TRACK_RATE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_LENGTH));
     idList.add(Const.XML_TRACK_LENGTH);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_DEVICE));
     idList.add(Const.XML_DEVICE);
-
     vColNames.add(Messages.getString("Property_filename"));
     idList.add(Const.XML_NAME);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_COMMENT));
     idList.add(Const.XML_TRACK_COMMENT);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_QUALITY));
     idList.add(Const.XML_QUALITY);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_SIZE));
     idList.add(Const.XML_SIZE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_ORDER));
     idList.add(Const.XML_TRACK_ORDER);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_DISC_NUMBER));
     idList.add(Const.XML_TRACK_DISC_NUMBER);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_YEAR));
     idList.add(Const.XML_YEAR);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_DIRECTORY));
     idList.add(Const.XML_DIRECTORY);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_FILE_DATE));
     idList.add(Const.XML_FILE_DATE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_HITS));
     idList.add(Const.XML_TRACK_HITS);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_DISCOVERY_DATE));
     idList.add(Const.XML_TRACK_DISCOVERY_DATE);
-
     // -- Custom properties now--
     // for files
     Iterator<PropertyMetaInformation> it = FileManager.getInstance().getCustomProperties()
@@ -143,7 +120,7 @@ public class FilesTableModel extends JajukTableModel {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.helpers.JajukTableModel#populateModel(java.lang.String, java.lang.String,
    * java.util.List)
    */
@@ -151,21 +128,18 @@ public class FilesTableModel extends JajukTableModel {
   public void populateModel(String sPropertyName, String sPattern, List<String> columnsToShow) {
     // This should be monitor file manager to avoid NPE when changing items
     List<File> alToShow = FileManager.getInstance().getFiles();
-
     // Filter mounted files if needed and apply sync table with tree
     // option if needed
     final boolean syncTreeTable = Conf.getBoolean(Const.CONF_SYNC_TABLE_TREE + "." + viewID);
-
     oItems = new Item[iRowNum];
     CollectionUtils.filter(alToShow, new Predicate() {
-
       @Override
       public boolean evaluate(Object o) {
         File file = (File) o;
         // show it if no sync option or if item is in the selection
         boolean bShowWithTree = !syncTreeTable
         // tree selection = null means none selection have been
-            // done in tree so far
+        // done in tree so far
             || treeSelection == null
             // check if the tree selection contains the current file
             || (treeSelection.size() > 0 && treeSelection.contains(file));
@@ -174,8 +148,7 @@ public class FilesTableModel extends JajukTableModel {
     });
     // Filter files
     Filter filter = new Filter(sPropertyName, sPattern, true, Conf.getBoolean(Const.CONF_REGEXP));
-    Filter.filterItems(alToShow, filter);
-
+    alToShow = Filter.filterItems(alToShow, filter, File.class);
     Iterator<File> it = alToShow.iterator();
     int iColNum = iNumberStandardCols + FileManager.getInstance().getCustomProperties().size()
         + TrackManager.getInstance().getCustomProperties().size();
@@ -184,7 +157,6 @@ public class FilesTableModel extends JajukTableModel {
     oValues = new Object[iRowNum][iColNum];
     oItems = new Item[iRowNum];
     bCellEditable = new boolean[iRowNum][iColNum];
-
     // For perfs, prepare columns visibility
     boolean bTrackName = (columnsToShow != null && columnsToShow.contains(Const.XML_TRACK));
     boolean bAlbum = (columnsToShow != null && columnsToShow.contains(Const.XML_ALBUM));
@@ -207,11 +179,9 @@ public class FilesTableModel extends JajukTableModel {
     boolean bDirectory = (columnsToShow != null && columnsToShow.contains(Const.XML_DIRECTORY));
     boolean bFileDate = (columnsToShow != null && columnsToShow.contains(Const.XML_FILE_DATE));
     boolean bHits = (columnsToShow != null && columnsToShow.contains(Const.XML_TRACK_HITS));
-
     for (int iRow = 0; it.hasNext(); iRow++) {
       File file = it.next();
       setItemAt(iRow, file);
-      Map<String, Object> properties = file.getProperties();
       // Id
       oItems[iRow] = file;
       // Play
@@ -229,7 +199,6 @@ public class FilesTableModel extends JajukTableModel {
       if (type != null) {
         bHasATagEditor = (type.getTaggerClass() != null);
       }
-
       // Track name
       if (bTrackName) {
         oValues[iRow][1] = file.getTrack().getName();
@@ -237,7 +206,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][1] = "";
       }
       bCellEditable[iRow][1] = bHasATagEditor;
-
       // Album
       if (bAlbum) {
         oValues[iRow][2] = file.getTrack().getAlbum().getName2();
@@ -245,7 +213,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][2] = "";
       }
       bCellEditable[iRow][2] = bHasATagEditor;
-
       // Artist
       if (bArtist) {
         oValues[iRow][3] = file.getTrack().getArtist().getName2();
@@ -253,7 +220,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][3] = "";
       }
       bCellEditable[iRow][3] = bHasATagEditor;
-
       // AlbumArtist
       if (bAlbumArtist) {
         oValues[iRow][4] = file.getTrack().getAlbumArtist().getName2();
@@ -261,7 +227,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][4] = "";
       }
       bCellEditable[iRow][4] = bHasATagEditor;
-
       // Genre
       if (bGenre) {
         oValues[iRow][5] = file.getTrack().getGenre().getName2();
@@ -269,7 +234,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][5] = "";
       }
       bCellEditable[iRow][5] = bHasATagEditor;
-
       // Rate
       if (bRate) {
         oValues[iRow][6] = StarsHelper.getStarIconLabel(file.getTrack());
@@ -277,7 +241,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][6] = "";
       }
       bCellEditable[iRow][6] = false;
-
       // Length
       if (bLength) {
         oValues[iRow][7] = new Duration(file.getTrack().getDuration());
@@ -285,7 +248,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][7] = "";
       }
       bCellEditable[iRow][7] = false;
-
       // Device
       if (bDevice) {
         oValues[iRow][8] = file.getDirectory().getDevice().getName();
@@ -293,7 +255,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][8] = "";
       }
       bCellEditable[iRow][8] = false;
-
       // File name
       if (bFileName) {
         oValues[iRow][9] = file.getName();
@@ -301,7 +262,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][9] = "";
       }
       bCellEditable[iRow][9] = true;
-
       // Comment
       if (bComment) {
         oValues[iRow][10] = file.getTrack().getValue(Const.XML_TRACK_COMMENT);
@@ -309,7 +269,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][10] = "";
       }
       bCellEditable[iRow][10] = bHasATagEditor;
-
       // Quality
       if (bQuality) {
         long lQuality = file.getQuality();
@@ -318,7 +277,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][11] = 0l;
       }
       bCellEditable[iRow][11] = false;
-
       // Size, we want to keep 2 decimals to the value in MB
       if (bSize) {
         oValues[iRow][12] = Math.round(file.getSize() / 10485.76) / 100f;
@@ -326,7 +284,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][12] = 0l;
       }
       bCellEditable[iRow][12] = false;
-
       // Order
       if (bOrder) {
         oValues[iRow][13] = file.getTrack().getOrder();
@@ -334,7 +291,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][13] = "";
       }
       bCellEditable[iRow][13] = bHasATagEditor;
-
       // Disc number
       if (bDiscNumber) {
         oValues[iRow][14] = file.getTrack().getDiscNumber();
@@ -342,7 +298,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][14] = "";
       }
       bCellEditable[iRow][14] = bHasATagEditor;
-
       // year
       if (bYear) {
         oValues[iRow][15] = file.getTrack().getYear().getValue();
@@ -350,7 +305,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][15] = "";
       }
       bCellEditable[iRow][15] = bHasATagEditor;
-
       // directory full path
       if (bDirectory) {
         oValues[iRow][16] = file.getDirectory().getAbsolutePath();
@@ -358,7 +312,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][16] = "";
       }
       bCellEditable[iRow][16] = false;
-
       // file date
       if (bFileDate) {
         oValues[iRow][17] = file.getDateValue(Const.XML_FILE_DATE);
@@ -366,7 +319,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][17] = "";
       }
       bCellEditable[iRow][17] = false;
-
       // Hits
       if (bHits) {
         oValues[iRow][18] = file.getTrack().getHits();
@@ -374,7 +326,6 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][18] = "";
       }
       bCellEditable[iRow][18] = false;
-
       // Discovery date
       if (bDiscovery) {
         oValues[iRow][19] = file.getTrack().getDiscoveryDate();
@@ -382,8 +333,8 @@ public class FilesTableModel extends JajukTableModel {
         oValues[iRow][19] = "";
       }
       bCellEditable[iRow][19] = false;
-
       // -- Custom properties now --
+      Map<String, Object> properties = file.getProperties();
       // files custom tags
       Iterator<PropertyMetaInformation> it2 = FileManager.getInstance().getCustomProperties()
           .iterator();
@@ -404,10 +355,10 @@ public class FilesTableModel extends JajukTableModel {
         }
       }
       // tracks custom properties
+      properties = file.getTrack().getProperties();
       it2 = TrackManager.getInstance().getCustomProperties().iterator();
       for (int i = FileManager.getInstance().getCustomProperties().size(); it2.hasNext(); i++) {
         PropertyMetaInformation meta = it2.next();
-        properties = file.getTrack().getProperties();
         Object o = properties.get(meta.getName());
         if (o != null) {
           oValues[iRow][iNumberStandardCols + i] = properties.get(meta.getName());
@@ -424,5 +375,4 @@ public class FilesTableModel extends JajukTableModel {
       }
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/FontManager.java b/src/main/java/org/jajuk/ui/helpers/FontManager.java
index 2ab84e5..678122c 100644
--- a/src/main/java/org/jajuk/ui/helpers/FontManager.java
+++ b/src/main/java/org/jajuk/ui/helpers/FontManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.Font;
@@ -40,76 +39,25 @@ import org.jajuk.events.Observer;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.log.Log;
-import org.jvnet.substance.SubstanceLookAndFeel;
-import org.jvnet.substance.fonts.FontPolicy;
-import org.jvnet.substance.fonts.FontSet;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
+import org.pushingpixels.substance.api.fonts.FontPolicy;
+import org.pushingpixels.substance.api.fonts.FontSet;
 
 /**
  * Manages Jajuk fonts, stores or update them.
  */
 public final class FontManager implements Observer {
-
-  /** The Constant SANS_SERIF.  DOCUMENT_ME */
+  /** The Constant SANS_SERIF.   */
   private static final String SANS_SERIF = "sans-serif";
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public enum JajukFont {
-
-    /** DOCUMENT_ME. */
-    DEFAULT,
-    
-    /** DOCUMENT_ME. */
-    PLAIN,
-    
-    /** DOCUMENT_ME. */
-    PLAIN_S,
-    
-    /** DOCUMENT_ME. */
-    PLAIN_L,
-    
-    /** DOCUMENT_ME. */
-    PLAIN_XL,
-    
-    /** DOCUMENT_ME. */
-    BOLD,
-    
-    /** DOCUMENT_ME. */
-    BOLD_L,
-    
-    /** DOCUMENT_ME. */
-    BOLD_XL,
-    
-    /** DOCUMENT_ME. */
-    BOLD_XXL,
-    
-    /** DOCUMENT_ME. */
-    BOLD_TITLE,
-    
-    /** DOCUMENT_ME. */
-    PERSPECTIVES,
-    
-    /** DOCUMENT_ME. */
-    PLANNED,
-    
-    /** DOCUMENT_ME. */
-    SEARCHBOX,
-    
-    /** DOCUMENT_ME. */
-    SPLASH,
-    
-    /** DOCUMENT_ME. */
-    SPLASH_PROGRESS,
-    
-    /** DOCUMENT_ME. */
-    VIEW_FONT
+    DEFAULT, PLAIN, PLAIN_S, PLAIN_L, PLAIN_XL, BOLD, BOLD_L, BOLD_XL, BOLD_XXL, BOLD_TITLE, PERSPECTIVES, PLANNED, SEARCHBOX, SPLASH, SPLASH_PROGRESS, VIEW_FONT
   }
 
-  /** DOCUMENT_ME. */
   private static Map<JajukFont, Font> fontCache = new HashMap<JajukFont, Font>(10);
-
-  /** DOCUMENT_ME. */
   private static FontManager self = new FontManager();
 
   // No instantiation
@@ -117,7 +65,6 @@ public final class FontManager implements Observer {
    * Instantiates a new font manager.
    */
   private FontManager() {
-
     registerFonts();
     ObservationManager.register(this);
   }
@@ -133,7 +80,7 @@ public final class FontManager implements Observer {
 
   /**
    * Register fonts.
-   * DOCUMENT_ME
+   * 
    */
   private void registerFonts() {
     // static fonts
@@ -143,28 +90,28 @@ public final class FontManager implements Observer {
     fontCache.put(JajukFont.SPLASH, new Font(SANS_SERIF, Font.PLAIN, 12));
     fontCache.put(JajukFont.SPLASH_PROGRESS, new Font(SANS_SERIF, Font.BOLD, 12));
     // Bold
-    fontCache.put(JajukFont.BOLD, new Font(SANS_SERIF, Font.BOLD, Conf
-        .getInt(Const.CONF_FONTS_SIZE)));
-    fontCache.put(JajukFont.BOLD_L, new Font(SANS_SERIF, Font.BOLD, Conf
-        .getInt(Const.CONF_FONTS_SIZE) + 2));
-    fontCache.put(JajukFont.BOLD_XL, new Font(SANS_SERIF, Font.BOLD, Conf
-        .getInt(Const.CONF_FONTS_SIZE) + 4));
-    fontCache.put(JajukFont.BOLD_XXL, new Font(SANS_SERIF, Font.BOLD, Conf
-        .getInt(Const.CONF_FONTS_SIZE) + 6));
+    fontCache.put(JajukFont.BOLD,
+        new Font(SANS_SERIF, Font.BOLD, Conf.getInt(Const.CONF_FONTS_SIZE)));
+    fontCache.put(JajukFont.BOLD_L,
+        new Font(SANS_SERIF, Font.BOLD, Conf.getInt(Const.CONF_FONTS_SIZE) + 2));
+    fontCache.put(JajukFont.BOLD_XL,
+        new Font(SANS_SERIF, Font.BOLD, Conf.getInt(Const.CONF_FONTS_SIZE) + 4));
+    fontCache.put(JajukFont.BOLD_XXL,
+        new Font(SANS_SERIF, Font.BOLD, Conf.getInt(Const.CONF_FONTS_SIZE) + 6));
     // Plain
-    fontCache.put(JajukFont.DEFAULT, new Font(SANS_SERIF, Font.PLAIN, Conf
-        .getInt(Const.CONF_FONTS_SIZE)));
-    fontCache.put(JajukFont.PLAIN, new Font(SANS_SERIF, Font.PLAIN, Conf
-        .getInt(Const.CONF_FONTS_SIZE)));
-    fontCache.put(JajukFont.PLAIN_S, new Font(SANS_SERIF, Font.PLAIN, Conf
-        .getInt(Const.CONF_FONTS_SIZE) - 2));
-    fontCache.put(JajukFont.PLAIN_L, new Font(SANS_SERIF, Font.PLAIN, Conf
-        .getInt(Const.CONF_FONTS_SIZE) + 2));
-    fontCache.put(JajukFont.PLAIN_XL, new Font(SANS_SERIF, Font.PLAIN, Conf
-        .getInt(Const.CONF_FONTS_SIZE) + 4));
+    fontCache.put(JajukFont.DEFAULT,
+        new Font(SANS_SERIF, Font.PLAIN, Conf.getInt(Const.CONF_FONTS_SIZE)));
+    fontCache.put(JajukFont.PLAIN,
+        new Font(SANS_SERIF, Font.PLAIN, Conf.getInt(Const.CONF_FONTS_SIZE)));
+    fontCache.put(JajukFont.PLAIN_S,
+        new Font(SANS_SERIF, Font.PLAIN, Conf.getInt(Const.CONF_FONTS_SIZE) - 2));
+    fontCache.put(JajukFont.PLAIN_L,
+        new Font(SANS_SERIF, Font.PLAIN, Conf.getInt(Const.CONF_FONTS_SIZE) + 2));
+    fontCache.put(JajukFont.PLAIN_XL,
+        new Font(SANS_SERIF, Font.PLAIN, Conf.getInt(Const.CONF_FONTS_SIZE) + 4));
     // Italic
-    fontCache.put(JajukFont.PLANNED, new Font("serif", Font.ITALIC, Conf
-        .getInt(Const.CONF_FONTS_SIZE)));
+    fontCache.put(JajukFont.PLANNED,
+        new Font("serif", Font.ITALIC, Conf.getInt(Const.CONF_FONTS_SIZE)));
     Font font = new Font(SANS_SERIF, Font.PLAIN, Conf.getInt(Const.CONF_FONTS_SIZE));
     fontCache.put(JajukFont.VIEW_FONT, font);
   }
@@ -172,7 +119,7 @@ public final class FontManager implements Observer {
   /**
    * Gets the font.
    * 
-   * @param font DOCUMENT_ME
+   * @param font 
    * 
    * @return the font
    */
@@ -182,11 +129,10 @@ public final class FontManager implements Observer {
 
   /**
    * Sets the default font.
-   * DOCUMENT_ME
+   * 
    */
   public void setDefaultFont() {
     SwingUtilities.invokeLater(new Runnable() {
-
       @Override
       public void run() {
         // Create the wrapper font set
@@ -204,7 +150,6 @@ public final class FontManager implements Observer {
         }
       }
     });
-
   }
 
   /*
@@ -224,9 +169,9 @@ public final class FontManager implements Observer {
    * This method return the number of characters of a given string that fits in
    * the given size in pixels.
    * 
-   * @param text DOCUMENT_ME
-   * @param font DOCUMENT_ME
-   * @param maxSize DOCUMENT_ME
+   * @param text 
+   * @param font 
+   * @param maxSize 
    * 
    * @return the rows for text
    */
@@ -259,17 +204,15 @@ public final class FontManager implements Observer {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private static class CustomFontSet implements FontSet {
-
-    /** DOCUMENT_ME. */
     protected FontUIResource font;
 
     /**
      * Instantiates a new custom font set.
      * 
-     * @param font DOCUMENT_ME
+     * @param font 
      */
     public CustomFontSet(Font font) {
       this.font = new FontUIResource(font);
diff --git a/src/main/java/org/jajuk/ui/helpers/ILaunchCommand.java b/src/main/java/org/jajuk/ui/helpers/ILaunchCommand.java
index 136c1c1..cf191a4 100644
--- a/src/main/java/org/jajuk/ui/helpers/ILaunchCommand.java
+++ b/src/main/java/org/jajuk/ui/helpers/ILaunchCommand.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -24,7 +24,6 @@ package org.jajuk.ui.helpers;
  * Command to be executed on a jajuk table after a left click.
  */
 public interface ILaunchCommand {
-
   /**
    * Action on launch.
    * 
@@ -32,5 +31,4 @@ public interface ILaunchCommand {
    * number of mouse clicks
    */
   void launch(int nbClicks);
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/IndexHighlighterPredicate.java b/src/main/java/org/jajuk/ui/helpers/IndexHighlighterPredicate.java
index 268e878..91ba423 100644
--- a/src/main/java/org/jajuk/ui/helpers/IndexHighlighterPredicate.java
+++ b/src/main/java/org/jajuk/ui/helpers/IndexHighlighterPredicate.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -31,12 +31,10 @@ import org.jdesktop.swingx.decorator.HighlightPredicate;
  * if the index is at the given row.
  */
 public class IndexHighlighterPredicate implements HighlightPredicate {
-
   /**
    * Instantiates a new index highlighter predicate.
    */
   public IndexHighlighterPredicate() {
-
   }
 
   /* (non-Javadoc)
diff --git a/src/main/java/org/jajuk/ui/helpers/ItemMoveManager.java b/src/main/java/org/jajuk/ui/helpers/ItemMoveManager.java
index f18cf1b..d9ffefd 100644
--- a/src/main/java/org/jajuk/ui/helpers/ItemMoveManager.java
+++ b/src/main/java/org/jajuk/ui/helpers/ItemMoveManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.ArrayList;
@@ -29,28 +28,17 @@ import org.jajuk.base.Item;
 /**
  * Convenient class to manage Items to be moved using Cut/Copy/Paste Actions.
  */
-
 public class ItemMoveManager {
-
-  /** DOCUMENT_ME. */
   private static ItemMoveManager singleton = new ItemMoveManager();
-
-  /** DOCUMENT_ME. */
   private final List<Item> itemsToMove = new ArrayList<Item>(20);
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public enum MoveActions {
-
-    /** DOCUMENT_ME. */
-    CUT,
-    
-    /** DOCUMENT_ME. */
-    COPY
+    CUT, COPY
   }
 
-  /** DOCUMENT_ME. */
   private MoveActions moveAction;
 
   /**
@@ -64,9 +52,9 @@ public class ItemMoveManager {
 
   /**
    * Adds the items.
-   * DOCUMENT_ME
    * 
-   * @param items DOCUMENT_ME
+   * 
+   * @param items 
    */
   public void addItems(List<Item> items) {
     itemsToMove.addAll(items);
@@ -83,7 +71,7 @@ public class ItemMoveManager {
 
   /**
    * Removes the all.
-   * DOCUMENT_ME
+   * 
    */
   public void removeAll() {
     itemsToMove.clear();
diff --git a/src/main/java/org/jajuk/ui/helpers/JajukCellRenderer.java b/src/main/java/org/jajuk/ui/helpers/JajukCellRenderer.java
index 626abed..f4b9269 100644
--- a/src/main/java/org/jajuk/ui/helpers/JajukCellRenderer.java
+++ b/src/main/java/org/jajuk/ui/helpers/JajukCellRenderer.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.Color;
@@ -34,7 +33,7 @@ import org.jajuk.ui.helpers.FontManager.JajukFont;
 import org.jajuk.ui.widgets.IconLabel;
 import org.jajuk.util.Const;
 import org.jajuk.util.UtilString;
-import org.jvnet.substance.api.renderers.SubstanceDefaultTableCellRenderer;
+import org.pushingpixels.substance.api.renderers.SubstanceDefaultTableCellRenderer;
 
 /**
  * Cell renderer to support cells color and icons
@@ -46,11 +45,8 @@ import org.jvnet.substance.api.renderers.SubstanceDefaultTableCellRenderer;
  * </p>
  */
 public class JajukCellRenderer extends SubstanceDefaultTableCellRenderer implements Const {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 154545454L;
-
-  /** DOCUMENT_ME. */
   private final Color color;
 
   /**
@@ -70,7 +66,6 @@ public class JajukCellRenderer extends SubstanceDefaultTableCellRenderer impleme
     this(null);
   }
 
-  /** DOCUMENT_ME. */
   private final SubstanceDefaultTableCellRenderer.BooleanRenderer booleanRenderer = new SubstanceDefaultTableCellRenderer.BooleanRenderer();
 
   /* (non-Javadoc)
@@ -105,5 +100,4 @@ public class JajukCellRenderer extends SubstanceDefaultTableCellRenderer impleme
     }
     return c;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/JajukMouseAdapter.java b/src/main/java/org/jajuk/ui/helpers/JajukMouseAdapter.java
index fa01e41..e0fa50d 100644
--- a/src/main/java/org/jajuk/ui/helpers/JajukMouseAdapter.java
+++ b/src/main/java/org/jajuk/ui/helpers/JajukMouseAdapter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -41,7 +41,6 @@ import java.awt.event.MouseEvent;
  * </p>
  */
 public class JajukMouseAdapter extends MouseAdapter {
-  
   /** Whether a popup request gesture has been recognized. */
   private boolean popupTrigger = false;
 
@@ -52,7 +51,6 @@ public class JajukMouseAdapter extends MouseAdapter {
   public void mousePressed(final MouseEvent e) {
     // Note that this method is not final as we sometimes need additional tests
     // or actions but overriding it is discouraged
-
     // reset the popup gesture state
     popupTrigger = false;
     // popupTrigger can be false here even if the user performed a right click
@@ -69,7 +67,6 @@ public class JajukMouseAdapter extends MouseAdapter {
   public void mouseReleased(final MouseEvent e) {
     // Note that this method is not final as we sometimes need additional tests
     // or actions but overriding it is discouraged
-
     // Actual popup request is an 'or' between state during mousePressed and
     // mouseReleased methods to deal with every JRE implementation
     popupTrigger = popupTrigger || e.isPopupTrigger();
@@ -127,5 +124,4 @@ public class JajukMouseAdapter extends MouseAdapter {
   public void handleAction(final MouseEvent e) {
     // Not abstract as we don't want to force user to override every methods
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/JajukTableModel.java b/src/main/java/org/jajuk/ui/helpers/JajukTableModel.java
index 5bf007b..7be7bd0 100644
--- a/src/main/java/org/jajuk/ui/helpers/JajukTableModel.java
+++ b/src/main/java/org/jajuk/ui/helpers/JajukTableModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.ArrayList;
@@ -36,56 +35,39 @@ import org.jajuk.util.Messages;
 
 /**
  * Jajuk table model, adds identifier to model.
+ * 
+ * <p>Note that we don't synchronize this class because all calls have to be done in the EDT.</p>
  */
+ at SuppressWarnings("serial")
 public abstract class JajukTableModel extends DefaultTableModel {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = -7296786603161189590L;
-
   /** Column identifiers. */
   volatile protected List<String> idList = new ArrayList<String>(10);
-
   /** Rows number. */
   protected int iRowNum;
-
   /** Values table*. */
   protected Object[][] oValues;
-
   // Play icon in cache
-  /** The Constant PLAY_ICON.  DOCUMENT_ME */
+  /** The Constant PLAY_ICON.   */
   protected static final ImageIcon PLAY_ICON = IconLoader.getIcon(JajukIcons.PLAY_TABLE);
-
   // Unmount Play icon in cache
-  /** The Constant UNMOUNT_PLAY_ICON.  DOCUMENT_ME */
+  /** The Constant UNMOUNT_PLAY_ICON.   */
   protected static final ImageIcon UNMOUNT_PLAY_ICON = IconLoader.getIcon(JajukIcons.UNKNOWN);
-
   /** Objects. */
   protected Item[] oItems;
-
   /** Number of standard columns. */
   protected int iNumberStandardCols;
-
   /** Cell editable flag. */
   protected boolean[][] bCellEditable;
-
   /** Column names. */
   protected List<String> vColNames = new ArrayList<String>(10);
-
   /** Last value used for undo. */
   private Object oLast = null;
-
   /** Editable flag. */
   boolean bEditable = false;
-
   /** Tree selection. */
   protected Set<Item> treeSelection;
-
-  /** DOCUMENT_ME. */
   protected IconLabel play_icon = null;
-
-  /** DOCUMENT_ME. */
   protected IconLabel unmount_play_icon = null;
-
   /** Whether the model is refreshing so we must ignore selection changes events. */
   private boolean refreshing = false;
 
@@ -114,7 +96,6 @@ public abstract class JajukTableModel extends DefaultTableModel {
    */
   public JajukTableModel(int iNumberStandardCols) {
     super();
-
     this.iNumberStandardCols = iNumberStandardCols;
   }
 
@@ -123,14 +104,13 @@ public abstract class JajukTableModel extends DefaultTableModel {
    */
   public JajukTableModel() {
     super();
-
     this.iNumberStandardCols = 0;
   }
 
   /**
    * Gets the identifier.
    * 
-   * @param sColName DOCUMENT_ME
+   * @param sColName 
    * 
    * @return Column identifier for a given column title
    */
@@ -141,7 +121,7 @@ public abstract class JajukTableModel extends DefaultTableModel {
   /**
    * Return item at given position.
    * 
-   * @param iRow DOCUMENT_ME
+   * @param iRow 
    * 
    * @return the item at
    */
@@ -152,8 +132,8 @@ public abstract class JajukTableModel extends DefaultTableModel {
   /**
    * Set item at given position.
    * 
-   * @param iRow DOCUMENT_ME
-   * @param item DOCUMENT_ME
+   * @param iRow 
+   * @param item 
    */
   public void setItemAt(int iRow, Item item) {
     oItems[iRow] = item;
@@ -198,8 +178,8 @@ public abstract class JajukTableModel extends DefaultTableModel {
   /**
    * Undo last change.
    * 
-   * @param rowIndex DOCUMENT_ME
-   * @param columnIndex DOCUMENT_ME
+   * @param rowIndex 
+   * @param columnIndex 
    */
   public void undo(int rowIndex, int columnIndex) {
     if (oLast != null) {
@@ -220,7 +200,7 @@ public abstract class JajukTableModel extends DefaultTableModel {
   /**
    * Gets the identifier.
    * 
-   * @param column DOCUMENT_ME
+   * @param column 
    * 
    * @return the identifier
    */
@@ -278,7 +258,7 @@ public abstract class JajukTableModel extends DefaultTableModel {
   /**
    * Fill model with data.
    * 
-   * @param columnsToShow DOCUMENT_ME
+   * @param columnsToShow 
    */
   public synchronized void populateModel(List<String> columnsToShow) {
     populateModel(null, null, columnsToShow);
@@ -323,22 +303,21 @@ public abstract class JajukTableModel extends DefaultTableModel {
   /**
    * Gets the icon.
    * 
-   * @param unmount DOCUMENT_ME
+   * @param unmount 
    * 
    * @return the icon
    */
   protected IconLabel getIcon(boolean unmount) {
     if (!unmount) {
       if (play_icon == null) {
-        play_icon = new IconLabel(PLAY_ICON, "", null, null, null, Messages
-            .getString("TracksTableView.7"));
+        play_icon = new IconLabel(PLAY_ICON, "", null, null, null,
+            Messages.getString("TracksTableView.7"));
       }
       return play_icon;
     } else {
       if (unmount_play_icon == null) {
-        unmount_play_icon = new IconLabel(UNMOUNT_PLAY_ICON, "", null, null, null, Messages
-            .getString("TracksTableView.7")
-            + Messages.getString("AbstractTableView.10"));
+        unmount_play_icon = new IconLabel(UNMOUNT_PLAY_ICON, "", null, null, null,
+            Messages.getString("TracksTableView.7") + Messages.getString("AbstractTableView.10"));
       }
       return unmount_play_icon;
     }
diff --git a/src/main/java/org/jajuk/ui/helpers/JajukTimer.java b/src/main/java/org/jajuk/ui/helpers/JajukTimer.java
index 22f6531..9d74ff4 100644
--- a/src/main/java/org/jajuk/ui/helpers/JajukTimer.java
+++ b/src/main/java/org/jajuk/ui/helpers/JajukTimer.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,11 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.Iterator;
-import java.util.List;
 
 import org.jajuk.base.File;
 import org.jajuk.services.players.Player;
@@ -35,16 +33,12 @@ import org.jajuk.services.players.StackItem;
  * </p>.
  */
 public final class JajukTimer {
-
   /** Self instance. */
   private static JajukTimer timer = new JajukTimer();
-
   /** Total time to play in secs. */
   private long lTimeToPlay = 0;
-
   /** A default heartbeat time in ms. */
   public static final int DEFAULT_HEARTBEAT = 800;
-
   /** The heartbeat for the Track Position Slider Toolbar. */
   public static final int D_MS_HEARTBEAT = 500;
 
@@ -83,7 +77,6 @@ public final class JajukTimer {
     Iterator<StackItem> it = alFiles.iterator();
     while (it.hasNext()) {
       Object o = it.next();
-
       // instanceof also checks for null by definition
       if (o instanceof File) {
         addTrackTime((File) o);
@@ -106,21 +99,6 @@ public final class JajukTimer {
   }
 
   /**
-   * Remove time of the given set of files.
-   * 
-   * @param alFiles The list of files which duration to remove from the overall playing time.
-   */
-  public void removeTrackTime(List<File> alFiles) {
-    Iterator<File> it = alFiles.iterator();
-    while (it.hasNext()) {
-      File file = it.next();
-      if (file != null) {
-        removeTrackTime(it.next());
-      }
-    }
-  }
-
-  /**
    * Gets the current track elapsed time.
    * 
    * @return Current track elapsed time in secs
diff --git a/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java b/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java
index e18d819..2b8bd21 100644
--- a/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java
+++ b/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeExpander.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -39,7 +39,6 @@ import javax.swing.tree.TreePath;
  * requests involved.
  */
 public class LazyLoadingTreeExpander implements TreeWillExpandListener {
-  
   /** Tree Model. */
   private DefaultTreeModel model;
 
@@ -65,7 +64,7 @@ public class LazyLoadingTreeExpander implements TreeWillExpandListener {
    * 
    * If the Node is a LazyLoadingTreeNode load it's children.
    * 
-   * @param event DOCUMENT_ME
+   * @param event 
    * 
    * @throws ExpandVetoException the expand veto exception
    */
@@ -75,7 +74,6 @@ public class LazyLoadingTreeExpander implements TreeWillExpandListener {
     Object lastPathComponent = path.getLastPathComponent();
     if (lastPathComponent instanceof LazyLoadingTreeNode) {
       LazyLoadingTreeNode lazyNode = (LazyLoadingTreeNode) lastPathComponent;
-
       if (!lazyNode.areChildrenLoaded()) {
         MutableTreeNode[] nodes = lazyNode.loadChildren(model);
         ((DefaultMutableTreeNode) lazyNode).setAllowsChildren(nodes != null && nodes.length > 0);
@@ -87,7 +85,7 @@ public class LazyLoadingTreeExpander implements TreeWillExpandListener {
   /**
    * Define nodes children.
    *
-   * @param lazyNode DOCUMENT_ME
+   * @param lazyNode 
    * @param nodes new nodes
    */
   private void setChildren(LazyLoadingTreeNode lazyNode, MutableTreeNode... nodes) {
diff --git a/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java b/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java
index 8ca2021..b7a0418 100644
--- a/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java
+++ b/src/main/java/org/jajuk/ui/helpers/LazyLoadingTreeNode.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -31,7 +31,6 @@ import javax.swing.tree.MutableTreeNode;
  * created a lot.
  */
 public abstract class LazyLoadingTreeNode extends DefaultMutableTreeNode {
-  
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -73,7 +72,7 @@ public abstract class LazyLoadingTreeNode extends DefaultMutableTreeNode {
    * This method will be executed in a background thread. If you have to do some
    * GUI stuff use {@link SwingUtilities#invokeLater(Runnable)}
    * 
-   * @param model DOCUMENT_ME
+   * @param model 
    * 
    * @return The created nodes.
    */
diff --git a/src/main/java/org/jajuk/ui/helpers/ManualDeviceRefreshReporter.java b/src/main/java/org/jajuk/ui/helpers/ManualDeviceRefreshReporter.java
index a232654..5ee1bc0 100644
--- a/src/main/java/org/jajuk/ui/helpers/ManualDeviceRefreshReporter.java
+++ b/src/main/java/org/jajuk/ui/helpers/ManualDeviceRefreshReporter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -39,18 +39,14 @@ import org.jajuk.util.log.Log;
  * Refresh reporter with GUI special operations.
  */
 public class ManualDeviceRefreshReporter extends RefreshReporter {
-
   // Refresh dialog
-  /** DOCUMENT_ME. */
   private RefreshDialog rdialog;
-
-  /** DOCUMENT_ME. */
   private int progress;
 
   /**
    * Instantiates a new manual device refresh reporter.
    * 
-   * @param device DOCUMENT_ME
+   * @param device 
    */
   public ManualDeviceRefreshReporter(Device device) {
     super(device);
@@ -70,10 +66,10 @@ public class ManualDeviceRefreshReporter extends RefreshReporter {
         public void run() {
           // if <0 directories count -> the progress bar is in indeterminate
           // state
-          rdialog = new RefreshDialog((dirTotal < 0));
-          rdialog.setTitle(Messages.getString("RefreshDialog.2") + " " + device.getName());
-          rdialog.setAction(Messages.getString("RefreshDialog.3"), IconLoader
-              .getIcon(JajukIcons.INFO));
+          rdialog = new RefreshDialog((dirTotal < 0), Messages.getString("RefreshDialog.2") + " "
+              + device.getName());
+          rdialog.setAction(Messages.getString("RefreshDialog.3"),
+              IconLoader.getIcon(JajukIcons.INFO));
         }
       });
     } catch (InterruptedException e) {
@@ -92,7 +88,6 @@ public class ManualDeviceRefreshReporter extends RefreshReporter {
   public void reset() {
     super.reset();
     this.progress = 0;
-
   }
 
   /*
@@ -121,8 +116,8 @@ public class ManualDeviceRefreshReporter extends RefreshReporter {
   @Override
   public void updateState(Directory dir) {
     if (rdialog != null) {
-      rdialog.setRefreshing(new StringBuilder(Messages.getString("Device.44")).append(' ').append(
-          dir.getRelativePath()).toString());
+      rdialog.setRefreshing(new StringBuilder(Messages.getString("Device.44")).append(' ')
+          .append(dir.getRelativePath()).toString());
       progress = 30 + (int) (70 * (float) dirCount / dirTotal);
       if (progress > 100) {
         progress = 100;
@@ -164,7 +159,6 @@ public class ManualDeviceRefreshReporter extends RefreshReporter {
 
   /** This timer limit dialog title changes (this can have side effect on performances or other in some window managers. Too many window title change causes others menu bar items freezes under KDE for ie) */
   Timer updateDialogTitle = new Timer(1000, new ActionListener() {
-
     @Override
     public void actionPerformed(ActionEvent e) {
       String sTitle = Messages.getString("RefreshDialog.2") + " " + device.getName() + " ("
@@ -173,7 +167,5 @@ public class ManualDeviceRefreshReporter extends RefreshReporter {
         rdialog.setTitle(sTitle);
       }
     }
-
   });
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/ManualDirectoryRefreshReporter.java b/src/main/java/org/jajuk/ui/helpers/ManualDirectoryRefreshReporter.java
index 572b499..b04faea 100644
--- a/src/main/java/org/jajuk/ui/helpers/ManualDirectoryRefreshReporter.java
+++ b/src/main/java/org/jajuk/ui/helpers/ManualDirectoryRefreshReporter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -29,11 +29,10 @@ import org.jajuk.util.log.Log;
  * Refresh reporter on directories with GUI special operations.
  */
 public class ManualDirectoryRefreshReporter extends RefreshReporter {
-
   /**
    * Instantiates a new manual directory refresh reporter.
    * 
-   * @param device DOCUMENT_ME
+   * @param device 
    */
   public ManualDirectoryRefreshReporter(Device device) {
     super(device);
diff --git a/src/main/java/org/jajuk/ui/helpers/PatternInputVerifier.java b/src/main/java/org/jajuk/ui/helpers/PatternInputVerifier.java
index c10625b..666c252 100644
--- a/src/main/java/org/jajuk/ui/helpers/PatternInputVerifier.java
+++ b/src/main/java/org/jajuk/ui/helpers/PatternInputVerifier.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.Locale;
@@ -37,7 +36,6 @@ import org.jajuk.util.Messages;
  * create at least one directory to avoid mess on disk
  */
 public class PatternInputVerifier extends InputVerifier {
-
   /*
    * (non-Javadoc)
    * 
@@ -65,5 +63,4 @@ public class PatternInputVerifier extends InputVerifier {
   public boolean shouldYieldFocus(JComponent input) {
     return verify(input);
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/helpers/PlayHighlighterPredicate.java b/src/main/java/org/jajuk/ui/helpers/PlayHighlighterPredicate.java
index 54d87b2..75429c6 100644
--- a/src/main/java/org/jajuk/ui/helpers/PlayHighlighterPredicate.java
+++ b/src/main/java/org/jajuk/ui/helpers/PlayHighlighterPredicate.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -27,6 +27,8 @@ import org.jajuk.base.File;
 import org.jajuk.base.Item;
 import org.jajuk.base.Track;
 import org.jajuk.services.players.QueueModel;
+import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.ui.widgets.JajukTable;
 import org.jdesktop.swingx.decorator.ComponentAdapter;
 import org.jdesktop.swingx.decorator.HighlightPredicate;
 
@@ -35,17 +37,17 @@ import org.jdesktop.swingx.decorator.HighlightPredicate;
  * if the item at given row is playing.
  */
 public class PlayHighlighterPredicate implements HighlightPredicate {
-
-  /** DOCUMENT_ME. */
   private final JajukTableModel model;
+  private final JajukTable jtable;
 
   /**
    * Instantiates a new play highlighter predicate.
    * 
-   * @param model DOCUMENT_ME
+   * @param jtable the table the predicate apple
    */
-  public PlayHighlighterPredicate(JajukTableModel model) {
-    this.model = model;
+  public PlayHighlighterPredicate(final JajukTable jtable) {
+    this.jtable = jtable;
+    this.model = (JajukTableModel) jtable.getModel();
   }
 
   /* (non-Javadoc)
@@ -56,7 +58,17 @@ public class PlayHighlighterPredicate implements HighlightPredicate {
     if (QueueModel.isStopped()) {
       return false;
     }
-    Item item = model.getItemAt(adapter.row);
+    int convertedRow = jtable.convertRowIndexToModel(adapter.row);
+    // For some reasons, we get OutOfBoundException here when the model is updated, 
+    // so we enforce a boundaries test :
+    if (convertedRow >= model.getRowCount()) {
+      return false;
+    }
+    if (model instanceof WebRadioTableModel) {
+      WebRadio radio = (WebRadio) model.getItemAt(convertedRow);
+      return QueueModel.isPlayingRadio() && QueueModel.getCurrentRadio().equals(radio);
+    }
+    Item item = model.getItemAt(convertedRow);
     if (item instanceof File && QueueModel.getPlayingFile() != null) {
       File file = (File) item;
       if (file.equals(QueueModel.getPlayingFile())) {
diff --git a/src/main/java/org/jajuk/ui/helpers/PlayerStateMediator.java b/src/main/java/org/jajuk/ui/helpers/PlayerStateMediator.java
index c8ca4d3..600970a 100644
--- a/src/main/java/org/jajuk/ui/helpers/PlayerStateMediator.java
+++ b/src/main/java/org/jajuk/ui/helpers/PlayerStateMediator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -48,7 +48,6 @@ import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.MuteAction;
-import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
@@ -61,10 +60,8 @@ import org.jajuk.util.log.Log;
  * buttons state) accordingly.
  */
 public class PlayerStateMediator implements Observer {
-
   /** Singleton. */
   private static PlayerStateMediator self = new PlayerStateMediator();
-
   // Register this item, do not do this in the constructor as the instance is not yet available
   static {
     ObservationManager.register(self);
@@ -106,10 +103,8 @@ public class PlayerStateMediator implements Observer {
     eventSubjectSet.add(JajukEvents.VOLUME_CHANGED);
     eventSubjectSet.add(JajukEvents.MUTE_STATE);
     eventSubjectSet.add(JajukEvents.SHOW_CURRENTLY_PLAYING);
-
     // for notification display
     eventSubjectSet.add(JajukEvents.FILE_LAUNCHED);
-
     return eventSubjectSet;
   }
 
@@ -134,13 +129,12 @@ public class PlayerStateMediator implements Observer {
           ActionManager.getAction(PREVIOUS_ALBUM).setEnabled(bQueueNotVoid);
           ActionManager.getAction(PREVIOUS_TRACK).setEnabled(bQueueNotVoid);
           ActionManager.getAction(NEXT_TRACK).setEnabled(bQueueNotVoid);
-
           setToPlay();
           ActionManager.getAction(STOP_TRACK).setEnabled(false);
           ActionManager.getAction(FORWARD_TRACK).setEnabled(false);
           ActionManager.getAction(FINISH_ALBUM).setEnabled(false);
           // reset startup position
-          Conf.setProperty(Const.CONF_STARTUP_LAST_POSITION, "0");
+          UtilFeatures.storePersistedPlayingPosition(0f);
         } else if (JajukEvents.ZERO.equals(subject)) {
           ActionManager.getAction(PREVIOUS_TRACK).setEnabled(false);
           ActionManager.getAction(NEXT_TRACK).setEnabled(false);
@@ -153,7 +147,7 @@ public class PlayerStateMediator implements Observer {
           ActionManager.getAction(FINISH_ALBUM).setEnabled(false);
           setToPlay();
           // reset startup position
-          Conf.setProperty(Const.CONF_STARTUP_LAST_POSITION, "0");
+          UtilFeatures.storePersistedPlayingPosition(0f);
           ActionManager.getAction(FINISH_ALBUM).setEnabled(true);
         } else if (JajukEvents.PLAYER_PLAY.equals(subject)) {
           ActionManager.getAction(PREVIOUS_TRACK).setEnabled(true);
@@ -203,7 +197,6 @@ public class PlayerStateMediator implements Observer {
           ActionManager.getAction(PAUSE_RESUME_TRACK).setEnabled(true);
           setToPause();
           ActionManager.getAction(STOP_TRACK).setEnabled(true);
-
           // display a system notification if specified
           INotificator notifier = NotificatorFactory.getNotificator();
           if (notifier != null) {
@@ -225,7 +218,6 @@ public class PlayerStateMediator implements Observer {
               Log.debug("No id found on FILE_LAUNCHED");
               return;
             }
-
             File file = FileManager.getInstance().getFileByID(id);
             Log.debug("Got update for new file launched, item: {{" + file + "}}. Sending text: {{"
                 + QueueModel.getCurrentFileTitle() + "}}");
@@ -245,7 +237,6 @@ public class PlayerStateMediator implements Observer {
             }
           }
         }
-
         // For all events except Volume Change/Mute, refresh the queue
         if (!JajukEvents.VOLUME_CHANGED.equals(subject) && !JajukEvents.MUTE_STATE.equals(subject)
             && !JajukEvents.FILE_LAUNCHED.equals(subject)
@@ -272,5 +263,4 @@ public class PlayerStateMediator implements Observer {
     ActionManager.getAction(PAUSE_RESUME_TRACK).setIcon(IconLoader.getIcon(JajukIcons.PLAYER_PLAY));
     ActionManager.getAction(PAUSE_RESUME_TRACK).setName(Messages.getString("JajukWindow.12"));
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java b/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java
index ac39b7f..f97b678 100644
--- a/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java
+++ b/src/main/java/org/jajuk/ui/helpers/PlaylistEditorTransferHandler.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.datatransfer.DataFlavor;
@@ -43,16 +42,14 @@ import org.jajuk.util.log.Log;
 /**
  * DND handler for table.
  */
-
 public class PlaylistEditorTransferHandler extends TableTransferHandler {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
   /**
    * Constructor.
    * 
-   * @param jtable DOCUMENT_ME
+   * @param jtable 
    */
   public PlaylistEditorTransferHandler(final JajukTable jtable) {
     super(jtable);
@@ -61,8 +58,8 @@ public class PlaylistEditorTransferHandler extends TableTransferHandler {
   /**
    * Called when dropping.
    * 
-   * @param c DOCUMENT_ME
-   * @param t DOCUMENT_ME
+   * @param c 
+   * @param t 
    * 
    * @return true, if import data
    */
@@ -100,7 +97,6 @@ public class PlaylistEditorTransferHandler extends TableTransferHandler {
               .getTransferData(TransferableAlbum.ALBUM_FLAVOR);
           oData = ttn.getUserObject();
         }
-
         List<File> alSelectedFiles = null;
         try {
           alSelectedFiles = UtilFeatures.getFilesForItems((List<Item>) oData);
@@ -109,7 +105,6 @@ public class PlaylistEditorTransferHandler extends TableTransferHandler {
           Messages.showErrorMessage(je.getCode());
           return false;
         }
-
         // If we get zero playing files, just leave, do not display a dummy message in Queue code:
         if (alSelectedFiles.size() == 0) {
           return false;
@@ -119,19 +114,18 @@ public class PlaylistEditorTransferHandler extends TableTransferHandler {
         if (row < 0) {
           row = plf.getFiles().size();
         }
-
         // queue case
         if (plf.getType() == Playlist.Type.QUEUE) {
           // If user selected "push on drop" option just push the selection
           if (Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_DROP)) {
-            QueueModel.push(UtilFeatures.createStackItems(UtilFeatures
-                .applyPlayOption(alSelectedFiles), Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL),
-                true), true);
+            QueueModel.push(
+                UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(alSelectedFiles),
+                    Conf.getBoolean(Const.CONF_STATE_REPEAT), true), true);
           } else {
             // Insert the selection at drop target
-            QueueModel.insert(UtilFeatures.createStackItems(UtilFeatures
-                .applyPlayOption(alSelectedFiles), Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL),
-                true), row);
+            QueueModel.insert(
+                UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(alSelectedFiles),
+                    Conf.getBoolean(Const.CONF_STATE_REPEAT), true), row);
           }
         }
         // normal or new playlist case
@@ -155,7 +149,6 @@ public class PlaylistEditorTransferHandler extends TableTransferHandler {
       jtable.getSelectionModel().setValueIsAdjusting(false);
     }
     return false;
-
   }
 
   /* (non-Javadoc)
@@ -176,5 +169,4 @@ public class PlaylistEditorTransferHandler extends TableTransferHandler {
     }
     return false;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/PlaylistRepositoryTableModel.java b/src/main/java/org/jajuk/ui/helpers/PlaylistRepositoryTableModel.java
index e67e64d..b34825b 100644
--- a/src/main/java/org/jajuk/ui/helpers/PlaylistRepositoryTableModel.java
+++ b/src/main/java/org/jajuk/ui/helpers/PlaylistRepositoryTableModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,11 +16,14 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
+
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -44,7 +47,6 @@ import org.jajuk.util.filters.JajukPredicates;
  * Table model used holding playlist repository data.
  */
 public class PlaylistRepositoryTableModel extends JajukTableModel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -59,19 +61,14 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
     // for proper display in some look and feel
     vColNames.add(" ");
     idList.add(Const.XML_PLAY);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_NAME));
     idList.add(Const.XML_NAME);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_DEVICE));
     idList.add(Const.XML_DEVICE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_DIRECTORY));
     idList.add(Const.XML_DIRECTORY);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_PATH));
     idList.add(Const.XML_PATH);
-
     // custom properties now
     for (PropertyMetaInformation meta : PlaylistManager.getInstance().getCustomProperties()) {
       vColNames.add(meta.getName());
@@ -85,26 +82,50 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
    * For now, this table will not be editable (except for custom properties) for
    * complexity reasons. This may be implemented in the future if required
    * </p>
-   * 
-   * @param sPropertyName DOCUMENT_ME
-   * @param sPattern DOCUMENT_ME
-   * @param columnsToShow DOCUMENT_ME
+   *
+   * @param sPropertyName 
+   * @param sPattern 
+   * @param columnsToShow 
    */
   @Override
-  @SuppressWarnings("unchecked")
-  public void populateModel(String sPropertyName, String sPattern, List<String> columnsToShow) {
+  public void populateModel(final String sPropertyName, final String sPattern,
+      final List<String> columnsToShow) {
     List<Playlist> alToShow = PlaylistManager.getInstance().getPlaylists();
     // OK, begin by filtering using any provided pattern
-    Filter filter = new Filter(sPropertyName, sPattern, true, Conf.getBoolean(Const.CONF_REGEXP));
-    Filter.filterItems(alToShow, filter);
-
-    // filter unavailable playlists
+    // Regular filtering for natural properties registrated as a playlist intern property
+    if (PlaylistManager.getInstance().getMetaInformation(sPropertyName) != null) {
+      Filter filter = new Filter(sPropertyName, sPattern, true, Conf.getBoolean(Const.CONF_REGEXP));
+      alToShow = Filter.filterItems(alToShow, filter, Playlist.class);
+      // Filter against the device attribute
+    } else if (Const.XML_DEVICE.equals(sPropertyName)) {
+      alToShow = new ArrayList<Playlist>(Collections2.filter(alToShow, new Predicate<Playlist>() {
+        @Override
+        public boolean apply(Playlist playlist) {
+          return playlist.getDirectory().getDevice().getName().toLowerCase()
+              .contains(sPattern.toLowerCase());
+        }
+      }));
+      // Filter against the PATH attribute
+    } else if (Const.XML_PATH.equals(sPropertyName)) {
+      alToShow = new ArrayList<Playlist>(Collections2.filter(alToShow, new Predicate<Playlist>() {
+        @Override
+        public boolean apply(Playlist playlist) {
+          return playlist.getAbsolutePath().toLowerCase().contains(sPattern.toLowerCase());
+        }
+      }));
+      // Filter against "any"
+    } else if (Const.XML_ANY.equals(sPropertyName)) {
+      alToShow = new ArrayList<Playlist>(Collections2.filter(alToShow, new Predicate<Playlist>() {
+        @Override
+        public boolean apply(Playlist playlist) {
+          return playlist.getAny().toLowerCase().contains(sPattern.toLowerCase());
+        }
+      }));
+    } // filter unavailable playlists
     if (Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED)) {
       CollectionUtils.filter(alToShow, new JajukPredicates.ReadyPlaylistPredicate());
     }
-
     Iterator<Playlist> it = null;
-
     int iColNum = iNumberStandardCols + PlaylistManager.getInstance().getCustomProperties().size();
     iRowNum = alToShow.size();
     oValues = new Object[iRowNum][iColNum];
@@ -112,18 +133,15 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
     bCellEditable = new boolean[iRowNum][iColNum];
     // Allow only custom properties edition
     bEditable = true;
-
     // For perfs, prepare columns visibility
     boolean bName = (columnsToShow != null && columnsToShow.contains(Const.XML_NAME));
     boolean bDevice = (columnsToShow != null && columnsToShow.contains(Const.XML_DEVICE));
     boolean bDirectory = (columnsToShow != null && columnsToShow.contains(Const.XML_DIRECTORY));
     boolean bPath = (columnsToShow != null && columnsToShow.contains(Const.XML_PATH));
-
     it = alToShow.iterator();
     for (int iRow = 0; it.hasNext(); iRow++) {
       Playlist plf = it.next();
       setItemAt(iRow, plf);
-      Map<String, Object> properties = plf.getProperties();
       // Id
       oItems[iRow] = plf;
       // Play
@@ -137,7 +155,6 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
       // change
       oValues[iRow][0] = il;
       bCellEditable[iRow][0] = false;
-
       // Playlist Name
       if (bName) {
         oValues[iRow][1] = plf.getName();
@@ -145,7 +162,6 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
         oValues[iRow][1] = "";
       }
       bCellEditable[iRow][1] = false;
-
       // Device
       if (bDevice) {
         Device device = plf.getDirectory().getDevice();
@@ -154,7 +170,6 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
         oValues[iRow][2] = "";
       }
       bCellEditable[iRow][2] = false;
-
       // Directory
       if (bDirectory) {
         Directory directory = plf.getDirectory();
@@ -163,7 +178,6 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
         oValues[iRow][3] = "";
       }
       bCellEditable[iRow][3] = false;
-
       // PATH
       if (bPath) {
         String path = plf.getAbsolutePath();
@@ -172,11 +186,12 @@ public class PlaylistRepositoryTableModel extends JajukTableModel {
         oValues[iRow][4] = "";
       }
       bCellEditable[iRow][4] = false;
-
       // Custom properties now
-      Iterator it2 = PlaylistManager.getInstance().getCustomProperties().iterator();
+      Map<String, Object> properties = plf.getProperties();
+      Iterator<PropertyMetaInformation> it2 = PlaylistManager.getInstance().getCustomProperties()
+          .iterator();
       for (int i = 0; it2.hasNext(); i++) {
-        PropertyMetaInformation meta = (PropertyMetaInformation) it2.next();
+        PropertyMetaInformation meta = it2.next();
         Object o = properties.get(meta.getName());
         if (o != null) {
           oValues[iRow][iNumberStandardCols + i] = o;
diff --git a/src/main/java/org/jajuk/ui/helpers/PlaylistTableModel.java b/src/main/java/org/jajuk/ui/helpers/PlaylistTableModel.java
index 51f62e7..1158ce1 100644
--- a/src/main/java/org/jajuk/ui/helpers/PlaylistTableModel.java
+++ b/src/main/java/org/jajuk/ui/helpers/PlaylistTableModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -30,7 +30,6 @@ import org.jajuk.base.FileManager;
 import org.jajuk.base.Item;
 import org.jajuk.base.PropertyMetaInformation;
 import org.jajuk.base.TrackManager;
-import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
 import org.jajuk.ui.widgets.IconLabel;
 import org.jajuk.util.Const;
@@ -41,26 +40,22 @@ import org.jajuk.util.Messages;
  * Playlist model used in queue view or playlist view.
  */
 public class PlaylistTableModel extends JajukTableModel {
-
   /** Values. */
   private List<StackItem> alItems = new ArrayList<StackItem>(10);
-
   /** Values planned. */
   private List<StackItem> alPlanned = new ArrayList<StackItem>(10);
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Whether this model is used by a Queue View. */
   private boolean bQueue = false;
 
   /**
    * Instantiates a new playlist table model.
    * 
-   * @param bQueue DOCUMENT_ME
+   * @param bQueue 
    */
   public PlaylistTableModel(boolean bQueue) {
-    super(17);
+    super(18);
     this.bQueue = bQueue;
     setEditable(false); // table not editable
     prepareColumns();
@@ -69,7 +64,7 @@ public class PlaylistTableModel extends JajukTableModel {
   /**
    * Need to overwrite this method for drag and drop.
    * 
-   * @param iRow DOCUMENT_ME
+   * @param iRow 
    * 
    * @return the item at
    */
@@ -85,7 +80,7 @@ public class PlaylistTableModel extends JajukTableModel {
   /**
    * Return all stack items from this value to the end of selection.
    * 
-   * @param index DOCUMENT_ME
+   * @param index 
    * 
    * @return an arraylist of stack items or null if index is out of bounds
    */
@@ -100,7 +95,7 @@ public class PlaylistTableModel extends JajukTableModel {
   /**
    * Return right stack item in normal or planned stacks.
    * 
-   * @param index DOCUMENT_ME
+   * @param index 
    * 
    * @return the stack item
    */
@@ -123,80 +118,64 @@ public class PlaylistTableModel extends JajukTableModel {
   public final void prepareColumns() {
     vColNames.clear();
     idList.clear();
-
     // State icon (play/repeat/planned)
     vColNames.add("");
     idList.add(Const.XML_PLAY);
-
     // Track name
     // Note we display "title" and not "name" for this property for
     // clearness
     vColNames.add(Messages.getString("AbstractPlaylistEditorView.0"));
     idList.add(Const.XML_TRACK_NAME);
-
     // Album
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_ALBUM));
     idList.add(Const.XML_TRACK_ALBUM);
-
     // Artist
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_ARTIST));
     idList.add(Const.XML_TRACK_ARTIST);
-
     // Artist
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ALBUM_ARTIST));
     idList.add(Const.XML_ALBUM_ARTIST);
-
     // Genre
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_GENRE));
     idList.add(Const.XML_TRACK_GENRE);
-
     // Stars
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_RATE));
     idList.add(Const.XML_TRACK_RATE);
-
     // Year
     vColNames.add(Messages.getHumanPropertyName(Const.XML_YEAR));
     idList.add(Const.XML_YEAR);
-
     // Length
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_LENGTH));
     idList.add(Const.XML_TRACK_LENGTH);
-
     // comments
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_COMMENT));
     idList.add(Const.XML_TRACK_COMMENT);
-
     // Added date
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_DISCOVERY_DATE));
     idList.add(Const.XML_TRACK_DISCOVERY_DATE);
-
     // Order
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_ORDER));
     idList.add(Const.XML_TRACK_ORDER);
-
     // Disc number
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_DISC_NUMBER));
     idList.add(Const.XML_TRACK_DISC_NUMBER);
-
     // Device
     vColNames.add(Messages.getHumanPropertyName(Const.XML_DEVICE));
     idList.add(Const.XML_DEVICE);
-
     // Directory
     vColNames.add(Messages.getHumanPropertyName(Const.XML_DIRECTORY));
     idList.add(Const.XML_DIRECTORY);
-
     // File name
     vColNames.add(Messages.getString("Property_filename"));
     idList.add(Const.XML_FILE);
-
     // Hits
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_HITS));
     idList.add(Const.XML_TRACK_HITS);
-
+    // File size
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_SIZE));
+    idList.add(Const.XML_SIZE);
     // custom properties now
     // for tracks
-
     for (PropertyMetaInformation meta : TrackManager.getInstance().getCustomProperties()) {
       vColNames.add(meta.getName());
       idList.add(meta.getName());
@@ -211,9 +190,9 @@ public class PlaylistTableModel extends JajukTableModel {
   /**
    * Fill model with data using an optional filter property.
    * 
-   * @param sPropertyName DOCUMENT_ME
-   * @param sPattern DOCUMENT_ME
-   * @param columnsToShow DOCUMENT_ME
+   * @param sPropertyName 
+   * @param sPattern 
+   * @param columnsToShow 
    */
   @Override
   public void populateModel(String sPropertyName, String sPattern, List<String> columnsToShow) {
@@ -221,7 +200,6 @@ public class PlaylistTableModel extends JajukTableModel {
     oValues = new Object[iRowNum][iNumberStandardCols
         + TrackManager.getInstance().getCustomProperties().size()
         + FileManager.getInstance().getCustomProperties().size()];
-
     // For perfs, prepare columns visibility
     boolean bName = (columnsToShow != null && columnsToShow.contains(Const.XML_NAME));
     boolean bAlbum = (columnsToShow != null && columnsToShow.contains(Const.XML_ALBUM));
@@ -241,10 +219,9 @@ public class PlaylistTableModel extends JajukTableModel {
     boolean bDirectory = (columnsToShow != null && columnsToShow.contains(Const.XML_DIRECTORY));
     boolean bDevice = (columnsToShow != null && columnsToShow.contains(Const.XML_DEVICE));
     boolean bFileName = (columnsToShow != null && columnsToShow.contains(Const.XML_FILE));
-
+    boolean bFileSize = (columnsToShow != null && columnsToShow.contains(Const.XML_SIZE));
     for (int iRow = 0; iRow < iRowNum; iRow++) {
       StackItem item = getStackItem(iRow);
-
       // Play
       if (bQueue) {
         if (item.isPlanned()) {
@@ -252,9 +229,6 @@ public class PlaylistTableModel extends JajukTableModel {
         } else if (item.isRepeat()) {
           // normal file, repeated
           oValues[iRow][0] = IconLabel.getIconLabel(JajukIcons.TRACK_FIFO_REPEAT);
-        } else if (iRow == QueueModel.getIndex()) {
-          // Played file
-          oValues[iRow][0] = IconLabel.getIconLabel(JajukIcons.TRACK_FIFO_PLAYING);
         } else {
           // normal file, not repeated
           oValues[iRow][0] = IconLabel.getIconLabel(JajukIcons.TRACK_FIFO_NORM);
@@ -262,129 +236,117 @@ public class PlaylistTableModel extends JajukTableModel {
       } else {
         oValues[iRow][0] = IconLabel.getIconLabel(JajukIcons.TRACK_FIFO_NORM);
       }
-
       File bf = item.getFile();
-
       // Track name
       if (bName) {
         oValues[iRow][1] = bf.getTrack().getName();
       } else {
         oValues[iRow][1] = "";
       }
-
       // Album
       if (bAlbum) {
         oValues[iRow][2] = bf.getTrack().getAlbum().getName2();
       } else {
         oValues[iRow][2] = "";
       }
-
       // Artist
       if (bArtist) {
         oValues[iRow][3] = bf.getTrack().getArtist().getName2();
       } else {
         oValues[iRow][3] = "";
       }
-
       // AlbumArtist
       if (bAlbumArtist) {
         oValues[iRow][4] = bf.getTrack().getAlbumArtist().getName2();
       } else {
         oValues[iRow][4] = "";
       }
-
       // Genre
       if (bGenre) {
         oValues[iRow][5] = bf.getTrack().getGenre().getName2();
       } else {
         oValues[iRow][5] = "";
       }
-
       // Rate
       if (bRate) {
         oValues[iRow][6] = StarsHelper.getStarIconLabel(bf.getTrack());
       } else {
         oValues[iRow][6] = "";
       }
-
       // Year
       if (bYear) {
         oValues[iRow][7] = bf.getTrack().getYear();
       } else {
         oValues[iRow][7] = "";
       }
-
       // Length
       if (bLength) {
         oValues[iRow][8] = new Duration(bf.getTrack().getDuration());
       } else {
         oValues[iRow][8] = "";
       }
-
       // Comment
       if (bComment) {
         oValues[iRow][9] = bf.getTrack().getStringValue(Const.XML_TRACK_COMMENT);
       } else {
         oValues[iRow][9] = "";
       }
-
       // Date discovery
       if (bDiscovery) {
         oValues[iRow][10] = bf.getTrack().getDiscoveryDate();
       } else {
         oValues[iRow][10] = "";
       }
-
       // Order
       if (bOrder) {
         oValues[iRow][11] = bf.getTrack().getOrder();
       } else {
         oValues[iRow][11] = "";
       }
-
       // Disc number
       if (bDiscNumber) {
         oValues[iRow][12] = bf.getTrack().getDiscNumber();
       } else {
         oValues[iRow][12] = "";
       }
-
       // Device name
       if (bDevice) {
         oValues[iRow][13] = bf.getDevice().getName();
       } else {
         oValues[iRow][13] = "";
       }
-
       // directory name
       if (bDirectory) {
         oValues[iRow][14] = bf.getDirectory().getName();
       } else {
         oValues[iRow][14] = "";
       }
-
       // file name
       if (bFileName) {
         oValues[iRow][15] = bf.getName();
       } else {
         oValues[iRow][15] = "";
       }
-
       // Hits
       if (bHits) {
         oValues[iRow][16] = bf.getTrack().getHits();
       } else {
         oValues[iRow][16] = "";
       }
-
+      // file size
+      if (bFileSize) {
+        oValues[iRow][17] = Math.round(bf.getSize() / 10485.76) / 100f;
+      } else {
+        oValues[iRow][17] = "";
+      }
       // Custom properties now
       // for tracks
+      Map<String, Object> trackProperties = bf.getTrack().getProperties();
       Iterator<PropertyMetaInformation> it2 = TrackManager.getInstance().getCustomProperties()
           .iterator();
       for (int i = 0; it2.hasNext(); i++) {
         PropertyMetaInformation meta = it2.next();
-        Map<String, Object> properties = bf.getTrack().getProperties();
-        Object o = properties.get(meta.getName());
+        Object o = trackProperties.get(meta.getName());
         if (o != null) {
           oValues[iRow][iNumberStandardCols + i] = o;
         } else {
@@ -392,12 +354,12 @@ public class PlaylistTableModel extends JajukTableModel {
         }
       }
       // for files
+      Map<String, Object> bfProperties = bf.getProperties();
       it2 = FileManager.getInstance().getCustomProperties().iterator();
       // note that index lust start at custom track properties size
       for (int i = TrackManager.getInstance().getCustomProperties().size(); it2.hasNext(); i++) {
         PropertyMetaInformation meta = it2.next();
-        Map<String, Object> properties = bf.getProperties();
-        Object o = properties.get(meta.getName());
+        Object o = bfProperties.get(meta.getName());
         if (o != null) {
           oValues[iRow][iNumberStandardCols + i] = o;
         } else {
diff --git a/src/main/java/org/jajuk/ui/helpers/PreferencesJMenu.java b/src/main/java/org/jajuk/ui/helpers/PreferencesJMenu.java
index dc89358..27591c7 100644
--- a/src/main/java/org/jajuk/ui/helpers/PreferencesJMenu.java
+++ b/src/main/java/org/jajuk/ui/helpers/PreferencesJMenu.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -31,6 +31,8 @@ import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.JajukActions;
 import org.jajuk.ui.helpers.FontManager.JajukFont;
 import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilFeatures;
 
@@ -38,41 +40,22 @@ import org.jajuk.util.UtilFeatures;
  * Preference menu item including ban/unban and preference choice.
  */
 public class PreferencesJMenu extends JMenu {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -4041513018474249903L;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiBan;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiUnBan;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiAdore;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiLove;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiLike;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiUnset;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiAverage;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiPoor;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiHate;
 
   /**
    * Constructs a Preference menu.
    * 
-   * @param item DOCUMENT_ME
+   * @param item 
    */
   public PreferencesJMenu(Item item) {
     super(Messages.getString("Preference.7"));
@@ -94,61 +77,58 @@ public class PreferencesJMenu extends JMenu {
   /**
    * initUI.
    * 
-   * @param selection DOCUMENT_ME
+   * @param selection 
    */
   private void initUI(List<? extends Item> selection) {
     // We compute preference of first item in selection to set right
     // item bold font
     long selectionPreference = UtilFeatures.getPreferenceForSelection(selection);
-
     jmiBan = new JMenuItem(ActionManager.getAction(JajukActions.BAN_SELECTION));
     jmiBan.putClientProperty(Const.DETAIL_SELECTION, selection);
-
     jmiUnBan = new JMenuItem(ActionManager.getAction(JajukActions.UN_BAN_SELECTION));
     jmiUnBan.putClientProperty(Const.DETAIL_SELECTION, selection);
-
     jmiAdore = new JMenuItem(ActionManager.getAction(JajukActions.PREFERENCE_ADORE));
     jmiAdore.putClientProperty(Const.DETAIL_SELECTION, selection);
     if (selectionPreference == Const.PREFERENCE_ADORE) {
       jmiAdore.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+      setIcon(IconLoader.getIcon(JajukIcons.PREFERENCE_ADORE));
     }
-
     jmiLove = new JMenuItem(ActionManager.getAction(JajukActions.PREFERENCE_LOVE));
     jmiLove.putClientProperty(Const.DETAIL_SELECTION, selection);
     if (selectionPreference == Const.PREFERENCE_LOVE) {
       jmiLove.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+      setIcon(IconLoader.getIcon(JajukIcons.PREFERENCE_LOVE));
     }
-
     jmiLike = new JMenuItem(ActionManager.getAction(JajukActions.PREFERENCE_LIKE));
     jmiLike.putClientProperty(Const.DETAIL_SELECTION, selection);
     if (selectionPreference == Const.PREFERENCE_LIKE) {
       jmiLike.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+      setIcon(IconLoader.getIcon(JajukIcons.PREFERENCE_LIKE));
     }
-
     jmiUnset = new JMenuItem(ActionManager.getAction(JajukActions.PREFERENCE_UNSET));
     jmiUnset.putClientProperty(Const.DETAIL_SELECTION, selection);
     if (selectionPreference == Const.PREFERENCE_UNSET) {
       jmiUnset.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+      setIcon(IconLoader.getIcon(JajukIcons.PREFERENCE_UNSET));
     }
-
     jmiAverage = new JMenuItem(ActionManager.getAction(JajukActions.PREFERENCE_AVERAGE));
     jmiAverage.putClientProperty(Const.DETAIL_SELECTION, selection);
     if (selectionPreference == Const.PREFERENCE_AVERAGE) {
       jmiAverage.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+      setIcon(IconLoader.getIcon(JajukIcons.PREFERENCE_AVERAGE));
     }
-
     jmiPoor = new JMenuItem(ActionManager.getAction(JajukActions.PREFERENCE_POOR));
     jmiPoor.putClientProperty(Const.DETAIL_SELECTION, selection);
     if (selectionPreference == Const.PREFERENCE_POOR) {
       jmiPoor.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+      setIcon(IconLoader.getIcon(JajukIcons.PREFERENCE_POOR));
     }
-
     jmiHate = new JMenuItem(ActionManager.getAction(JajukActions.PREFERENCE_HATE));
     jmiHate.putClientProperty(Const.DETAIL_SELECTION, selection);
     if (selectionPreference == Const.PREFERENCE_HATE) {
       jmiHate.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+      setIcon(IconLoader.getIcon(JajukIcons.PREFERENCE_HATE));
     }
-
     add(jmiBan);
     add(jmiUnBan);
     addSeparator();
@@ -168,11 +148,10 @@ public class PreferencesJMenu extends JMenu {
    * in valueChanged() method as we can't build a popup menu in mouse adapter
    * methods because the selection is not always yet set
    * 
-   * @param selection DOCUMENT_ME
+   * @param selection 
    */
   public synchronized void resetUI(List<? extends Item> selection) {
     removeAll();
     initUI(selection);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/RefreshReporter.java b/src/main/java/org/jajuk/ui/helpers/RefreshReporter.java
index 44224b4..76ebb81 100644
--- a/src/main/java/org/jajuk/ui/helpers/RefreshReporter.java
+++ b/src/main/java/org/jajuk/ui/helpers/RefreshReporter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.List;
@@ -34,29 +33,22 @@ import org.jajuk.util.log.Log;
  * Is responsible to manage various UI items changed during refreshing.
  */
 public class RefreshReporter {
-
-  /** DOCUMENT_ME. */
   protected Device device;
-
-  /** DOCUMENT_ME. */
   protected int dirTotal;
-
-  /** DOCUMENT_ME. */
   protected int dirCount;
-
   /** Actual refresh date start*. */
   protected long lRefreshDateStart;
-
   /** Number of new files found during refresh for stats. */
   protected int iNbNewFiles;
-
   /** Number of corrupted files found during refresh for stats. */
   protected int iNbCorruptedFiles;
+  /** Number of files or playlists removed during refresh */
+  protected int droppedFileOrPlaylist;
 
   /**
    * Instantiates a new refresh reporter.
    * 
-   * @param device DOCUMENT_ME
+   * @param device 
    */
   public RefreshReporter(Device device) {
     this.device = device;
@@ -64,7 +56,7 @@ public class RefreshReporter {
 
   /**
    * Startup.
-   * DOCUMENT_ME
+   * 
    */
   public void startup() {
     // reset all values as this object is reused
@@ -100,6 +92,14 @@ public class RefreshReporter {
   }
 
   /**
+  * Notify dropped file or playlist.
+  * 
+  */
+  public void notifyFileOrPlaylistDropped() {
+    droppedFileOrPlaylist++;
+  }
+
+  /**
    * Notify new file.
    * 
    */
@@ -119,18 +119,21 @@ public class RefreshReporter {
    * Builds the final message.
    * 
    * 
-   * @param time DOCUMENT_ME
+   * @param time 
    * 
    * @return the string
    */
   protected String buildFinalMessage(long time) {
-    StringBuilder sbOut = new StringBuilder("[").append(device.getName()).append(
-        Messages.getString("Device.25"))
-        .append(((time < 1000) ? time + " ms" : time / 1000 + " s")).append(" - ").append(
-            iNbNewFiles).append(Messages.getString("Device.27"));
+    StringBuilder sbOut = new StringBuilder("[").append(device.getName())
+        .append(Messages.getString("Device.25"))
+        .append(((time < 1000) ? time + " ms" : time / 1000 + " s")).append(" - ")
+        .append(iNbNewFiles).append(Messages.getString("Device.27"));
     if (iNbCorruptedFiles > 0) {
       sbOut.append(" - ").append(iNbCorruptedFiles).append(Messages.getString("Device.43"));
     }
+    if (droppedFileOrPlaylist > 0) {
+      sbOut.append(" - ").append(droppedFileOrPlaylist).append(Messages.getString("Device.48"));
+    }
     return sbOut.toString();
   }
 
@@ -156,10 +159,9 @@ public class RefreshReporter {
    * Callback method when an update state is required. Can be overwritten for
    * specific behaviors
    * 
-   * @param dir DOCUMENT_ME
+   * @param dir 
    */
   public void updateState(Directory dir) {
     // Intentionnal NOP
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/StarsHelper.java b/src/main/java/org/jajuk/ui/helpers/StarsHelper.java
index d2e1bd9..5e2deff 100644
--- a/src/main/java/org/jajuk/ui/helpers/StarsHelper.java
+++ b/src/main/java/org/jajuk/ui/helpers/StarsHelper.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -40,9 +40,8 @@ import org.jajuk.util.JajukIcons;
  * Stars are only visible from the GUI, they are never stored into collection itself
  */
 public class StarsHelper {
-
   /** Cache iconLabel for each different rate to save memory and CPU. Map at index 0 stores banned tracks. */
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings("rawtypes")
   private static Map map[] = { new HashMap<Long, StarIconLabel>(),
       new HashMap<Long, StarIconLabel>(), new HashMap<Long, StarIconLabel>(),
       new HashMap<Long, StarIconLabel>(), new HashMap<Long, StarIconLabel>(),
@@ -51,7 +50,7 @@ public class StarsHelper {
   /**
    * Gets the icon.
    * 
-   * @param starsNumber DOCUMENT_ME
+   * @param starsNumber 
    * 
    * @return the icon
    */
@@ -77,7 +76,7 @@ public class StarsHelper {
   /**
    * Gets the stars number.
    * 
-   * @param item DOCUMENT_ME
+   * @param item 
    * 
    * @return Number of stars based on the rate of this item
    */
@@ -106,7 +105,7 @@ public class StarsHelper {
   /**
    * Gets the stars.
    * 
-   * @param item DOCUMENT_ME
+   * @param item 
    * 
    * @return the stars icon or ban icon if banned
    */
@@ -127,5 +126,4 @@ public class StarsHelper {
     }
     return sil;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/TableTransferHandler.java b/src/main/java/org/jajuk/ui/helpers/TableTransferHandler.java
index d1a8d8e..66b877f 100644
--- a/src/main/java/org/jajuk/ui/helpers/TableTransferHandler.java
+++ b/src/main/java/org/jajuk/ui/helpers/TableTransferHandler.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.datatransfer.Transferable;
@@ -35,19 +34,15 @@ import org.jajuk.ui.widgets.JajukTable;
 /**
  * DND handler for table.
  */
-
 public class TableTransferHandler extends TransferHandler {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   final JajukTable jtable;
 
   /**
    * Constructor.
    * 
-   * @param jtable DOCUMENT_ME
+   * @param jtable 
    */
   public TableTransferHandler(final JajukTable jtable) {
     this.jtable = jtable;
@@ -57,14 +52,11 @@ public class TableTransferHandler extends TransferHandler {
     // 2 start dragging row 2 : the drag gesture is not recognized because the row 2 is not yet selected
     source.createDefaultDragGestureRecognizer(jtable, DnDConstants.ACTION_COPY,
         new DragGestureListener() {
-
           @Override
           public void dragGestureRecognized(DragGestureEvent dge) {
             Transferable transferable = createTransferable(jtable);
-
             //and this is the magic right here
             dge.startDrag(null, transferable);
-
           }
         });
   }
@@ -72,22 +64,19 @@ public class TableTransferHandler extends TransferHandler {
   /**
    * Called when dragging.
    * 
-   * @param c DOCUMENT_ME
+   * @param c 
    * 
    * @return the transferable
    */
   @Override
   protected Transferable createTransferable(JComponent c) {
-    // Force selection to update before beginning actual drag, otherwise, drag is done
-    // against previously selected row.
-    jtable.updateSelection();
     return new TransferableTableRows(jtable.getSelection());
   }
 
   /**
    * return action type.
    * 
-   * @param c DOCUMENT_ME
+   * @param c 
    * 
    * @return the source actions
    */
@@ -95,5 +84,4 @@ public class TableTransferHandler extends TransferHandler {
   public int getSourceActions(JComponent c) {
     return COPY_OR_MOVE;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/TracksTableModel.java b/src/main/java/org/jajuk/ui/helpers/TracksTableModel.java
index 9efbdfe..3373aa0 100644
--- a/src/main/java/org/jajuk/ui/helpers/TracksTableModel.java
+++ b/src/main/java/org/jajuk/ui/helpers/TracksTableModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.util.Collections;
@@ -42,22 +41,19 @@ import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Filter;
 import org.jajuk.util.Messages;
-import org.jajuk.util.log.Log;
 
 /**
  * Table model used for logical table view.
  */
 public class TracksTableModel extends JajukTableModel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Associated view ID. */
   private String viewID;
 
   /**
    * Model constructor.
-   * 
+   *
    * @param viewID Associated view ID
    */
   public TracksTableModel(String viewID) {
@@ -69,49 +65,34 @@ public class TracksTableModel extends JajukTableModel {
     // for proper display in some look and feel
     vColNames.add(" ");
     idList.add(Const.XML_PLAY);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_NAME));
     idList.add(Const.XML_NAME);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ALBUM));
     idList.add(Const.XML_ALBUM);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ARTIST));
     idList.add(Const.XML_ARTIST);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_ALBUM_ARTIST));
     idList.add(Const.XML_ALBUM_ARTIST);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_GENRE));
     idList.add(Const.XML_GENRE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_RATE));
     idList.add(Const.XML_TRACK_RATE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_LENGTH));
     idList.add(Const.XML_TRACK_LENGTH);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_COMMENT));
     idList.add(Const.XML_TRACK_COMMENT);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_DISCOVERY_DATE));
     idList.add(Const.XML_TRACK_DISCOVERY_DATE);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_ORDER));
     idList.add(Const.XML_TRACK_ORDER);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_DISC_NUMBER));
     idList.add(Const.XML_TRACK_DISC_NUMBER);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_YEAR));
     idList.add(Const.XML_YEAR);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_TRACK_HITS));
     idList.add(Const.XML_TRACK_HITS);
-
     vColNames.add(Messages.getHumanPropertyName(Const.XML_FILES));
     idList.add(Const.XML_FILES);
-
     // custom properties now
     for (PropertyMetaInformation meta : TrackManager.getInstance().getCustomProperties()) {
       vColNames.add(meta.getName());
@@ -121,48 +102,36 @@ public class TracksTableModel extends JajukTableModel {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.helpers.JajukTableModel#populateModel(java.lang.String, java.lang.String,
    * java.util.List)
    */
   @Override
   public void populateModel(String property, String sPattern, List<String> columnsToShow) {
-
     // This should be monitor file manager to avoid NPE when changing items
     List<Track> alToShow = TrackManager.getInstance().getTracks();
-
     // / Filter mounted files if needed and apply sync table with tree
     // option if needed
     final boolean syncTreeTable = Conf.getBoolean(Const.CONF_SYNC_TABLE_TREE + "." + viewID);
-
     CollectionUtils.filter(alToShow, new Predicate() {
-
       @Override
       public boolean evaluate(Object o) {
         Track track = (Track) o;
         // show it if no sync option or if item is in the selection
         boolean bShowWithTree = !syncTreeTable
         // tree selection = null means none election have been
-            // selected in tree so far
+        // selected in tree so far
             || treeSelection == null
             // check if the tree selection contains the current file
             || (treeSelection.size() > 0 && treeSelection.contains(track));
         return (!track.shouldBeHidden() && bShowWithTree);
       }
     });
-
     // Filter values using given pattern
     Filter filter = new Filter(property, sPattern, true, Conf.getBoolean(Const.CONF_REGEXP));
-    Filter.filterItems(alToShow, filter);
-
+    alToShow = Filter.filterItems(alToShow, filter, Track.class);
     // sort by album
-    long before = System.currentTimeMillis();
     Collections.sort(alToShow, new TrackComparator(TrackComparatorType.ALBUM));
-
-    // Collections.sort(alToShow, new TrackComparator(TrackComparatorType.ALBUM));
-    Log.debug("Sorting of " + alToShow.size() + " elements took: "
-        + (System.currentTimeMillis() - before) + " mseconds");
-
     Iterator<Track> it = alToShow.iterator();
     int iColNum = iNumberStandardCols + TrackManager.getInstance().getCustomProperties().size();
     iRowNum = alToShow.size();
@@ -170,7 +139,6 @@ public class TracksTableModel extends JajukTableModel {
     oValues = new Object[iRowNum][iColNum];
     oItems = new Item[iRowNum];
     bCellEditable = new boolean[iRowNum][iColNum];
-
     // For perfs, prepare columns visibility
     boolean bName = (columnsToShow != null && columnsToShow.contains(Const.XML_NAME));
     boolean bAlbum = (columnsToShow != null && columnsToShow.contains(Const.XML_ALBUM));
@@ -188,11 +156,9 @@ public class TracksTableModel extends JajukTableModel {
     boolean bYear = (columnsToShow != null && columnsToShow.contains(Const.XML_YEAR));
     boolean bHits = (columnsToShow != null && columnsToShow.contains(Const.XML_TRACK_HITS));
     boolean bFiles = (columnsToShow != null && columnsToShow.contains(Const.XML_FILES));
-
     for (int iRow = 0; it.hasNext(); iRow++) {
       Track track = it.next();
       setItemAt(iRow, track);
-      Map<String, Object> properties = track.getProperties();
       // Id
       oItems[iRow] = track;
       // Play
@@ -214,7 +180,6 @@ public class TracksTableModel extends JajukTableModel {
       if (type != null) {
         bHasATagEditor = (type.getTaggerClass() != null);
       }
-
       // Track name
       if (bName) {
         oValues[iRow][1] = track.getName();
@@ -222,7 +187,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][1] = "";
       }
       bCellEditable[iRow][1] = bHasATagEditor;
-
       // Album
       if (bAlbum) {
         oValues[iRow][2] = track.getAlbum().getName2();
@@ -230,7 +194,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][2] = "";
       }
       bCellEditable[iRow][2] = bHasATagEditor;
-
       // Artist
       if (bArtist) {
         oValues[iRow][3] = track.getArtist().getName2();
@@ -238,7 +201,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][3] = "";
       }
       bCellEditable[iRow][3] = bHasATagEditor;
-
       // Album Artist
       if (bAlbumArtist) {
         oValues[iRow][4] = track.getAlbumArtist().getName2();
@@ -246,7 +208,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][4] = "";
       }
       bCellEditable[iRow][4] = bHasATagEditor;
-
       // Genre
       if (bGenre) {
         oValues[iRow][5] = track.getGenre().getName2();
@@ -254,7 +215,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][5] = "";
       }
       bCellEditable[iRow][5] = bHasATagEditor;
-
       // Rate
       if (bRate) {
         oValues[iRow][6] = StarsHelper.getStarIconLabel(track);
@@ -262,7 +222,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][6] = "";
       }
       bCellEditable[iRow][6] = false;
-
       // Length
       if (bLength) {
         oValues[iRow][7] = new Duration(track.getDuration());
@@ -270,7 +229,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][7] = "";
       }
       bCellEditable[iRow][7] = false;
-
       // Comment
       if (bComment) {
         oValues[iRow][8] = track.getValue(Const.XML_TRACK_COMMENT);
@@ -278,7 +236,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][8] = "";
       }
       bCellEditable[iRow][8] = bHasATagEditor;
-
       // Date discovery
       if (bDiscovery) {
         oValues[iRow][9] = track.getDiscoveryDate(); // show date using
@@ -289,7 +246,6 @@ public class TracksTableModel extends JajukTableModel {
       } else {
         oValues[iRow][9] = "";
       }
-
       // Order
       if (bOrder) {
         oValues[iRow][10] = track.getOrder();
@@ -297,7 +253,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][10] = "";
       }
       bCellEditable[iRow][10] = bHasATagEditor;
-
       // Disc number
       if (bDiscNumber) {
         oValues[iRow][11] = track.getDiscNumber();
@@ -305,7 +260,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][11] = "";
       }
       bCellEditable[iRow][11] = bHasATagEditor;
-
       // Year
       if (bYear) {
         oValues[iRow][12] = track.getYear().getValue();
@@ -313,7 +267,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][12] = "";
       }
       bCellEditable[iRow][12] = bHasATagEditor;
-
       // Hits
       if (bHits) {
         oValues[iRow][13] = track.getHits();
@@ -321,7 +274,6 @@ public class TracksTableModel extends JajukTableModel {
         oValues[iRow][13] = "";
       }
       bCellEditable[iRow][13] = false;
-
       // Files
       if (bFiles) {
         List<File> alFiles = track.getFiles();
@@ -337,13 +289,12 @@ public class TracksTableModel extends JajukTableModel {
           files.deleteCharAt(files.length() - 1);
         }
         oValues[iRow][14] = files.toString();
-
       } else {
         oValues[iRow][14] = "";
       }
       bCellEditable[iRow][14] = false;
-
       // Custom properties now
+      Map<String, Object> properties = track.getProperties();
       Iterator<PropertyMetaInformation> it2 = TrackManager.getInstance().getCustomProperties()
           .iterator();
       for (int i = 0; it2.hasNext(); i++) {
diff --git a/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java b/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java
index 8161f48..b4002f2 100644
--- a/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java
+++ b/src/main/java/org/jajuk/ui/helpers/TransferableAlbum.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.datatransfer.DataFlavor;
@@ -34,27 +33,22 @@ import org.jajuk.base.TrackManager;
  * Transferable album ( for DND ).
  */
 public class TransferableAlbum implements Transferable {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant ALBUM_FLAVOR.  DOCUMENT_ME */
+  /** The Constant ALBUM_FLAVOR.   */
   public static final DataFlavor ALBUM_FLAVOR = new DataFlavor(
       DataFlavor.javaJVMLocalObjectMimeType, "Album");
-
-  /** DOCUMENT_ME. */
   private Album album;
 
   /**
    * Instantiates a new transferable album.
    * 
-   * @param album DOCUMENT_ME
+   * @param album 
    */
   public TransferableAlbum(Album album) {
     this.album = album;
   }
 
-  /** DOCUMENT_ME. */
   private final DataFlavor[] flavors = { ALBUM_FLAVOR };
 
   /*
diff --git a/src/main/java/org/jajuk/ui/helpers/TransferableTableRows.java b/src/main/java/org/jajuk/ui/helpers/TransferableTableRows.java
index 580a1c1..5f1d76b 100644
--- a/src/main/java/org/jajuk/ui/helpers/TransferableTableRows.java
+++ b/src/main/java/org/jajuk/ui/helpers/TransferableTableRows.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.datatransfer.DataFlavor;
@@ -34,27 +33,23 @@ import org.jajuk.base.Item;
  * Transferable table row ( for DND ).
  */
 public class TransferableTableRows implements Transferable {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant ROW_FLAVOR.  DOCUMENT_ME */
+  /** The Constant ROW_FLAVOR.   */
   public static final DataFlavor ROW_FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType,
       "Row");
-
   /** Transferable model. */
   private List<Item> items;
 
   /**
    * Instantiates a new transferable table row.
    * 
-   * @param items DOCUMENT_ME
+   * @param items 
    */
   public TransferableTableRows(List<Item> items) {
     this.items = items;
   }
 
-  /** DOCUMENT_ME. */
   private final DataFlavor[] flavors = { ROW_FLAVOR };
 
   /*
diff --git a/src/main/java/org/jajuk/ui/helpers/TransferableTreeNodes.java b/src/main/java/org/jajuk/ui/helpers/TransferableTreeNodes.java
index 6dd6c94..9df8e60 100644
--- a/src/main/java/org/jajuk/ui/helpers/TransferableTreeNodes.java
+++ b/src/main/java/org/jajuk/ui/helpers/TransferableTreeNodes.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.datatransfer.DataFlavor;
@@ -34,27 +33,23 @@ import org.jajuk.base.Item;
  * Transferable tree nodes ( for DND ).
  */
 public class TransferableTreeNodes implements Transferable {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant NODE_FLAVOR.  DOCUMENT_ME */
+  /** The Constant NODE_FLAVOR.   */
   public static final DataFlavor NODE_FLAVOR = new DataFlavor(
       DataFlavor.javaJVMLocalObjectMimeType, "Node");
-
   /** Transferable model. */
   private List<Item> items;
 
   /**
    * Instantiates a new transferable tree node.
    * 
-   * @param items DOCUMENT_ME
+   * @param items 
    */
   public TransferableTreeNodes(List<Item> items) {
     this.items = items;
   }
 
-  /** DOCUMENT_ME. */
   private final DataFlavor[] flavors = { NODE_FLAVOR };
 
   /*
diff --git a/src/main/java/org/jajuk/ui/helpers/TreeRootElement.java b/src/main/java/org/jajuk/ui/helpers/TreeRootElement.java
index 837c035..e99857f 100644
--- a/src/main/java/org/jajuk/ui/helpers/TreeRootElement.java
+++ b/src/main/java/org/jajuk/ui/helpers/TreeRootElement.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -26,7 +26,6 @@ import javax.swing.tree.DefaultMutableTreeNode;
  * Flag class telling a tree node is a root element.
  */
 public class TreeRootElement extends DefaultMutableTreeNode {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -3183130517695923747L;
 
@@ -40,7 +39,7 @@ public class TreeRootElement extends DefaultMutableTreeNode {
   /**
    * The Constructor.
    * 
-   * @param userObject DOCUMENT_ME
+   * @param userObject 
    */
   public TreeRootElement(Object userObject) {
     super(userObject);
diff --git a/src/main/java/org/jajuk/ui/helpers/TreeTransferHandler.java b/src/main/java/org/jajuk/ui/helpers/TreeTransferHandler.java
index 9847850..7361bf2 100644
--- a/src/main/java/org/jajuk/ui/helpers/TreeTransferHandler.java
+++ b/src/main/java/org/jajuk/ui/helpers/TreeTransferHandler.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers;
 
 import java.awt.datatransfer.Transferable;
@@ -36,17 +35,14 @@ import org.jajuk.base.Item;
  * DND handler for jtree.
  */
 public class TreeTransferHandler extends TransferHandler {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   final JTree jtree;
 
   /**
    * Constructor.
    * 
-   * @param jtree DOCUMENT_ME
+   * @param jtree 
    */
   public TreeTransferHandler(final JTree jtree) {
     this.jtree = jtree;
@@ -55,7 +51,7 @@ public class TreeTransferHandler extends TransferHandler {
   /**
    * Called when dragging.
    * 
-   * @param c DOCUMENT_ME
+   * @param c 
    * 
    * @return the transferable
    */
@@ -81,7 +77,7 @@ public class TreeTransferHandler extends TransferHandler {
   /**
    * return action type.
    * 
-   * @param c DOCUMENT_ME
+   * @param c 
    * 
    * @return the source actions
    */
@@ -89,5 +85,4 @@ public class TreeTransferHandler extends TransferHandler {
   public int getSourceActions(JComponent c) {
     return COPY_OR_MOVE;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/TwoStepsDisplayable.java b/src/main/java/org/jajuk/ui/helpers/TwoStepsDisplayable.java
index e3a1d2b..551c304 100644
--- a/src/main/java/org/jajuk/ui/helpers/TwoStepsDisplayable.java
+++ b/src/main/java/org/jajuk/ui/helpers/TwoStepsDisplayable.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -29,7 +29,6 @@ package org.jajuk.ui.helpers;
  * </p>
  */
 public interface TwoStepsDisplayable {
-
   /**
    * Long call done in background in a dedicated thread.
    * 
@@ -40,8 +39,7 @@ public interface TwoStepsDisplayable {
   /**
    * Fast call done in the EDT, must be fast !.
    * 
-   * @param in DOCUMENT_ME
+   * @param in 
    */
   void shortCall(Object in);
-
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/WebRadioTableModel.java b/src/main/java/org/jajuk/ui/helpers/WebRadioTableModel.java
new file mode 100644
index 0000000..397cb1c
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/helpers/WebRadioTableModel.java
@@ -0,0 +1,131 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.helpers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.jajuk.base.Item;
+import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.services.webradio.WebRadioOrigin;
+import org.jajuk.ui.widgets.IconLabel;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.Filter;
+import org.jajuk.util.Messages;
+
+/**
+ * Table model used for web radios.
+ */
+public class WebRadioTableModel extends JajukTableModel {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+
+  /**
+  * Model constructor.
+  * 
+  */
+  public WebRadioTableModel() {
+    super(9);
+    setEditable(Conf.getBoolean(Const.CONF_WEBRADIO_TABLE_EDITION));
+    // Columns names
+    // First column is play icon, need to set a space character
+    // for proper display in some look and feel
+    vColNames.add(" ");
+    idList.add(Const.XML_PLAY);
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_NAME));
+    idList.add(Const.XML_NAME);
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_DESC));
+    idList.add(Const.XML_DESC);
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_URL));
+    idList.add(Const.XML_URL);
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_KEYWORDS));
+    idList.add(Const.XML_KEYWORDS);
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_GENRE));
+    idList.add(Const.XML_GENRE);
+    vColNames.add(Messages.getString("WebRadioView.2"));
+    idList.add(Const.XML_ORIGIN);
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_BITRATE));
+    idList.add(Const.XML_BITRATE);
+    vColNames.add(Messages.getHumanPropertyName(Const.XML_FREQUENCY));
+    idList.add(Const.XML_FREQUENCY);
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.jajuk.ui.helpers.JajukTableModel#populateModel(java.lang.String, java.lang.String,
+   * java.util.List)
+   */
+  @Override
+  public void populateModel(String sPropertyName, String sPattern, List<String> columnsToShow) {
+    // This should be monitor file manager to avoid NPE when changing items
+    List<WebRadio> alToShow = new ArrayList<WebRadio>(WebRadioManager.getInstance().getWebRadios());
+    oItems = new Item[iRowNum];
+    // Filter radios if required
+    Filter filter = new Filter(sPropertyName, sPattern, true, Conf.getBoolean(Const.CONF_REGEXP));
+    alToShow = Filter.filterItems(alToShow, filter, WebRadio.class);
+    Iterator<WebRadio> it = alToShow.iterator();
+    int iColNum = iNumberStandardCols;
+    iRowNum = alToShow.size();
+    it = alToShow.iterator();
+    oValues = new Object[iRowNum][iColNum];
+    oItems = new Item[iRowNum];
+    bCellEditable = new boolean[iRowNum][iColNum];
+    for (int iRow = 0; it.hasNext(); iRow++) {
+      WebRadio radio = it.next();
+      setItemAt(iRow, radio);
+      // Id
+      oItems[iRow] = radio;
+      // Play
+      IconLabel il = getIcon(false);
+      oValues[iRow][0] = il;
+      bCellEditable[iRow][0] = false;
+      // Radio name
+      oValues[iRow][1] = radio.getName();
+      bCellEditable[iRow][1] = true;
+      // Radio description
+      oValues[iRow][2] = radio.getDescription();
+      bCellEditable[iRow][2] = true;
+      // Url
+      oValues[iRow][3] = radio.getUrl();
+      bCellEditable[iRow][3] = true;
+      // Keywords
+      oValues[iRow][4] = radio.getKeywords();
+      bCellEditable[iRow][4] = true;
+      // Genre
+      oValues[iRow][5] = radio.getGenre();
+      // Genre can be edited only on custom radios
+      bCellEditable[iRow][5] = (radio.getOrigin() == WebRadioOrigin.CUSTOM);
+      // Origin
+      oValues[iRow][6] = radio.getOrigin().name();
+      bCellEditable[iRow][6] = false;
+      // Bitrate
+      oValues[iRow][7] = radio.getLongValue(Const.XML_BITRATE);
+      bCellEditable[iRow][7] = true;
+      // Frequency
+      oValues[iRow][8] = radio.getLongValue(Const.XML_FREQUENCY);
+      bCellEditable[iRow][8] = true;
+    }
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/AWTUtilities.java b/src/main/java/org/jajuk/ui/helpers/animations/AWTUtilities.java
index 77034b6..d20f35c 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/AWTUtilities.java
+++ b/src/main/java/org/jajuk/ui/helpers/animations/AWTUtilities.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers.animations;
 
 import java.awt.Shape;
@@ -28,20 +27,18 @@ import java.lang.reflect.Method;
 /**
  * Wrapper class used to handle cases where JRE AWTUtilities class is not available.
  * 
- * See https://trac.jajuk.info/ticket/1464 for more details
+ * See #1464 for more details
  */
 public class AWTUtilities {
-
   /**
    * Checks if is available.
    * 
    * @return true, if is available
    */
-  @SuppressWarnings("unchecked")
   public static boolean isAvailable() {
     try {
       @SuppressWarnings("unused")
-      Class awtutil = Class.forName("com.sun.awt.AWTUtilities");
+      Class<?> awtutil = Class.forName("com.sun.awt.AWTUtilities");
       return true;
     } catch (Exception ex) {
       // Void on purpose, means that this JRE doesn't support the com.sun.awt.AWTUtilities class, do
@@ -52,15 +49,14 @@ public class AWTUtilities {
 
   /**
    * Sets the window shape.
-   * DOCUMENT_ME
    * 
-   * @param window DOCUMENT_ME
-   * @param shape DOCUMENT_ME
+   * 
+   * @param window 
+   * @param shape 
    */
-  @SuppressWarnings("unchecked")
   public static void setWindowShape(Window window, Shape shape) {
     try {
-      Class awtutil = Class.forName("com.sun.awt.AWTUtilities");
+      Class<?> awtutil = Class.forName("com.sun.awt.AWTUtilities");
       Method setWindowShape = awtutil.getMethod("setWindowShape", Window.class, Shape.class);
       setWindowShape.invoke(null, window, shape);
     } catch (Exception ex) {
@@ -71,15 +67,14 @@ public class AWTUtilities {
 
   /**
    * Sets the window opacity.
-   * DOCUMENT_ME
    * 
-   * @param window DOCUMENT_ME
-   * @param alpha DOCUMENT_ME
+   * 
+   * @param window 
+   * @param alpha 
    */
-  @SuppressWarnings("unchecked")
   public static void setWindowOpacity(Window window, float alpha) {
     try {
-      Class awtutil = Class.forName("com.sun.awt.AWTUtilities");
+      Class<?> awtutil = Class.forName("com.sun.awt.AWTUtilities");
       Method setWindowOpaque = awtutil.getMethod("setWindowOpacity", Window.class, float.class);
       setWindowOpaque.invoke(null, window, alpha);
     } catch (Exception ex) {
@@ -92,6 +87,5 @@ public class AWTUtilities {
    * Instantiates a new aWT utilities.
    */
   private AWTUtilities() {
-
   }
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/AbstractAnimation.java b/src/main/java/org/jajuk/ui/helpers/animations/AbstractAnimation.java
index f6cc8a5..4e3654e 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/AbstractAnimation.java
+++ b/src/main/java/org/jajuk/ui/helpers/animations/AbstractAnimation.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers.animations;
 
 import java.awt.Window;
@@ -28,17 +27,13 @@ import java.util.concurrent.CopyOnWriteArrayList;
  * Base implementation of IAnimation.
  */
 public abstract class AbstractAnimation implements IAnimation {
-
-  /** DOCUMENT_ME. */
   protected Window window;
-
-  /** DOCUMENT_ME. */
   private CopyOnWriteArrayList<AnimationCompletedListener> listeners = new CopyOnWriteArrayList<AnimationCompletedListener>();
 
   /**
    * Instantiates a new abstract animation.
    * 
-   * @param window DOCUMENT_ME
+   * @param window 
    */
   protected AbstractAnimation(Window window) {
     this.window = window;
@@ -54,9 +49,9 @@ public abstract class AbstractAnimation implements IAnimation {
 
   /**
    * Adds the animation completed listener.
-   * DOCUMENT_ME
    * 
-   * @param listener DOCUMENT_ME
+   * 
+   * @param listener 
    */
   public void addAnimationCompletedListener(AnimationCompletedListener listener) {
     listeners.add(listener);
@@ -64,9 +59,9 @@ public abstract class AbstractAnimation implements IAnimation {
 
   /**
    * Removes the animation completed listener.
-   * DOCUMENT_ME
    * 
-   * @param listener DOCUMENT_ME
+   * 
+   * @param listener 
    */
   public void removeAnimationCompletedListener(AnimationCompletedListener listener) {
     listeners.remove(listener);
@@ -74,7 +69,7 @@ public abstract class AbstractAnimation implements IAnimation {
 
   /**
    * Animation completed.
-   * DOCUMENT_ME
+   * 
    */
   protected void animationCompleted() {
     AnimationCompletedEvent event = new AnimationCompletedEvent(this, window);
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedEvent.java b/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedEvent.java
index 33299fd..327543b 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedEvent.java
+++ b/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedEvent.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers.animations;
 
 import java.awt.Window;
@@ -27,18 +26,14 @@ import java.awt.Window;
  * Event thrown when the naimation is done.
  */
 public class AnimationCompletedEvent {
-
-  /** DOCUMENT_ME. */
   private IAnimation source;
-
-  /** DOCUMENT_ME. */
   private Window window;
 
   /**
    * Instantiates a new animation completed event.
    * 
-   * @param source DOCUMENT_ME
-   * @param window DOCUMENT_ME
+   * @param source 
+   * @param window 
    */
   public AnimationCompletedEvent(IAnimation source, Window window) {
     this.source = source;
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedListener.java b/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedListener.java
index d3dfd1c..b68db7d 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedListener.java
+++ b/src/main/java/org/jajuk/ui/helpers/animations/AnimationCompletedListener.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,21 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers.animations;
 
 /**
  * Listener used to track for animation ending.
  */
 public interface AnimationCompletedListener {
-
   /**
    * Animation completed.
-   * DOCUMENT_ME
    * 
-   * @param e DOCUMENT_ME
+   * 
+   * @param e 
    */
   void animationCompleted(AnimationCompletedEvent e);
 }
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/FadeAnimation.java b/src/main/java/org/jajuk/ui/helpers/animations/FadeAnimation.java
index efdc404..80cccbc 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/FadeAnimation.java
+++ b/src/main/java/org/jajuk/ui/helpers/animations/FadeAnimation.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers.animations;
 
 import java.awt.Window;
@@ -31,18 +30,15 @@ import org.jajuk.util.log.Log;
  * Fade animation implementation.
  */
 public class FadeAnimation extends AbstractAnimation {
-
-  /** DOCUMENT_ME. */
   private Direction opacity;
-
   /** Number of frames. */
   private static final int FRAME_NUMBER = 50;
 
   /**
    * Instantiates a new fade animation.
    * 
-   * @param window DOCUMENT_ME
-   * @param opacity DOCUMENT_ME
+   * @param window 
+   * @param opacity 
    */
   public FadeAnimation(Window window, Direction opacity) {
     super(window);
@@ -80,14 +76,13 @@ public class FadeAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public interface Direction {
-
     /**
      * Gets the opacity.
      * 
-     * @param progress DOCUMENT_ME
+     * @param progress 
      * 
      * @return the opacity
      */
@@ -95,19 +90,15 @@ public class FadeAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public enum Directions implements Direction {
-
-    /** DOCUMENT_ME. */
     IN {
       @Override
       public float getOpacity(float progress) {
         return progress;
       }
     },
-
-    /** DOCUMENT_ME. */
     OUT {
       @Override
       public float getOpacity(float progress) {
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/IAnimation.java b/src/main/java/org/jajuk/ui/helpers/animations/IAnimation.java
index 7257a95..3b8923d 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/IAnimation.java
+++ b/src/main/java/org/jajuk/ui/helpers/animations/IAnimation.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers.animations;
 
 import java.awt.Window;
@@ -27,11 +26,10 @@ import java.awt.Window;
  * Interface for any kind of animation.
  */
 public interface IAnimation {
-
   /**
    * What the animation is supposed to do.
    * 
-   * @param animationTime DOCUMENT_ME
+   * @param animationTime 
    */
   void animate(int animationTime);
 
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/SlideAnimation.java b/src/main/java/org/jajuk/ui/helpers/animations/SlideAnimation.java
index d55ddc8..3dc41b6 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/SlideAnimation.java
+++ b/src/main/java/org/jajuk/ui/helpers/animations/SlideAnimation.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.helpers.animations;
 
 import java.awt.Dimension;
@@ -40,38 +39,23 @@ import org.jajuk.util.log.Log;
  * Slide animation implementation.
  */
 public class SlideAnimation extends AbstractAnimation {
-
-  /** DOCUMENT_ME. */
   private ScreenPosition screenPosition;
-
-  /** DOCUMENT_ME. */
   private StartingPosition startingPosition;
-
-  /** DOCUMENT_ME. */
   private Direction direction;
-
-  /** DOCUMENT_ME. */
   private Timer animationTimer;
-
-  /** DOCUMENT_ME. */
   private long animationStart;
-
-  /** DOCUMENT_ME. */
   private Rectangle start;
-
-  /** DOCUMENT_ME. */
   private Rectangle windowBounds;
-
   /** Time (ms) of a frame displaying. */
   private static final int FRAME_DURATION = 5;
 
   /**
    * Instantiates a new slide animation.
    * 
-   * @param window DOCUMENT_ME
-   * @param screenPosition DOCUMENT_ME
-   * @param startingPosition DOCUMENT_ME
-   * @param direction DOCUMENT_ME
+   * @param window 
+   * @param screenPosition 
+   * @param startingPosition 
+   * @param direction 
    */
   public SlideAnimation(Window window, ScreenPosition screenPosition,
       StartingPosition startingPosition, Direction direction) {
@@ -90,11 +74,9 @@ public class SlideAnimation extends AbstractAnimation {
   public void animate(final int animationTime) {
     window.pack();
     windowBounds = window.getBounds();
-
     start = startingPosition.getStartingPosition(screenPosition.getScreenPosition(windowBounds));
     start.width = windowBounds.width;
     start.height = windowBounds.height;
-
     if (!AWTUtilities.isAvailable()) {
       SwingUtilities.invokeLater(new Runnable() {
         @Override
@@ -115,12 +97,10 @@ public class SlideAnimation extends AbstractAnimation {
       });
       return;
     }
-
     ActionListener animationLogic = new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {
         long elapsed = System.currentTimeMillis() - animationStart;
-
         if (elapsed > animationTime) {
           animationTimer.stop();
           animationCompleted();
@@ -132,7 +112,6 @@ public class SlideAnimation extends AbstractAnimation {
         }
       }
     };
-
     animationTimer = new Timer(FRAME_DURATION, animationLogic);
     animationStart = System.currentTimeMillis();
     animationTimer.start();
@@ -166,14 +145,13 @@ public class SlideAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public interface ScreenPosition {
-
     /**
      * Gets the screen position.
      * 
-     * @param size DOCUMENT_ME
+     * @param size 
      * 
      * @return the screen position
      */
@@ -181,14 +159,13 @@ public class SlideAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public interface StartingPosition {
-
     /**
      * Gets the starting position.
      * 
-     * @param position DOCUMENT_ME
+     * @param position 
      * 
      * @return the starting position
      */
@@ -196,15 +173,14 @@ public class SlideAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public interface Direction {
-
     /**
      * Gets the current location.
      * 
-     * @param start DOCUMENT_ME
-     * @param progress DOCUMENT_ME
+     * @param start 
+     * @param progress 
      * 
      * @return the current location
      */
@@ -213,8 +189,8 @@ public class SlideAnimation extends AbstractAnimation {
     /**
      * Gets the showing bounds.
      * 
-     * @param start DOCUMENT_ME
-     * @param progress DOCUMENT_ME
+     * @param start 
+     * @param progress 
      * 
      * @return the showing bounds
      */
@@ -222,11 +198,9 @@ public class SlideAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public enum ScreenPositions implements ScreenPosition {
-
-    /** DOCUMENT_ME. */
     TOP_LEFT {
       @Override
       public Rectangle getScreenPosition(Rectangle size) {
@@ -239,8 +213,6 @@ public class SlideAnimation extends AbstractAnimation {
         return position;
       }
     },
-
-    /** DOCUMENT_ME. */
     TOP_RIGHT {
       @Override
       public Rectangle getScreenPosition(Rectangle size) {
@@ -253,8 +225,6 @@ public class SlideAnimation extends AbstractAnimation {
         return position;
       }
     },
-
-    /** DOCUMENT_ME. */
     BOTTOM_LEFT {
       @Override
       public Rectangle getScreenPosition(Rectangle size) {
@@ -267,8 +237,6 @@ public class SlideAnimation extends AbstractAnimation {
         return position;
       }
     },
-
-    /** DOCUMENT_ME. */
     BOTTOM_RIGHT {
       @Override
       public Rectangle getScreenPosition(Rectangle size) {
@@ -281,15 +249,12 @@ public class SlideAnimation extends AbstractAnimation {
         return position;
       }
     },
-
-    /** DOCUMENT_ME. */
     CURRENT {
       @Override
       public Rectangle getScreenPosition(Rectangle size) {
         return new Rectangle(size);
       }
     };
-
     /**
      * Gets the desktop bounds.
      * 
@@ -312,11 +277,9 @@ public class SlideAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public enum StartingPositions implements StartingPosition {
-
-    /** DOCUMENT_ME. */
     TOP {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -328,8 +291,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     BOTTOM {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -341,8 +302,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     LEFT {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -354,8 +313,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     RIGHT {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -367,8 +324,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     TOP_LEFT {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -380,8 +335,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     TOP_RIGHT {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -393,8 +346,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     BOTTOM_LEFT {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -406,8 +357,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     BOTTOM_RIGHT {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -419,8 +368,6 @@ public class SlideAnimation extends AbstractAnimation {
         return size;
       }
     },
-
-    /** DOCUMENT_ME. */
     FULL {
       @Override
       public Rectangle getStartingPosition(Rectangle position) {
@@ -430,11 +377,9 @@ public class SlideAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public enum InDirections implements Direction {
-
-    /** DOCUMENT_ME. */
     UP {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -454,8 +399,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     DOWN {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -475,8 +418,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     LEFT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -496,8 +437,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     RIGHT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -517,8 +456,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     UP_LEFT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -538,8 +475,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     UP_RIGHT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -559,8 +494,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     DOWN_LEFT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -580,8 +513,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     DOWN_RIGHT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -604,11 +535,9 @@ public class SlideAnimation extends AbstractAnimation {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public enum OutDirections implements Direction {
-
-    /** DOCUMENT_ME. */
     UP {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -628,8 +557,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     DOWN {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -649,8 +576,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     LEFT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -670,8 +595,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     RIGHT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -691,8 +614,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     UP_LEFT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -712,8 +633,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     UP_RIGHT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -733,8 +652,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     DOWN_LEFT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
@@ -754,8 +671,6 @@ public class SlideAnimation extends AbstractAnimation {
         return current;
       }
     },
-
-    /** DOCUMENT_ME. */
     DOWN_RIGHT {
       @Override
       public Point getCurrentLocation(Rectangle start, float progress) {
diff --git a/src/main/java/org/jajuk/ui/helpers/animations/package.html b/src/main/java/org/jajuk/ui/helpers/animations/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/ui/helpers/animations/package.html
+++ b/src/main/java/org/jajuk/ui/helpers/animations/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/perspectives/AlbumsPerspective.java b/src/main/java/org/jajuk/ui/perspectives/AlbumsPerspective.java
index 5fe58e1..e5dbba8 100644
--- a/src/main/java/org/jajuk/ui/perspectives/AlbumsPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/AlbumsPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Catalog perspective, shows all default covers by album.
  */
 public class AlbumsPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/perspectives/ConfigurationPerspective.java b/src/main/java/org/jajuk/ui/perspectives/ConfigurationPerspective.java
index 562cca3..6e3f437 100644
--- a/src/main/java/org/jajuk/ui/perspectives/ConfigurationPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/ConfigurationPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Configuration perspective.
  */
 public class ConfigurationPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/perspectives/DisplayPerspective.java b/src/main/java/org/jajuk/ui/perspectives/DisplayPerspective.java
index b119697..a335e7f 100644
--- a/src/main/java/org/jajuk/ui/perspectives/DisplayPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/DisplayPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Player perspective, contains view useful to be displayed during playing.
  */
 public class DisplayPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/perspectives/FilesPerspective.java b/src/main/java/org/jajuk/ui/perspectives/FilesPerspective.java
index 4ac3e30..11ce4d2 100644
--- a/src/main/java/org/jajuk/ui/perspectives/FilesPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/FilesPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Physical perspective.
  */
 public class FilesPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/perspectives/IPerspective.java b/src/main/java/org/jajuk/ui/perspectives/IPerspective.java
index a71d1b1..d19f13d 100644
--- a/src/main/java/org/jajuk/ui/perspectives/IPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/IPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.perspectives;
 
@@ -30,9 +30,7 @@ import org.jajuk.ui.views.IView;
 /**
  * Representation of a perspective.
  */
-
 public interface IPerspective {
-
   /**
    * Gets the id.
    * 
@@ -88,9 +86,7 @@ public interface IPerspective {
   void restoreDefaults();
 
   /**
-   * As been selected flag.
-   * 
-   * @param b DOCUMENT_ME
+   * The perspective has been selected
    */
-  void setAsBeenSelected(boolean b);
+  void selected();
 }
diff --git a/src/main/java/org/jajuk/ui/perspectives/InfoPerspective.java b/src/main/java/org/jajuk/ui/perspectives/InfoPerspective.java
index 411954e..95e4f15 100644
--- a/src/main/java/org/jajuk/ui/perspectives/InfoPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/InfoPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Information perspective, display various information about played tracks.
  */
 public class InfoPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/perspectives/PerspectiveAdapter.java b/src/main/java/org/jajuk/ui/perspectives/PerspectiveAdapter.java
index 7d3782a..14f32c0 100644
--- a/src/main/java/org/jajuk/ui/perspectives/PerspectiveAdapter.java
+++ b/src/main/java/org/jajuk/ui/perspectives/PerspectiveAdapter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import com.vlsolutions.swing.docking.AutoHideButton;
@@ -36,6 +35,8 @@ import com.vlsolutions.swing.docking.event.DockingActionListener;
 
 import java.awt.Component;
 import java.awt.Container;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -50,6 +51,7 @@ import javax.xml.parsers.ParserConfigurationException;
 
 import org.jajuk.events.ObservationManager;
 import org.jajuk.events.Observer;
+import org.jajuk.services.core.PersistenceService;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.ui.views.IView;
 import org.jajuk.ui.views.ViewAdapter;
@@ -63,165 +65,166 @@ import org.xml.sax.SAXException;
 /**
  * Perspective adapter, provide default implementation for perspectives.
  */
+ at SuppressWarnings("serial")
 public abstract class PerspectiveAdapter extends DockingDesktop implements IPerspective, Const {
-
-  /** The Constant XML_EXT.  DOCUMENT_ME */
-  private static final String XML_EXT = ".xml";
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 698162872976536725L;
-
   /** Perspective id (class). */
   private final String sID;
-
-  /** As been selected flag (workaround for VLDocking issue when saving position). */
-  protected boolean bAsBeenSelected = false;
+  private long dateFirstDisplay;
+  private boolean alreadySelected = false;
+  private static final int RESIZE_EVENTS_DISABLING_DELAY_MS = 5000;
 
   /**
    * Constructor.
    */
   public PerspectiveAdapter() {
     super();
-
     this.sID = getClass().getName();
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.perspectives.IPerspective#getID()
-   */
   @Override
-  public String getID() {
-    return sID;
-  }
-
-  /**
-   * toString method.
-   * 
-   * @return the string
-   */
-  @Override
-  public String toString() {
-    return "Perspective[name=" + getID() + " description='" + getDesc() + "]";
+  public void selected() {
+    if (!alreadySelected) {
+      this.dateFirstDisplay = System.currentTimeMillis();
+    }
+    alreadySelected = true;
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.perspectives.IPerspective#commit()
-   */
   @Override
-  public void commit() throws IOException {
-    // workaround for a VLDocking issue + performances
-    if (!bAsBeenSelected) {
-      return;
-    }
-    // The writeXML method must be called in the EDT to avoid freezing, it
-    // requires a lock some UI components
-    File saveFile = SessionService.getConfFileByPath(getClass().getSimpleName() + XML_EXT);
-    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(saveFile));
+  public synchronized void commit() throws IOException {
     try {
-      writeXML(out);
-      out.flush();
-    } finally {
-      out.close();
+      // The writeXML method must be called in the EDT to avoid freezing, it
+      // requires a lock some UI components
+      File saveFile = SessionService.getConfFileByPath(PerspectiveAdapter.this.getClass()
+          .getSimpleName() + Const.FILE_XML_EXT);
+      // No need for recovery-enable commit here as the perspective can be restored to default 
+      // any time in case of write failure
+      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(saveFile));
+      try {
+        writeXML(out);
+        out.flush();
+      } finally {
+        out.close();
+      }
+      Log.debug("Perspective " + getID() + " commited");
+    } catch (Exception e) {
+      Log.error(e);
+      throw new IOException(e);
     }
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.perspectives.IPerspective#load()
-   */
   @Override
   public void load() throws IOException, ParserConfigurationException, SAXException {
-
     // Try to read XML conf file from home directory
-    File loadFile = SessionService.getConfFileByPath(getClass().getSimpleName() + XML_EXT);
+    File loadFile = SessionService.getConfFileByPath(getClass().getSimpleName()
+        + Const.FILE_XML_EXT);
     // If file doesn't exist (normally only at first install), read
     // perspective conf from the jar
     URL url = loadFile.toURI().toURL();
     if (!loadFile.exists()) {
       url = UtilSystem.getResource(FILE_DEFAULT_PERSPECTIVES_PATH + '/'
-          + getClass().getSimpleName() + XML_EXT);
+          + getClass().getSimpleName() + Const.FILE_XML_EXT);
     }
     BufferedInputStream in = new BufferedInputStream(url.openStream());
     // then, load the workspace
-    try {
-      DockingContext ctx = new DockingContext();
-      DockableResolver resolver = new DockableResolver() {
-        @Override
-        public Dockable resolveDockable(String keyName) {
-          Dockable view = null;
-          try {
-            StringTokenizer st = new StringTokenizer(keyName, "/");
-            String className = st.nextToken();
-            int id = Integer.parseInt(st.nextToken());
-            view = ViewFactory.createView(Class.forName(className), PerspectiveAdapter.this, id);
-          } catch (Exception e) {
-            Log.error(e);
-          }
-          return view;
-        }
-      };
-
-      // register a listener to unregister the view upon closing
-      ctx.addDockingActionListener(new DockingActionListener() {
-
-        @Override
-        public void dockingActionPerformed(DockingActionEvent dockingactionevent) {
-          // on closing/removing of a view try to unregister it at the
-          // ObservationManager
-          if (dockingactionevent instanceof DockingActionCloseEvent) {
-            Dockable obj = ((DockingActionDockableEvent) dockingactionevent).getDockable();
-            if (obj instanceof Observer) {
-              ObservationManager.unregister((Observer) obj);
+    DockingContext ctx = new DockingContext();
+    DockableResolver resolver = new DockableResolver() {
+      @Override
+      public Dockable resolveDockable(String keyName) {
+        Dockable view = null;
+        try {
+          StringTokenizer st = new StringTokenizer(keyName, "/");
+          String className = st.nextToken();
+          int id = Integer.parseInt(st.nextToken());
+          view = ViewFactory.createView(Class.forName(className), PerspectiveAdapter.this, id);
+          // save disposition upon resize
+          view.getComponent().addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+              // Avoid persisting the perspective for nothing at first display display.
+              // We disable the resize events during a small period of time to make sure events are done.
+              if (System.currentTimeMillis() - dateFirstDisplay > RESIZE_EVENTS_DISABLING_DELAY_MS) {
+                PersistenceService.getInstance().setPerspectiveChanged(PerspectiveAdapter.this);
+              }
             }
+          });
+        } catch (Exception e) {
+          Log.error(e);
+        }
+        return view;
+      }
+    };
+    addDockableListener(ctx);
+    ctx.setDockableResolver(resolver);
+    setContext(ctx);
+    ctx.addDesktop(this);
+    try {
+      ctx.readXML(in);
+      in.close();
+    } catch (Exception e) {
+      // error parsing the file, user can't be blocked, use
+      // default conf
+      Log.error(e);
+      Log.debug("Error parsing conf file, use defaults - " + getID());
+      url = UtilSystem.getResource(FILE_DEFAULT_PERSPECTIVES_PATH + '/'
+          + getClass().getSimpleName() + Const.FILE_XML_EXT);
+      BufferedInputStream defaultConf = new BufferedInputStream(url.openStream());
+      ctx.readXML(defaultConf);
+      // Delete the corrupted file
+      if (in != null) {
+        in.close();
+      }
+      loadFile.delete();
+    }
+  }
 
-            // it seems the Docking-library does not unregister these things by itself
-            // so we need to do it on our own here as well. We create the Dockable (i.e.
-            // the View) from scratch every time (see constructor of JajukJMenuBar where we create
-            // the menu entries to add new views and ViewFactory)
-            unregisterDockable(obj);
-
-            // workaround for DockingDesktop-leaks, we need to remove the Dockable from the
-            // "TitleBar"
-            // if it is one of those that are hidden on the left side.
-            removeFromDockingDesktop(PerspectiveAdapter.this, obj);
+  private void addDockableListener(DockingContext ctx) {
+    // Listen action on the perspective itself, used to track events like drag over 
+    // another view of the same size that doesn't throw a view event
+    addDockingActionListener(new DockingActionListener() {
+      @Override
+      public void dockingActionPerformed(DockingActionEvent dockingactionevent) {
+        PersistenceService.getInstance().setPerspectiveChanged(PerspectiveAdapter.this);
+      }
 
-            // do some additional cleanup on the View itself if necessary
-            if (obj instanceof ViewAdapter) {
-              ((ViewAdapter) obj).cleanup();
-            }
+      @Override
+      public boolean acceptDockingAction(DockingActionEvent arg0) {
+        return true;
+      }
+    });
+    // Actions on views themselves
+    ctx.addDockingActionListener(new DockingActionListener() {
+      @Override
+      public void dockingActionPerformed(DockingActionEvent dockingactionevent) {
+        // on closing/removing of a view try to unregister it at the
+        // ObservationManager
+        if (dockingactionevent instanceof DockingActionCloseEvent) {
+          Dockable obj = ((DockingActionDockableEvent) dockingactionevent).getDockable();
+          if (obj instanceof Observer) {
+            ObservationManager.unregister((Observer) obj);
+          }
+          // Seems that the Docking-library does not unregister these things by itself
+          // so we need to do it on our own here as well. We create the Dockable (i.e.
+          // the View) from scratch every time (see constructor of JajukJMenuBar where we create
+          // the menu entries to add new views and ViewFactory)
+          unregisterDockable(obj);
+          // workaround for DockingDesktop-leaks, we need to remove the Dockable from the
+          // "TitleBar"
+          // if it is one of those that are hidden on the left side.
+          removeFromDockingDesktop(PerspectiveAdapter.this, obj);
+          // do some additional cleanup on the View itself if necessary
+          if (obj instanceof ViewAdapter) {
+            ((ViewAdapter) obj).cleanup();
           }
         }
+        PersistenceService.getInstance().setPerspectiveChanged(PerspectiveAdapter.this);
+      }
 
-        @Override
-        public boolean acceptDockingAction(DockingActionEvent dockingactionevent) {
-          // always accept here
-          return true;
-        }
-      });
-
-      ctx.setDockableResolver(resolver);
-      setContext(ctx);
-      ctx.addDesktop(this);
-      try {
-        ctx.readXML(in);
-      } catch (Exception e) {
-        // error parsing the file, user can't be blocked, use
-        // default conf
-        Log.error(e);
-        Log.debug("Error parsing conf file, use defaults - " + getID());
-        url = UtilSystem.getResource(FILE_DEFAULT_PERSPECTIVES_PATH + '/'
-            + getClass().getSimpleName() + XML_EXT);
-        in = new BufferedInputStream(url.openStream());
-        ctx.readXML(in);
+      @Override
+      public boolean acceptDockingAction(DockingActionEvent dockingactionevent) {
+        // always accept here
+        return true;
       }
-    } finally {
-      in.close(); // stream isn't closed
-    }
+    });
   }
 
   /**
@@ -238,13 +241,11 @@ public abstract class PerspectiveAdapter extends DockingDesktop implements IPers
      */
     for (int i = 0; i < c.getComponentCount(); i++) {
       Component comp = c.getComponent(i);
-
       // on the AutoHideExpandPanel, we need to set a new Dockable on the TitleBar
       // as it otherwise keeps the Dockable as "target"
       if (comp instanceof AutoHideExpandPanel) {
         AutoHideExpandPanel panel = (AutoHideExpandPanel) comp;
         panel.getTitleBar().setDockable(new Dockable() {
-
           @Override
           public DockKey getDockKey() {
             return new DockKey();
@@ -256,15 +257,12 @@ public abstract class PerspectiveAdapter extends DockingDesktop implements IPers
           }
         });
       }
-
       // the AutoHideButton points at the dockable, replace it with a new one here as well
       if (comp instanceof AutoHideButton) {
         AutoHideButton button = (AutoHideButton) comp;
-
         if (button.getDockable() == dockable) {
           // set an empty dockable to free up this one...
           button.init(new Dockable() {
-
             @Override
             public DockKey getDockKey() {
               return new DockKey();
@@ -277,7 +275,6 @@ public abstract class PerspectiveAdapter extends DockingDesktop implements IPers
           }, button.getZone());
         }
       }
-
       // recursively call the Container to also look at it's components
       if (comp instanceof Container) {
         removeFromDockingDesktop((Container) comp, dockable);
@@ -285,38 +282,26 @@ public abstract class PerspectiveAdapter extends DockingDesktop implements IPers
     }
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.perspectives.IPerspective#getContentPane()
-   */
   @Override
   public Container getContentPane() {
     return this;
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.IPerspective#restaureDefaults()
-   */
   @Override
   public void restoreDefaults() {
     // SHOULD BE CALLED ONLY FOR THE CURRENT PERSPECTIVE
     // to ensure views are not invisible
     try {
-      // Remove current conf file to force using default file from the
-      // jar
-      File loadFile = SessionService.getConfFileByPath(getClass().getSimpleName() + XML_EXT);
+      // Remove current conf file to force using default file from the jar
+      File loadFile = SessionService.getConfFileByPath(getClass().getSimpleName()
+          + Const.FILE_XML_EXT);
       // lazy deletion, the file can be already removed by a previous reset
       loadFile.delete();
-
       // Remove all registered dockables
       DockableState[] ds = getDockables();
       for (DockableState element : ds) {
         close(element.getDockable());
       }
-
       // force reload
       load();
       // set perspective again to force UI refresh
@@ -328,21 +313,6 @@ public abstract class PerspectiveAdapter extends DockingDesktop implements IPers
     }
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.IPerspective#setAsBeenSelected()
-   */
-  @Override
-  public void setAsBeenSelected(boolean b) {
-    bAsBeenSelected = b;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.perspectives.IPerspective#getViews()
-   */
   @Override
   public Set<IView> getViews() {
     Set<IView> views = new HashSet<IView>();
@@ -353,4 +323,13 @@ public abstract class PerspectiveAdapter extends DockingDesktop implements IPers
     return views;
   }
 
+  @Override
+  public String getID() {
+    return sID;
+  }
+
+  @Override
+  public String toString() {
+    return "Perspective[name=" + getID() + " description='" + getDesc() + "]";
+  }
 }
diff --git a/src/main/java/org/jajuk/ui/perspectives/PerspectiveManager.java b/src/main/java/org/jajuk/ui/perspectives/PerspectiveManager.java
index cfa5d68..135bceb 100644
--- a/src/main/java/org/jajuk/ui/perspectives/PerspectiveManager.java
+++ b/src/main/java/org/jajuk/ui/perspectives/PerspectiveManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.perspectives;
 
@@ -31,7 +31,6 @@ import java.util.Map;
 import java.util.Set;
 
 import javax.swing.JPanel;
-import javax.swing.SwingUtilities;
 
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
@@ -53,16 +52,12 @@ import org.jajuk.util.log.Log;
  * Perspectives Manager.
  */
 public final class PerspectiveManager {
-
   /** Current perspective. */
   private static IPerspective currentPerspective = null;
-
   /** Perspective name -> perspective. */
   private static Map<String, IPerspective> hmNameInstance = new HashMap<String, IPerspective>(10);
-
   /** perspective, required despite the Map above in order to keep the order of the perspectives as the order in the Map is undefined. */
   private static Set<IPerspective> perspectives = new LinkedHashSet<IPerspective>(10);
-
   /** List of perspectives that need reset from version n-1. */
   // None perspective to reset from 1.6 to 1.7
   private static String[] perspectivesToReset = new String[] {};
@@ -100,7 +95,7 @@ public final class PerspectiveManager {
       if (UpgradeManager.doNeedPerspectiveResetAtUpgrade()) {
         // upgrade message
         Messages.showInfoMessage(Messages.getString("Note.0"));
-        resetPerspectives();
+        resetPerspectivesAfterUpgrade();
       }
     }
     // Load each perspective
@@ -113,11 +108,7 @@ public final class PerspectiveManager {
     }
   }
 
-  /**
-   * Reset perspectives.
-   * DOCUMENT_ME
-   */
-  private static void resetPerspectives() {
+  private static void resetPerspectivesAfterUpgrade() {
     List<String> perspectivesToReset = Arrays.asList(PerspectiveManager.perspectivesToReset);
     for (IPerspective perspective : getPerspectives()) {
       String className = perspective.getClass().getSimpleName();
@@ -163,9 +154,6 @@ public final class PerspectiveManager {
     return PerspectiveManager.currentPerspective;
   }
 
-  /*
-   * @see org.jajuk.ui.perspectives.IPerspectiveManager#setCurrentPerspective(Perspective)
-   */
   /**
    * Sets the current perspective.
    * 
@@ -173,52 +161,47 @@ public final class PerspectiveManager {
    */
   protected static void setCurrentPerspective(final IPerspective perspective) {
     UtilGUI.waiting();
+    perspective.selected();
     // views display
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        perspective.setAsBeenSelected(true);
-        PerspectiveManager.currentPerspective = perspective;
-        for (IView view : perspective.getViews()) {
-          if (!view.isPopulated()) {
-            try {
-              view.initUI();
-            } catch (Exception e) {
-              Log.error(e);
-            }
-            view.setIsPopulated(true);
-          }
-          // Perform specific view operation at perspective display
-          view.onPerspectiveSelection();
-        }
-        // Clear the perspective panel
-        JPanel perspectivePanel = JajukMainWindow.getInstance().getPerspectivePanel();
-        if (perspectivePanel.getComponentCount() > 0) {
-          Component[] components = perspectivePanel.getComponents();
-          for (Component element : components) {
-            perspectivePanel.remove(element);
-          }
+    PerspectiveManager.currentPerspective = perspective;
+    for (IView view : perspective.getViews()) {
+      if (!view.isPopulated()) {
+        try {
+          view.initUI();
+        } catch (Exception e) {
+          Log.error(e);
         }
-        perspectivePanel.add(perspective.getContentPane(), BorderLayout.CENTER);
-        // refresh UI
-        perspectivePanel.revalidate();
-        perspectivePanel.repaint();
-        // Select right item in perspective selector
-        PerspectiveBarJPanel.getInstance().setActivated(perspective);
-        // store perspective selection
-        Conf.setProperty(Const.CONF_PERSPECTIVE_DEFAULT, perspective.getID());
-        UtilGUI.stopWaiting();
-        // Emit a event
-        ObservationManager.notify(new JajukEvent(JajukEvents.PERSPECTIVE_CHANGED,
-            ObservationManager.getDetailsLastOccurence(JajukEvents.FILE_LAUNCHED)));
+        view.setPopulated();
+      }
+      // Perform specific view operation at perspective display
+      view.onPerspectiveSelection();
+    }
+    // Clear the perspective panel
+    JPanel perspectivePanel = JajukMainWindow.getInstance().getPerspectivePanel();
+    if (perspectivePanel.getComponentCount() > 0) {
+      Component[] components = perspectivePanel.getComponents();
+      for (Component element : components) {
+        perspectivePanel.remove(element);
       }
-    });
+    }
+    perspectivePanel.add(perspective.getContentPane(), BorderLayout.CENTER);
+    // refresh UI
+    perspectivePanel.revalidate();
+    perspectivePanel.repaint();
+    // Select right item in perspective selector
+    PerspectiveBarJPanel.getInstance().setActivated(perspective);
+    // store perspective selection
+    Conf.setProperty(Const.CONF_PERSPECTIVE_DEFAULT, perspective.getID());
+    UtilGUI.stopWaiting();
+    // Emit a event
+    ObservationManager.notify(new JajukEvent(JajukEvents.PERSPECTIVE_CHANGED, ObservationManager
+        .getDetailsLastOccurence(JajukEvents.FILE_LAUNCHED)));
   }
 
   /**
    * Set current perspective.
    * 
-   * @param sPerspectiveID DOCUMENT_ME
+   * @param sPerspectiveID 
    */
   public static void setCurrentPerspective(String sPerspectiveID) {
     IPerspective perspective = hmNameInstance.get(sPerspectiveID);
@@ -238,18 +221,6 @@ public final class PerspectiveManager {
   }
 
   /**
-   * Saves perspectives and views position in the perspective.xml file Must be
-   * executed in EDT to avoid dead locks on getComponent()
-   * 
-   * @throws Exception the exception
-   */
-  public static void commit() throws Exception {
-    for (IPerspective perspective : getPerspectives()) {
-      perspective.commit();
-    }
-  }
-
-  /**
    * Register default perspective configuration. Will be overwritten by
    * perspective.xml parsing if it exists
    * <p>
@@ -259,31 +230,22 @@ public final class PerspectiveManager {
    */
   private static void registerDefaultPerspectives() {
     reset();
-
     // Simple perspective
     registerPerspective(new SimplePerspective());
-
     // Files perspective
     registerPerspective(new FilesPerspective());
-
     // Tracks perspective
     registerPerspective(new TracksPerspective());
-
     // Catalog perspective
     registerPerspective(new AlbumsPerspective());
-
     // Playlists perspective
     registerPerspective(new PlaylistsPerspective());
-
     // Display perspective
     registerPerspective(new DisplayPerspective());
-
     // Information perspective
     registerPerspective(new InfoPerspective());
-
     // Configuration perspective
     registerPerspective(new ConfigurationPerspective());
-
     // Stats perspective
     registerPerspective(new StatPerspective());
   }
@@ -291,7 +253,7 @@ public final class PerspectiveManager {
   /**
    * Register a new perspective.
    * 
-   * @param perspective DOCUMENT_ME
+   * @param perspective 
    * 
    * @return registered perspective
    */
diff --git a/src/main/java/org/jajuk/ui/perspectives/PlaylistsPerspective.java b/src/main/java/org/jajuk/ui/perspectives/PlaylistsPerspective.java
index ca95fd5..03ed003 100644
--- a/src/main/java/org/jajuk/ui/perspectives/PlaylistsPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/PlaylistsPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Contains all views that deals with playlist manipulation.
  */
 public class PlaylistsPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/perspectives/SimplePerspective.java b/src/main/java/org/jajuk/ui/perspectives/SimplePerspective.java
index e1b6978..7b3997c 100644
--- a/src/main/java/org/jajuk/ui/perspectives/SimplePerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/SimplePerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Simple perspective, contains only the logical table view.
  */
 public class SimplePerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -52,5 +50,4 @@ public class SimplePerspective extends PerspectiveAdapter {
   public ImageIcon getIcon() {
     return IconLoader.getIcon(JajukIcons.PERSPECTIVE_SIMPLE);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/perspectives/StatPerspective.java b/src/main/java/org/jajuk/ui/perspectives/StatPerspective.java
index 1da6652..6477632 100644
--- a/src/main/java/org/jajuk/ui/perspectives/StatPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/StatPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Statistics perspective.
  */
 public class StatPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/perspectives/TracksPerspective.java b/src/main/java/org/jajuk/ui/perspectives/TracksPerspective.java
index e6eee88..29ef294 100644
--- a/src/main/java/org/jajuk/ui/perspectives/TracksPerspective.java
+++ b/src/main/java/org/jajuk/ui/perspectives/TracksPerspective.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.perspectives;
 
 import javax.swing.ImageIcon;
@@ -31,7 +30,6 @@ import org.jajuk.util.Messages;
  * Logical perspective.
  */
 public class TracksPerspective extends PerspectiveAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/substance/ButtonShaper.java b/src/main/java/org/jajuk/ui/substance/ButtonShaper.java
index 1db7c1a..ebd5689 100644
--- a/src/main/java/org/jajuk/ui/substance/ButtonShaper.java
+++ b/src/main/java/org/jajuk/ui/substance/ButtonShaper.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.substance;
 
 import java.awt.Component;
@@ -30,10 +29,11 @@ import java.awt.geom.GeneralPath;
 import javax.swing.AbstractButton;
 import javax.swing.border.Border;
 
-import org.jvnet.substance.SubstanceButtonUI;
-import org.jvnet.substance.shaper.StandardButtonShaper;
-import org.jvnet.substance.shaper.SubstanceButtonShaper;
-import org.jvnet.substance.utils.border.SubstanceButtonBorder;
+import org.pushingpixels.substance.api.shaper.StandardButtonShaper;
+import org.pushingpixels.substance.api.shaper.SubstanceButtonShaper;
+import org.pushingpixels.substance.internal.ui.SubstanceButtonUI;
+import org.pushingpixels.substance.internal.utils.border.SubstanceButtonBorder;
+
 
 /*
  * based on code from Xtreme Media Player
@@ -42,11 +42,9 @@ import org.jvnet.substance.utils.border.SubstanceButtonBorder;
  * The Class ButtonShaper.
  */
 public abstract class ButtonShaper implements SubstanceButtonShaper {
-
   /* (non-Javadoc)
    * @see org.jvnet.substance.shaper.SubstanceButtonShaper#getButtonOutline(javax.swing.AbstractButton)
    */
-  @Override
   public Shape getButtonOutline(AbstractButton button) {
     return getButtonOutline(button, null, button.getWidth(), button.getHeight(), true);
   }
@@ -54,7 +52,6 @@ public abstract class ButtonShaper implements SubstanceButtonShaper {
   /* (non-Javadoc)
    * @see org.jvnet.substance.shaper.SubstanceButtonShaper#getButtonOutline(javax.swing.AbstractButton, java.awt.Insets)
    */
-  @Override
   public GeneralPath getButtonOutline(AbstractButton button, Insets insets) {
     throw new UnsupportedOperationException();
   }
@@ -62,7 +59,6 @@ public abstract class ButtonShaper implements SubstanceButtonShaper {
   /* (non-Javadoc)
    * @see org.jvnet.substance.shaper.SubstanceButtonShaper#getButtonOutline(javax.swing.AbstractButton, java.awt.Insets, int, int)
    */
-  @Override
   public GeneralPath getButtonOutline(AbstractButton button, Insets insets, int width, int height) {
     throw new UnsupportedOperationException();
   }
@@ -82,7 +78,6 @@ public abstract class ButtonShaper implements SubstanceButtonShaper {
         button.setBorder(null);
       }
       uiPreferredSize.setSize(uiw - bi.left - bi.right, uih - bi.top - bi.bottom);
-
       if (!isBorderComputing) {
         button.setBorder(this.getButtonBorder(button));
         button.putClientProperty(SubstanceButtonUI.BORDER_COMPUTED, "");
diff --git a/src/main/java/org/jajuk/ui/substance/CircleButtonShaper.java b/src/main/java/org/jajuk/ui/substance/CircleButtonShaper.java
index 96eb63f..0d40bb3 100644
--- a/src/main/java/org/jajuk/ui/substance/CircleButtonShaper.java
+++ b/src/main/java/org/jajuk/ui/substance/CircleButtonShaper.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.substance;
 
 import java.awt.Insets;
@@ -35,7 +34,6 @@ import javax.swing.AbstractButton;
  * The Class CircleButtonShaper.
  */
 public class CircleButtonShaper extends ButtonShaper {
-
   /* (non-Javadoc)
    * @see org.jvnet.substance.shaper.SubstanceButtonShaper#getDisplayName()
    */
@@ -51,11 +49,8 @@ public class CircleButtonShaper extends ButtonShaper {
   public Shape getButtonOutline(AbstractButton button, Insets insets, int w, int h, boolean isInner) {
     int width = w - 1;
     int height = h - 1;
-
     Shape shape = new Ellipse2D.Double(0, 0, width, height);
     GeneralPath generalPath = new GeneralPath(shape);
-
     return generalPath;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/substance/LeftConcaveButtonShaper.java b/src/main/java/org/jajuk/ui/substance/LeftConcaveButtonShaper.java
index d0b321d..0784427 100644
--- a/src/main/java/org/jajuk/ui/substance/LeftConcaveButtonShaper.java
+++ b/src/main/java/org/jajuk/ui/substance/LeftConcaveButtonShaper.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.substance;
 
 import java.awt.Insets;
@@ -37,14 +36,12 @@ import javax.swing.AbstractButton;
  * The Class LeftConcaveButtonShaper.
  */
 public class LeftConcaveButtonShaper extends ButtonShaper {
-
-  /** DOCUMENT_ME. */
   private int concaveDiameter;
 
   /**
    * Instantiates a new left concave button shaper.
    * 
-   * @param concaveDiameter DOCUMENT_ME
+   * @param concaveDiameter 
    */
   public LeftConcaveButtonShaper(int concaveDiameter) {
     super();
@@ -66,14 +63,10 @@ public class LeftConcaveButtonShaper extends ButtonShaper {
   public Shape getButtonOutline(AbstractButton button, Insets insets, int w, int h, boolean isInner) {
     int width = w - 1;
     int height = h - 1;
-
     int z = concaveDiameter / 3;
-
     Shape shape = new Ellipse2D.Double(0, 0, z, height);
     Area area = new Area(new RoundRectangle2D.Double(z / 2d, 0, width - z, height, z, z));
     area.subtract(new Area(shape));
-
     return new GeneralPath(area);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/substance/RightConcaveButtonShaper.java b/src/main/java/org/jajuk/ui/substance/RightConcaveButtonShaper.java
index ba1dd1b..6601543 100644
--- a/src/main/java/org/jajuk/ui/substance/RightConcaveButtonShaper.java
+++ b/src/main/java/org/jajuk/ui/substance/RightConcaveButtonShaper.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.substance;
 
 import java.awt.Insets;
@@ -37,14 +36,12 @@ import javax.swing.AbstractButton;
  * The Class RightConcaveButtonShaper.
  */
 public class RightConcaveButtonShaper extends ButtonShaper {
-
-  /** DOCUMENT_ME. */
   private int concaveDiameter;
 
   /**
    * Instantiates a new right concave button shaper.
    * 
-   * @param concaveDiameter DOCUMENT_ME
+   * @param concaveDiameter 
    */
   public RightConcaveButtonShaper(int concaveDiameter) {
     super();
@@ -66,13 +63,10 @@ public class RightConcaveButtonShaper extends ButtonShaper {
   public Shape getButtonOutline(AbstractButton button, Insets insets, int w, int h, boolean isInner) {
     int width = w - 1;
     int height = h - 1;
-
     int z = concaveDiameter / 3;
-
     Shape shape = new Ellipse2D.Double(width - z, 0, z, height);
     Area area = new Area(new RoundRectangle2D.Double(z / 2d, 0, width - z, height, z, z));
     area.subtract(new Area(shape));
-
     return new GeneralPath(area);
   }
 }
diff --git a/src/main/java/org/jajuk/ui/substance/RoundRectButtonShaper.java b/src/main/java/org/jajuk/ui/substance/RoundRectButtonShaper.java
index 749d3c4..3062ced 100644
--- a/src/main/java/org/jajuk/ui/substance/RoundRectButtonShaper.java
+++ b/src/main/java/org/jajuk/ui/substance/RoundRectButtonShaper.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.substance;
 
 import java.awt.Insets;
@@ -35,7 +34,6 @@ import javax.swing.AbstractButton;
  * The Class RoundRectButtonShaper.
  */
 public class RoundRectButtonShaper extends ButtonShaper {
-
   /* (non-Javadoc)
    * @see org.jvnet.substance.shaper.SubstanceButtonShaper#getDisplayName()
    */
@@ -51,11 +49,8 @@ public class RoundRectButtonShaper extends ButtonShaper {
   public Shape getButtonOutline(AbstractButton button, Insets insets, int w, int h, boolean isInner) {
     int width = w - 1;
     int height = h - 1;
-
     Shape shape = new RoundRectangle2D.Double(0, 0, width, height, width / 3d, height / 3d);
     GeneralPath generalPath = new GeneralPath(shape);
-
     return generalPath;
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/thumbnails/AbstractThumbnail.java b/src/main/java/org/jajuk/ui/thumbnails/AbstractThumbnail.java
index ac869ba..77ab4ad 100644
--- a/src/main/java/org/jajuk/ui/thumbnails/AbstractThumbnail.java
+++ b/src/main/java/org/jajuk/ui/thumbnails/AbstractThumbnail.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.thumbnails;
 
 import com.vlsolutions.swing.docking.ShadowBorder;
@@ -72,76 +71,35 @@ import org.jajuk.util.log.Log;
  * display...
  */
 public abstract class AbstractThumbnail extends JPanel implements ActionListener, Transferable {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -6396225563540281695L;
-
   /** Size. */
   int size;
-
-  /** DOCUMENT_ME. */
   protected JLabel jlIcon;
-
-  /** DOCUMENT_ME. */
   private static long lDateLastMove;
-
-  /** DOCUMENT_ME. */
   private static Point lastPosition;
-
-  /** DOCUMENT_ME. */
   JPopupMenu jmenu;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlay;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPush;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiFrontPush;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDelete;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlayShuffle;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlayRepeat;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiGetCovers;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiShowPopup;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiCDDBWizard;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiProperties;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiOpenLastFMSite;
-
   /** Dragging flag used to disable simple click behavior. */
   private static boolean bDragging = false;
-
   /** Current details dialog. */
   private static ThumbnailPopup details;
-
-  /** DOCUMENT_ME. */
   private static AbstractThumbnail last;
-
-  /** DOCUMENT_ME. */
   private static AbstractThumbnail mouseOverItem = null;
-
   /** Whether this thumb is used in artist view *. */
   private boolean artistView;
-
   /** Associated file. */
   File fCover;
-
   /** Timer used to launch popup */
   static {
     Timer timerPopup = new Timer(200, new ActionListener() {
@@ -163,7 +121,7 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
             // Finally display the popup (Leave if user unselected
             // the option "Show catalog popups"
             if (Conf.getBoolean(Const.CONF_SHOW_POPUPS)) {
-              mouseOverItem.displayPopup();
+              mouseOverItem.displayPopup(true);
             }
           }
           bDragging = false;
@@ -206,12 +164,13 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
   }
 
   /**
-   * display a popup over the catalog item.
+   * Display a popup over the catalog item.
+   * @param autoclose should the popup close by itself or stuck on the screen ?
    */
-  private void displayPopup() {
+  private void displayPopup(boolean autoclose) {
     // close popup if any visible
     if (details != null) {
-      details.dispose();
+      details.closeIfAutoclose();
       details = null;
     }
     // don't show details if the contextual popup menu
@@ -219,17 +178,15 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
     if (jmenu.isVisible()) {
       return;
     }
-    UtilGUI.waiting();
     String description = getDescription();
     if (description != null) {
       details = new ThumbnailPopup(description, new Rectangle(jlIcon.getLocationOnScreen(),
-          new Dimension(jlIcon.getWidth(), jlIcon.getHeight())), true);
-      UtilGUI.stopWaiting();
+          new Dimension(jlIcon.getWidth(), jlIcon.getHeight())), autoclose);
     }
   }
 
   /**
-   * Populate. DOCUMENT_ME
+   * Populate. 
    */
   public abstract void populate();
 
@@ -246,7 +203,6 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
   void postPopulate() {
     // do this only once as it might be a costly operation...
     Item item = getItem();
-
     // Album menu
     jmenu = new JPopupMenu();
     jmiPlay = new JMenuItem(ActionManager.getAction(JajukActions.PLAY_SELECTION));
@@ -261,11 +217,11 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
     jmiPlayShuffle.putClientProperty(Const.DETAIL_SELECTION, item);
     jmiPlayRepeat = new JMenuItem(ActionManager.getAction(JajukActions.PLAY_REPEAT_SELECTION));
     jmiPlayRepeat.putClientProperty(Const.DETAIL_SELECTION, item);
-    jmiGetCovers = new JMenuItem(Messages.getString("CatalogView.7"), IconLoader
-        .getIcon(JajukIcons.COVER_16X16));
+    jmiGetCovers = new JMenuItem(Messages.getString("CatalogView.7"),
+        IconLoader.getIcon(JajukIcons.COVER_16X16));
     jmiGetCovers.addActionListener(this);
-    jmiShowPopup = new JMenuItem(Messages.getString("CatalogView.20"), IconLoader
-        .getIcon(JajukIcons.POPUP));
+    jmiShowPopup = new JMenuItem(Messages.getString("CatalogView.20"),
+        IconLoader.getIcon(JajukIcons.POPUP));
     jmiShowPopup.addActionListener(this);
     jmiCDDBWizard = new JMenuItem(ActionManager.getAction(JajukActions.CDDB_SELECTION));
     jmiCDDBWizard.putClientProperty(Const.DETAIL_SELECTION, item);
@@ -297,7 +253,6 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
     }
     jmenu.addSeparator();
     jmenu.add(jmiProperties);
-
     jlIcon.addMouseMotionListener(new MouseMotionAdapter() {
       @Override
       public void mouseDragged(MouseEvent e) {
@@ -314,11 +269,8 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
         lDateLastMove = System.currentTimeMillis();
         lastPosition = e.getPoint();
       }
-
     });
-
     jlIcon.addMouseListener(new JajukMouseAdapter() {
-
       @Override
       public void handlePopup(MouseEvent e) {
         if (e.getSource() == jlIcon) {
@@ -370,14 +322,13 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
         }
         super.mouseReleased(e);
       }
-
     });
   }
 
   /**
    * Sets the selected.
    * 
-   * @param b DOCUMENT_ME
+   * @param b 
    */
   public final void setSelected(boolean b) {
     requestFocusInWindow();
@@ -392,7 +343,7 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
   }
 
   /**
-   * Launch. DOCUMENT_ME
+   * Launch. 
    */
   public abstract void launch();
 
@@ -426,7 +377,7 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
       }
       CoverView cv = null;
       if (file != null) {
-        cv = new CoverView(file);
+        cv = new CoverView(file, jd);
         cv.setID("catalog/0");
         cv.initUI();
         jd.add(cv);
@@ -437,12 +388,11 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
         UtilGUI.centerWindow(jd);
         jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
         jd.setVisible(true);
-       
       } else {
         Messages.showErrorMessage(166);
       }
     } else if (e.getSource() == jmiShowPopup) {
-      displayPopup();
+      displayPopup(false);
     }
   }
 
@@ -484,5 +434,4 @@ public abstract class AbstractThumbnail extends JPanel implements ActionListener
   public JLabel getIcon() {
     return jlIcon;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/thumbnails/LastFmAlbumThumbnail.java b/src/main/java/org/jajuk/ui/thumbnails/LastFmAlbumThumbnail.java
index 021d3fe..a65af7a 100644
--- a/src/main/java/org/jajuk/ui/thumbnails/LastFmAlbumThumbnail.java
+++ b/src/main/java/org/jajuk/ui/thumbnails/LastFmAlbumThumbnail.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.thumbnails;
 
 import ext.services.lastfm.AlbumInfo;
@@ -28,6 +27,7 @@ import ext.services.lastfm.TrackInfo;
 import java.awt.Color;
 import java.awt.image.BufferedImage;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.net.SocketTimeoutException;
 import java.net.URL;
 
@@ -60,22 +60,18 @@ import org.jdesktop.swingx.border.DropShadowBorder;
  * information display...
  */
 public class LastFmAlbumThumbnail extends AbstractThumbnail {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -804471264407148566L;
-
   /** Associated album. */
   private AlbumInfo album;
-
   /** Is this artist known in collection ?. */
   private final boolean bKnown;
-
   /** Thumb associated image *. */
   private ImageIcon ii;
 
   /**
    * The Constructor.
-   * 
+   *
    * @param album :
    * associated album
    */
@@ -87,7 +83,7 @@ public class LastFmAlbumThumbnail extends AbstractThumbnail {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.thumbnails.AbstractThumbnail#getItem()
    */
   @Override
@@ -101,7 +97,7 @@ public class LastFmAlbumThumbnail extends AbstractThumbnail {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.thumbnails.AbstractThumbnail#getDescription()
    */
   @Override
@@ -144,7 +140,7 @@ public class LastFmAlbumThumbnail extends AbstractThumbnail {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.thumbnails.AbstractThumbnail#launch()
    */
   @Override
@@ -175,6 +171,14 @@ public class LastFmAlbumThumbnail extends AbstractThumbnail {
       // Download image and store file reference (to generate the
       // popup thumb for ie)
       fCover = DownloadManager.downloadToCache(remote);
+      if (!fCover.exists()) {
+        Log.warn("Cache file not found: {{" + fCover.getAbsolutePath() + "}}");
+        return;
+      }
+      if (fCover.length() == 0) {
+        Log.warn("Cache file has zero bytes: {{" + fCover.getAbsolutePath() + "}}");
+        return;
+      }
       BufferedImage image = ImageIO.read(fCover);
       if (image == null) {
         Log.warn("Could not read cover from: {{" + fCover.getAbsolutePath() + "}}");
@@ -193,8 +197,21 @@ public class LastFmAlbumThumbnail extends AbstractThumbnail {
       // only report a warning for FileNotFoundException and do not show a
       // stacktrace in the logfile as it is happening frequently
       Log.warn("Could not load image, timed out while reading address: {{" + e.getMessage() + "}}");
+    } catch (IOException e) {
+      if (e.getMessage().contains(" 403 ")) {
+        Log.warn("Could not access webpage, returned error 403: " + e.getMessage());
+      } else {
+        Log.error(e);
+      }
     } catch (Exception e) {
       Log.error(e);
+      // check for empty file to remove invalid cache entries
+      if (fCover.exists() && fCover.length() == 0) {
+        Log.warn("Removing empty file from cache: " + fCover.getAbsolutePath());
+        if (!fCover.delete()) {
+          Log.warn("Error removing file: " + fCover.getAbsolutePath());
+        }
+      }
     }
   }
 
@@ -225,8 +242,8 @@ public class LastFmAlbumThumbnail extends AbstractThumbnail {
     }
     if (bKnown) {
       // Album known in collection, display its name in bold
-      jlTitle = new JLabel(UtilString.getLimitedString(fullTitle, textLength), IconLoader
-          .getIcon(JajukIcons.ALBUM), SwingConstants.CENTER);
+      jlTitle = new JLabel(UtilString.getLimitedString(fullTitle, textLength),
+          IconLoader.getIcon(JajukIcons.ALBUM), SwingConstants.CENTER);
       jlTitle.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
     } else {
       jlTitle = new JLabel(UtilString.getLimitedString(fullTitle, textLength));
@@ -252,7 +269,5 @@ public class LastFmAlbumThumbnail extends AbstractThumbnail {
     if (UtilSystem.isBrowserSupported()) {
       jmiOpenLastFMSite.putClientProperty(Const.DETAIL_CONTENT, album.getUrl());
     }
-
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/thumbnails/LastFmArtistThumbnail.java b/src/main/java/org/jajuk/ui/thumbnails/LastFmArtistThumbnail.java
index b0fa4a2..8f84ae6 100644
--- a/src/main/java/org/jajuk/ui/thumbnails/LastFmArtistThumbnail.java
+++ b/src/main/java/org/jajuk/ui/thumbnails/LastFmArtistThumbnail.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.thumbnails;
 
 import ext.services.lastfm.AlbumInfo;
@@ -58,23 +57,19 @@ import org.jdesktop.swingx.border.DropShadowBorder;
  * information display...
  */
 public class LastFmArtistThumbnail extends AbstractThumbnail {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -804471264407148566L;
-
   /** Associated artist. */
   private final ArtistInfo artist;
-
   /** Is this artist known in collection ?. */
   private final boolean bKnown;
-
   /** Thumb associated image *. */
   private ImageIcon ii;
 
   /**
    * The Constructor.
    * 
-   * @param artist DOCUMENT_ME
+   * @param artist 
    */
   public LastFmArtistThumbnail(ArtistInfo artist) {
     super(100);
@@ -165,7 +160,6 @@ public class LastFmArtistThumbnail extends AbstractThumbnail {
         Log.warn("Could not read remote file: {{" + remote.toString() + "}}");
         return;
       }
-
       BufferedImage image = ImageIO.read(fCover);
       if (image == null) {
         Log.warn("Could not read image data in file: {{" + fCover + "}}");
@@ -178,15 +172,14 @@ public class LastFmArtistThumbnail extends AbstractThumbnail {
       } else {
         ii = UtilGUI.getScaledImage(downloadedImage, 100);
       }
-
       // Free images memory
       downloadedImage.getImage().flush();
       image.flush();
     } catch (IIOException e) {
       // report IIOException only as warning here as we can expect this to
       // happen frequently with images on the net
-      Log.warn("Could not read image: {{" + artist.getImageUrl().toString() + "}} Cache: {{"
-          + fCover + "}}", e.getMessage());
+      Log.warn("Could not read image: {{" + artist.getImageUrl() + "}} Cache: {{" + fCover + "}}",
+          e.getMessage());
     } catch (UnknownHostException e) {
       Log.warn("Could not contact host for loading images: {{" + e.getMessage() + "}}");
     } catch (Exception e) {
@@ -247,5 +240,4 @@ public class LastFmArtistThumbnail extends AbstractThumbnail {
       jmiOpenLastFMSite.putClientProperty(Const.DETAIL_CONTENT, artist.getUrl());
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/thumbnails/LocalAlbumThumbnail.java b/src/main/java/org/jajuk/ui/thumbnails/LocalAlbumThumbnail.java
index a97a835..0c1797b 100644
--- a/src/main/java/org/jajuk/ui/thumbnails/LocalAlbumThumbnail.java
+++ b/src/main/java/org/jajuk/ui/thumbnails/LocalAlbumThumbnail.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.thumbnails;
 
 import com.vlsolutions.swing.docking.ShadowBorder;
@@ -55,6 +54,7 @@ import org.jajuk.ui.helpers.FontManager;
 import org.jajuk.ui.helpers.FontManager.JajukFont;
 import org.jajuk.ui.helpers.PreferencesJMenu;
 import org.jajuk.ui.helpers.StarsHelper;
+import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
@@ -68,23 +68,13 @@ import org.jajuk.util.log.Log;
  * display...
  */
 public class LocalAlbumThumbnail extends AbstractThumbnail {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -282669695411453802L;
-
   /** Associated album. */
   private Album album;
-
-  /** DOCUMENT_ME. */
   private JLabel jlArtist;
-
-  /** DOCUMENT_ME. */
   private JLabel jlAlbum;
-
-  /** DOCUMENT_ME. */
   private final boolean bShowFullText;
-
-  /** DOCUMENT_ME. */
   private PreferencesJMenu pjmFiles;
 
   /**
@@ -126,19 +116,15 @@ public class LocalAlbumThumbnail extends AbstractThumbnail {
     if (bShowFullText) {
       int iRows = 7 + 7 * ((size / 50) - 1);
       String artistName = album.getArtistOrALbumArtist();
-
       jlArtist = new JLabel(UtilString.getLimitedString(artistName, iRows));
       jlArtist.setToolTipText(artistName);
       jlArtist.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-
       // we have to use a empty border to avoid getting default border
       jlArtist.setBorder(new EmptyBorder(0, 0, 0, 0));
       jlAlbum = new JLabel(UtilString.getLimitedString(album.getName2(), iRows));
       jlAlbum.setToolTipText(album.getName2());
       jlAlbum.setBorder(new EmptyBorder(0, 0, 0, 0));
-
       jlIcon.setToolTipText(artistName + "/" + album.getName2());
-
       // Add items
       setLayout(new MigLayout("ins 0", "[grow]", "[" + (size + 10) + "!][grow][grow]"));
       add(jlIcon, "wrap,center");
@@ -203,15 +189,13 @@ public class LocalAlbumThumbnail extends AbstractThumbnail {
     Track firstTrack = tracks.iterator().next();
     Color bgcolor = UtilGUI.getUltraLightColor();
     Color fgcolor = UtilGUI.getForegroundColor();
-    String sOut = "<html bgcolor='#" + UtilGUI.getHTMLColor(bgcolor) + "'><TABLE color='"
-        + UtilGUI.getHTMLColor(fgcolor) + "'><TR><TD VALIGN='TOP'> <b>" + album.getName2()
-        + "</b><br><br>";
+    String sOut = "<html bgcolor='#" + UtilGUI.getHTMLColor(bgcolor) + "'> <b>" + album.getName2()
+        + "</b><br><TABLE color='" + UtilGUI.getHTMLColor(fgcolor) + "'><TR><TD VALIGN='TOP'>";
     // display cover
     if (cover.exists()) {
       sOut += "<img src='file:" + cover.getAbsolutePath() + "'><br>";
     }
     // TODO : add AlbumArtist value and hyperlink here
-
     // Display artist as global value only if it is a single artist album
     // We use file://<item type>?<item id> as HTML hyperlink format
     if (album.getArtist() != null) {
@@ -236,8 +220,9 @@ public class LocalAlbumThumbnail extends AbstractThumbnail {
       sOut += "<br>"
           + Messages.getHumanPropertyName(Const.XML_TRACK_RATE)
           + ": <img src='"
-          + SessionService.getConfFileByPath(
-              "cache/internal/star" + StarsHelper.getStarsNumber(album) + "_16x16.png").toURI()
+          + SessionService
+              .getConfFileByPath(
+                  "cache/internal/star" + StarsHelper.getStarsNumber(album) + "_16x16.png").toURI()
               .toURL().toExternalForm() + "'> (" + album.getRate() + ")";
     } catch (MalformedURLException e) {
       Log.error(e);
@@ -246,7 +231,6 @@ public class LocalAlbumThumbnail extends AbstractThumbnail {
     long length = album.getDuration();
     sOut += "<br>" + Messages.getHumanPropertyName(Const.XML_TRACK_LENGTH) + ": "
         + UtilString.formatTimeBySec(length) + "</TD><TD VALIGN='TOP'><br>";
-
     // Show each track detail
     for (Track track : tracks) {
       sOut += "<br>";
@@ -278,7 +262,11 @@ public class LocalAlbumThumbnail extends AbstractThumbnail {
   @Override
   public void launch() {
     // play the album
-    jmiPlay.doClick();
+    if (Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK)) {
+      jmiPush.doClick();
+    } else {
+      jmiPlay.doClick();
+    }
   }
 
   /**
@@ -297,5 +285,4 @@ public class LocalAlbumThumbnail extends AbstractThumbnail {
     inputMap.put(KeyStroke.getKeyStroke("alt ENTER"), "properties");
     actionMap.put("properties", action);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/thumbnails/ThumbnailManager.java b/src/main/java/org/jajuk/ui/thumbnails/ThumbnailManager.java
index 932a7df..bbd8448 100644
--- a/src/main/java/org/jajuk/ui/thumbnails/ThumbnailManager.java
+++ b/src/main/java/org/jajuk/ui/thumbnails/ThumbnailManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.thumbnails;
 
 import java.awt.Image;
@@ -50,7 +49,6 @@ import org.jajuk.util.log.Log;
  * Manage thumbnails.
  */
 public final class ThumbnailManager {
-
   /**
    * No instances.
    */
@@ -78,10 +76,8 @@ public final class ThumbnailManager {
       // Refresh default cover
       File fDefault = SessionService.getConfFileByPath(Const.FILE_THUMBS + "/" + size + "/"
           + Const.FILE_THUMB_NO_COVER);
-      if (fDefault.exists()) {
-        if (!fDefault.delete()) {
-          Log.warn("Could not delete " + fDefault.toString());
-        }
+      if (fDefault.exists() && !fDefault.delete()) {
+        Log.warn("Could not delete " + fDefault.toString());
       }
       try {
         int iSize = Integer.parseInt(new StringTokenizer(size, "x").nextToken());
@@ -99,7 +95,7 @@ public final class ThumbnailManager {
   /**
    * Delete all thumbs for a given album.
    * 
-   * @param album DOCUMENT_ME
+   * @param album 
    */
   public static void cleanThumbs(Album album) {
     // Now delete thumb files
@@ -120,20 +116,20 @@ public final class ThumbnailManager {
    * created if necessary. the thumbnail must be maxDim pixels or less. Thanks
    * Marco Schmidt
    * http://schmidt.devlib.org/java/save-jpeg-thumbnail.html#source
-   * 
+   *
    * @param orig source image
    * @param thumb destination file
    * @param maxDim required size
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
    * @throws InterruptedException the interrupted exception
+   * @throws IOException Signals that an I/O exception has occurred.
    */
   public static void createThumbnail(final File orig, final File thumb, final int maxDim)
       throws InterruptedException, IOException {
     // do not use URL object has it can corrupt special paths
     ImageIcon ii = new ImageIcon(orig.getAbsolutePath());
     if (ii.getImageLoadStatus() != MediaTracker.COMPLETE) {
-      throw new JajukRuntimeException("Cannot load image : " + orig.getAbsolutePath());
+      throw new JajukRuntimeException("Cannot load image: " + orig.getAbsolutePath()
+          + ", load status is: " + ii.getImageLoadStatus());
     }
     createThumbnail(ii, thumb, maxDim);
   }
@@ -144,24 +140,21 @@ public final class ThumbnailManager {
    * encoding makes impossible to create the image from a file. Will be created
    * if necessary. the thumbnail must be maxDim pixels or less. Thanks Marco
    * Schmidt http://schmidt.devlib.org/java/save-jpeg-thumbnail.html#source
-   * 
+   *
+   * @param ii 
    * @param thumb destination file (jpg)
    * @param maxDim required size
-   * @param ii DOCUMENT_ME
-   * 
    * @throws InterruptedException the interrupted exception
    * @throws IOException Signals that an I/O exception has occurred.
-   * @throws Exception    */
+   */
   public static void createThumbnail(final ImageIcon ii, final File thumb, final int maxDim)
       throws InterruptedException, IOException {
     // Synchronize the file to avoid any concurrency between several threads refreshing the thumb
     // like the catalog view and the artist view.
-
     // Don't lock the thumb file itself because we have to write in in this method and
     // Windows doesn't support share mode for locks but only exclusive
     File thumbLock = new File(thumb.getAbsolutePath() + ".lock");
     thumbLock.createNewFile();
-
     synchronized (thumbLock.getAbsolutePath().intern()) {
       // Note that at this point, the image is fully loaded (done in the ImageIcon constructor)
       final Image image = ii.getImage();
@@ -185,7 +178,6 @@ public final class ThumbnailManager {
       // Free thumb memory
       thumbImage.flush();
     }
-
   }
 
   /**
@@ -204,8 +196,8 @@ public final class ThumbnailManager {
    * Make thumbnail file exists (album id.jpg or.gif or .png) in thumbs
    * directory if it doesn't exist yet
    * 
-   * @param album DOCUMENT_ME
-   * @param size DOCUMENT_ME
+   * @param album 
+   * @param size 
    * 
    * @return whether a new cover has been created
    */
@@ -246,5 +238,4 @@ public final class ThumbnailManager {
         .append(size).append('/').append(album.getID()).append('.').append(Const.EXT_THUMB);
     return SessionService.getConfFileByPath(thumb.toString());
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/thumbnails/ThumbnailPopup.java b/src/main/java/org/jajuk/ui/thumbnails/ThumbnailPopup.java
index 67b286a..3ae5bd2 100644
--- a/src/main/java/org/jajuk/ui/thumbnails/ThumbnailPopup.java
+++ b/src/main/java/org/jajuk/ui/thumbnails/ThumbnailPopup.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.thumbnails;
 
 import java.awt.KeyEventDispatcher;
@@ -34,9 +33,10 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.swing.JDialog;
 import javax.swing.JEditorPane;
+import javax.swing.JRootPane;
 import javax.swing.JScrollPane;
-import javax.swing.JWindow;
 import javax.swing.SwingUtilities;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkEvent.EventType;
@@ -52,8 +52,6 @@ import org.jajuk.base.TrackManager;
 import org.jajuk.base.Year;
 import org.jajuk.base.YearManager;
 import org.jajuk.services.players.QueueModel;
-import org.jajuk.ui.helpers.FontManager;
-import org.jajuk.ui.helpers.FontManager.JajukFont;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.UtilFeatures;
@@ -66,25 +64,17 @@ import org.jajuk.util.log.Log;
  * <p>
  * It is displayed nicely from provided jlabel position
  * </p>
- * <p>
- * We use a JWindow instead of a JDialog because the painting is faster
- * </p>.
  */
-public class ThumbnailPopup extends JWindow {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = -8131528719972829954L;
-
-  /** DOCUMENT_ME. */
+ at SuppressWarnings("serial")
+public class ThumbnailPopup extends JDialog {
   private final JEditorPane text;
-
-  /** DOCUMENT_ME. */
   private KeyEventDispatcher dispatcher = null;
+  private boolean autoclose = false;
 
   /**
    * Launch selection and set right cursor.
    * 
-   * @param tracks DOCUMENT_ME
+   * @param tracks 
    */
   private void launchLink(List<Track> tracks) {
     List<org.jajuk.base.File> toPlay = new ArrayList<org.jajuk.base.File>(1);
@@ -95,12 +85,13 @@ public class ThumbnailPopup extends JWindow {
       }
     }
     text.setCursor(UtilGUI.WAIT_CURSOR);
-    QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(toPlay), Conf
-        .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), Conf
-        .getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
+    QueueModel.push(
+        UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(toPlay),
+            Conf.getBoolean(Const.CONF_STATE_REPEAT), true),
+        Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
     // Change icon cursor and wait a while so user can see it in case
     // the PUSH_ON_CLICK option is set, otherwise, user may think
-    // nothing appened.
+    // nothing appended.
     try {
       Thread.sleep(250);
     } catch (InterruptedException e1) {
@@ -114,18 +105,37 @@ public class ThumbnailPopup extends JWindow {
    * 
    * @param description HTML text to display (HTML 3.0)
    * @param origin :
-   * coordinates of the origin item on whish we want to display the
-   * popup
+   * coordinates of the origin item on which we want to display the popup
    * @param autoclose :
    * whether the popup should close when mouse leave the origin item or
    * is displayed as a regular Dialog
    */
   public ThumbnailPopup(String description, Rectangle origin, boolean autoclose) {
+    this.autoclose = autoclose;
     getRootPane().setOpaque(true);
     text = new JEditorPane("text/html", description);
     text.setEditable(false);
-    text.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
-    text.setFont(FontManager.getInstance().getFont(JajukFont.DEFAULT));
+    setHyperlinkHandling();
+    final JScrollPane jspText = new JScrollPane(text);
+    add(jspText);
+    setUndecorated(true);
+    if (autoclose) {
+      getRootPane().setWindowDecorationStyle(JRootPane.NONE);
+      setAlwaysOnTop(false);
+      addAutoCloseHandling();
+    } else {
+      setDefaultLookAndFeelDecorated(true);
+      setAlwaysOnTop(true);
+    }
+    setSizeAndLocation(origin);
+    pack();
+    setVisible(true);
+    setKeystrokes();
+    // Force scrollbar to stay on top (otherwise, it scrolls automatically to the bottom)
+    forceScrollbarToTop(jspText);
+  }
+
+  private void setHyperlinkHandling() {
     text.addHyperlinkListener(new HyperlinkListener() {
       @Override
       public void hyperlinkUpdate(HyperlinkEvent e) {
@@ -176,75 +186,99 @@ public class ThumbnailPopup extends JWindow {
             }
           });
         }
+      }
+    });
+  }
 
+  /**
+   * @param jspText
+   */
+  private void forceScrollbarToTop(final JScrollPane jspText) {
+    SwingUtilities.invokeLater(new Runnable() {
+      @Override
+      public void run() {
+        jspText.getVerticalScrollBar().setValue(0);
       }
     });
-    final JScrollPane jspText = new JScrollPane(text);
-    add(jspText);
-    if (autoclose) {
-      // Make sure to close this popup when it lost focus
-      text.addMouseListener(new MouseAdapter() {
-        @Override
-        public void mouseExited(MouseEvent e) {
-          // Test if mouse is really outside the popup, for unknown reason,
-          // this event is catch when entering the popup (Windows)
-          if (!jspText.contains(e.getPoint())) {
-            dispose();
-          }
-        }
-      });
-    }
+  }
+
+  /**
+   * @param origin
+   */
+  private void setSizeAndLocation(Rectangle origin) {
     if (origin != null) {
-      // compute dialog position ( note that setRelativeTo
-      // is buggy and that we need more advanced positioning)
-      int x = (int) origin.getX() + (int) (0.6 * origin.getWidth());
-      // set position at 60 % of the picture
-      int y = (int) origin.getY() + (int) (0.6 * origin.getHeight());
-      int screenWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
-      int screenHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
-      // Adjust position if details are located outside
-      // the screen
-      // in x-axis
-      if ((x + 500) > screenWidth) {
-        x = screenWidth - 510;
-      }
-      if ((y + 400) > screenHeight) {
-        x = (int) origin.getX() + (int) (0.6 * origin.getWidth());
-        if ((x + 500) > screenWidth) {
-          x = screenWidth - 510;
-        }
-        y = (int) origin.getY() + (int) (0.4 * origin.getHeight()) - 350;
-      }
-      setLocation(x, y);
+      setLocationRelativeToOrigin(origin);
     } else {
-      setLocationByPlatform(true);
+      UtilGUI.centerWindow(this);
     }
-    setSize(500, 400);
-    setVisible(true);
-    // Force scrollbar to stay on top
-    SwingUtilities.invokeLater(new Runnable() {
+  }
+
+  /**
+   * @param autoclose
+   */
+  private void addAutoCloseHandling() {
+    // Make sure to close this popup when it lost focus
+    getContentPane().addMouseListener(new MouseAdapter() {
       @Override
-      public void run() {
-        jspText.getVerticalScrollBar().setValue(0);
+      public void mouseExited(MouseEvent e) {
+        // Test if mouse is really outside the popup, for unknown reason,
+        // this event is catch when entering the popup (Windows)
+        if (!text.contains(e.getPoint())) {
+          dispose();
+        }
       }
     });
-    setKeystrokes();
+  }
+
+  /**
+   * @param origin
+   */
+  private void setLocationRelativeToOrigin(Rectangle origin) {
+    // compute dialog position ( note that setRelativeTo
+    // is buggy and that we need more advanced positioning)
+    int x = (int) origin.getX() + (int) (0.6 * origin.getWidth());
+    // set position at 60 % of the picture
+    int y = (int) origin.getY() + (int) (0.6 * origin.getHeight());
+    int screenWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
+    int screenHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
+    // Adjust position if details are located outside
+    // the screen
+    // in x-axis
+    if ((x + getWidth()) > screenWidth) {
+      x = screenWidth - (getWidth() + 10);
+    }
+    if ((y + getHeight()) > screenHeight) {
+      x = (int) origin.getX() + (int) (0.6 * origin.getWidth());
+      if ((x + getWidth()) > screenWidth) {
+        x = screenWidth - (getWidth() + 10);
+      }
+      y = (int) origin.getY() + (int) (0.4 * origin.getHeight()) - (getHeight() - 50);
+    }
+    setLocation(x, y);
+  }
+
+  /* (non-Javadoc)
+   * @see java.awt.Window#dispose()
+   */
+  @Override
+  public void dispose() {
+    removeKeystrokes();
+    super.dispose();
+  }
+
+  public void closeIfAutoclose() {
+    if (autoclose) {
+      dispose();
+    }
   }
 
   /**
    * Add keystroke to dispose the popup when escape is pressed For unknown
-   * reasons, registerKeyboardAction() against JWindow doesn't work (it does for
-   * JFrame) but we need to use JWindow for performance reasons. for that
-   * reason, we add a keyboard focus manager which is called before any focus
-   * consideration
-   * 
-   * Note that for a JFrame, we would use
-   * rootPane.registerKeyboardAction(actionListener, stroke,
-   * JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+   * reasons, registerKeyboardAction() against this dialog has no effect (maybe because 
+   * it doesn't get the focus)
    */
   private void setKeystrokes() {
     removeKeystrokes();
-
     dispatcher = new KeyEventDispatcher() {
       @Override
       public boolean dispatchKeyEvent(KeyEvent e) {
@@ -252,13 +286,12 @@ public class ThumbnailPopup extends JWindow {
         return false;
       }
     };
-
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher);
   }
 
   /**
    * Removes the keystrokes.
-   * DOCUMENT_ME
+   * 
    */
   private void removeKeystrokes() {
     if (dispatcher != null) {
@@ -266,13 +299,4 @@ public class ThumbnailPopup extends JWindow {
       dispatcher = null;
     }
   }
-
-  /* (non-Javadoc)
-   * @see java.awt.Window#dispose()
-   */
-  @Override
-  public void dispose() {
-    removeKeystrokes();
-    super.dispose();
-  }
 }
diff --git a/src/main/java/org/jajuk/ui/thumbnails/package.html b/src/main/java/org/jajuk/ui/thumbnails/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/ui/thumbnails/package.html
+++ b/src/main/java/org/jajuk/ui/thumbnails/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/views/AbstractTableView.java b/src/main/java/org/jajuk/ui/views/AbstractTableView.java
index 206119d..2452156 100644
--- a/src/main/java/org/jajuk/ui/views/AbstractTableView.java
+++ b/src/main/java/org/jajuk/ui/views/AbstractTableView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import ext.AutoCompleteDecorator;
@@ -27,6 +26,8 @@ import java.awt.Color;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.KeyAdapter;
@@ -49,6 +50,7 @@ import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.JTextField;
 import javax.swing.KeyStroke;
+import javax.swing.SortOrder;
 import javax.swing.SwingUtilities;
 import javax.swing.SwingWorker;
 import javax.swing.event.ListSelectionEvent;
@@ -75,6 +77,7 @@ import org.jajuk.ui.helpers.FontManager;
 import org.jajuk.ui.helpers.FontManager.JajukFont;
 import org.jajuk.ui.helpers.ILaunchCommand;
 import org.jajuk.ui.helpers.JajukTableModel;
+import org.jajuk.ui.helpers.PlayHighlighterPredicate;
 import org.jajuk.ui.helpers.PreferencesJMenu;
 import org.jajuk.ui.helpers.TableTransferHandler;
 import org.jajuk.ui.helpers.TwoStepsDisplayable;
@@ -93,6 +96,7 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.error.NoneAccessibleFileException;
 import org.jajuk.util.log.Log;
 import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor;
+import org.jdesktop.swingx.decorator.ColorHighlighter;
 import org.jdesktop.swingx.table.DefaultTableColumnModelExt;
 import org.jdesktop.swingx.table.TableColumnExt;
 
@@ -102,91 +106,44 @@ import org.jdesktop.swingx.table.TableColumnExt;
  */
 public abstract class AbstractTableView extends ViewAdapter implements ActionListener,
     ItemListener, TableModelListener, TwoStepsDisplayable, ListSelectionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -4418626517605128694L;
-
-  /** DOCUMENT_ME. */
   JajukTable jtable;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpControl;
-
-  /** DOCUMENT_ME. */
+  JPanel jpControl;
   JajukToggleButton jtbEditable;
-
-  /** DOCUMENT_ME. */
   private JLabel jlFilter;
-
-  /** DOCUMENT_ME. */
   private JComboBox jcbProperty;
-
-  /** DOCUMENT_ME. */
   private JLabel jlEquals;
-
-  /** DOCUMENT_ME. */
   private JTextField jtfValue;
-
   /** Table model. */
   JajukTableModel model;
-
   /** Currently applied filter. */
-  private String sAppliedFilter = "";
-
+  String sAppliedFilter = "";
   /** Currently applied criteria. */
-  private String sAppliedCriteria;
-
+  String sAppliedCriteria;
   /** Do search panel need a search. */
   private boolean bNeedSearch = false;
-
   /** Default time in ms before launching a search automatically. */
-  private static final int WAIT_TIME = 300;
-
+  private static final int WAIT_TIME = 200;
   /** Date last key pressed. */
   private long lDateTyped;
-
   /** Editable table configuration name, must be overwritten by child classes. */
   String editableConf;
-
   /** Columns to show table configuration name, must be overwritten by child classes. */
   String columnsConf;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiPlay;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiPush;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiFrontPush;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDelete;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiPlayRepeat;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiPlayShuffle;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiBookmark;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiProperties;
-
-  /** DOCUMENT_ME. */
-  private JMenuItem jmiFileCopyURL;
-
-  /** DOCUMENT_ME. */
+  JMenuItem jmiFileCopyURL;
   PreferencesJMenu pjmTracks;
-
   /** The table/tree sync toggle button. */
   JajukToggleButton jtbSync;
-
-  /** DOCUMENT_ME. */
-  private boolean bStopThread = false;
-
+  private volatile boolean bStopThread = false;
   /** Launches a thread used to perform dynamic filtering when user is typing. */
   private Thread filteringThread = new Thread("Dynamic user input filtering thread") {
     @Override
@@ -197,11 +154,15 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
         } catch (InterruptedException ie) {
           Log.error(ie);
         }
-        if (bNeedSearch && (System.currentTimeMillis() - lDateTyped >= WAIT_TIME)) {
-          sAppliedFilter = jtfValue.getText();
-          sAppliedCriteria = getApplyCriteria();
-          applyFilter(sAppliedCriteria, sAppliedFilter);
-          bNeedSearch = false;
+        try {
+          if (bNeedSearch && (System.currentTimeMillis() - lDateTyped >= WAIT_TIME)) {
+            sAppliedFilter = jtfValue.getText();
+            sAppliedCriteria = getApplyCriteria();
+            applyFilter(sAppliedCriteria, sAppliedFilter);
+            bNeedSearch = false;
+          }
+        } catch (Exception ie) {
+          Log.error(ie);
         }
       }
     }
@@ -209,7 +170,7 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
 
   /**
    * Gets the apply criteria.
-   * 
+   *
    * @return Applied criteria
    */
   private String getApplyCriteria() {
@@ -225,7 +186,7 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
   /**
    * Code used in child class SwingWorker for long delay computations (used in
    * initUI()).
-   * 
+   *
    * @return the object
    */
   @Override
@@ -237,8 +198,8 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
   /**
    * Code used in child class SwingWorker for display computations (used in
    * initUI()).
-   * 
-   * @param in DOCUMENT_ME
+   *
+   * @param in 
    */
   @Override
   public void shortCall(Object in) {
@@ -246,41 +207,30 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
     jmiPlay = new JMenuItem(ActionManager.getAction(JajukActions.PLAY_SELECTION));
     jmiPlay.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     jtable.getMenu().add(jmiPlay);
-
     jmiFrontPush = new JMenuItem(ActionManager.getAction(JajukActions.PUSH_FRONT_SELECTION));
     jmiFrontPush.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     jtable.getMenu().add(jmiFrontPush);
-
     jmiPush = new JMenuItem(ActionManager.getAction(JajukActions.PUSH_SELECTION));
     jmiPush.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     jtable.getMenu().add(jmiPush);
-
     jmiPlayRepeat = new JMenuItem(ActionManager.getAction(JajukActions.PLAY_REPEAT_SELECTION));
     jmiPlayRepeat.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     jtable.getMenu().add(jmiPlayRepeat);
-
     jmiPlayShuffle = new JMenuItem(ActionManager.getAction(JajukActions.PLAY_SHUFFLE_SELECTION));
     jmiPlayShuffle.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     jtable.getMenu().add(jmiPlayShuffle);
-
     jtable.getMenu().addSeparator();
-
     jmiDelete = new JMenuItem(ActionManager.getAction(JajukActions.DELETE));
     jmiDelete.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     jtable.getMenu().add(jmiDelete);
-
     jmiFileCopyURL = new JMenuItem(ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD));
     jmiFileCopyURL.putClientProperty(Const.DETAIL_CONTENT, jtable.getSelection());
     jtable.getMenu().add(jmiFileCopyURL);
-
     jmiBookmark = new JMenuItem(ActionManager.getAction(JajukActions.BOOKMARK_SELECTION));
     jmiBookmark.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
-
     jmiProperties = new JMenuItem(ActionManager.getAction(JajukActions.SHOW_PROPERTIES));
     jmiProperties.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
-
     pjmTracks = new PreferencesJMenu(jtable.getSelection());
-
     // Set a default behavior for double click or click on the play column
     jtable.setCommand(new ILaunchCommand() {
       @Override
@@ -289,11 +239,9 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
         if (jtable.getSelectedColumnCount() != 1) {
           return;
         }
-
         int iSelectedCol = jtable.getSelectedColumn();
         // Convert column selection as columns may have been moved
         iSelectedCol = jtable.convertColumnIndexToModel(iSelectedCol);
-
         // We launch the selection :
         // - In any case if user clicked on the play column (column 0)
         // - Or in case of double click on any column when table is not editable
@@ -304,9 +252,10 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
           List<File> files = UtilFeatures.getPlayableFiles(item);
           if (files.size() > 0) {
             // launch it
-            QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-                .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), Conf
-                .getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
+            QueueModel.push(
+                UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                    Conf.getBoolean(Const.CONF_STATE_REPEAT), true),
+                Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
           } else {
             Messages.showErrorMessage(10);
           }
@@ -316,15 +265,33 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
     // Control panel
     jpControl = new JPanel();
     jpControl.setBorder(BorderFactory.createEtchedBorder());
-    jtbEditable = new JajukToggleButton(IconLoader.getIcon(JajukIcons.EDIT));
-    jtbEditable.setToolTipText(Messages.getString("AbstractTableView.11"));
-    jtbEditable.addActionListener(this);
-
     // Create the sync toggle button and restore its state
     jtbSync = new JajukToggleButton(ActionManager.getAction(JajukActions.SYNC_TREE_TABLE));
     jtbSync.putClientProperty(Const.DETAIL_VIEW, getID());
     jtbSync.setSelected(Conf.getBoolean(Const.CONF_SYNC_TABLE_TREE + "." + getID()));
+    createGenericGUI(jtbSync);
+    ColorHighlighter colorHighlighter = new ColorHighlighter(new PlayHighlighterPredicate(jtable),
+        Color.ORANGE, null);
+    jtable.addHighlighter(colorHighlighter);
+    // refresh columns conf in case of some attributes been removed
+    // or added before view instantiation
+    Properties properties = ObservationManager
+        .getDetailsLastOccurence(JajukEvents.CUSTOM_PROPERTIES_ADD);
+    JajukEvent event = new JajukEvent(JajukEvents.CUSTOM_PROPERTIES_ADD, properties);
+    update(event);
+    initTable(); // perform type-specific init
+    // Register keystrokes
+    setKeystrokes();
+  }
 
+  /**
+   * Generic part of the panel 
+   * @param component the component to display before filter
+   */
+  void createGenericGUI(JComponent component) {
+    jtbEditable = new JajukToggleButton(IconLoader.getIcon(JajukIcons.EDIT));
+    jtbEditable.setToolTipText(Messages.getString("AbstractTableView.11"));
+    jtbEditable.addActionListener(this);
     jlFilter = new JLabel(Messages.getString("AbstractTableView.0"));
     // properties combo box, fill with columns names expect ID
     jcbProperty = new JComboBox();
@@ -346,12 +313,28 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
       public void keyReleased(KeyEvent e) {
         bNeedSearch = true;
         lDateTyped = System.currentTimeMillis();
+        // Start filtering thread
+        if (!filteringThread.isAlive()) {
+          filteringThread.start();
+        }
+      }
+    });
+    // Add a focus listener to select all the text and ease previous text cleanup
+    jtfValue.addFocusListener(new FocusListener() {
+      @Override
+      public void focusLost(FocusEvent e) {
+        jtfValue.setCaretPosition(jtfValue.getText().length());
+      }
+
+      @Override
+      public void focusGained(FocusEvent e) {
+        jtfValue.selectAll();
       }
     });
     jtfValue.setToolTipText(Messages.getString("AbstractTableView.3"));
-    jpControl.setLayout(new MigLayout("insets 5", "[][20][grow,gp 70][grow]"));
-    jpControl.add(jtbSync, "gapleft 5");
-    jpControl.add(jtbEditable, "gapright 15");
+    jpControl.setLayout(new MigLayout("insets 5", "[][][grow,gp 70][grow]"));
+    jpControl.add(jtbEditable, "gapleft 5");
+    jpControl.add(component, "gapright 15");
     jpControl.add(jlFilter, "split 2");
     jpControl.add(jcbProperty, "grow,gapright 15");
     jpControl.add(jlEquals, "split 2");
@@ -364,27 +347,16 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
     jtable.setTransferHandler(new TableTransferHandler(jtable));
     jtable.showColumns(jtable.getColumnsConf());
     applyFilter(null, null);
-
     jtable.getSelectionModel().addListSelectionListener(this);
-
     // Register on the list for subject we are interested in
     ObservationManager.register(this);
-    // refresh columns conf in case of some attributes been removed
-    // or added before view instantiation
-    Properties properties = ObservationManager
-        .getDetailsLastOccurence(JajukEvents.CUSTOM_PROPERTIES_ADD);
-    JajukEvent event = new JajukEvent(JajukEvents.CUSTOM_PROPERTIES_ADD, properties);
-    update(event);
-    initTable(); // perform type-specific init
-    // Start filtering thread
-    filteringThread.start();
     // Register keystrokes
     setKeystrokes();
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.events.Observer#getRegistrationKeys()
    */
   @Override
@@ -396,7 +368,6 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
     eventSubjectSet.add(JajukEvents.CUSTOM_PROPERTIES_ADD);
     eventSubjectSet.add(JajukEvents.CUSTOM_PROPERTIES_REMOVE);
     eventSubjectSet.add(JajukEvents.RATE_CHANGED);
-    eventSubjectSet.add(JajukEvents.TABLE_CLEAR_SELECTION);
     eventSubjectSet.add(JajukEvents.PARAMETERS_CHANGE);
     eventSubjectSet.add(JajukEvents.VIEW_REFRESH_REQUEST);
     eventSubjectSet.add(JajukEvents.TREE_SELECTION_CHANGED);
@@ -406,9 +377,9 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
   /**
    * Apply a filter, to be implemented by files and tracks tables, alter the
    * model.
-   * 
-   * @param sPropertyName DOCUMENT_ME
-   * @param sPropertyValue DOCUMENT_ME
+   *
+   * @param sPropertyName 
+   * @param sPropertyValue 
    */
   public void applyFilter(final String sPropertyName, final String sPropertyValue) {
     SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
@@ -422,8 +393,20 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
 
       @Override
       public void done() {
+        int[] selection = jtable.getSelectedRows();
         // Force table repaint (for instance for rating stars update)
         model.fireTableDataChanged();
+        // Restore selection (even if rows content may have change) if is is not now out of bound
+        boolean outOfBounds = false;
+        for (int index : selection) {
+          if (index >= model.getRowCount()) {
+            outOfBounds = true;
+            break;
+          }
+        }
+        if (!outOfBounds) {
+          jtable.setSelectedRows(selection);
+        }
         UtilGUI.stopWaiting();
       }
     };
@@ -433,7 +416,7 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.Observer#update(java.lang.String)
    */
   @Override
@@ -447,9 +430,6 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
           // column
           // events
           JajukEvents subject = event.getSubject();
-          if (JajukEvents.TABLE_CLEAR_SELECTION.equals(subject)) {
-            jtable.clearSelection();
-          }
           if (JajukEvents.DEVICE_MOUNT.equals(subject)
               || JajukEvents.DEVICE_UNMOUNT.equals(subject)) {
             jtable.clearSelection();
@@ -492,12 +472,6 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
               applyFilter(sAppliedCriteria, sAppliedFilter);
             }
           } else if (JajukEvents.RATE_CHANGED.equals(subject)) {
-            // Ignore the refresh if the event comes from the table itself
-            Properties properties = event.getDetails();
-            if (properties != null
-                && AbstractTableView.this.equals(properties.get(Const.DETAIL_ORIGIN))) {
-              return;
-            }
             // Keep current selection and nb of rows
             int[] selection = jtable.getSelectedRows();
             // force filter to refresh
@@ -550,12 +524,10 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
     jtable.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     InputMap inputMap = jtable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
     ActionMap actionMap = jtable.getActionMap();
-
     // Delete
     Action action = ActionManager.getAction(JajukActions.DELETE);
     inputMap.put(KeyStroke.getKeyStroke("DELETE"), "delete");
     actionMap.put("delete", action);
-
     // Properties ALT/ENTER
     action = ActionManager.getAction(JajukActions.SHOW_PROPERTIES);
     inputMap.put(KeyStroke.getKeyStroke("alt ENTER"), "properties");
@@ -564,13 +536,13 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
 
   /**
    * Fill the table.
-   * 
+   *
    * @return the jajuk table model
    */
   abstract JajukTableModel populateTable();
 
   /**
-   * Sets the cell editors. DOCUMENT_ME
+   * Sets the cell editors. 
    */
   private void setCellEditors() {
     for (TableColumn tc : ((DefaultTableColumnModelExt) jtable.getColumnModel()).getColumns(true)) {
@@ -613,8 +585,8 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
 
   /**
    * Detect property change.
-   * 
-   * @param ie DOCUMENT_ME
+   *
+   * @param ie 
    */
   @Override
   public void itemStateChanged(ItemEvent ie) {
@@ -627,7 +599,7 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @seejavax.swing.event.TableModelListener#tableChanged(javax.swing.event. TableModelEvent)
    */
   @Override
@@ -658,8 +630,10 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
       // Require refresh of all tables
       Properties properties = new Properties();
       properties.put(Const.DETAIL_ORIGIN, AbstractTableView.this);
-      ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH, properties));
-
+      // No real device change if Webradio view
+      if (!(this instanceof WebRadioView)) {
+        ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH, properties));
+      }
     } catch (NoneAccessibleFileException none) {
       Messages.showErrorMessage(none.getCode());
       ((JajukTableModel) jtable.getModel()).undo(e.getFirstRow(), e.getColumn());
@@ -673,16 +647,11 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
     }
   }
 
-  /**
-   * Table initialization after table display.
-   */
-  abstract void initTable();
-
   /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-   */
+  * (non-Javadoc)
+  *
+  * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+  */
   @Override
   public void actionPerformed(final ActionEvent e) {
     // Editable state
@@ -691,7 +660,6 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
       model.setEditable(jtbEditable.isSelected());
       return;
     }
-
   }
 
   /* (non-Javadoc)
@@ -709,13 +677,12 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
         Log.error(e);
       }
     }
-
     super.cleanup();
   }
 
   /**
    * Called when table selection changed.
-   * 
+   *
    * @param e the List selection event
    */
   @Override
@@ -724,49 +691,56 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
       // leave during normal refresh
       return;
     }
-
     // Ignore event if the model is refreshing
     if (((JajukTableModel) jtable.getModel()).isRefreshing()) {
       return;
     }
-
-    // Call view specific behavior on selection change
-    onSelectionChange();
-
-    // Hide the copy url if several items selection. Do not simply disable them
-    // as the getMenu() method enable all menu items
-    jmiFileCopyURL.setVisible(jtable.getSelectedRowCount() < 2);
-
-    // Compute Information view message
-    if (AbstractTableView.this instanceof TracksTableView) {
-      int rows = jtable.getSelection().size();
-      StringBuilder sbOut = new StringBuilder().append(rows).append(
-          Messages.getString("TracksTreeView.31"));
-      InformationJPanel.getInstance().setSelection(sbOut.toString());
-    } else if (AbstractTableView.this instanceof FilesTableView) {
-      // Compute recursive selection size, nb of items...
-      long lSize = 0l;
-      int items = 0;
-      for (Item item : jtable.getSelection()) {
-        if (item instanceof File) {
-          lSize += ((File) item).getSize();
+    // We absolutely need to perform the actual treatment in the next EDT call because otherwise, 
+    // the selection is wrong because the selection event is catch first here and after in the JajukTable
+    // valueChanged() that performs the actual selection computation. Doing this invokeLater ensure to 
+    // serialize the event treatment in the correct order.
+    SwingUtilities.invokeLater(new Runnable() {
+      @Override
+      public void run() {
+        // Call view specific behavior on selection change
+        onSelectionChange();
+        // Hide the copy url if several items selection. Do not simply disable them
+        // as the getMenu() method enable all menu items
+        jmiFileCopyURL.setVisible(jtable.getSelectedRowCount() < 2);
+        // Compute Information view message
+        if (AbstractTableView.this instanceof TracksTableView) {
+          int rows = jtable.getSelection().size();
+          StringBuilder sbOut = new StringBuilder().append(rows).append(
+              Messages.getString("TracksTreeView.31"));
+          InformationJPanel.getInstance().setSelection(sbOut.toString());
+        } else if (AbstractTableView.this instanceof FilesTableView) {
+          // Compute recursive selection size, nb of items...
+          long lSize = 0l;
+          int items = 0;
+          for (Item item : jtable.getSelection()) {
+            if (item instanceof File) {
+              lSize += ((File) item).getSize();
+            }
+          }
+          items = jtable.getSelection().size();
+          lSize /= 1048576; // set size in MB
+          StringBuilder sbOut = new StringBuilder().append(items).append(
+              Messages.getString("FilesTreeView.52"));
+          if (lSize > 1024) { // more than 1024 MB -> in GB
+            sbOut.append(lSize / 1024).append('.').append(lSize % 1024)
+                .append(Messages.getString("FilesTreeView.53"));
+          } else {
+            sbOut.append(lSize).append(Messages.getString("FilesTreeView.54"));
+          }
+          InformationJPanel.getInstance().setSelection(sbOut.toString());
+        }
+        // Refresh the preference menu according to the selection
+        // (Useless for WebRadioView)
+        if (!(AbstractTableView.this instanceof WebRadioView)) {
+          pjmTracks.resetUI(jtable.getSelection());
         }
       }
-      items = jtable.getSelection().size();
-      lSize /= 1048576; // set size in MB
-      StringBuilder sbOut = new StringBuilder().append(items).append(
-          Messages.getString("FilesTreeView.52"));
-      if (lSize > 1024) { // more than 1024 MB -> in GB
-        sbOut.append(lSize / 1024).append('.').append(lSize % 1024).append(
-            Messages.getString("FilesTreeView.53"));
-      } else {
-        sbOut.append(lSize).append(Messages.getString("FilesTreeView.54"));
-      }
-      InformationJPanel.getInstance().setSelection(sbOut.toString());
-    }
-
-    // Refresh the preference menu according to the selection
-    pjmTracks.resetUI(jtable.getSelection());
+    });
   }
 
   /**
@@ -774,7 +748,17 @@ public abstract class AbstractTableView extends ViewAdapter implements ActionLis
    */
   void onSelectionChange() {
     // Do nothing by default
-    Log.debug("Table selection changed for : " + this);
   }
 
+  /**
+  * Table initialization after table display.
+  * Default implementation for table initialization :
+  * update editable button state.
+  * 
+  */
+  void initTable() {
+    jtbEditable.setSelected(Conf.getBoolean(editableConf));
+    // Sort by name by default. 
+    jtable.setSortOrder(1, SortOrder.ASCENDING);
+  }
 }
diff --git a/src/main/java/org/jajuk/ui/views/AbstractTreeView.java b/src/main/java/org/jajuk/ui/views/AbstractTreeView.java
index 020b406..5a89179 100644
--- a/src/main/java/org/jajuk/ui/views/AbstractTreeView.java
+++ b/src/main/java/org/jajuk/ui/views/AbstractTreeView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.event.ActionEvent;
@@ -64,98 +63,50 @@ import org.jdesktop.swingx.JXTree;
  * An abstract files or tracks tree view. Contains common methods
  */
 public abstract class AbstractTreeView extends ViewAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 8330315957562739918L;
-
   /** The tree scrollpane. */
   JScrollPane jspTree;
-
   /** The phyical tree. */
   JXTree jtree;
-
   /** The table/tree sync toggle button. */
   JajukToggleButton jtbSync;
-
   /** the collapse all button. */
   JButton jbCollapseAll;
-
   /** Current selection. */
   TreePath[] paths;
-
   /** Resursive items selection. */
   Set<Item> selectedRecursively = new HashSet<Item>(100);
-
   /** Items selection. */
   List<Item> alSelected = new ArrayList<Item>(100);
-
   /** Top tree node. */
   DefaultMutableTreeNode top;
-
-  /** DOCUMENT_ME. */
   javax.swing.JPopupMenu jmenu;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlay;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPush;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiFrontPush;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlayShuffle;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlayRepeat;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiCut;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiCopy;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPaste;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiRename;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDelete;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiNewFolder;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiAddFavorite;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiReport;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiProperties;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiCDDBWizard;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiCopyURL;
-
   /** Jtree scroller position*. */
   private int pos;
-
   /** Preference menu. */
   PreferencesJMenu pjmTracks;
-
   /** Used to differentiate user action tree collapse from code tree collapse. */
   boolean bManualAction = true;
-
   /** Used to differentiate tree/table sync due to internal events from users's ones. */
   boolean bInternalAction = false;
-  
-  /** Flag used to set tree is refreshing */
+  /** Flag used to set tree is refreshing. */
   boolean refreshing = false;
 
   /*
@@ -173,13 +124,14 @@ public abstract class AbstractTreeView extends ViewAdapter {
     eventSubjectSet.add(JajukEvents.CDDB_WIZARD);
     eventSubjectSet.add(JajukEvents.PARAMETERS_CHANGE);
     eventSubjectSet.add(JajukEvents.TABLE_SELECTION_CHANGED);
+    eventSubjectSet.add(JajukEvents.RATE_CHANGED);
     return eventSubjectSet;
   }
 
   /**
-   * Creates the tree. DOCUMENT_ME
+   * Creates the tree. 
    * 
-   * @param bLazy DOCUMENT_ME
+   * @param bLazy 
    * 
    * @return the j tree
    */
@@ -188,14 +140,12 @@ public abstract class AbstractTreeView extends ViewAdapter {
     jtree.putClientProperty("JTree.lineStyle", "Angled");
     jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
     setKeystrokes();
-
     // set the special controller for doing lazy loading if used for this View
     if (bLazy) {
       final LazyLoadingTreeExpander controller = new LazyLoadingTreeExpander(
           (DefaultTreeModel) jtree.getModel());
       jtree.addTreeWillExpandListener(controller);
     }
-
     return jtree;
   }
 
@@ -242,12 +192,10 @@ public abstract class AbstractTreeView extends ViewAdapter {
     jmiCopyURL = new JMenuItem(ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD));
     jmiCopyURL.putClientProperty(Const.DETAIL_CONTENT, alSelected);
     pjmTracks = new PreferencesJMenu(alSelected);
-
     // Create the sync toggle button and restore its state
     jtbSync = new JajukToggleButton(ActionManager.getAction(JajukActions.SYNC_TREE_TABLE));
     jtbSync.putClientProperty(Const.DETAIL_VIEW, getID());
     jtbSync.setSelected(Conf.getBoolean(Const.CONF_SYNC_TABLE_TREE + "." + getID()));
-
     // Create the collapse all button, no need to a dedicated Action here as it
     // is used only in this class
     jbCollapseAll = new JButton(IconLoader.getIcon(JajukIcons.REMOVE));
@@ -261,34 +209,38 @@ public abstract class AbstractTreeView extends ViewAdapter {
         jtree.setSelectionInterval(0, 0);
       }
     });
-
   }
 
   /**
-   * Populate tree. DOCUMENT_ME
+   * Populate tree. 
    */
   abstract void populateTree();
 
   /**
-   * Expand. DOCUMENT_ME
+   * Expand. 
    */
   abstract void expand();
 
   /**
    * Expand a given item.
    * 
-   * @param item DOCUMENT_ME
+   * @param item 
    */
   abstract void scrollTo(Item item);
 
   /**
+   * Select a set of items
+   * @param items items to select
+   */
+  abstract void selectNodes(List<Item> items);
+
+  /**
    * Add keystroke support on the tree.
    */
   private void setKeystrokes() {
     jtree.putClientProperty(Const.DETAIL_SELECTION, alSelected);
     InputMap inputMap = jtree.getInputMap(JComponent.WHEN_FOCUSED);
     ActionMap actionMap = jtree.getActionMap();
-
     // Delete
     Action action = ActionManager.getAction(JajukActions.DELETE);
     inputMap.put(KeyStroke.getKeyStroke("DELETE"), "delete");
@@ -323,8 +275,16 @@ public abstract class AbstractTreeView extends ViewAdapter {
   @Override
   public void update(JajukEvent event) {
     final JajukEvents subject = event.getSubject();
-    if (subject.equals(JajukEvents.DEVICE_MOUNT) || subject.equals(JajukEvents.DEVICE_UNMOUNT)
-        || subject.equals(JajukEvents.DEVICE_REFRESH)
+    if (JajukEvents.RATE_CHANGED.equals(subject)) {
+      // Make sure that preference menu icon is refreshed
+      SwingUtilities.invokeLater(new Runnable() {
+        @Override
+        public void run() {
+          pjmTracks.resetUI(alSelected);
+        }
+      });
+    } else if (subject.equals(JajukEvents.DEVICE_MOUNT)
+        || subject.equals(JajukEvents.DEVICE_UNMOUNT) || subject.equals(JajukEvents.DEVICE_REFRESH)
         || subject.equals(JajukEvents.PARAMETERS_CHANGE)) {
       SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
         @Override
@@ -342,6 +302,8 @@ public abstract class AbstractTreeView extends ViewAdapter {
           bManualAction = false;
           expand();
           bManualAction = true;
+          // Make sure that preference menu icon is refreshed
+          pjmTracks.resetUI(alSelected);
           // Reset last position in tree
           // The scrollbar must be set after current EDT work to be effective,
           // so queue it
@@ -353,7 +315,6 @@ public abstract class AbstractTreeView extends ViewAdapter {
               }
             }
           });
-
         }
       };
       sw.execute();
@@ -373,22 +334,22 @@ public abstract class AbstractTreeView extends ViewAdapter {
               || sourceView.getID().equals(getID())) {
             return;
           }
-
           @SuppressWarnings("unchecked")
-          List<Item> selection = (List<Item>) details.get(Const.DETAIL_SELECTION);
+          final List<Item> selection = (List<Item>) details.get(Const.DETAIL_SELECTION);
           if (selection.size() == 0) {
             return;
           }
-          // for tree/table consideration, we only expand the first found item, we don't
-          // support
-          // multiple expands (useful?)
           final Item item = selection.get(0);
-          SwingUtilities.invokeLater(new Runnable() {
-            @Override
-            public void run() {
-              scrollTo(item);
-            }
-          });
+          // Do not scroll if a webradio has been launched
+          if (item instanceof org.jajuk.base.File | item instanceof org.jajuk.base.Track) {
+            SwingUtilities.invokeLater(new Runnable() {
+              @Override
+              public void run() {
+                selectNodes(selection);
+                scrollTo(item);
+              }
+            });
+          }
         }
       }
     }
diff --git a/src/main/java/org/jajuk/ui/views/AlbumsTableView.java b/src/main/java/org/jajuk/ui/views/AlbumsTableView.java
index d99c399..319132f 100644
--- a/src/main/java/org/jajuk/ui/views/AlbumsTableView.java
+++ b/src/main/java/org/jajuk/ui/views/AlbumsTableView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.Dimension;
@@ -47,11 +46,8 @@ import org.jajuk.util.UtilGUI;
  * List collection albums as a table.
  */
 public class AlbumsTableView extends AbstractTableView {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 7576455252866971945L;
-
-  /** DOCUMENT_ME. */
   private static ThumbnailPopup popup = null;
 
   /**
@@ -90,9 +86,10 @@ public class AlbumsTableView extends AbstractTableView {
    */
   @Override
   void initTable() {
-    jtbEditable.setSelected(Conf.getBoolean(Const.CONF_ALBUMS_TABLE_EDITION));
     // Disable edit button, edition not yet implemented
     jtbEditable.setVisible(false);
+    // Set this value even if the button is not displayed
+    jtbEditable.setSelected(Conf.getBoolean(Const.CONF_ALBUMS_TABLE_EDITION));
   }
 
   /*
@@ -126,8 +123,8 @@ public class AlbumsTableView extends AbstractTableView {
   public void shortCall(Object in) {
     jtable = new JajukTable(model, true, columnsConf);
     super.shortCall(null);
-    JMenuItem jmiShowAlbumDetails = new JMenuItem(ActionManager
-        .getAction(JajukActions.SHOW_ALBUM_DETAILS));
+    JMenuItem jmiShowAlbumDetails = new JMenuItem(
+        ActionManager.getAction(JajukActions.SHOW_ALBUM_DETAILS));
     jmiShowAlbumDetails.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     JMenuItem jmiReport = new JMenuItem(ActionManager.getAction(JajukActions.CREATE_REPORT));
     jmiReport.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
@@ -142,7 +139,6 @@ public class AlbumsTableView extends AbstractTableView {
     jtable.getMenu().add(jmiBookmark);
     jtable.getMenu().addSeparator();
     jtable.getMenu().add(jmiProperties);
-
     // Add popup feature when mouse rolls over cells
     jtable.addMouseMotionListener(new MouseMotionListener() {
       Album current = null;
@@ -176,26 +172,21 @@ public class AlbumsTableView extends AbstractTableView {
       public void mouseDragged(MouseEvent e) {
         // nothing to do here
       }
-
     });
-
     // Add another listener on view borders (outside the table itself) to
     // close popups when leaving the table
     jtable.addMouseListener(new MouseAdapter() {
       @Override
       public void mouseExited(MouseEvent e) {
         super.mouseExited(e);
-
         // Do not hide popup if still in the table to allow user to mouse
         // mouse over the popup (in this case, a table exit event is thrown)
         if (popup != null
-            && !UtilGUI.isOver(jtable.getLocationOnScreen(), jtable
-                .getPreferredScrollableViewportSize())) {
+            && !UtilGUI.isOver(jtable.getLocationOnScreen(),
+                jtable.getPreferredScrollableViewportSize())) {
           popup.dispose();
         }
       }
     });
-
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/AnimationView.java b/src/main/java/org/jajuk/ui/views/AnimationView.java
index c0142f5..c742ce9 100644
--- a/src/main/java/org/jajuk/ui/views/AnimationView.java
+++ b/src/main/java/org/jajuk/ui/views/AnimationView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import com.jgoodies.animation.Animation;
@@ -27,23 +26,25 @@ import com.jgoodies.animation.Animator;
 import com.jgoodies.animation.animations.BasicTextAnimation;
 import com.jgoodies.animation.components.BasicTextLabel;
 
-import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.FontMetrics;
 import java.awt.event.ComponentEvent;
-import java.awt.event.ComponentListener;
+import java.awt.event.MouseEvent;
 import java.util.HashSet;
 import java.util.Set;
 
 import javax.swing.SwingUtilities;
 
+import net.miginfocom.swing.MigLayout;
+
 import org.jajuk.base.File;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.ui.helpers.JajukMouseAdapter;
 import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
@@ -56,28 +57,20 @@ import org.jajuk.util.log.Log;
 /**
  * Animation-based view.
  */
-public class AnimationView extends ViewAdapter implements ComponentListener {
-
+public class AnimationView extends ViewAdapter {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant DEFAULT_FRAME_RATE.  DOCUMENT_ME */
+  /** The Constant DEFAULT_FRAME_RATE.   */
   private static final int DEFAULT_FRAME_RATE = 25;
-
-  /** The Constant DEFAULT_DURATION.  DOCUMENT_ME */
+  /** The Constant DEFAULT_DURATION.   */
   private static final int DEFAULT_DURATION = 5000;
-
-  /** The Constant DEFAULT_PAUSE.  DOCUMENT_ME */
+  /** The Constant DEFAULT_PAUSE.   */
   private static final int DEFAULT_PAUSE = 500;
-
   /** Current panel width*. */
   private int iSize;
-
-  /** DOCUMENT_ME. */
   private BasicTextLabel btl1;
-
-  /** DOCUMENT_ME. */
   private Animator animator;
+  private boolean paused = false;
 
   /**
    * Instantiates a new animation view.
@@ -102,15 +95,28 @@ public class AnimationView extends ViewAdapter implements ComponentListener {
    */
   @Override
   public void initUI() {
-    setLayout(new BorderLayout());
-    addComponentListener(this);
+    setLayout(new MigLayout("", "[cente,grow]", "[center,grow]"));
     btl1 = new BasicTextLabel(" ");
-    add(btl1);
+    // Allow to stop animation by left clicking on it
+    btl1.addMouseListener(new JajukMouseAdapter() {
+      @Override
+      public void handleAction(final MouseEvent e) {
+        if (animator != null) {
+          if (paused) {
+            animator.start();
+            paused = false;
+          } else {
+            animator.stop();
+            paused = true;
+          }
+        }
+      }
+    });
+    add(btl1, "grow,center");
     // Force initial message refresh
     UtilFeatures.updateStatus(this);
-
+    addComponentListener(this);
     ObservationManager.register(this);
-
   }
 
   /* (non-Javadoc)
@@ -121,6 +127,7 @@ public class AnimationView extends ViewAdapter implements ComponentListener {
     Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
     eventSubjectSet.add(JajukEvents.FILE_LAUNCHED);
     eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
+    eventSubjectSet.add(JajukEvents.WEBRADIO_INFO_UPDATED);
     eventSubjectSet.add(JajukEvents.ZERO);
     eventSubjectSet.add(JajukEvents.PLAYER_STOP);
     return eventSubjectSet;
@@ -129,18 +136,21 @@ public class AnimationView extends ViewAdapter implements ComponentListener {
   /**
    * Set the text to be displayed*.
    * 
-   * @param sText DOCUMENT_ME
+   * @param sText 
    */
   public void setText(final String sText) {
     SwingUtilities.invokeLater(new Runnable() {
-      // this is mandatory to
-      // get actual getWitdth
+      // This is mandatory to get actual getWitdth
       @Override
       public void run() {
+        // Make sure to stop any animation
+        if (animator != null) {
+          animator.stop();
+        }
+        btl1.setText("");
         iSize = AnimationView.this.getWidth();
-        // current width. Must be called inside an invoke and wait,
-        // otherwise, returns zero
         Font font = null;
+        // Find optimal target font size
         boolean bOk = false;
         int i = 40;
         while (!bOk) {
@@ -154,29 +164,47 @@ public class AnimationView extends ViewAdapter implements ComponentListener {
           }
         }
         btl1.setFont(font);
-        if (animator != null) {
-          animator.stop();
-        }
         Animation animPause = Animations.pause(DEFAULT_PAUSE);
         Animation anim = null;
-        // select a random animation
-        int iShuffle = (int) (Math.random() * 3);
-        switch (iShuffle) {
-        case 0:
-          anim = BasicTextAnimation.defaultScale(btl1, DEFAULT_DURATION, sText, Color.darkGray);
-          break;
-        case 1:
-          anim = BasicTextAnimation.defaultSpace(btl1, DEFAULT_DURATION, sText, Color.darkGray);
-          break;
-        case 2:
+        // Select a random animation or fade animation if no animation (because 
+        // we want to make sure that long labels are not cut  after animation stop)
+        if (!Conf.getBoolean(Const.CONF_TITLE_ANIMATION)) {
           anim = BasicTextAnimation.defaultFade(btl1, DEFAULT_DURATION, sText, Color.darkGray);
-          break;
+        } else {
+          int iShuffle = (int) (Math.random() * 3); //NOSONAR
+          switch (iShuffle) {
+          case 0:
+            anim = BasicTextAnimation.defaultScale(btl1, DEFAULT_DURATION, sText, Color.darkGray);
+            break;
+          case 1:
+            anim = BasicTextAnimation.defaultSpace(btl1, DEFAULT_DURATION, sText, Color.darkGray);
+            break;
+          case 2:
+            anim = BasicTextAnimation.defaultFade(btl1, DEFAULT_DURATION, sText, Color.darkGray);
+            break;
+          }
         }
         Animation animAll = Animations.sequential(anim, animPause);
         anim = Animations.repeat(Float.POSITIVE_INFINITY, animAll);
         animator = new Animator(anim, DEFAULT_FRAME_RATE);
         animator.start();
-
+        if (!Conf.getBoolean(Const.CONF_TITLE_ANIMATION)) {
+          // Stop animation after few seconds if still the same label
+          new Thread() {
+            @Override
+            public void run() {
+              String title = sText;
+              try {
+                Thread.sleep(3000);
+              } catch (InterruptedException e) {
+                Log.error(e);
+              }
+              if (btl1.getText().equals(title) && animator != null) {
+                animator.stop();
+              }
+            }
+          }.start();
+        }
       }
     });
   }
@@ -208,6 +236,11 @@ public class AnimationView extends ViewAdapter implements ComponentListener {
       if (radio != null) {
         setText(radio.getName());
       }
+    } else if (subject.equals(JajukEvents.WEBRADIO_INFO_UPDATED)) {
+      String webradioInfo = (String) event.getDetails().get(Const.CURRENT_RADIO_TRACK);
+      if (webradioInfo != null) {
+        setText(webradioInfo);
+      }
     }
   }
 
@@ -237,7 +270,6 @@ public class AnimationView extends ViewAdapter implements ComponentListener {
       animator.stop();
       animator = null;
     }
-
     super.cleanup();
   }
 }
diff --git a/src/main/java/org/jajuk/ui/views/ArtistView.java b/src/main/java/org/jajuk/ui/views/ArtistView.java
index 17df8ce..51dd265 100644
--- a/src/main/java/org/jajuk/ui/views/ArtistView.java
+++ b/src/main/java/org/jajuk/ui/views/ArtistView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.views;
 
@@ -25,6 +25,7 @@ import ext.services.lastfm.LastFmService;
 
 import java.awt.Dimension;
 import java.awt.Insets;
+import java.io.IOException;
 import java.net.UnknownHostException;
 import java.util.HashSet;
 import java.util.Set;
@@ -57,28 +58,19 @@ import org.jdesktop.swingx.JXBusyLabel;
  * Display Artist bio and albums.
  */
 public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** The artist picture + labels. */
   private LastFmArtistThumbnail artistThumb;
-
   /** The artist bio (from last.fm wiki) */
   private JTextArea jtaArtistDesc;
-
-  /** DOCUMENT_ME. */
   private JScrollPane jspAlbums;
-
-  /** DOCUMENT_ME. */
   private String bio;
-
-  /** DOCUMENT_ME. */
   private ArtistInfo artistInfo;
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.views.IView#getDesc()
    */
   @Override
@@ -88,24 +80,22 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.views.IView#initUI()
    */
   @Override
   public void initUI() {
     // register to player events
     ObservationManager.register(this);
-
     // by default, show reseted view
     reset();
-
     // Update initial status
     UtilFeatures.updateStatus(this);
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.events.Observer#getRegistrationKeys()
    */
   @Override
@@ -129,7 +119,7 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.events.Observer#update(org.jajuk.events.JajukEvent)
    */
   @Override
@@ -167,7 +157,6 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
             add(busy1, "center");
             revalidate();
             repaint();
-
             ArtistView.this.artist = artist.getName();
             // Display the panel only if the artist is not unknown
             if (!artist.seemsUnknown()) {
@@ -180,7 +169,6 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
         }
       }
     });
-
   }
 
   /* (non-Javadoc)
@@ -208,7 +196,7 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.helpers.TwoStepsDisplayable#longCall()
    */
   @Override
@@ -222,6 +210,14 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
       preFetchSimilarArtists();
     } catch (UnknownHostException e) {
       Log.warn("Could not contact host for loading album information: {{" + e.getMessage() + "}}");
+    } catch (IOException e) {
+      if (e.getMessage().contains(" 403 ")) {
+        // server responded with code "forbidden"
+        Log.warn("Server returned an error while fetching images: " + e.getMessage());
+      } else {
+        // other exception
+        Log.error(e);
+      }
     } catch (Exception e) {
       Log.error(e);
     }
@@ -230,7 +226,7 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.helpers.TwoStepsDisplayable#shortCall(java.lang.Object)
    */
   @Override
@@ -240,7 +236,7 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
     // Artist unknown from last.fm, leave
     if (artistInfo == null
     // If image url is void, last.fm doesn't provide enough data about this
-        // artist, we reset the view
+    // artist, we reset the view
         || StringUtils.isBlank(artistInfo.getImageUrl())) {
       reset();
       return;
@@ -249,7 +245,6 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
     // No known icon next to artist thumb
     artistThumb.setArtistView(true);
     artistThumb.populate();
-
     jtaArtistDesc = new JTextArea(bio) {
       private static final long serialVersionUID = 9217998016482118852L;
 
@@ -265,13 +260,10 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
     jtaArtistDesc.setLineWrap(true);
     jtaArtistDesc.setWrapStyleWord(true);
     jtaArtistDesc.setOpaque(false);
-
     JScrollPane jspWiki = new JScrollPane(jtaArtistDesc);
     jspWiki.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
     jspWiki.setBorder(null);
-
     jspWiki.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
-
     // Add items, layout is different according wiki text availability
     if (StringUtils.isNotBlank(jtaArtistDesc.getText())) {
       setLayout(new MigLayout("ins 5,gapy 5", "[grow]", "[grow][20%!][grow]"));
@@ -288,5 +280,4 @@ public class ArtistView extends SuggestionView implements TwoStepsDisplayable {
     revalidate();
     repaint();
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/CDScanView.java b/src/main/java/org/jajuk/ui/views/CDScanView.java
index d103896..75d9193 100644
--- a/src/main/java/org/jajuk/ui/views/CDScanView.java
+++ b/src/main/java/org/jajuk/ui/views/CDScanView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.event.ActionEvent;
@@ -55,23 +54,12 @@ import org.jajuk.util.log.Log;
  * Configuration perspective *.
  */
 public class CDScanView extends ViewAdapter implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   JTextField jtfName;
-
-  /** DOCUMENT_ME. */
   JLabel jlMountPoint;
-
-  /** DOCUMENT_ME. */
   JTextField jtfMountPoint;
-
-  /** DOCUMENT_ME. */
   JButton jbScan;
-
-  /** DOCUMENT_ME. */
   JButton jbUrl;
 
   /**
@@ -89,22 +77,13 @@ public class CDScanView extends ViewAdapter implements ActionListener {
   @Override
   public void actionPerformed(final ActionEvent e) {
     if (e.getSource() == jbScan) {
-      if ((e.getModifiers() & ActionEvent.CTRL_MASK) == ActionEvent.CTRL_MASK) {
-        try {
-          UtilGUI.showPictureDialog("http://repository.jajuk.info/images/no2.jpg");
-        } catch (MalformedURLException me) {
-          Log.debug("Ignoring exception in CD-Scan-View: ", me);
-        }
-        return;
-      }
-
       SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
         @Override
         public Void doInBackground() {
           if (!"".equals(jtfName.getText().trim()) && !"".equals(jtfMountPoint.getText().trim())) {
             Device device = null;
-            device = DeviceManager.getInstance().registerDevice(jtfName.getText().trim(), 1,
-                jtfMountPoint.getText().trim());
+            device = DeviceManager.getInstance().registerDevice(jtfName.getText().trim(),
+                Device.Type.FILES_CD, jtfMountPoint.getText().trim());
             try {
               device.mount(true);
               // refresh synchronously
@@ -128,8 +107,8 @@ public class CDScanView extends ViewAdapter implements ActionListener {
       };
       sw.execute();
     } else if (e.getSource() == jbUrl) {
-      final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(DirectoryFilter
-          .getInstance()));
+      final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(
+          DirectoryFilter.getInstance()));
       jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
       jfc.setDialogTitle(Messages.getString("DeviceWizard.43"));
       jfc.setMultiSelectionEnabled(false);
diff --git a/src/main/java/org/jajuk/ui/views/CatalogView.java b/src/main/java/org/jajuk/ui/views/CatalogView.java
index 5bd1be1..ab193b4 100644
--- a/src/main/java/org/jajuk/ui/views/CatalogView.java
+++ b/src/main/java/org/jajuk/ui/views/CatalogView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import ext.FlowScrollPanel;
@@ -30,7 +29,6 @@ import java.awt.Insets;
 import java.awt.KeyboardFocusManager;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.ComponentListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
@@ -44,7 +42,6 @@ import java.util.List;
 import java.util.Set;
 
 import javax.swing.BorderFactory;
-import javax.swing.FocusManager;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
@@ -96,95 +93,50 @@ import org.jdesktop.swingx.JXBusyLabel;
  * <p>
  * Catalog perspectives
  */
-public class CatalogView extends ViewAdapter implements ComponentListener, ActionListener,
-    TwoStepsDisplayable {
-
+public class CatalogView extends ViewAdapter implements ActionListener, TwoStepsDisplayable {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   // Top control panel
-  /** DOCUMENT_ME. */
   JPanel jpControlTop;
-
-  /** DOCUMENT_ME. */
   JLabel jlSorter;
-
-  /** DOCUMENT_ME. */
   SteppedComboBox jcbSorter;
-
-  /** DOCUMENT_ME. */
   JLabel jlFilter;
-
-  /** DOCUMENT_ME. */
   SteppedComboBox jcbFilter;
-
-  /** DOCUMENT_ME. */
   JLabel jlContains;
-
-  /** DOCUMENT_ME. */
   JTextField jtfValue;
-
-  /** DOCUMENT_ME. */
   JButton jbPrev;
-
-  /** DOCUMENT_ME. */
   JButton jbNext;
-
-  /** DOCUMENT_ME. */
   SteppedComboBox jcbPage;
-
   // Bottom control panel
-  /** DOCUMENT_ME. */
   JPanel jpControlBottom;
-
-  /** DOCUMENT_ME. */
   JComboBox jcbShowCover;
-
-  /** DOCUMENT_ME. */
   JSlider jsSize;
-
-  /** DOCUMENT_ME. */
   FlowScrollPanel jpItems;
-
-  /** DOCUMENT_ME. */
   JScrollPane jsp;
-
   /** Filter properties. */
   List<PropertyMetaInformation> alFilters;
-
   /** Sorter properties. */
   List<PropertyMetaInformation> alSorters;
-
   /** Do search panel need a search. */
   private boolean bNeedSearch = false;
-
   /** Populating flag. */
   private boolean bPopulating = false;
-
   /** Default time in ms before launching a search automatically. */
   private static final int WAIT_TIME = 600;
-
   /** Date last key pressed. */
   private long lDateTyped;
-
   /** Last selected item. */
   private LocalAlbumThumbnail item;
-
   /** Page index. */
   private int page = 0;
-
   /** Number of page in current selection. */
   int iNbPages = 0;
-
   /** Utility list used by size selector. */
   private final List<String> sizes = new ArrayList<String>(10);
-
   /** Thumbs list *. */
   private List<LocalAlbumThumbnail> thumbs;
-
   /** Last scrollbar position *. */
   private int scrollPosition;
-
   /** Swing Timer to refresh the component. */
   private final Timer timerSearch = new Timer(WAIT_TIME, new ActionListener() {
     @Override
@@ -200,7 +152,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /**
    * Gets the selected item.
-   * 
+   *
    * @return the selected item
    */
   public LocalAlbumThumbnail getSelectedItem() {
@@ -209,20 +161,18 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.IView#display()
    */
   @Override
   public void initUI() {
     initMetaInformation();
-
     sizes.add(THUMBNAIL_SIZE_50X50);
     sizes.add(THUMBNAIL_SIZE_100X100);
     sizes.add(THUMBNAIL_SIZE_150X150);
     sizes.add(THUMBNAIL_SIZE_200X200);
     sizes.add(THUMBNAIL_SIZE_250X250);
     sizes.add(THUMBNAIL_SIZE_300X300);
-
     // --Top (most used) control items
     jpControlTop = new JPanel();
     jlSorter = new JLabel(Messages.getString("Sort") + " ");
@@ -235,7 +185,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
     }
     jcbSorter.setSelectedIndex(Conf.getInt(Const.CONF_THUMBS_SORTER));
     jcbSorter.addActionListener(this);
-
     jlFilter = new JLabel(Messages.getString("AbstractTableView.0") + " ");
     jlContains = new JLabel("   " + Messages.getString("AbstractTableView.7") + " ");
     jcbFilter = new SteppedComboBox();
@@ -256,7 +205,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
     jtfValue.setMargin(new Insets(0, 3, 0, 0));
     jtfValue.setFont(FontManager.getInstance().getFont(JajukFont.SEARCHBOX));
     jtfValue.addKeyListener(new CatalogViewKeyAdaptor());
-
     JToolBar jtbPage = new JajukJToolbar();
     jtbPage.setFloatable(false);
     jtbPage.setRollover(true);
@@ -272,7 +220,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
     jtbPage.add(jbPrev);
     jtbPage.add(jcbPage);
     jtbPage.add(jbNext);
-
     jpControlTop.setLayout(new MigLayout("ins 3", "[grow][grow][grow][grow]"));
     jpControlTop.add(jlFilter, "split 2");
     jpControlTop.add(jcbFilter, "grow");
@@ -281,17 +228,13 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
     jpControlTop.add(jlSorter, "split 2");
     jpControlTop.add(jcbSorter, "gapright 40,grow");
     jpControlTop.add(jtbPage, "gapright 5,grow");
-
     // --Bottom (less used) items
-
     jcbShowCover = new JComboBox();
     jcbShowCover.addItem(Messages.getString("CatalogView.21"));
     jcbShowCover.addItem(Messages.getString("CatalogView.22"));
     jcbShowCover.addItem(Messages.getString("CatalogView.2"));
-
     jcbShowCover.setSelectedIndex(Conf.getInt(Const.CONF_THUMBS_SHOW_COVER));
     jcbShowCover.addActionListener(this);
-
     JLabel jlSize = new JLabel(Messages.getString("CatalogView.15"));
     jsSize = new JSlider(0, 5);
     jsSize.setMajorTickSpacing(1);
@@ -299,7 +242,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
     jsSize.setSnapToTicks(true);
     jsSize.setPaintTicks(true);
     jsSize.addMouseWheelListener(new CatalogViewMouseWheelListener(jsSize));
-
     int index = sizes.indexOf(Conf.getString(Const.CONF_THUMBS_SIZE));
     if (index < 0) {
       index = 2; // 150x150 if a problem occurs
@@ -314,31 +256,24 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
         sliderValueChanged();
       }
     });
-
     jpControlBottom = new JPanel(new MigLayout("gapx 20"));
     jpControlBottom.add(jcbShowCover);
     jpControlBottom.add(jlSize, "split 2");
     jpControlBottom.add(jsSize);
-
     // Set layout
     initLayout();
-
     populateCatalog();
-
     // subscriptions to events
     ObservationManager.register(this);
-
     // Show facts
     showFacts();
-
     // Start the timers
     timerSearch.start();
   }
 
   /**
    * Inits the meta information.
-   * DOCUMENT_ME
-   */
+   **/
   private void initMetaInformation() {
     alFilters = new ArrayList<PropertyMetaInformation>(10);
     alFilters.add(null); // All
@@ -346,7 +281,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
     alFilters.add(TrackManager.getInstance().getMetaInformation(Const.XML_TRACK_ARTIST));
     alFilters.add(TrackManager.getInstance().getMetaInformation(Const.XML_TRACK_ALBUM));
     alFilters.add(TrackManager.getInstance().getMetaInformation(Const.XML_YEAR));
-
     // please note: this needs to be kept in-sync with what we do in
     // AlbumComparator!
     alSorters = new ArrayList<PropertyMetaInformation>(10);
@@ -415,7 +349,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.events.Observer#getRegistrationKeys()
    */
   @Override
@@ -442,14 +376,11 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
       return;
     }
     bPopulating = true;
-
     // Store current state
     scrollPosition = jsp.getVerticalScrollBar().getValue();
     thumbs = new ArrayList<LocalAlbumThumbnail>(100);
-
     // Clear all the view and show a busy label instead
     showBusyLabel();
-
     // Show the page
     UtilGUI.populate(this);
   }
@@ -458,7 +389,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
    * Compute the catalog page to be displayed.
    * <p>
    * Do *not* call this from the EDT, can take a while to run
-   * 
+   *
    * @return the object
    */
   @Override
@@ -467,7 +398,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
     List<Album> albums = null;
     // The final album list we will display
     List<Album> pageAlbums = new ArrayList<Album>(Conf.getInt(Const.CONF_CATALOG_PAGE_SIZE));
-
     try {
       Filter filter = null;
       if (jtfValue.getText().length() > 0) {
@@ -476,7 +406,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
       }
       // filter albums matching tracks
       List<Track> alAllTracks = TrackManager.getInstance().getTracks();
-      Filter.filterItems(alAllTracks, filter);
+      alAllTracks = Filter.filterItems(alAllTracks, filter, Track.class);
       // keep matching albums
       HashSet<Album> hsAlbums = new HashSet<Album>(alAllTracks.size() / 10);
       for (Item item : alAllTracks) {
@@ -496,13 +426,10 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
           itAlbums.remove();
         }
       }
-
       albums = new ArrayList<Album>(hsAlbums);
-
       // sort albums
       final int index = jcbSorter.getSelectedIndex();
       Collections.sort(albums, new AlbumComparator(index));
-
       // Now process each album
       Set<Directory> directories = new HashSet<Directory>(albums.size());
       Iterator<Album> it = albums.iterator();
@@ -540,7 +467,10 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
           }
         }
       }
-
+      // Leave if zero match
+      if (albums.size() == 0) {
+        return pageAlbums;
+      }
       // Force thumbs build if required, this is the longest task of this worker
       // we only keep albums for this page
       // computes the number of pages
@@ -554,8 +484,8 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
       // After user changed the number of thumbs on a page, we can be
       // out of bounds exception so make sure to reinit the page index in
       // this case
-      if (page >= jcbPage.getItemCount()) {
-        page = 0;
+      if (page > iNbPages - 1) {
+        page = iNbPages - 1;
       }
       // Add all items
       int max = albums.size(); // upper limit
@@ -582,15 +512,14 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /**
    * Catalog page display (must be called from the EDT).
-   * 
-   * @param in DOCUMENT_ME
+   *
+   * @param in 
    */
   @Override
   public void shortCall(Object in) {
     @SuppressWarnings("unchecked")
     List<Album> albums = (List<Album>) in;
     if (in == null) {
-      stopAllBusyLabels();
       return;
     }
     // Populate each thumb if required (this is short because the thumb should have already been built in the long call )
@@ -598,7 +527,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
       final LocalAlbumThumbnail thumb = new LocalAlbumThumbnail(album, getSelectedSize(), true);
       thumb.populate();
       thumbs.add(thumb);
-
       // restore previous selected item if still set
       if (item != null) {
         if (((Album) thumb.getItem()).equals(item.getItem())) {
@@ -606,7 +534,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
           CatalogView.this.item.setSelected(true);
         }
       }
-      // Thumb selection mouse listener 
+      // Thumb selection mouse listener
       thumb.getIcon().addMouseListener(new MouseAdapter() {
         @Override
         public void mousePressed(MouseEvent e) {
@@ -620,14 +548,11 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
           CatalogView.this.item = thumb;
         }
       });
-
     }
-
     // populate page selector
     // remove action listener
     jcbPage.removeActionListener(CatalogView.this);
     jcbPage.removeAllItems(); // void it
-
     for (int i = 0; i < iNbPages; i++) { // add the pages
       jcbPage.addItem(Messages.getString("CatalogView.11") + " " + (i + 1) + "/" + iNbPages);
       // start at page 1, not 0
@@ -655,7 +580,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.Observer#update(java.lang.String)
    */
   @Override
@@ -678,7 +603,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.IView#getDesc()
    */
   @Override
@@ -688,7 +613,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
    */
   @Override
@@ -737,7 +662,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /**
    * Gets the selected size.
-   * 
+   *
    * @return current thumbs size as selected with the combo
    */
   private int getSelectedSize() {
@@ -745,13 +670,12 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private class CatalogViewKeyAdaptor extends KeyAdapter {
-
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see java.awt.event.KeyAdapter#keyReleased(java.awt.event.KeyEvent)
      */
     @Override
@@ -765,14 +689,13 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private class CatalogViewMouseWheelListener extends DefaultMouseWheelListener {
-
     /**
      * Instantiates a new catalog view mouse wheel listener.
-     * 
-     * @param js DOCUMENT_ME
+     *
+     * @param js 
      */
     public CatalogViewMouseWheelListener(JSlider js) {
       super(js);
@@ -780,7 +703,7 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see
      * org.jajuk.ui.helpers.DefaultMouseWheelListener#mouseWheelMoved(java.awt.event.MouseWheelEvent
      * )
@@ -795,7 +718,6 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
       // Add again the change listener
       jsSize.addChangeListener(cl);
     }
-
   }
 
   /**
@@ -818,18 +740,16 @@ public class CatalogView extends ViewAdapter implements ComponentListener, Actio
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.views.ViewAdapter#cleanup()
    */
   @Override
   public void cleanup() {
     // make sure the timer is not running any more
     timerSearch.stop();
-
     // we specifically request the focus for jtfValue, therefore we should make sure that we release
     // that focus to let this be destroyed
     KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
-
     // call the parent class to do more cleanup if necessary
     super.cleanup();
   }
diff --git a/src/main/java/org/jajuk/ui/views/CoverView.java b/src/main/java/org/jajuk/ui/views/CoverView.java
index 4f73209..21d79ed 100644
--- a/src/main/java/org/jajuk/ui/views/CoverView.java
+++ b/src/main/java/org/jajuk/ui/views/CoverView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.Component;
@@ -27,7 +26,6 @@ import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ComponentEvent;
-import java.awt.event.ComponentListener;
 import java.awt.event.MouseEvent;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -42,19 +40,20 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import javax.swing.BorderFactory;
 import javax.swing.ImageIcon;
 import javax.swing.JComboBox;
+import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JToolBar;
-import javax.swing.SwingConstants;
 import javax.swing.SwingUtilities;
-import javax.swing.SwingWorker;
 import javax.swing.border.EmptyBorder;
 import javax.swing.plaf.basic.BasicComboBoxRenderer;
 
@@ -99,123 +98,58 @@ import org.jajuk.util.log.Log;
 
 /**
  * Cover view. Displays an image for the current album
- * 
- * All methods dealing with covers content must be synchronized.
  */
-public class CoverView extends ViewAdapter implements ComponentListener, ActionListener {
-
-  /** The Constant PLUS_QUOTE.  DOCUMENT_ME */
+public class CoverView extends ViewAdapter implements ActionListener {
+  /** The Constant PLUS_QUOTE.   */
   private static final String PLUS_QUOTE = "+\"";
-
-  /** The Constant QUOTE_BLANK.  DOCUMENT_ME */
+  /** The Constant QUOTE_BLANK.   */
   private static final String QUOTE_BLANK = "\" ";
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** No cover cover. */
-  private static Cover nocover;
-
+  private static Cover nocover = new Cover(Const.IMAGES_SPLASHSCREEN, CoverType.NO_COVER);
   /** Error counter to check connection availability. */
-  private static int iErrorCounter = 0;
-
+  private volatile static int iErrorCounter = 0;
   /** Connected one flag : true if jajuk managed once to connect to the web to bring covers. */
-  private static boolean bOnceConnected = false;
-
+  private volatile static boolean bOnceConnected = false;
   /** Reference File for cover. */
-  private org.jajuk.base.File fileReference;
-
+  private volatile org.jajuk.base.File fileReference;
   /** File directory used as a cache for perfs. */
-  private Directory dirReference;
-
+  private volatile Directory dirReference;
   /** List of available covers for the current file. */
-  private final LinkedList<Cover> alCovers = new LinkedList<Cover>(); // NOPMD
-
+  private final LinkedList<Cover> alCovers = new LinkedList<Cover>();
   // control panel
-  /** DOCUMENT_ME. */
   private JPanel jpControl;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbPrevious;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbNext;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbDelete;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbSave;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbDefault;
-
-  /** DOCUMENT_ME. */
   private JLabel jlSize;
-
-  /** DOCUMENT_ME. */
   private JLabel jlFound;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlSearching;
-
   /** Cover search accuracy combo. */
+  @SuppressWarnings("rawtypes")
   private JComboBox jcbAccuracy;
-
   /** Date last resize (used for adjustment management). */
-  private long lDateLastResize;
-
+  private volatile long lDateLastResize;
   /** URL and size of the image. */
   private JLabel jl;
-
   /** Used Cover index. */
-  private int index = 0;
-
-  /** Event ID. */
-  private volatile int iEventID;
-
+  private volatile int index = 0;
   /** Flag telling that user wants to display a better cover. */
   private boolean bGotoBetter = false;
-
   /** Final image to display. */
-  private ImageIcon ii;
-
+  private volatile ImageIcon ii;
   /** Force next track cover reload flag*. */
-  private boolean bForceCoverReload = true;
-
-  /** DOCUMENT_ME. */
+  private volatile boolean bForceCoverReload = true;
   private boolean includeControls;
-
   /** Whether the view has not yet been displayed for its first time */
-  private boolean initEvent = true;
-
-  /** Thread launch at view init to reset its state */
-  private class CoverResetThread extends Thread {
-    @Override
-    public void run() {
-      if (fileReference == null) { // regular cover view
-        if (QueueModel.isStopped()) {
-          update(new JajukEvent(JajukEvents.ZERO));
-        }
-        // check if a track has already been launched
-        else if (QueueModel.isPlayingRadio()) {
-          update(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED,
-              ObservationManager.getDetailsLastOccurence(JajukEvents.WEBRADIO_LAUNCHED)));
-          // If the view is displayed for the first time, a ComponentResized event is launched at its first display but
-          // we want to perform the full process : update past launches files (FILE_LAUNCHED). 
-          // But if it is no more the initial resize event, we only want to refresh the cover, not the full story.
-        } else if (!initEvent) {
-          displayCurrentCover();
-        } else {
-          update(new JajukEvent(JajukEvents.FILE_LAUNCHED));
-        }
-      } else { // cover view used as dialog
-        update(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
-      }
-      // It will never more be the first time ...
-      CoverView.this.initEvent = false;
-    }
-  }
+  private volatile boolean initEvent = true;
+  /** Used to lock access to covers collection, we don't synchronize this as this may create thread 
+   * starvations because the EDT requires this lock as well in ViewAdater.stopAllBusyLabels() method. */
+  private final Lock listLock = new ReentrantLock(true);
+  /** Parent of this view. */
+  private JDialog parentJDialog; 
 
   /**
    * Constructor.
@@ -235,6 +169,19 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     fileReference = file;
   }
 
+  /**
+   * Constructor.
+   * 
+   * @param file Reference file. Used to display cover for a particular file, null if the cover view is used in the "reular" way as a view, not 
+   * as a dialog from catalog view for ie.
+   * @param jd parent dialog (closed after a default cover is selected) 
+   */
+  public CoverView(final org.jajuk.base.File file, JDialog jd) {
+    super();
+    fileReference = file;
+    parentJDialog = jd;
+  }
+
   /*
    * (non-Javadoc)
    *
@@ -245,26 +192,19 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     initUI(true);
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.jajuk.ui.IView#display()
-   */
   /**
    * Inits the ui.
    *  
-   * @param includeControls DOCUMENT_ME
+   * @param includeControls 
    */
+  @SuppressWarnings({ "unchecked", "rawtypes" })
   public void initUI(boolean includeControls) {
     this.includeControls = includeControls;
-
     // Control panel
-    jlSearching = new JLabel("", IconLoader.getIcon(JajukIcons.NET_SEARCH), SwingConstants.CENTER);
     jpControl = new JPanel();
     if (includeControls) {
       jpControl.setBorder(BorderFactory.createEtchedBorder());
     }
-
     final JToolBar jtb = new JajukJToolbar();
     jbPrevious = new JajukButton(IconLoader.getIcon(JajukIcons.PLAYER_PREVIOUS_SMALL));
     jbPrevious.addActionListener(this);
@@ -317,52 +257,32 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       }
     });
     jcbAccuracy.setToolTipText(Messages.getString("ParameterView.155"));
-
     jcbAccuracy.addItem(IconLoader.getIcon(JajukIcons.ACCURACY_LOW));
     jcbAccuracy.addItem(IconLoader.getIcon(JajukIcons.ACCURACY_MEDIUM));
     jcbAccuracy.addItem(IconLoader.getIcon(JajukIcons.ACCURACY_HIGH));
     jcbAccuracy.addItem(IconLoader.getIcon(JajukIcons.ARTIST));
     jcbAccuracy.addItem(IconLoader.getIcon(JajukIcons.ALBUM));
     jcbAccuracy.addItem(IconLoader.getIcon(JajukIcons.TRACK));
-
-    int i = 1; // medium accuracy
-    try {
-      i = Conf.getInt(Const.CONF_COVERS_ACCURACY + "_"
-          + ((getPerspective() == null) ? "popup" : getPerspective().getID()));
-    } catch (final NumberFormatException e) {
-      // Will reach this point at first launch
-    }
-    jcbAccuracy.setSelectedIndex(i);
+    int accuracy = getCurrentAccuracy();
+    jcbAccuracy.setSelectedIndex(accuracy);
     jcbAccuracy.addActionListener(this);
-
     jtb.add(jbPrevious);
     jtb.add(jbNext);
     jtb.addSeparator();
     jtb.add(jbDelete);
     jtb.add(jbSave);
     jtb.add(jbDefault);
-
     if (includeControls) {
-      jpControl.setLayout(new MigLayout("insets 5 2 5 2", "[][grow][grow][][25]"));
+      jpControl.setLayout(new MigLayout("insets 5 2 5 2", "[][grow][grow][]"));
       jpControl.add(jtb);
       jpControl.add(jlSize, "center,gapright 5::");
       jpControl.add(jlFound, "center,gapright 5::");
       jpControl.add(jcbAccuracy, "grow,width 47!,gapright 5");
-      jpControl.add(jlSearching);
     }
-
     // Cover view used in catalog view should not listen events
     if (fileReference == null) {
       ObservationManager.register(this);
     }
-    try {
-      // instantiate default cover
-      if (CoverView.nocover == null) {
-        CoverView.nocover = new Cover(Const.IMAGES_SPLASHSCREEN, CoverType.NO_COVER);
-      }
-    } catch (final Exception e) {
-      Log.error(e);
-    }
     // global layout
     MigLayout globalLayout = null;
     if (includeControls) {
@@ -372,23 +292,10 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     }
     setLayout(globalLayout);
     add(jpControl, "grow,wrap");
-
-    // We have to start using the componentListener AFTER the view is fully displayed
-    // to avoid blank covers due to wrong (negative) cover dimensions.
-    new Thread() {
-      public void run() {
-        try {
-          Thread.sleep(1000);
-        } catch (InterruptedException e) {
-          Log.error(e);
-        }
-        // Force a init event as the ComponentListener was not yet attached to the view.
-        componentResized(null);
-        // Attach the listener for further manual actions against the view.
-        addComponentListener(CoverView.this);
-      }
-    }.start();
-
+    //Force initial resizing (required after a perspective reset as the component event is not thrown in this case)
+    componentResized(null);
+    // Attach the listener for initial cover display and further manual actions against the view when resizing.
+    addComponentListener(CoverView.this);
   }
 
   /*
@@ -426,7 +333,6 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     Conf.setProperty(Const.CONF_COVERS_ACCURACY + "_"
         + ((getPerspective() == null) ? "popup" : getPerspective().getID()),
         Integer.toString(jcbAccuracy.getSelectedIndex()));
-
     new Thread("Cover Accuracy Thread") {
       @Override
       public void run() {
@@ -442,7 +348,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Called on the previous cover button event.
    */
-  private synchronized void handlePrevious() {
+  private void handlePrevious() {
     // better cover
     bGotoBetter = true;
     index++;
@@ -457,7 +363,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Called on the next cover button event.
    */
-  private synchronized void handleNext() {
+  private void handleNext() {
     bGotoBetter = false;
     index--;
     if (index < 0) {
@@ -469,7 +375,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Called on the delete cover button event.
    */
-  private synchronized void handleDelete() {
+  private void handleDelete() {
     // sanity check
     if (index >= alCovers.size()) {
       Log.warn("Cannot delete cover that is not available.");
@@ -479,16 +385,13 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       Log.warn("Cannot delete cover with invalid index.");
       return;
     }
-
     // get the cover at the specified position
     final Cover cover = alCovers.get(index);
-
     // don't delete the splashscreen-jpg!!
     if (cover.getType().equals(CoverType.NO_COVER)) {
       Log.warn("Cannot delete default Jajuk cover.");
       return;
     }
-
     // show confirmation message if required
     if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_DELETE_COVER)) {
       final int iResu = Messages.getChoice(Messages.getString("Confirmation_delete_cover") + " : "
@@ -497,7 +400,6 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
         return;
       }
     }
-
     // yet there? ok, delete the cover
     try {
       final File file = cover.getFile();
@@ -512,29 +414,32 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       Messages.showErrorMessage(131);
       return;
     }
-
     // If this was the absolute cover, remove the reference in the
     // collection
     if (cover.getType() == CoverType.SELECTED_COVER) {
       dirReference.removeProperty("default_cover");
     }
-
     // reorganize covers
-    alCovers.remove(index);
-    index--;
-    if (index < 0) {
-      index = alCovers.size() - 1;
-    }
-    ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
-    if (fileReference != null) {
-      update(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+    try {
+      listLock.lock();
+      alCovers.remove(index);
+      index--;
+      if (index < 0) {
+        index = alCovers.size() - 1;
+      }
+      ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+      if (fileReference != null) {
+        update(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+      }
+    } finally {
+      listLock.unlock();
     }
   }
 
   /**
    * Called when saving a cover.
    */
-  private synchronized void handleSave() {
+  private void handleSave() {
     // sanity check
     if (index >= alCovers.size()) {
       Log.warn("Cannot save cover that is not available.");
@@ -544,46 +449,41 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       Log.warn("Cannot save cover with invalid index.");
       return;
     }
-
     // save a file with its original name
     new Thread("Cover Save Thread") {
       @Override
       public void run() {
-        synchronized (CoverView.this) {
-          final Cover cover = alCovers.get(index);
-          // should not happen, only remote covers here
-          if (cover.getType() != CoverType.REMOTE_COVER) {
-            Log.debug("Try to save a local cover");
-            return;
-          }
-          String sFilePath = null;
-          sFilePath = dirReference.getFio().getPath() + "/"
-              + UtilSystem.getOnlyFile(cover.getURL().toString());
-          sFilePath = convertCoverPath(sFilePath);
-          try {
-            // copy file from cache
-            final File fSource = DownloadManager.downloadToCache(cover.getURL());
-            final File file = new File(sFilePath);
-            UtilSystem.copy(fSource, file);
-            InformationJPanel.getInstance().setMessage(Messages.getString("CoverView.11"),
-                InformationJPanel.MessageType.INFORMATIVE);
-            final Cover cover2 = new Cover(file, CoverType.SELECTED_COVER);
-            if (!alCovers.contains(cover2)) {
-              alCovers.add(cover2);
-              setFoundText();
-            }
-
-            // Reset cached cover in associated albums to make sure that new covers
-            // will be discovered in various views like Catalog View.
-            resetCachedCover();
-
-            // Notify cover change
-            ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
-            // add new cover in others cover views
-          } catch (final Exception ex) {
-            Log.error(24, ex);
-            Messages.showErrorMessage(24);
+        final Cover cover = alCovers.get(index);
+        // should not happen, only remote covers here
+        if (cover.getType() != CoverType.REMOTE_COVER) {
+          Log.debug("Try to save a local cover");
+          return;
+        }
+        String sFilePath = null;
+        sFilePath = dirReference.getFio().getPath() + "/"
+            + UtilSystem.getOnlyFile(cover.getURL().toString());
+        sFilePath = convertCoverPath(sFilePath);
+        try {
+          // copy file from cache
+          final File fSource = DownloadManager.downloadToCache(cover.getURL());
+          final File file = new File(sFilePath);
+          UtilSystem.copy(fSource, file);
+          InformationJPanel.getInstance().setMessage(Messages.getString("CoverView.11"),
+              InformationJPanel.MessageType.INFORMATIVE);
+          final Cover cover2 = new Cover(file, CoverType.SELECTED_COVER);
+          if (!alCovers.contains(cover2)) {
+            alCovers.add(cover2);
+            setFoundText();
           }
+          // Reset cached cover in associated albums to make sure that new covers
+          // will be discovered in various views like Catalog View.
+          resetCachedCover();
+          // Notify cover change
+          ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+          // add new cover in others cover views
+        } catch (final Exception ex) {
+          Log.error(24, ex);
+          Messages.showErrorMessage(24);
         }
       }
     }.start();
@@ -593,7 +493,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
    * Reset cached cover in associated albums to make sure that new covers
    *  will be discovered in various views like Catalog View.
    */
-  private synchronized void resetCachedCover() {
+  private void resetCachedCover() {
     org.jajuk.base.File fCurrent = fileReference;
     if (fCurrent == null) {
       fCurrent = QueueModel.getPlayingFile();
@@ -610,20 +510,27 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   }
 
   /**
-   * Converts a cover path according to options and jajuk conventions
-   * 
+   * Converts a cover path according to options and jajuk conventions.
+   *
    * @param sFilePath current cover path
-   * 
    * @return the converted cover file path
    */
   private String convertCoverPath(String sFilePath) {
     int pos = sFilePath.lastIndexOf('.');
     if (Conf.getBoolean(Const.CONF_COVERS_SAVE_EXPLORER_FRIENDLY)) {
       // Covers should be stored as folder.xxx for windows explorer
-      String ext = sFilePath.substring(pos, sFilePath.length());
+      final String ext;
+      if (pos == -1) {
+        ext = "";
+      } else {
+        ext = sFilePath.substring(pos, sFilePath.length());
+      }
       String parent = new File(sFilePath).getParent();
       return parent + System.getProperty("file.separator") + "Folder" + ext;
     } else {
+      if (pos == -1) {
+        return sFilePath + Const.FILE_JAJUK_DOWNLOADED_FILES_SUFFIX;
+      }
       // Add a jajuk suffix to know this cover has been downloaded by jajuk
       return new StringBuilder(sFilePath).insert(pos, Const.FILE_JAJUK_DOWNLOADED_FILES_SUFFIX)
           .toString();
@@ -633,7 +540,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Called when saving as a cover.
    */
-  private synchronized void handleSaveAs() {
+  private void handleSaveAs() {
     // sanity check
     if (index >= alCovers.size()) {
       Log.warn("Cannot save cover that is not available.");
@@ -643,43 +550,38 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       Log.warn("Cannot save cover with invalid index.");
       return;
     }
-
     new Thread("Cover SaveAs Thread") {
       @Override
       public void run() {
-        synchronized (CoverView.this) {
-          final Cover cover = alCovers.get(index);
-          final JajukFileChooser jfchooser = new JajukFileChooser(new JajukFileFilter(
-              GIFFilter.getInstance(), PNGFilter.getInstance(), JPGFilter.getInstance()));
-          jfchooser.setAcceptDirectories(true);
-          jfchooser.setCurrentDirectory(dirReference.getFio());
-          jfchooser.setDialogTitle(Messages.getString("CoverView.10"));
-          final File finalFile = new File(dirReference.getFio().getPath() + "/"
-              + UtilSystem.getOnlyFile(cover.getURL().toString()));
-          jfchooser.setSelectedFile(finalFile);
-          final int returnVal = jfchooser.showSaveDialog(JajukMainWindow.getInstance());
-          File fNew = null;
-          if (returnVal == JFileChooser.APPROVE_OPTION) {
-            fNew = jfchooser.getSelectedFile();
-            // if user try to save as without changing file name
-            if (fNew.getAbsolutePath().equals(cover.getFile().getAbsolutePath())) {
-              return;
-            }
-            try {
-              UtilSystem.copy(cover.getFile(), fNew);
-              InformationJPanel.getInstance().setMessage(Messages.getString("CoverView.11"),
-                  InformationJPanel.MessageType.INFORMATIVE);
-
-              // Reset cached cover in associated albums to make sure that new covers
-              // will be discovered in various views like Catalog View.
-              resetCachedCover();
-
-              // Notify cover change
-              ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
-            } catch (final Exception ex) {
-              Log.error(24, ex);
-              Messages.showErrorMessage(24);
-            }
+        final Cover cover = alCovers.get(index);
+        final JajukFileChooser jfchooser = new JajukFileChooser(new JajukFileFilter(
+            GIFFilter.getInstance(), PNGFilter.getInstance(), JPGFilter.getInstance()));
+        jfchooser.setAcceptDirectories(true);
+        jfchooser.setCurrentDirectory(dirReference.getFio());
+        jfchooser.setDialogTitle(Messages.getString("CoverView.10"));
+        final File finalFile = new File(dirReference.getFio().getPath() + "/"
+            + UtilSystem.getOnlyFile(cover.getURL().toString()));
+        jfchooser.setSelectedFile(finalFile);
+        final int returnVal = jfchooser.showSaveDialog(JajukMainWindow.getInstance());
+        File fNew = null;
+        if (returnVal == JFileChooser.APPROVE_OPTION) {
+          fNew = jfchooser.getSelectedFile();
+          // if user try to save as without changing file name
+          if (fNew.getAbsolutePath().equals(cover.getFile().getAbsolutePath())) {
+            return;
+          }
+          try {
+            UtilSystem.copy(cover.getFile(), fNew);
+            InformationJPanel.getInstance().setMessage(Messages.getString("CoverView.11"),
+                InformationJPanel.MessageType.INFORMATIVE);
+            // Reset cached cover in associated albums to make sure that new covers
+            // will be discovered in various views like Catalog View.
+            resetCachedCover();
+            // Notify cover change
+            ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+          } catch (final Exception ex) {
+            Log.error(24, ex);
+            Messages.showErrorMessage(24);
           }
         }
       }
@@ -689,7 +591,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Called when making a cover default.
    */
-  private synchronized void handleDefault() {
+  private void handleDefault() {
     // sanity check
     if (index >= alCovers.size()) {
       Log.warn("Cannot default cover which is not available.");
@@ -700,68 +602,71 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       return;
     }
     new Thread("Default cover thread") {
+      @Override
       public void run() {
-        synchronized (CoverView.this) {
-          Cover cover = alCovers.get(index);
-          org.jajuk.base.File fCurrent = fileReference;
-          // Path of the default cover, it is simply the URL of the current cover for local covers
-          // but it is another path to a newly created image for tag or remote covers
-          String destPath = cover.getFile().getAbsolutePath();
-          if (fCurrent == null) {
-            fCurrent = QueueModel.getPlayingFile();
+        Cover cover = alCovers.get(index);
+        org.jajuk.base.File fCurrent = fileReference;
+        // Path of the default cover, it is simply the URL of the current cover for local covers
+        // but it is another path to a newly created image for tag or remote covers
+        String destPath = cover.getFile().getAbsolutePath();
+        if (fCurrent == null) {
+          fCurrent = QueueModel.getPlayingFile();
+        }
+        if (cover.getType() == CoverType.TAG_COVER) {
+          destPath = dirReference.getFio().getPath() + "/" + cover.getFile().getName();
+          destPath = convertCoverPath(destPath);
+          File destFile = new File(destPath);
+          try {
+            // Copy cached file to music directory
+            // Note that the refreshCover() methods automatically 
+            // extract any track cover tag to an image file in the cache
+            UtilSystem.copy(cover.getFile(), destFile);
+            Cover cover2 = new Cover(destFile, CoverType.SELECTED_COVER);
+            alCovers.add(cover2);
+          } catch (Exception ex) {
+            Log.error(24, ex);
+            Messages.showErrorMessage(24);
+            return;
           }
-          if (cover.getType() == CoverType.TAG_COVER) {
-            destPath = dirReference.getFio().getPath() + "/" + cover.getFile().getName();
-            destPath = convertCoverPath(destPath);
-            File destFile = new File(destPath);
-            try {
-              // Copy cached file to music directory
-              // Note that the refreshCover() methods automatically 
-              // extract any track cover tag to an image file in the cache
-              UtilSystem.copy(cover.getFile(), destFile);
-              Cover cover2 = new Cover(destFile, CoverType.SELECTED_COVER);
+        } else if (cover.getType() == CoverType.REMOTE_COVER) {
+          String sFilename = UtilSystem.getOnlyFile(cover.getURL().toString());
+          destPath = dirReference.getFio().getPath() + "/" + sFilename;
+          destPath = convertCoverPath(destPath);
+          try {
+            // Download cover and copy file from cache to music directory
+            File fSource = DownloadManager.downloadToCache(cover.getURL());
+            File fileDest = new File(destPath);
+            UtilSystem.copy(fSource, new File(destPath));
+            Cover cover2 = new Cover(fileDest, CoverType.SELECTED_COVER);
+            if (!alCovers.contains(cover2)) {
               alCovers.add(cover2);
-            } catch (Exception ex) {
-              Log.error(24, ex);
-              Messages.showErrorMessage(24);
-              return;
-            }
-          } else if (cover.getType() == CoverType.REMOTE_COVER) {
-            String sFilename = UtilSystem.getOnlyFile(cover.getURL().toString());
-            destPath = dirReference.getFio().getPath() + "/" + sFilename;
-            destPath = convertCoverPath(destPath);
-            try {
-              // Download cover and copy file from cache to music directory
-              File fSource = DownloadManager.downloadToCache(cover.getURL());
-              File fileDest = new File(destPath);
-              UtilSystem.copy(fSource, new File(destPath));
-              Cover cover2 = new Cover(fileDest, CoverType.SELECTED_COVER);
-              if (!alCovers.contains(cover2)) {
-                alCovers.add(cover2);
-                setFoundText();
-              }
-            } catch (Exception ex) {
-              Log.error(24, ex);
-              Messages.showErrorMessage(24);
-              return;
+              setFoundText();
             }
+          } catch (Exception ex) {
+            Log.error(24, ex);
+            Messages.showErrorMessage(24);
+            return;
           }
-          // Remove previous thumbs to avoid using outdated images
-          // Reset cached cover
-          ThumbnailManager.cleanThumbs(fCurrent.getTrack().getAlbum());
-          refreshThumbs(cover);
-          InformationJPanel.getInstance().setMessage(Messages.getString("Success"),
-              InformationJPanel.MessageType.INFORMATIVE);
-          // For every kind of cover types :
-          ObservationManager.notify(new JajukEvent(JajukEvents.COVER_DEFAULT_CHANGED));
-          ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
-          // then make it the default cover for this album
-          if (fCurrent != null && fCurrent.getTrack() != null
-              && fCurrent.getTrack().getAlbum() != null && cover.getFile() != null) {
-            Album album = fCurrent.getTrack().getAlbum();
-            album.setProperty(XML_ALBUM_SELECTED_COVER, destPath);
-            album.setProperty(XML_ALBUM_DISCOVERED_COVER, destPath);
-          }
+        }
+        // Remove previous thumbs to avoid using outdated images
+        // Reset cached cover
+        ThumbnailManager.cleanThumbs(fCurrent.getTrack().getAlbum());
+        refreshThumbs(cover);
+        InformationJPanel.getInstance().setMessage(Messages.getString("Success"),
+            InformationJPanel.MessageType.INFORMATIVE);
+        // For every kind of cover types :
+        ObservationManager.notify(new JajukEvent(JajukEvents.COVER_DEFAULT_CHANGED));
+        ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+        // then make it the default cover for this album
+        if (fCurrent != null && fCurrent.getTrack() != null
+            && fCurrent.getTrack().getAlbum() != null && cover.getFile() != null) {
+          Album album = fCurrent.getTrack().getAlbum();
+          album.setProperty(XML_ALBUM_SELECTED_COVER, destPath);
+          album.setProperty(XML_ALBUM_DISCOVERED_COVER, destPath);
+        }
+        // Close the current dialog
+        if (parentJDialog!= null) {
+          parentJDialog.dispose();
         }
       }
     }.start();
@@ -774,250 +679,199 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
    */
   @Override
   public void componentResized(final ComponentEvent e) {
+    Dimension dim = getSize();
+    if (dim.getHeight() <= 0 || dim.getWidth() <= 0) {
+      return;
+    }
     final long lCurrentDate = System.currentTimeMillis(); // adjusting code
     if (lCurrentDate - lDateLastResize < 500) { // Do consider only one event every 
       // 500 ms to avoid race conditions and lead to unexpected states (verified)
-      lDateLastResize = lCurrentDate;
       return;
     }
     lDateLastResize = lCurrentDate;
-    Log.debug("Cover resized");
-    // Force initial cover refresh. We do this inside this method and not initUI() 
-    // because we make sure that the window is fully displayed then (otherwise, we get 
-    // a black cover when switching from slimbar to main window for ie)
-    CoverResetThread refresh = new CoverResetThread();
-    refresh.start();
+    Log.debug("Cover resized, view=" + getID() + " size=" + getSize());
+    // Run this in another thread to accelerate the component resize events processing and filter by time
+    new Thread() {
+      @Override
+      public void run() {
+        if (fileReference == null) { // regular cover view
+          if (QueueModel.isStopped()) {
+            update(new JajukEvent(JajukEvents.ZERO));
+          }
+          // check if a track has already been launched
+          else if (QueueModel.isPlayingRadio()) {
+            update(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED,
+                ObservationManager.getDetailsLastOccurence(JajukEvents.WEBRADIO_LAUNCHED)));
+            // If the view is displayed for the first time, a ComponentResized event is launched at its first display but
+            // we want to perform the full process : update past launches files (FILE_LAUNCHED). 
+            // But if it is no more the initial resize event, we only want to refresh the cover, not the full story.
+          } else if (!initEvent) {
+            displayCurrentCover();
+          } else {
+            update(new JajukEvent(JajukEvents.FILE_LAUNCHED));
+          }
+        } else { // cover view used as dialog
+          update(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+        }
+        // It will never more be the first time ...
+        CoverView.this.initEvent = false;
+      }
+    }.start();
   }
 
   /**
    * Creates the query.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    * 
    * @return an accurate google search query for a file
    */
   public String createQuery(final org.jajuk.base.File file) {
-    String sQuery = "";
-    int iAccuracy = 0;
-    try {
-      iAccuracy = Conf.getInt(Const.CONF_COVERS_ACCURACY + "_"
-          + ((getPerspective() == null) ? "popup" : getPerspective().getID()));
-    } catch (final NumberFormatException e) {
-      // can append if accuracy never set
-      Log.debug("Unknown accuracy");
-    }
+    String query = "";
+    int iAccuracy = getCurrentAccuracy();
     final Track track = file.getTrack();
     final Artist artist = track.getArtist();
     final Album album = track.getAlbum();
     switch (iAccuracy) {
     case 0: // low, default
       if (!artist.seemsUnknown()) {
-        sQuery += artist.getName() + " ";
+        query += artist.getName() + " ";
+      } else if (!track.getAlbumArtist().seemsUnknown()) {
+        query += track.getAlbumArtist().getName() + " ";
       }
       if (!album.seemsUnknown()) {
-        sQuery += album.getName() + " ";
+        query += album.getName() + " ";
       }
       break;
     case 1: // medium
       if (!artist.seemsUnknown()) {
-        sQuery += '\"' + artist.getName() + QUOTE_BLANK;
-        // put quotes around it
+        query += '\"' + artist.getName() + QUOTE_BLANK;
+      } else if (!track.getAlbumArtist().seemsUnknown()) {
+        query += '\"' + track.getAlbumArtist().getName() + QUOTE_BLANK;
       }
       if (!album.seemsUnknown()) {
-        sQuery += '\"' + album.getName() + QUOTE_BLANK;
+        query += '\"' + album.getName() + QUOTE_BLANK;
       }
       break;
     case 2: // high
       if (!artist.seemsUnknown()) {
-        sQuery += PLUS_QUOTE + artist.getName() + QUOTE_BLANK;
-        // put "" around it
+        query += PLUS_QUOTE + artist.getName() + QUOTE_BLANK;
+      } else if (!track.getAlbumArtist().seemsUnknown()) {
+        query += PLUS_QUOTE + track.getAlbumArtist().getName() + QUOTE_BLANK;
       }
       if (!album.seemsUnknown()) {
-        sQuery += PLUS_QUOTE + album.getName() + QUOTE_BLANK;
+        query += PLUS_QUOTE + album.getName() + QUOTE_BLANK;
       }
       break;
     case 3: // by artist
       if (!artist.seemsUnknown()) {
-        sQuery += artist.getName() + " ";
+        query += artist.getName() + " ";
+      } else if (!track.getAlbumArtist().seemsUnknown()) {
+        query += track.getAlbumArtist().getName() + " ";
       }
       break;
     case 4: // by album
       if (!album.seemsUnknown()) {
-        sQuery += album.getName() + " ";
+        query += album.getName() + " ";
       }
       break;
     case 5: // by track name
-      sQuery += track.getName();
+      query += track.getName();
       break;
     default:
       break;
     }
-    return sQuery;
+    return query;
   }
 
-  /**
-   * Display given cover.
-   * 
-   * @param index index of the cover to display
-   */
-  private synchronized void displayCover(final int index) {
-    if ((alCovers.size() == 0) || (index >= alCovers.size()) || (index < 0)) {
-      // just a check
-      alCovers.add(CoverView.nocover); // display nocover by default
-      displayCover(0);
-      return;
-    }
-    final Cover cover = alCovers.get(index); // take image at the given index
-    final URL url = cover.getURL();
-    // enable delete button only for local covers
-    jbDelete.setEnabled(cover.getType() == CoverType.LOCAL_COVER
-        || cover.getType() == CoverType.SELECTED_COVER
-        || cover.getType() == CoverType.STANDARD_COVER);
-
-    //Disable default command for "none" cover
-    jbDefault.setEnabled(cover.getType() != CoverType.NO_COVER);
-
-    if (url != null) {
-      jbSave.setEnabled(false);
-      String sType = " (L)"; // local cover
-      if (cover.getType() == CoverType.REMOTE_COVER) {
-        sType = "(@)"; // Web cover
-        jbSave.setEnabled(true);
-      } else if (cover.getType() == CoverType.TAG_COVER) {
-        sType = "(T)"; // Tag cover
-      }
-      final String size = cover.getSize();
-      jl = new JLabel(ii);
-      jl.setMinimumSize(new Dimension(0, 0)); // required for info
-      // node resizing
-      if (cover.getType() == CoverType.TAG_COVER) {
-        jl.setToolTipText("<html>Tag<br>" + size + "K");
-      } else {
-        jl.setToolTipText("<html>" + url.toString() + "<br>" + size + "K");
-      }
-      setSizeText(size + "K" + sType);
-      setFoundText();
-    }
-    // set tooltip for previous and next track
+  private int getCurrentAccuracy() {
+    // Default = medium
+    int iAccuracy = 1;
     try {
-      int indexPrevious = index + 1;
-      if (indexPrevious > alCovers.size() - 1) {
-        indexPrevious = 0;
-      }
-      final URL urlPrevious = alCovers.get(indexPrevious).getURL();
-      if (urlPrevious != null) {
-        jbPrevious.setToolTipText("<html>" + Messages.getString("CoverView.4") + "<br>"
-            + urlPrevious.toString() + "</html>");
-      }
-      int indexNext = index - 1;
-      if (indexNext < 0) {
-        indexNext = alCovers.size() - 1;
-      }
-      final URL urlNext = alCovers.get(indexNext).getURL();
-      if (urlNext != null) {
-        jbNext.setToolTipText("<html>" + Messages.getString("CoverView.5") + "<br>"
-            + urlNext.toString() + "</html>");
-      }
-    } catch (final Exception e) { // the url code can throw out of bounds
-      // exception for unknown reasons so check it
-      Log.debug("jl=" + jl + " url={{" + url + "}}");
-      Log.error(e);
-    }
-    if (getComponentCount() > 0) {
-      removeAll();
-    }
-    if (includeControls) {
-      add(jpControl, "grow,wrap");
+      iAccuracy = Conf.getInt(Const.CONF_COVERS_ACCURACY + "_"
+          + ((getPerspective() == null) ? "popup" : getPerspective().getID()));
+    } catch (final NumberFormatException e) {
+      // can append if accuracy never set
+      Log.debug("Unknown accuracy");
     }
-    // Invert the mirrow option when clicking on the cover
-    jl.addMouseListener(new JajukMouseAdapter() {
-      @Override
-      public void mousePressed(MouseEvent e) {
-        boolean isMirrowed = Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER);
-        Conf.setProperty(Const.CONF_COVERS_MIRROW_COVER, !isMirrowed + "");
-        ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
-      }
-    });
-    add(jl, "center,wrap");
-    // make sure the image is repainted to avoid overlapping covers
-    CoverView.this.revalidate();
-    CoverView.this.repaint();
-    searching(false);
+    return iAccuracy;
   }
 
   /**
    * Display current cover (at this.index), try all covers in case of error
    */
   private void displayCurrentCover() {
-    SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
+    UtilGUI.showBusyLabel(CoverView.this); // lookup icon
+    findRightCover();
+    SwingUtilities.invokeLater(new Runnable() {
       @Override
-      public Void doInBackground() {
-        synchronized (CoverView.this) {
-          // Avoid looping
-          if (alCovers.size() == 0) {
-            // should not append
-            alCovers.add(CoverView.nocover);
-            // Add at last the default cover if all remote cover has
-            // been discarded
-            try {
-              prepareDisplay(0);
-            } catch (JajukException e) {
-              Log.error(e);
-            }
-            return null;
-          }
-          if ((alCovers.size() == 1) && ((alCovers.get(0)).getType() == CoverType.NO_COVER)) {
-            // only a default cover
-            try {
-              prepareDisplay(0);
-            } catch (JajukException e) {
-              Log.error(e);
-            }
-            return null;
-          }
-          // else, there is at least one local cover and no
-          // default cover
-          while (alCovers.size() > 0) {
-            try {
-              prepareDisplay(index);
-              return null; // OK, leave
-            } catch (Exception e) {
-              Log.debug("Removed cover: {{" + alCovers.get(index) + "}}");
-              alCovers.remove(index);
-              // refresh number of found covers
-              if (!bGotoBetter) {
-                // we go to worse covers. If we go to better
-                // covers, we just
-                // keep the same index try a worse cover...
-                if (index - 1 >= 0) {
-                  index--;
-                } else { // no more worse cover
-                  index = alCovers.size() - 1;
-                  // come back to best cover
-                }
-              }
+      public void run() {
+        displayCover(index);
+      }
+    });
+  }
+
+  private void findRightCover() {
+    try {
+      listLock.lock();
+      // Avoid looping
+      if (alCovers.size() == 0) {
+        // should not append
+        alCovers.add(CoverView.nocover);
+        // Add at last the default cover if all remote cover has
+        // been discarded
+        try {
+          prepareDisplay(0);
+        } catch (JajukException e) {
+          Log.error(e);
+        }
+        return;
+      }
+      if (alCovers.size() == 1 && (alCovers.get(0)).getType() == CoverType.NO_COVER) {
+        // only a default cover
+        try {
+          prepareDisplay(0);
+        } catch (JajukException e) {
+          Log.error(e);
+        }
+        return;
+      }
+      // else, there is at least one local cover and no
+      // default cover
+      while (alCovers.size() > 0) {
+        try {
+          prepareDisplay(index);
+          return; // OK, leave
+        } catch (Exception e) {
+          Log.debug("Removed cover: {{" + alCovers.get(index) + "}}");
+          alCovers.remove(index);
+          // refresh number of found covers
+          if (!bGotoBetter) {
+            // we go to worse covers. If we go to better
+            // covers, we just
+            // keep the same index try a worse cover...
+            if (index - 1 >= 0) {
+              index--;
+            } else { // no more worse cover
+              index = alCovers.size() - 1;
+              // come back to best cover
             }
           }
-          // if this code is executed, it means than no available
-          // cover was found, then display default cover
-          alCovers.add(CoverView.nocover); // Add at last the default cover
-          // if all remote cover has been discarded
-          try {
-            index = 0;
-            prepareDisplay(index);
-          } catch (JajukException e) {
-            Log.error(e);
-          }
         }
-        return null;
       }
-
-      @Override
-      public void done() {
-        displayCover(index);
+      // if this code is executed, it means than no available
+      // cover was found, then display default cover
+      alCovers.add(CoverView.nocover); // Add at last the default cover
+      // if all remote cover has been discarded
+      try {
+        index = 0;
+        prepareDisplay(index);
+      } catch (JajukException e) {
+        Log.error(e);
       }
-    };
-    sw.execute();
+    } finally {
+      listLock.unlock();
+    }
   }
 
   /**
@@ -1025,7 +879,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
    * 
    * @return number of real covers (not default) covers found
    */
-  private synchronized int getCoverNumber() {
+  private int getCoverNumber() {
     return alCovers.size();
   }
 
@@ -1058,64 +912,51 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Long action to compute image to display (download, resizing...)
    * 
-   * @param index DOCUMENT_ME
-   * 
-   * @return null (just used by the SwingWorker)
+   * @param index 
    * 
    * @throws JajukException the jajuk exception
    */
-  private Object prepareDisplay(final int index) throws JajukException {
-    final int iLocalEventID = iEventID;
-    Log.debug("display index: " + index);
-    searching(true); // lookup icon
+  private void prepareDisplay(final int index) throws JajukException {
     // find next correct cover
-    ImageIcon icon = null;
     Cover cover = null;
+    ImageIcon icon = null;
     try {
-      if (iEventID == iLocalEventID) {
-        cover = alCovers.get(index); // take image at the given index
-        Image img = cover.getImage();
-
-        if (!Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER)
-            || cover.getType().equals(CoverType.NO_COVER)) {
-          icon = new ImageIcon(img);
-        } else {
+      cover = alCovers.get(index); // take image at the given index
+      Log.debug("Display cover: " + cover + " at index :" + index);
+      Image img = cover.getImage();
+      // Never mirror our no cover image
+      if (cover.getType().equals(CoverType.NO_COVER)) {
+        icon = new ImageIcon(img);
+      } else {
+        if (
+        // should we mirror in our GUI
+        (includeControls && Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER))
+        // should we mirror in fullscreen mode
+            || (!includeControls && Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER_FS_MODE))) {
           icon = new ImageIcon(UtilGUI.get3dImage(img));
+        } else {
+          icon = new ImageIcon(img);
         }
-
-        if (icon.getIconHeight() == 0 || icon.getIconWidth() == 0) {
-          throw new JajukException(0, "Wrong picture, size is null");
-        }
-      } else {
-        Log.debug("Download stopped - 2");
-        return null;
+      }
+      if (icon.getIconHeight() == 0 || icon.getIconWidth() == 0) {
+        throw new JajukException(0, "Wrong picture, size is null");
       }
     } catch (final FileNotFoundException e) {
-      setCursor(UtilGUI.DEFAULT_CURSOR);
-      searching(false);
-
       // do not display a stacktrace for FileNotfound as we expect this in cases
       // where the picture is gone on the net
       Log.warn("Cover image not found at URL: "
           + (cover == null ? "<null>" : cover.getURL().toString()));
-      return null;
+      throw new JajukException(0, e);
     } catch (final UnknownHostException e) {
-      setCursor(UtilGUI.DEFAULT_CURSOR);
-      searching(false);
-
       // do not display a stacktrace for HostNotFound as we expect this in cases
       // where the whole server is gone on the net
       Log.warn("Cover image not found at URL: "
           + (cover == null ? "<null>" : cover.getURL().toString()));
-      return null;
+      throw new JajukException(0, e);
     } catch (final IOException e) { // this cover cannot be loaded
-      setCursor(UtilGUI.DEFAULT_CURSOR);
-      searching(false);
       Log.error(e);
       throw new JajukException(0, e);
     } catch (final InterruptedException e) { // this cover cannot be loaded
-      setCursor(UtilGUI.DEFAULT_CURSOR);
-      searching(false);
       Log.error(e);
       throw new JajukException(0, e);
     }
@@ -1124,7 +965,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     final int iDisplayAreaWidth = (int) (0.9f * CoverView.this.getWidth() - 10);
     // check minimum sizes
     if ((iDisplayAreaHeight < 1) || (iDisplayAreaWidth < 1)) {
-      return null;
+      return;
     }
     int iNewWidth;
     int iNewHeight;
@@ -1155,24 +996,113 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
         iNewWidth = (int) (icon.getIconWidth() * ((float) iNewHeight / icon.getIconHeight()));
       }
     }
-    if (iEventID == iLocalEventID) {
-      // Note that at this point, the image is fully loaded (done in the ImageIcon constructor)
-      ii = UtilGUI.getResizedImage(icon, iNewWidth, iNewHeight);
-      // Free source and destination image buffer, see
-      // http://forums.sun.com/thread.jspa?threadID=5424304&tstart=60
-      icon.getImage().flush();
-      ii.getImage().flush();
-    } else {
-      Log.debug("Download stopped - 2");
-      return null;
+    // Note that at this point, the image is fully loaded (done in the ImageIcon constructor)
+    ii = UtilGUI.getResizedImage(icon, iNewWidth, iNewHeight);
+    // Free memory of source image, removing this causes severe memory leaks ! (tested)
+    icon.getImage().flush();
+  }
+
+  /**
+  * Display given cover.
+  * 
+  * @param index index of the cover to display
+  */
+  private void displayCover(final int index) {
+    if ((alCovers.size() == 0) || (index >= alCovers.size()) || (index < 0)) {
+      // just a check
+      alCovers.add(CoverView.nocover); // display nocover by default
+      displayCover(0);
+      return;
     }
-    return null;
+    final Cover cover = alCovers.get(index); // take image at the given index
+    final URL url = cover.getURL();
+    // enable delete button only for local covers
+    jbDelete.setEnabled(cover.getType() == CoverType.LOCAL_COVER
+        || cover.getType() == CoverType.SELECTED_COVER
+        || cover.getType() == CoverType.STANDARD_COVER);
+    //Disable default command for "none" cover
+    jbDefault.setEnabled(cover.getType() != CoverType.NO_COVER);
+    if (url != null) {
+      jbSave.setEnabled(false);
+      String sType = " (L)"; // local cover
+      if (cover.getType() == CoverType.REMOTE_COVER) {
+        sType = "(@)"; // Web cover
+        jbSave.setEnabled(true);
+      } else if (cover.getType() == CoverType.TAG_COVER) {
+        sType = "(T)"; // Tag cover
+      }
+      final String size = cover.getSize();
+      jl = new JLabel(ii);
+      jl.setMinimumSize(new Dimension(0, 0)); // required for info
+      // node resizing
+      if (cover.getType() == CoverType.TAG_COVER) {
+        jl.setToolTipText("<html>Tag<br>" + size + "K");
+      } else {
+        jl.setToolTipText("<html>" + url.toString() + "<br>" + size + "K");
+      }
+      setSizeText(size + "K" + sType);
+      setFoundText();
+    }
+    // set tooltip for previous and next track
+    try {
+      int indexPrevious = index + 1;
+      if (indexPrevious > alCovers.size() - 1) {
+        indexPrevious = 0;
+      }
+      final URL urlPrevious = alCovers.get(indexPrevious).getURL();
+      if (urlPrevious != null) {
+        jbPrevious.setToolTipText("<html>" + Messages.getString("CoverView.4") + "<br>"
+            + urlPrevious.toString() + "</html>");
+      }
+      int indexNext = index - 1;
+      if (indexNext < 0) {
+        indexNext = alCovers.size() - 1;
+      }
+      final URL urlNext = alCovers.get(indexNext).getURL();
+      if (urlNext != null) {
+        jbNext.setToolTipText("<html>" + Messages.getString("CoverView.5") + "<br>"
+            + urlNext.toString() + "</html>");
+      }
+    } catch (final Exception e) { // the url code can throw out of bounds
+      // exception for unknown reasons so check it
+      Log.debug("jl=" + jl + " url={{" + url + "}}");
+      Log.error(e);
+    }
+    if (getComponentCount() > 0) {
+      removeAll();
+    }
+    if (includeControls) {
+      add(jpControl, "grow,wrap");
+    }
+    // Invert the mirrow option when clicking on the cover
+    jl.addMouseListener(new JajukMouseAdapter() {
+      @Override
+      public void mousePressed(MouseEvent e) {
+        if (!(cover.getType().equals(CoverType.NO_COVER))) {
+          boolean isMirrowed = includeControls ? Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER)
+              : Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER_FS_MODE);
+          // Normal cover view
+          if (includeControls) {
+            Conf.setProperty(Const.CONF_COVERS_MIRROW_COVER, !isMirrowed + "");
+          } else {
+            // Full screen mode
+            Conf.setProperty(Const.CONF_COVERS_MIRROW_COVER_FS_MODE, !isMirrowed + "");
+          }
+          ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+          ObservationManager.notify(new JajukEvent(JajukEvents.PARAMETERS_CHANGE));
+        }
+      }
+    });
+    add(jl, "center,wrap");
+    // make sure the image is repainted to avoid overlapping covers
+    CoverView.this.revalidate();
+    CoverView.this.repaint();
   }
 
   /**
    * Refresh default cover thumb (used in catalog view).
    * 
-   * @param cover DOCUMENT_ME
+   * @param cover 
    */
   private void refreshThumbs(final Cover cover) {
     if (dirReference == null) {
@@ -1186,36 +1116,14 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
         final File fThumb = ThumbnailManager.getThumbBySize(album, size);
         ThumbnailManager.createThumbnail(cover.getFile(), fThumb, size);
       }
-    } catch (final InterruptedException ex) {
-      Log.error(24, ex);
-    } catch (final IOException ex) {
-      Log.error(24, ex);
-    } catch (final RuntimeException ex) {
+    } catch (final Exception ex) {
       Log.error(24, ex);
     }
   }
 
   /**
-   * Display or hide search icon.
-   * 
-   * @param bSearching DOCUMENT_ME
-   */
-  public void searching(final boolean bSearching) {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        if (bSearching) {
-          jlSearching.setIcon(IconLoader.getIcon(JajukIcons.NET_SEARCH));
-        } else {
-          jlSearching.setIcon(null);
-        }
-      }
-    });
-  }
-
-  /**
-   * Set the cover Found text.
-   */
+  * Set the cover Found text.
+  */
   private void setFoundText() {
     SwingUtilities.invokeLater(new Runnable() {
       @Override
@@ -1250,7 +1158,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Set the cover size text.
    * 
-   * @param sSize DOCUMENT_ME
+   * @param sSize 
    */
   private void setSizeText(final String sSize) {
     if (sSize != null) {
@@ -1287,34 +1195,32 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   @Override
   public void update(final JajukEvent event) {
     final JajukEvents subject = event.getSubject();
-    iEventID = (int) (Integer.MAX_VALUE * Math.random());
-    final int iLocalEventID = iEventID;
     try {
-      searching(true);
+      listLock.lock();
       // When receiving this event, check if we should change the cover or
-      // not
-      // (we don't change cover if playing another track of the same album
+      // not (we don't change cover if playing another track of the same album
       // except if option shuffle cover is set)
       if (JajukEvents.FILE_LAUNCHED.equals(subject)) {
-        updateFileLaunched(event, iLocalEventID);
+        updateFileLaunched(event);
       } else if (JajukEvents.ZERO.equals(subject) || JajukEvents.WEBRADIO_LAUNCHED.equals(subject)
           || JajukEvents.PLAYER_STOP.equals(subject)) {
-        updateStopOrWebRadioLaunched();
-      } else if (JajukEvents.COVER_NEED_REFRESH.equals(subject)) {
-        refreshCovers(iLocalEventID, true);
+        reset();
+      } else if (JajukEvents.COVER_NEED_REFRESH.equals(subject) && !QueueModel.isPlayingRadio()) {
+        refreshCovers(true);
+        displayCurrentCover();
       }
     } catch (final IOException e) {
       Log.error(e);
     } finally {
-      searching(false); // hide searching icon
+      listLock.unlock();
     }
   }
 
   /**
    * Update stop or web radio launched.
-   * DOCUMENT_ME
+   * 
    */
-  private synchronized void updateStopOrWebRadioLaunched() {
+  private void reset() {
     // Ignore this event if a reference file has been set
     if (fileReference != null) {
       return;
@@ -1335,13 +1241,11 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
   /**
    * Update file launched.
    * 
-   * @param event DOCUMENT_ME
-   * @param iLocalEventID DOCUMENT_ME
+   * @param event 
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    */
-  private synchronized void updateFileLaunched(final JajukEvent event, final int iLocalEventID)
-      throws IOException {
+  private void updateFileLaunched(final JajukEvent event) throws IOException {
     org.jajuk.base.File last = null;
     Properties details = event.getDetails();
     if (details != null) {
@@ -1362,8 +1266,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     if (bForceCoverReload) {
       dirChanged = true;
     }
-    refreshCovers(iLocalEventID, dirChanged);
-
+    refreshCovers(dirChanged);
     if (Conf.getBoolean(Const.CONF_COVERS_SHUFFLE)) {
       // Ignore this event if a reference file has been set
       if (fileReference != null) {
@@ -1371,15 +1274,15 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       }
       // choose a random cover
       index = (int) (Math.random() * alCovers.size() - 1);
-      displayCurrentCover();
     }
+    displayCurrentCover();
     enableCommands(true);
   }
 
   /**
    * Convenient method to massively enable/disable this view buttons.
    * 
-   * @param enable DOCUMENT_ME
+   * @param enable 
    */
   private void enableCommands(final boolean enable) {
     SwingUtilities.invokeLater(new Runnable() {
@@ -1394,9 +1297,7 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
         jlFound.setVisible(enable);
         jlSize.setVisible(enable);
       }
-
     });
-
   }
 
   /**
@@ -1405,12 +1306,11 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
    * Must be called outside the EDT, contains network access
    * </p>.
    * 
-   * @param iLocalEventID DOCUMENT_ME
-   * @param dirChanged DOCUMENT_ME
+   * @param dirChanged 
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    */
-  private synchronized void refreshCovers(int iLocalEventID, boolean dirChanged) throws IOException {
+  private void refreshCovers(boolean dirChanged) throws IOException {
     // Reset this flag
     bForceCoverReload = false;
     org.jajuk.base.File fCurrent = fileReference;
@@ -1419,30 +1319,26 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     if (fCurrent == null) {
       fCurrent = QueueModel.getPlayingFile();
     }
-    // no current cover
+    // no current cover and nothing playing
     if (fCurrent == null) {
       dirReference = null;
     } else {
       // store this dir
       dirReference = fCurrent.getDirectory();
     }
-
     if (dirReference == null) {
       alCovers.clear();
       alCovers.add(CoverView.nocover);
       index = 0;
-      displayCurrentCover();
       return;
     }
-
     if (fCurrent == null) {
       throw new IllegalArgumentException("Internal Error: Unexpected value, "
           + "variable fCurrent should not be empty. dirReference: " + dirReference);
     }
-
     // We only need to refresh the other covers if the directory changed 
     // but we still clear tag-based covers even if directory didn't change
-    // so the song-specific tag is token into account. 
+    // so the song-specific tag is taken into account. 
     Iterator<Cover> it = alCovers.iterator();
     while (it.hasNext()) {
       Cover cover = it.next();
@@ -1453,13 +1349,11 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     if (dirChanged) {
       // remove all existing covers
       alCovers.clear();
-
       // Search for local covers in all directories mapping
       // the current track to reach other devices covers and
       // display them together
       final Track trackCurrent = fCurrent.getTrack();
       final List<org.jajuk.base.File> alFiles = trackCurrent.getFiles();
-
       // Add any selected default cover
       String defaultCoverPath = trackCurrent.getAlbum().getStringValue(XML_ALBUM_SELECTED_COVER);
       if (StringUtils.isNotBlank(defaultCoverPath)) {
@@ -1472,7 +1366,6 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
           }
         }
       }
-
       // list of files mapping the track
       for (final org.jajuk.base.File file : alFiles) {
         final Directory dirScanned = file.getDirectory();
@@ -1502,7 +1395,6 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
           }
         }
       }
-
       // Then we search for web covers online if max
       // connection errors number is not reached or if user
       // already managed to connect.
@@ -1528,11 +1420,10 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
             // set best results to be displayed first
             final Iterator<URL> it2 = alUrls.iterator();
             // add found covers
-            while (it2.hasNext() && (iEventID == iLocalEventID)) {
+            while (it2.hasNext()) {
               // load each cover (pre-load or post-load)
               // and stop if a signal has been emitted
               final URL url = it2.next();
-
               final Cover cover = new Cover(url, CoverType.REMOTE_COVER);
               // Create a cover with given url ( image
               // will be really downloaded when
@@ -1541,13 +1432,6 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
                 Log.debug("Found Cover: {{" + url.toString() + "}}");
                 alCovers.add(cover);
               }
-
-            }
-            if (iEventID != iLocalEventID) {
-              // a stop signal has been emitted
-              // from a concurrent thread
-              Log.debug("Download stopped - 1");
-              return;
             }
           }
         } catch (final IOException e) {
@@ -1565,7 +1449,6 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
         }
       }
     }
-
     // Check for tag covers 
     try {
       Tag tag = new Tag(fCurrent.getFIO(), false);
@@ -1582,14 +1465,11 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
     } catch (JajukException e1) {
       Log.error(e1);
     }
-
     if (alCovers.size() == 0) {// add the default cover if none
       // other cover has been found
       alCovers.add(CoverView.nocover);
     }
-
     Collections.sort(alCovers);
-
     Log.debug("Local cover list: {{" + alCovers + "}}");
     if (Conf.getBoolean(Const.CONF_COVERS_SHUFFLE)) {
       // choose a random cover
@@ -1598,6 +1478,5 @@ public class CoverView extends ViewAdapter implements ComponentListener, ActionL
       index = alCovers.size() - 1;
       // current index points to the best available cover
     }
-    displayCurrentCover();
   }
 }
diff --git a/src/main/java/org/jajuk/ui/views/DeviceView.java b/src/main/java/org/jajuk/ui/views/DeviceView.java
index 59f4215..3015754 100644
--- a/src/main/java/org/jajuk/ui/views/DeviceView.java
+++ b/src/main/java/org/jajuk/ui/views/DeviceView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import ext.FlowScrollPanel;
@@ -67,47 +66,23 @@ import org.jajuk.util.error.JajukException;
  * <p>
  * Configuration perspective.
  */
-public class DeviceView extends ViewAdapter implements IView, ActionListener {
-
+public class DeviceView extends ViewAdapter implements ActionListener {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** self instance. */
   private static DeviceView dv = new DeviceView();
-
-  /** DOCUMENT_ME. */
   FlowScrollPanel jpDevices;
-
-  /** DOCUMENT_ME. */
   JPopupMenu jpmenu;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDelete;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiProperties;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiMount;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiUnmount;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiTest;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiRefresh;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiSynchronize;
-
-  /** DOCUMENT_ME. */
   DeviceItem diSelected;
-
   /** Mouse adapter used over device items to manage action or popup clicks. */
   MouseAdapter ma = new JajukMouseAdapter() {
-
     @Override
     public void handleActionSingleClick(final MouseEvent e) {
       selectItem(e);
@@ -147,59 +122,47 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
     JScrollPane jsp = new JScrollPane(jpDevices, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
     jsp.setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 0));
-
     jpDevices.setScroller(jsp);
-
     jpDevices.setLayout(new FlowLayout(FlowLayout.LEFT));
-
     // Popup menus
     jpmenu = new JPopupMenu();
-
-    jmiMount = new JMenuItem(Messages.getString("DeviceView.8"), IconLoader
-        .getIcon(JajukIcons.MOUNT));
+    jmiMount = new JMenuItem(Messages.getString("DeviceView.8"),
+        IconLoader.getIcon(JajukIcons.MOUNT));
     jmiMount.addActionListener(this);
     jmiMount.setActionCommand(JajukEvents.DEVICE_MOUNT.toString());
     jpmenu.add(jmiMount);
-
-    jmiUnmount = new JMenuItem(Messages.getString("DeviceView.9"), IconLoader
-        .getIcon(JajukIcons.UNMOUNT));
+    jmiUnmount = new JMenuItem(Messages.getString("DeviceView.9"),
+        IconLoader.getIcon(JajukIcons.UNMOUNT));
     jmiUnmount.addActionListener(this);
     jmiUnmount.setActionCommand(JajukEvents.DEVICE_UNMOUNT.toString());
     jpmenu.add(jmiUnmount);
-
-    jmiRefresh = new JMenuItem(Messages.getString("DeviceView.11"), IconLoader
-        .getIcon(JajukIcons.REFRESH));
+    jmiRefresh = new JMenuItem(Messages.getString("DeviceView.11"),
+        IconLoader.getIcon(JajukIcons.REFRESH));
     jmiRefresh.addActionListener(this);
     jmiRefresh.setActionCommand(JajukEvents.DEVICE_REFRESH.toString());
     jpmenu.add(jmiRefresh);
-
-    jmiTest = new JMenuItem(Messages.getString("DeviceView.10"), IconLoader
-        .getIcon(JajukIcons.TEST));
+    jmiTest = new JMenuItem(Messages.getString("DeviceView.10"),
+        IconLoader.getIcon(JajukIcons.TEST));
     jmiTest.addActionListener(this);
     jmiTest.setActionCommand(JajukEvents.DEVICE_TEST.toString());
     jpmenu.add(jmiTest);
-
-    jmiSynchronize = new JMenuItem(Messages.getString("DeviceView.12"), IconLoader
-        .getIcon(JajukIcons.SYNCHRO));
+    jmiSynchronize = new JMenuItem(Messages.getString("DeviceView.12"),
+        IconLoader.getIcon(JajukIcons.SYNCHRO));
     jmiSynchronize.addActionListener(this);
     jmiSynchronize.setActionCommand(JajukEvents.DEVICE_SYNCHRO.toString());
     jpmenu.add(jmiSynchronize);
-
-    jmiDelete = new JMenuItem(Messages.getString("DeviceView.13"), IconLoader
-        .getIcon(JajukIcons.DELETE));
+    jmiDelete = new JMenuItem(Messages.getString("DeviceView.13"),
+        IconLoader.getIcon(JajukIcons.DELETE));
     jmiDelete.addActionListener(this);
     jmiDelete.setActionCommand(JajukEvents.DEVICE_DELETE.toString());
     jpmenu.add(jmiDelete);
-
-    jmiProperties = new JMenuItem(Messages.getString("DeviceView.14"), IconLoader
-        .getIcon(JajukIcons.CONFIGURATION));
+    jmiProperties = new JMenuItem(Messages.getString("DeviceView.14"),
+        IconLoader.getIcon(JajukIcons.CONFIGURATION));
     jmiProperties.addActionListener(this);
     jmiProperties.setActionCommand(JajukEvents.DEVICE_PROPERTIES.toString());
     jpmenu.add(jmiProperties);
-
     // add devices
     refreshDevices();
-
     // add components
     setLayout(new MigLayout("ins 0", "[grow]", "[grow]"));
     add(jsp, "grow");
@@ -223,7 +186,7 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
   }
 
   /**
-   * Refresh devices. DOCUMENT_ME
+   * Refresh devices. 
    */
   private void refreshDevices() {
     // remove all devices
@@ -231,8 +194,8 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
       jpDevices.removeAll();
     }
     // New device
-    DeviceItem diNew = new DeviceItem(IconLoader.getIcon(JajukIcons.DEVICE_NEW), Messages
-        .getString("DeviceView.17"), null);
+    DeviceItem diNew = new DeviceItem(IconLoader.getIcon(JajukIcons.DEVICE_NEW),
+        Messages.getString("DeviceView.17"), null);
     diNew.setToolTipText(Messages.getString("DeviceView.18"));
     jpDevices.add(diNew);
     diNew.addMouseListener(new MouseAdapter() {
@@ -247,54 +210,11 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
     // Add devices
     List<Device> devices = DeviceManager.getInstance().getDevices();
     for (Device device : devices) {
-      ImageIcon icon = IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_MOUNTED);
-      String sTooltip = "";
-      switch ((int) device.getType()) {
-      case 0:
-        sTooltip = Messages.getString("Device_type.directory");
-        if (device.isMounted()) {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_MOUNTED);
-        } else {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_UNMOUNTED);
-        }
-        break;
-      case 1:
-        sTooltip = Messages.getString("Device_type.file_cd");
-        if (device.isMounted()) {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_CD_MOUNTED);
-        } else {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_CD_UNMOUNTED);
-        }
-        break;
-      case 2:
-        sTooltip = Messages.getString("Device_type.network_drive");
-        if (device.isMounted()) {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED);
-        } else {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED);
-        }
-        break;
-      case 3:
-        sTooltip = Messages.getString("Device_type.extdd");
-        if (device.isMounted()) {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_MOUNTED);
-        } else {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_UNMOUNTED);
-        }
-        break;
-      case 4:
-        sTooltip = Messages.getString("Device_type.player");
-        if (device.isMounted()) {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_MOUNTED);
-        } else {
-          icon = IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_UNMOUNTED);
-        }
-        break;
-      }
+      ImageIcon icon = device.getIconRepresentationLarge();
+      String sTooltip = device.getHumanValue(XML_TYPE);
       DeviceItem di = new DeviceItem(icon, device.getName(), device);
       di.setToolTipText(sTooltip);
       di.addMouseListener(ma);
-      di.setToolTipText(device.getDeviceTypeS());
       di.addKeyListener(new KeyAdapter() {
         @Override
         public void keyTyped(KeyEvent e) {
@@ -351,11 +271,9 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
       dw.setVisible(true);
       return;
     }
-
     if (diSelected == null) { // test a device is selected
       return;
     }
-
     if (ae.getActionCommand().equals(JajukEvents.DEVICE_DELETE.toString())) {
       handleDelete();
     } else if (ae.getActionCommand().equals(JajukEvents.DEVICE_MOUNT.toString())) {
@@ -388,11 +306,11 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
         @Override
         public void run() {
           if (diSelected.getDevice().test()) {
-            Messages.showInfoMessage(Messages.getString("DeviceView.21"), IconLoader
-                .getIcon(JajukIcons.OK));
+            Messages.showInfoMessage(Messages.getString("DeviceView.21"),
+                IconLoader.getIcon(JajukIcons.OK));
           } else {
-            Messages.showInfoMessage(Messages.getString("DeviceView.22"), IconLoader
-                .getIcon(JajukIcons.KO));
+            Messages.showInfoMessage(Messages.getString("DeviceView.22"),
+                IconLoader.getIcon(JajukIcons.KO));
           }
         }
       }.start();
@@ -443,9 +361,9 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
   }
 
   /**
-   * Select item. DOCUMENT_ME
+   * Select item. 
    * 
-   * @param e DOCUMENT_ME
+   * @param e 
    */
   private void selectItem(final MouseEvent e) {
     boolean bSameDevice = ((diSelected != null) && e.getSource().equals(diSelected));
@@ -472,7 +390,13 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
    * 
    * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
    */
-  public void mouseExited(@SuppressWarnings("unused") MouseEvent arg0) {
+  /**
+   * Mouse exited.
+   * 
+   *
+   * @param arg0 
+   */
+  public void mouseExited(MouseEvent arg0) {
     // required by interface, but nothing to do here...
   }
 
@@ -481,7 +405,13 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
    * 
    * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
    */
-  public void mouseEntered(@SuppressWarnings("unused") MouseEvent e) {
+  /**
+   * Mouse entered.
+   * 
+   *
+   * @param e 
+   */
+  public void mouseEntered(MouseEvent e) {
     // required by interface, but nothing to do here...
   }
 
@@ -490,7 +420,13 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
    * 
    * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
    */
-  public void mouseClicked(@SuppressWarnings("unused") MouseEvent e) {
+  /**
+   * Mouse clicked.
+   * 
+   *
+   * @param e 
+   */
+  public void mouseClicked(MouseEvent e) {
     // required by interface, but nothing to do here...
   }
 }
@@ -500,7 +436,6 @@ public class DeviceView extends ViewAdapter implements IView, ActionListener {
  */
 class DeviceItem extends JPanel {
   private static final long serialVersionUID = 1L;
-
   /** Associated device */
   private Device device;
 
@@ -508,8 +443,6 @@ class DeviceItem extends JPanel {
    * Constructor
    */
   DeviceItem(ImageIcon icon, String sName, Device device) {
-    super();
-
     this.device = device;
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
@@ -536,5 +469,4 @@ class DeviceItem extends JPanel {
   public void setDevice(Device device) {
     this.device = device;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/FilesTableView.java b/src/main/java/org/jajuk/ui/views/FilesTableView.java
index 173e35b..fdbc4a6 100644
--- a/src/main/java/org/jajuk/ui/views/FilesTableView.java
+++ b/src/main/java/org/jajuk/ui/views/FilesTableView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import javax.swing.JMenuItem;
@@ -27,9 +26,7 @@ import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.JajukActions;
 import org.jajuk.ui.helpers.FilesTableModel;
 import org.jajuk.ui.helpers.JajukTableModel;
-import org.jajuk.ui.helpers.TwoStepsDisplayable;
 import org.jajuk.ui.widgets.JajukTable;
-import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
@@ -37,13 +34,11 @@ import org.jajuk.util.UtilGUI;
 /**
  * Logical table view.
  */
-public class FilesTableView extends AbstractTableView implements TwoStepsDisplayable {
-
+public class FilesTableView extends AbstractTableView {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiFilePlayDirectory;
+  private JMenuItem jmiOpenExplorer;
 
   /**
    * Instantiates a new files table view.
@@ -84,10 +79,14 @@ public class FilesTableView extends AbstractTableView implements TwoStepsDisplay
     jtable = new JajukTable(model, true, columnsConf);
     super.shortCall(null);
     // File menu
-    jmiFilePlayDirectory = new JMenuItem(ActionManager
-        .getAction(JajukActions.PLAY_DIRECTORY_SELECTION));
+    jmiFilePlayDirectory = new JMenuItem(
+        ActionManager.getAction(JajukActions.PLAY_DIRECTORY_SELECTION));
     jmiFilePlayDirectory.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
     jtable.getMenu().add(jmiFilePlayDirectory, 4);
+    //Add menu to open directory of the selected file
+    jmiOpenExplorer = new JMenuItem(ActionManager.getAction(JajukActions.OPEN_EXPLORER));
+    jmiOpenExplorer.putClientProperty(Const.DETAIL_CONTENT, jtable.getSelection());
+    jtable.getMenu().add(jmiOpenExplorer);
     // Add this generic menu item manually to ensure it's the last one in
     // the list for GUI reasons
     jtable.getMenu().addSeparator();
@@ -118,16 +117,4 @@ public class FilesTableView extends AbstractTableView implements TwoStepsDisplay
     // model creation
     return new FilesTableModel(getID());
   }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.views.AbstractTableView#initTable()
-   */
-  @Override
-  void initTable() {
-    boolean bEditable = Conf.getBoolean(Const.CONF_FILES_TABLE_EDITION);
-    jtbEditable.setSelected(bEditable);
-  }
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/FilesTreeView.java b/src/main/java/org/jajuk/ui/views/FilesTreeView.java
index 51e83ee..a45b7a0 100644
--- a/src/main/java/org/jajuk/ui/views/FilesTreeView.java
+++ b/src/main/java/org/jajuk/ui/views/FilesTreeView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.Component;
@@ -94,78 +93,35 @@ import org.jajuk.util.UtilGUI;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
-import org.jvnet.substance.api.renderers.SubstanceDefaultTreeCellRenderer;
+import org.pushingpixels.substance.api.renderers.SubstanceDefaultTreeCellRenderer;
 
 /**
  * Physical tree view.
  */
-public class FilesTreeView extends AbstractTreeView implements ActionListener,
-    org.jajuk.events.Observer {
-
+public class FilesTreeView extends AbstractTreeView implements ActionListener {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Directories selection. */
   List<Directory> alDirs = new ArrayList<Directory>(10);
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDirRefresh;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDirDesynchro;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDirResynchro;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDirCreatePlaylist;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDirRefactor;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDirCopyURL;
-
-  /** DOCUMENT_ME. */
-  JMenuItem jmiDirOpenExplorer;
-
-  /** DOCUMENT_ME. */
+  JMenuItem jmiOpenExplorer;
   JMenuItem jmiDevMount;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDevUnmount;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDevRefresh;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDevSynchronize;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDevTest;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDevOrganize;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDevConfiguration;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDevDelete;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlaylistFileCopy;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlaylistFileCut;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlaylistFilePaste;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlaylistCopyURL;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlaylistPrepareParty;
 
   /*
@@ -192,7 +148,6 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
   @Override
   public void initUI() {
     super.initUI();
-
     // Directory menu
     Action actionRefreshDir = ActionManager.getAction(JajukActions.REFRESH);
     jmiDirRefresh = new JMenuItem(actionRefreshDir);
@@ -212,9 +167,8 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     jmiDirRefactor.addActionListener(this);
     jmiDirCopyURL = new JMenuItem(ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD));
     jmiDirCopyURL.putClientProperty(Const.DETAIL_CONTENT, alSelected);
-    jmiDirOpenExplorer = new JMenuItem(ActionManager.getAction(JajukActions.OPEN_EXPLORER));
-    jmiDirOpenExplorer.putClientProperty(Const.DETAIL_CONTENT, alSelected);
-
+    jmiOpenExplorer = new JMenuItem(ActionManager.getAction(JajukActions.OPEN_EXPLORER));
+    jmiOpenExplorer.putClientProperty(Const.DETAIL_CONTENT, alSelected);
     // Device menu
     jmiDevMount = new JMenuItem(Messages.getString("FilesTreeView.28"),
         IconLoader.getIcon(JajukIcons.UNMOUNT));
@@ -240,7 +194,6 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     jmiDevOrganize = new JMenuItem(Messages.getString(("FilesTreeView.62")),
         IconLoader.getIcon(JajukIcons.REORGANIZE));
     jmiDevOrganize.addActionListener(this);
-
     // playlist menu
     jmiPlaylistFileCopy = new JMenuItem(Messages.getString("FilesTreeView.40"));
     jmiPlaylistFileCopy.setEnabled(false);
@@ -255,26 +208,19 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     jmiPlaylistCopyURL.putClientProperty(Const.DETAIL_CONTENT, alSelected);
     jmiPlaylistPrepareParty = new JMenuItem(ActionManager.getAction(JajukActions.PREPARE_PARTY));
     jmiPlaylistPrepareParty.putClientProperty(Const.DETAIL_SELECTION, alSelected);
-
     // Add Action Listener
     jmiCopy.addActionListener(this);
     jmiCut.addActionListener(this);
     jmiPaste.addActionListener(this);
-
     // By default disable paste
     jmiPaste.setEnabled(false);
-
     top = new TreeRootElement(Messages.getString("FilesTreeView.47"));
-
     // Register on the list for subject we are interested in
     ObservationManager.register(this);
-
     // fill the tree model
     populateTree();
-
     // create tree
     createTree(true);
-
     /**
      * CAUTION ! we register several listeners against this tree Swing can't
      * ensure the order where listeners will treat them so don't count in the
@@ -291,11 +237,9 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     jtree.setAutoscrolls(true);
     jspTree = new JScrollPane(jtree);
     jspTree.setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 0));
-
     // DND support
     jtree.setDragEnabled(true);
     jtree.setTransferHandler(new TreeTransferHandler(jtree));
-
     // layout : the tree takes all the available height and we display the
     // command buttons on a different layer (because we don't want to use a
     // dedicated row like in the Tracks tree table : it's too ugly and
@@ -319,7 +263,6 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
       }
     });
     add(lp, "grow");
-
     // expand all
     expand();
   }
@@ -337,13 +280,6 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     try {
       refreshing = true;
       top.removeAllChildren();
-
-      // see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6472844 for a
-      // small memory leak that is caused here...
-      if (jtree != null && jtree.getModel() != null) {
-        ((DefaultTreeModel) (jtree.getModel())).reload();
-      }
-
       // add all devices as "LazyLoading" nodes so all subsequent elements are
       // only populated if necessary
       List<Device> devices = DeviceManager.getInstance().getDevices();
@@ -351,6 +287,11 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         DefaultMutableTreeNode nodeDevice = new DeviceNode(device);
         top.add(nodeDevice);
       }
+      // see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6472844 for a
+      // small memory leak that is caused here...
+      if (jtree != null && jtree.getModel() != null) {
+        ((DefaultTreeModel) (jtree.getModel())).reload();
+      }
     } finally {
       refreshing = false;
     }
@@ -494,7 +435,6 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
   void expand() {
     // make sure the main element is expanded
     jtree.expandRow(0);
-
     // begin by expanding all needed devices and directory, only after,
     // collapse unmounted devices if required
     for (int i = 0; i < jtree.getRowCount(); i++) {
@@ -517,19 +457,51 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     }
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.views.AbstractTreeView#scrollTo(org.jajuk.base.Item)
-   */
   @Override
-  void scrollTo(Item item) {
+  void selectNodes(List<Item> items) {
+    if (items == null || items.size() == 0) {
+      Log.warn("None item to select in Tree view");
+      return;
+    }
     // Set manual change because we force here tree selection and
     // we don't want to force table views to synchronize
     bInternalAction = true;
     try {
       // Clear selection so we only select new synchronized item
       jtree.getSelectionModel().clearSelection();
+      for (Item item : items) {
+        // Expand recursively item's directory because of the lazy loading stuff
+        expandRecursively(item);
+        // Now scroll to the item and select it
+        for (int i = 0; i < jtree.getRowCount(); i++) {
+          Object o = jtree.getPathForRow(i).getLastPathComponent();
+          if (o instanceof FileNode) {
+            o = ((FileNode) o).getFile();
+          } else if (o instanceof PlaylistFileNode) {
+            o = ((PlaylistFileNode) o).getPlaylistFile();
+          } else {
+            continue;
+          }
+          if (item.equals(o)) {
+            jtree.getSelectionModel().addSelectionPath(jtree.getPathForRow(i));
+          }
+        }
+      }
+    } finally {
+      bInternalAction = false;
+    }
+  }
+
+  @Override
+  void scrollTo(Item item) {
+    // Make sure item is a file (may be webradio)
+    if (FileManager.getInstance().getFileByID(item.getID()) == null) {
+      return;
+    }
+    // Set manual change because we force here tree selection and
+    // we don't want to force table views to synchronize
+    bInternalAction = true;
+    try {
       // Expand recursively item's directory because of the lazy loading stuff
       expandRecursively(item);
       // Now scroll to the item and select it
@@ -544,13 +516,11 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         }
         if (item.equals(o)) {
           jtree.scrollRowToVisible(i);
-          jtree.getSelectionModel().addSelectionPath(jtree.getPathForRow(i));
         }
       }
     } finally {
       bInternalAction = false;
     }
-
   }
 
   /**
@@ -602,14 +572,12 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     if (!stopLoop) {
       expandRecursively(item);
     }
-
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
-  class FilesMouseAdapter extends JajukMouseAdapter {
-
+  private class FilesMouseAdapter extends JajukMouseAdapter {
     /*
      * (non-Javadoc)
      * 
@@ -626,7 +594,7 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
       if (o instanceof FileNode) {
         File file = ((FileNode) o).getFile();
         try {
-          QueueModel.push(new StackItem(file, Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL), true),
+          QueueModel.push(new StackItem(file, Conf.getBoolean(Const.CONF_STATE_REPEAT), true),
               Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
         } catch (JajukException je) {
           Log.error(je);
@@ -729,7 +697,6 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
           }
         }
       }
-
       // get all components recursively
       for (TreePath element : paths) {
         Object o = element.getLastPathComponent();
@@ -756,6 +723,7 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         jmenu.add(jmiRename);
         jmenu.add(jmiDelete);
         jmenu.add(jmiCopyURL);
+        jmenu.add(jmiOpenExplorer);
         jmenu.addSeparator();
         jmenu.add(pjmTracks);
         jmenu.add(jmiAddFavorite);
@@ -776,7 +744,7 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         jmenu.add(jmiNewFolder);
         jmenu.add(jmiDelete);
         jmenu.add(jmiDirCopyURL);
-        jmenu.add(jmiDirOpenExplorer);
+        jmenu.add(jmiOpenExplorer);
         jmenu.addSeparator();
         jmenu.add(jmiDirRefresh);
         jmenu.add(jmiRename);
@@ -801,6 +769,7 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         jmenu.addSeparator();
         jmenu.add(jmiPlaylistCopyURL);
         jmenu.add(jmiPlaylistPrepareParty);
+        jmenu.add(jmiOpenExplorer);
         jmenu.add(jmiDelete);
         jmenu.addSeparator();
         jmenu.add(jmiProperties);
@@ -861,23 +830,19 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         // to be able to get it
         jmiCollectionReport.putClientProperty(Const.DETAIL_ORIGIN, COLLECTION_PHYSICAL);
         jmenuCollection.add(jmiCollectionReport);
-
         Action actionDuplicateFiles = ActionManager.getAction(JajukActions.FIND_DUPLICATE_FILES);
         JMenuItem jmiCollectionDuplicateFiles = new JMenuItem(actionDuplicateFiles);
         jmenuCollection.add(jmiCollectionDuplicateFiles);
-
         // collection
         jmenuCollection.show(jtree, e.getX(), e.getY());
       }
-
     }
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
-  class FilesTreeSelectionListener implements TreeSelectionListener {
-
+  private class FilesTreeSelectionListener implements TreeSelectionListener {
     /*
      * (non-Javadoc)
      * 
@@ -888,11 +853,9 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
     public void valueChanged(TreeSelectionEvent e) {
       paths = jtree.getSelectionModel().getSelectionPaths();
       // nothing selected, can be called during dnd
-      if (paths == null) {
+      if (paths == null || paths.length == 0) {
         return;
       }
-      int items = 0;
-      long lSize = 0;
       // get all components recursively
       selectedRecursively.clear();
       alSelected.clear();
@@ -924,24 +887,7 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
           }
         }
       }
-      // Compute recursive selection size, nb of items...
-      for (Item item : selectedRecursively) {
-        if (item instanceof File) {
-          lSize += ((File) item).getSize();
-        }
-      }
-      items = selectedRecursively.size();
-      lSize /= 1048576; // set size in MB
-      StringBuilder sbOut = new StringBuilder().append(items).append(
-          Messages.getString("FilesTreeView.52"));
-      if (lSize > 1024) { // more than 1024 MB -> in GB
-        sbOut.append(lSize / 1024).append('.').append(lSize % 1024)
-            .append(Messages.getString("FilesTreeView.53"));
-      } else {
-        sbOut.append(lSize).append(Messages.getString("FilesTreeView.54"));
-      }
-      InformationJPanel.getInstance().setSelection(sbOut.toString());
-
+      updateSelectionMessage();
       // Notify the tree selection change (used by tree/table sync)
       if (!bInternalAction) {
         Properties properties = new Properties();
@@ -951,18 +897,17 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         properties.put(Const.DETAIL_VIEW, getID());
         ObservationManager.notify(new JajukEvent(JajukEvents.TREE_SELECTION_CHANGED, properties));
       }
-
       // Enable CDDB retagging only for a single directory selection
       jmiCDDBWizard.setEnabled(alSelected.size() == 1 && alSelected.get(0) instanceof Directory);
-
       // Enable device refresh for a single item
       jmiDevRefresh.setEnabled(alSelected.size() == 1 && alSelected.get(0) instanceof Device);
-
       // Enable Copy url for a single item only
       jmiCopyURL.setEnabled(alSelected.size() == 1 && alSelected.get(0) instanceof File);
       jmiDirCopyURL.setEnabled(alSelected.size() == 1 && alSelected.get(0) instanceof Directory);
-      jmiDirOpenExplorer.setEnabled(alSelected.size() == 1
-          && alSelected.get(0) instanceof Directory);
+      jmiOpenExplorer
+          .setEnabled(alSelected.size() == 1
+              && (alSelected.get(0) instanceof Directory || alSelected.get(0) instanceof File || alSelected
+                  .get(0) instanceof Playlist));
       jmiPlaylistCopyURL
           .setEnabled(alSelected.size() == 1 && alSelected.get(0) instanceof Playlist);
       jmiPlaylistPrepareParty.setEnabled(alSelected.size() == 1
@@ -970,13 +915,34 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
       // Update preference menu
       pjmTracks.resetUI(alSelected);
     }
+
+    private void updateSelectionMessage() {
+      long lSize = 0;
+      int items;
+      // Compute recursive selection size, nb of items...
+      for (Item item : selectedRecursively) {
+        if (item instanceof File) {
+          lSize += ((File) item).getSize();
+        }
+      }
+      items = selectedRecursively.size();
+      lSize /= 1048576; // set size in MB
+      StringBuilder sbOut = new StringBuilder().append(items).append(
+          Messages.getString("FilesTreeView.52"));
+      if (lSize > 1024) { // more than 1024 MB -> in GB
+        sbOut.append(lSize / 1024).append('.').append(lSize % 1024)
+            .append(Messages.getString("FilesTreeView.53"));
+      } else {
+        sbOut.append(lSize).append(Messages.getString("FilesTreeView.54"));
+      }
+      InformationJPanel.getInstance().setSelection(sbOut.toString());
+    }
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
-  class FilesTreeExpansionListener implements TreeExpansionListener {
-
+  private class FilesTreeExpansionListener implements TreeExpansionListener {
     /*
      * (non-Javadoc)
      * 
@@ -1011,7 +977,6 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
         Device device = ((DeviceNode) o).getDevice();
         device.setProperty(Const.XML_EXPANDED, true);
       }
-
     }
   }
 
@@ -1046,14 +1011,12 @@ public class FilesTreeView extends AbstractTreeView implements ActionListener,
       list.add(new PlaylistFileNode(pl));
     }
   }
-
 }
 
 /**
  * File node
  */
 class FileNode extends DefaultMutableTreeNode {
-
   private static final long serialVersionUID = 1L;
 
   /**
@@ -1085,7 +1048,6 @@ class FileNode extends DefaultMutableTreeNode {
  * Device node
  */
 class DeviceNode extends LazyLoadingTreeNode {
-
   private static final long serialVersionUID = 1L;
 
   /**
@@ -1120,7 +1082,6 @@ class DeviceNode extends LazyLoadingTreeNode {
   @Override
   public MutableTreeNode[] loadChildren(DefaultTreeModel model) {
     List<MutableTreeNode> list = new ArrayList<MutableTreeNode>();
-
     // first level is the directory of the device itself, usually only one
     for (Directory parent : getDevice().getDirectories()) {
       // so for each directory that is listed for that Device we build up the
@@ -1129,7 +1090,6 @@ class DeviceNode extends LazyLoadingTreeNode {
     }
     return list.toArray(new MutableTreeNode[list.size()]);
   }
-
 }
 
 /**
@@ -1170,13 +1130,10 @@ class DirectoryNode extends LazyLoadingTreeNode {
   @Override
   public MutableTreeNode[] loadChildren(DefaultTreeModel model) {
     List<MutableTreeNode> list = new ArrayList<MutableTreeNode>();
-
     // simply collect all items one level below that directory
     FilesTreeView.populateFromDirectory(getDirectory(), list);
-
     return list.toArray(new MutableTreeNode[list.size()]);
   }
-
 }
 
 /**
@@ -1221,7 +1178,6 @@ class FilesTreeCellRenderer extends SubstanceDefaultTreeCellRenderer {
     if (value instanceof FileNode) {
       setBorder(null);
       File file = ((FileNode) value).getFile();
-
       // Note: file.getName() is better here as it will do less and not
       // create java.io.File in File
       String ext = UtilSystem.getExtension(file.getName());
@@ -1230,7 +1186,7 @@ class FilesTreeCellRenderer extends SubstanceDefaultTreeCellRenderer {
       URL icon = null;
       String sIcon;
       if (type != null) {
-        sIcon = (String) type.getProperties().get(Const.XML_TYPE_ICON);
+        sIcon = (String) type.getValue(Const.XML_TYPE_ICON);
         try {
           icon = new URL(sIcon);
         } catch (MalformedURLException e) {
@@ -1248,43 +1204,8 @@ class FilesTreeCellRenderer extends SubstanceDefaultTreeCellRenderer {
     } else if (value instanceof DeviceNode) {
       setBorder(BorderFactory.createEmptyBorder(2, 0, 3, 0));
       Device device = ((DeviceNode) value).getDevice();
-      switch ((int) device.getType()) {
-      case 0:
-        if (device.isMounted()) {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_MOUNTED_SMALL));
-        } else {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_DIRECTORY_UNMOUNTED_SMALL));
-        }
-        break;
-      case 1:
-        if (device.isMounted()) {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_CD_MOUNTED_SMALL));
-        } else {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_CD_UNMOUNTED_SMALL));
-        }
-        break;
-      case 2:
-        if (device.isMounted()) {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED_SMALL));
-        } else {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED_SMALL));
-        }
-        break;
-      case 3:
-        if (device.isMounted()) {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_MOUNTED_SMALL));
-        } else {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_EXT_DD_UNMOUNTED_SMALL));
-        }
-        break;
-      case 4:
-        if (device.isMounted()) {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_MOUNTED_SMALL));
-        } else {
-          setIcon(IconLoader.getIcon(JajukIcons.DEVICE_PLAYER_UNMOUNTED_SMALL));
-        }
-        break;
-      }
+      ImageIcon deviceIconSmall = device.getIconRepresentation();
+      setIcon(deviceIconSmall);
     } else if (value instanceof DirectoryNode) {
       setBorder(null);
       Directory dir = ((DirectoryNode) value).getDirectory();
diff --git a/src/main/java/org/jajuk/ui/views/IView.java b/src/main/java/org/jajuk/ui/views/IView.java
index 7a36795..9319d6c 100644
--- a/src/main/java/org/jajuk/ui/views/IView.java
+++ b/src/main/java/org/jajuk/ui/views/IView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.views;
 
@@ -30,7 +30,6 @@ import org.jajuk.ui.perspectives.IPerspective;
  * A view.
  */
 public interface IView extends ComponentListener, Dockable {
-
   /**
    * Returns the view identifier.
    * 
@@ -41,7 +40,7 @@ public interface IView extends ComponentListener, Dockable {
   /**
    * Set view ID.
    * 
-   * @param sID DOCUMENT_ME
+   * @param sID 
    */
   void setID(String sID);
 
@@ -67,9 +66,8 @@ public interface IView extends ComponentListener, Dockable {
   /**
    * Sets the is populated.
    * 
-   * @param isDisplayed DOCUMENT_ME
    */
-  void setIsPopulated(boolean isDisplayed);
+  void setPopulated();
 
   /**
    * Gets the perspective.
@@ -81,7 +79,7 @@ public interface IView extends ComponentListener, Dockable {
   /**
    * Sets the perspective.
    * 
-   * @param perspective DOCUMENT_ME
+   * @param perspective 
    */
   void setPerspective(IPerspective perspective);
 
@@ -89,5 +87,4 @@ public interface IView extends ComponentListener, Dockable {
    * Called when the view perspective is selected.
    */
   void onPerspectiveSelection();
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/LyricsView.java b/src/main/java/org/jajuk/ui/views/LyricsView.java
index 17a2dff..db958e4 100644
--- a/src/main/java/org/jajuk/ui/views/LyricsView.java
+++ b/src/main/java/org/jajuk/ui/views/LyricsView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.Insets;
@@ -73,7 +72,6 @@ import org.jajuk.util.UtilGUI;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.LyricsPersistenceException;
 import org.jajuk.util.log.Log;
-import org.jdesktop.swingx.JXBusyLabel;
 
 /**
  * Lyrics view
@@ -83,57 +81,29 @@ import org.jdesktop.swingx.JXBusyLabel;
  * </p>
  */
 public class LyricsView extends ViewAdapter implements DocumentListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 2229941034734574056L;
-
-  /** DOCUMENT_ME. */
   private JTextArea jtaLyrics;
-
-  /** DOCUMENT_ME. */
   private JScrollPane jspLyrics;
-
-  /** DOCUMENT_ME. */
   private JLabel jlTitle;
-
-  /** DOCUMENT_ME. */
   private String sURL;
-
   /** Currently analyzed file. */
-  private File file;
-
-  /** DOCUMENT_ME. */
+  private volatile File file;
   private String lyrics;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiCopyToClipboard;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiLaunchInBrowser;
-
-  /** DOCUMENT_ME. */
   private JPanel jpMain;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbSave;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbDelete;
-
-  /** DOCUMENT_ME. */
   private JajukToggleButton jtbEdit;
-
   /** Edition toolbar. */
   private JToolBar toolbarEdit;
-
-  /** DOCUMENT_ME. */
   private boolean changeDetected = false;
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   class LyricsUpdateThread extends Thread {
-
     /**
      * Instantiates a new lyrics update thread.
      */
@@ -159,7 +129,6 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
       // Notify to make UI changes
       ObservationManager.notify(new JajukEvent(JajukEvents.LYRICS_DOWNLOADED));
     }
-
   }
 
   /**
@@ -182,14 +151,12 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
     jlTitle = new JLabel();
     jlTitle.setFont(fmgr.getFont(JajukFont.PLAIN_L));
     jspLyrics = new JScrollPane(jtaLyrics);
-
     jtaLyrics.setLineWrap(true);
     jtaLyrics.setWrapStyleWord(true);
     jtaLyrics.setEditable(false);
     jtaLyrics.setMargin(new Insets(10, 10, 10, 10));
     jtaLyrics.setFont(fmgr.getFont(JajukFont.BOLD));
     jtaLyrics.addMouseListener(new JajukMouseAdapter() {
-
       @Override
       public void handlePopup(final MouseEvent e) {
         final JPopupMenu menu = new JPopupMenu();
@@ -205,19 +172,16 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
     // Detect text area content change to enable save button on changes
     jtaLyrics.getDocument().addDocumentListener(this);
     initEditUI();
-
     //Create a toolbar to group edition commands
     toolbarEdit = new JajukJToolbar();
     toolbarEdit.add(jtbEdit);
     toolbarEdit.add(jbSave);
     toolbarEdit.add(jbDelete);
-
     // Menu items
     jmiCopyToClipboard = new JMenuItem(ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD));
     if (UtilSystem.isBrowserSupported()) {
       jmiLaunchInBrowser = new JMenuItem(ActionManager.getAction(JajukActions.LAUNCH_IN_BROWSER));
     }
-
     // Add items
     jpMain = new JPanel(new MigLayout("insets 5,gapx 3, gapy 5,filly", "[95][grow]", "[][grow]"));
     jpMain.add(jtbEdit, "left,split 3");
@@ -225,14 +189,11 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
     jpMain.add(jbDelete, "left");
     jpMain.add(jlTitle, "left,wrap");
     jpMain.add(jspLyrics, "span,grow");
-
     setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
     add(jpMain);
     ObservationManager.register(this);
-
     // force initial buttons states
     updateButtonsState();
-
     // Force initial message refresh
     UtilFeatures.updateStatus(this);
   }
@@ -262,7 +223,6 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
         }
       }
     });
-
     jbSave = new JajukButton(IconLoader.getIcon(JajukIcons.SAVE));
     jbSave.setToolTipText(Messages.getString("LyricsView.4"));
     jbSave.addActionListener(new ActionListener() {
@@ -279,7 +239,6 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
         exitEditLyrics(false);
       }
     });
-
     jbDelete = new JajukButton(IconLoader.getIcon(JajukIcons.DELETE));
     jbDelete.setToolTipText(Messages.getString("LyricsView.5"));
     jbDelete.addActionListener(new ActionListener() {
@@ -363,7 +322,7 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
       if (Conf.getBoolean(CONF_NETWORK_NONE_INTERNET_ACCESS)) {
         resetNoInternet();
       } else {
-        showBuzyLabel();
+        UtilGUI.showBusyLabel(this);
         // Launch lyrics search asynchronously
         new LyricsUpdateThread().start();
       }
@@ -373,7 +332,9 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
     } else if (subject.equals(JajukEvents.WEBRADIO_LAUNCHED)) {
       resetWebradio((WebRadio) event.getDetails().get(Const.DETAIL_CONTENT));
       file = null;
-    } else if (subject.equals(JajukEvents.LYRICS_DOWNLOADED)) {
+    } else if (subject.equals(JajukEvents.LYRICS_DOWNLOADED)
+    // file can be null if the search has been aborted in the mean time
+        && file != null) {
       refreshLyrics();
     }
   }
@@ -400,26 +361,9 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
   }
 
   /**
-   * Show buzy label when searching lyrics.
-   */
-  private void showBuzyLabel() {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        removeAll();
-        final JXBusyLabel busy = new JXBusyLabel();
-        busy.setBusy(true);
-        add(UtilGUI.getCentredPanel(busy, BoxLayout.X_AXIS));
-        revalidate();
-        repaint();
-      }
-    });
-  }
-
-  /**
    * Reset webradio.
    *
-   * @param radio DOCUMENT_ME
+   * @param radio 
    */
   private void resetWebradio(final WebRadio radio) {
     SwingUtilities.invokeLater(new Runnable() {
@@ -429,7 +373,6 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
           jlTitle.setText(radio.getName());
           updateButtonsState();
           jspLyrics.setEnabled(false);
-          jtaLyrics.setText(radio.getName());
           updateButtonsState();
           revalidate();
           repaint();
@@ -446,7 +389,6 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
     // Delete button
     jbDelete.setEnabled(file != null && provider != null
         && !(provider instanceof GenericWebLyricsProvider));
-
     // Save button : enabled only for changes in the text area or
     // if we just got lyrics from the web or form a txt file
     // (so user can try to commit it to the tag)
@@ -463,7 +405,6 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
       public void run() {
         removeAll();
         add(jpMain);
-        jtaLyrics.setToolTipText(sURL);
         if ((lyrics != null) && (lyrics.length() > 0)) {
           jtaLyrics.setText(lyrics);
         } else {
@@ -479,6 +420,7 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
           }
         });
         jlTitle.setText(file.getTrack().getName());
+        jlTitle.setToolTipText(sURL);
         jspLyrics.setEnabled(true);
         updateButtonsState();
         revalidate();
@@ -500,7 +442,6 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
         jtaLyrics.getDocument().removeDocumentListener(LyricsView.this);
         jtaLyrics.setText("");
         jtaLyrics.getDocument().addDocumentListener(LyricsView.this);
-        jtaLyrics.setToolTipText(Messages.getString("JajukWindow.18"));
       }
     });
   }
@@ -541,5 +482,4 @@ public class LyricsView extends ViewAdapter implements DocumentListener {
     changeDetected = true;
     updateButtonsState();
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/ParameterView.java b/src/main/java/org/jajuk/ui/views/ParameterView.java
index 1039eab..80545d8 100644
--- a/src/main/java/org/jajuk/ui/views/ParameterView.java
+++ b/src/main/java/org/jajuk/ui/views/ParameterView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,21 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.Component;
 import java.awt.SystemTray;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
 import java.util.HashSet;
-import java.util.Locale;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -44,7 +39,6 @@ import javax.swing.JComponent;
 import javax.swing.JFormattedTextField;
 import javax.swing.JLabel;
 import javax.swing.JList;
-import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPasswordField;
 import javax.swing.JRadioButton;
@@ -61,27 +55,19 @@ import javax.swing.plaf.basic.BasicComboBoxRenderer;
 
 import net.miginfocom.swing.MigLayout;
 
-import org.apache.commons.lang.StringUtils;
-import org.jajuk.base.AlbumManager;
-import org.jajuk.base.DeviceManager;
-import org.jajuk.base.File;
-import org.jajuk.base.FileManager;
 import org.jajuk.base.SearchResult;
 import org.jajuk.base.SearchResult.SearchResultType;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
-import org.jajuk.services.core.RatingManager;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.services.notification.NotificatorTypes;
-import org.jajuk.services.webradio.WebRadio;
-import org.jajuk.services.webradio.WebRadioManager;
 import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.JajukActions;
 import org.jajuk.ui.helpers.DefaultMouseWheelListener;
 import org.jajuk.ui.helpers.PatternInputVerifier;
-import org.jajuk.ui.thumbnails.ThumbnailManager;
 import org.jajuk.ui.widgets.InformationJPanel;
+import org.jajuk.ui.widgets.InformationJPanel.MessageType;
 import org.jajuk.ui.widgets.JajukButton;
 import org.jajuk.ui.widgets.PathSelector;
 import org.jajuk.ui.widgets.SearchBox;
@@ -89,352 +75,146 @@ import org.jajuk.ui.widgets.SteppedComboBox;
 import org.jajuk.ui.widgets.ToggleLink;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
-import org.jajuk.util.DownloadManager;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.LocaleManager;
 import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
-import org.jajuk.util.UtilString;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
 import org.jdesktop.swingx.HorizontalLayout;
 import org.jdesktop.swingx.JXCollapsiblePane;
 import org.jdesktop.swingx.VerticalLayout;
-import org.jvnet.substance.SubstanceLookAndFeel;
-import org.jvnet.substance.skin.SkinInfo;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
+import org.pushingpixels.substance.api.skin.SkinInfo;
 
 /**
  * View used to set Jajuk parameters.
  * <p>
  * Configuration perspective *
  */
-public class ParameterView extends ViewAdapter implements ActionListener, ItemListener,
-    ChangeListener {
-
+public class ParameterView extends ViewAdapter {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant NOTIFICATOR_PREFIX. DOCUMENT_ME */
-  private static final String NOTIFICATOR_PREFIX = "Notificator.";
-
-  /** DOCUMENT_ME. */
-  private JTabbedPane jtpMain;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfHistory;
-
-  /** DOCUMENT_ME. */
-  private JButton jbClearHistory;
-
-  /** DOCUMENT_ME. */
-  private JButton jbResetRatings;
-
-  /** DOCUMENT_ME. */
-  private JButton jbResetPreferences;
-
-  /** DOCUMENT_ME. */
-  private ButtonGroup bgStart;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jrbNothing;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jrbLast;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jrbLastKeepPos;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jrbShuffle;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jrbBestof;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jrbNovelties;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jrbFile;
-
-  /** DOCUMENT_ME. */
-  private SearchBox sbSearch;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpConfirmations;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBeforeDelete;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBeforeExit;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBeforeRemoveDevice;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBeforeDeleteCover;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBeforeClearingHistory;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBeforeResetingRatings;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBeforeRefactorFiles;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpOptions;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbDisplayUnmounted;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbAudioScrobbler;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlASUser;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfASUser;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlASPassword;
-
-  /** DOCUMENT_ME. */
-  private JPasswordField jpfASPassword;
-
-  /** DOCUMENT_ME. */
-  private SteppedComboBox scbLanguage;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfFrameTitle;
-
+  /** GUI updater. */
+  private ParameterViewGUIHelper updateHelper = new ParameterViewGUIHelper(this);
+  /** The Constant NOTIFICATOR_PREFIX.  */
+  static final String NOTIFICATOR_PREFIX = "Notificator.";
+  JTabbedPane jtpMain;
+  JTextField jtfHistory;
+  JCheckBox jcbManualRatings;
+  JButton jbClearHistory;
+  JButton jbResetRatings;
+  /** Allows to export ratings to a file */
+  JButton jbExportRatings;
+  /** Allows to import ratings from a file */
+  JButton jbImportRatings;
+  JButton jbResetPreferences;
+  ButtonGroup bgStart;
+  JRadioButton jrbNothing;
+  JRadioButton jrbLast;
+  JRadioButton jrbLastKeepPos;
+  JRadioButton jrbShuffle;
+  JRadioButton jrbBestof;
+  JRadioButton jrbNovelties;
+  JRadioButton jrbFile;
+  SearchBox sbSearch;
+  JCheckBox jcbBeforeDelete;
+  JCheckBox jcbBeforeExit;
+  JCheckBox jcbBeforeRemoveDevice;
+  JCheckBox jcbBeforeDeleteCover;
+  JCheckBox jcbBeforeClearingHistory;
+  JCheckBox jcbBeforeResetingRatings;
+  JCheckBox jcbBeforeRefactorFiles;
+  JCheckBox jcbBeforeWritingTag;
+  JCheckBox jcbDisplayUnmounted;
+  JCheckBox jcbAudioScrobbler;
+  JButton jbResetDontShowAgain;
+  JLabel jlASUser;
+  JTextField jtfASUser;
+  JLabel jlASPassword;
+  JPasswordField jpfASPassword;
+  SteppedComboBox scbLanguage;
+  JTextField jtfFrameTitle;
   /** Balloon notifier pattern text field. */
-  private JTextField jtfBalloonNotifierPattern;
-
+  JTextField jtfBalloonNotifierPattern;
   /** Information pattern textfield. */
-  private JTextField jtfInformationPattern;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlLAF;
-
-  /** DOCUMENT_ME. */
-  private SteppedComboBox scbLAF;
-
-  /** DOCUMENT_ME. */
-  private SteppedComboBox scbLogLevel;
-
-  /** DOCUMENT_ME. */
-  private JSlider introPosition;
-
-  /** DOCUMENT_ME. */
-  private JSlider introLength;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfBestofSize;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfNoveltiesAge;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfVisiblePlanned;
-
-  /** DOCUMENT_ME. */
-  private JSlider crossFadeDuration;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbDefaultActionClick;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbDefaultActionDrop;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlNotificationType;
-
-  /** DOCUMENT_ME. */
-  private JComboBox jcbNotificationType;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbHotkeys;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpTags;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbUseParentDir;
-
-  /** DOCUMENT_ME. */
-  private JFormattedTextField jtfRefactorPattern;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfAnimationPattern;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpAdvanced;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbBackup;
-
-  /** DOCUMENT_ME. */
-  private JSlider backupSize;
-
-  /** DOCUMENT_ME. */
-  private JComboBox jcbCollectionEncoding;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbRegexp;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpNetwork;
-
-  /** DOCUMENT_ME. */
-  private ButtonGroup bgProxy;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbNoneInternetAccess;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jcbProxyNone;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jcbProxyHttp;
-
-  /** DOCUMENT_ME. */
-  private JRadioButton jcbProxySocks;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlProxyHostname;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfProxyHostname;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlProxyPort;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfProxyPort;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlProxyLogin;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfProxyLogin;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlProxyPwd;
-
-  /** DOCUMENT_ME. */
-  private JPasswordField jtfProxyPwd;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlConnectionTO;
-
-  /** DOCUMENT_ME. */
-  private JSlider connectionTO;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpCovers;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbAutoCover;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbShuffleCover;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlCoverSize;
-
-  /** DOCUMENT_ME. */
-  private JComboBox jcbCoverSize;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfMPlayerArgs;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfEnvVariables;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfMPlayerPath;
-
-  /** DOCUMENT_ME. */
-  private PathSelector psJajukWorkspace;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlCatalogPages;
-
-  /** DOCUMENT_ME. */
-  private JSlider jsCatalogPages;
-
-  /** DOCUMENT_ME. */
-  private JButton jbCatalogRefresh;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbShowPopups;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbShowSystray;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbMinimizeToTray;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpUI;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlFonts;
-
-  /** DOCUMENT_ME. */
-  private JSlider jsFonts;
-
-  /** DOCUMENT_ME. */
-  private JPanel jpLastFM;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbEnableLastFMInformation;
-
-  /** DOCUMENT_ME. */
-  private JButton jbOK;
-
-  /** DOCUMENT_ME. */
-  private JButton jbDefault;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbCheckUpdates;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbForceFileDate;
-
-  /** DOCUMENT_ME. */
-  private JSlider jsPerspectiveSize;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbUseVolnorm;
-
-  /** DOCUMENT_ME. */
-  private boolean someOptionsAppliedAtNextStartup = false;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfExplorerPath;
-
+  JTextField jtfInformationPattern;
+  JLabel jlLAF;
+  SteppedComboBox scbLAF;
+  SteppedComboBox scbLogLevel;
+  JSlider introPosition;
+  JSlider introLength;
+  JTextField jtfBestofSize;
+  JTextField jtfNoveltiesAge;
+  JSlider crossFadeDuration;
+  JCheckBox jcbDefaultActionClick;
+  JCheckBox jcbDefaultActionDrop;
+  JLabel jlNotificationType;
+  JComboBox jcbNotificationType;
+  JCheckBox jcbHotkeys;
+  JCheckBox jcbShowVideos;
+  JCheckBox jcbPreserveFileDates;
+  JCheckBox jcbUseParentDir;
+  JFormattedTextField jtfRefactorPattern;
+  JTextField jtfAnimationPattern;
+  JCheckBox jcbBackup;
+  JSlider backupSize;
+  JCheckBox jcbRegexp;
+  ButtonGroup bgProxy;
+  JCheckBox jcbNoneInternetAccess;
+  JRadioButton jcbProxyNone;
+  JRadioButton jcbProxyHttp;
+  JRadioButton jcbProxySocks;
+  JLabel jlProxyHostname;
+  JTextField jtfProxyHostname;
+  JLabel jlProxyPort;
+  JTextField jtfProxyPort;
+  JLabel jlProxyLogin;
+  JTextField jtfProxyLogin;
+  JLabel jlProxyPwd;
+  JPasswordField jtfProxyPwd;
+  JLabel jlConnectionTO;
+  JSlider connectionTO;
+  JCheckBox jcbAutoCover;
+  JCheckBox jcbShuffleCover;
+  JLabel jlCoverSize;
+  JComboBox jcbCoverSize;
+  JTextField jtfMPlayerArgs;
+  JTextField jtfEnvVariables;
+  JTextField jtfMPlayerPath;
+  PathSelector psJajukWorkspace;
+  JLabel jlCatalogPages;
+  JSlider jsCatalogPages;
+  JButton jbCatalogRefresh;
+  JCheckBox jcbShowPopups;
+  JCheckBox jcbShowSystray;
+  JCheckBox jcbMinimizeToTray;
+  JCheckBox jcbClickTrayAlwaysDisplayWindow;
+  JLabel jlFonts;
+  JSlider jsFonts;
+  JCheckBox jcbEnableLastFMInformation;
+  JButton jbOK;
+  JButton jbDefault;
+  JCheckBox jcbCheckUpdates;
+  JCheckBox jcbForceFileDate;
+  JSlider jsPerspectiveSize;
+  /** VolNorm checkbox. */
+  JCheckBox jcbUseVolnorm;
+  /** Bit-perfect checkbox. */
+  JCheckBox jcbEnableBitPerfect;
+  JTextField jtfExplorerPath;
   /** Whether the "theme will be token into account" message has been already displayed. */
   boolean bLAFMessage = false;
-
-  /** DOCUMENT_ME. */
-  private JLabel jlDefaultCoverSearchPattern;
-
-  /** DOCUMENT_ME. */
-  private JTextField jtfDefaultCoverSearchPattern;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbSaveExplorerFriendly;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbDropPlayedTracksFromQueue;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcb3dCover;
+  JLabel jlDefaultCoverSearchPattern;
+  JTextField jtfDefaultCoverSearchPattern;
+  JCheckBox jcbSaveExplorerFriendly;
+  JCheckBox jcb3dCover;
+  JCheckBox jcb3dCoverFS;
+  /** Enable Title view animation effect. */
+  JCheckBox jcbTitleAnimation;
+  /** Splashscreen flag. */
+  JCheckBox jcbSplashscreen;
+  JButton jbReloadRadiosPreset;
 
   /**
    * View providing main jajuk configuration GUI. Known in the doc as
@@ -446,462 +226,34 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
 
   /*
    * (non-Javadoc)
-   * 
-   * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-   */
-  public void actionPerformed(final ActionEvent e) {
-
-    if (e.getSource() == jbClearHistory) {
-      // show confirmation message if required
-      if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY)) {
-        final int iResu = Messages.getChoice(Messages.getString("Confirmation_clear_history"),
-            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
-        if (iResu != JOptionPane.YES_OPTION) {
-          return;
-        }
-      }
-      ObservationManager.notify(new JajukEvent(JajukEvents.CLEAR_HISTORY));
-    } else if (e.getSource() == scbLAF) {
-      // Refresh full GUI at each LAF change as a preview
-      UtilGUI.setupSubstanceLookAndFeel((String) scbLAF.getSelectedItem());
-      UtilGUI.updateAllUIs();
-    } else if (e.getSource() == jbResetRatings) {
-      // show confirmation message if required
-      if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS)) {
-        final int iResu = Messages.getChoice(Messages.getString("Confirmation_reset_ratings"),
-            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
-        if (iResu != JOptionPane.YES_OPTION) {
-          return;
-        }
-      }
-      ObservationManager.notify(new JajukEvent(JajukEvents.RATE_RESET));
-    } else if (e.getSource() == jbResetPreferences) {
-      // show confirmation message if required
-      if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS)) {
-        final int iResu = Messages.getChoice(Messages.getString("Confirmation_reset_preferences"),
-            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
-        if (iResu != JOptionPane.YES_OPTION) {
-          return;
-        }
-      }
-      if (!DeviceManager.getInstance().isAnyDeviceRefreshing()) {
-        ObservationManager.notify(new JajukEvent(JajukEvents.PREFERENCES_RESET));
-      } else {
-        Messages.showErrorMessage(120);
-      }
-    } else if (e.getSource() == jbOK) {
-      applyParameters();
-      // Notify any client than wait for parameters updates
-      final Properties details = new Properties();
-      details.put(Const.DETAIL_ORIGIN, this);
-      if (someOptionsAppliedAtNextStartup) {
-        // Inform user that some parameters will apply only at
-        // next startup
-        Messages.showInfoMessage(Messages.getString("ParameterView.198"));
-        someOptionsAppliedAtNextStartup = false;
-      }
-    } else if (e.getSource() == jbDefault) {
-      int resu = Messages.getChoice(Messages.getString("Confirmation_defaults"),
-          JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
-      if (resu == JOptionPane.OK_OPTION) {
-        Conf.setDefaultProperties();
-        updateSelection();// update UI
-        InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.110"),
-            InformationJPanel.MessageType.INFORMATIVE);
-        applyParameters();
-        Messages.showInfoMessage(Messages.getString("ParameterView.198"));
-      }
-    } else if (e.getSource() == jcbBackup) {
-      // if backup option is unchecked, reset backup size
-      if (jcbBackup.isSelected()) {
-        backupSize.setEnabled(true);
-        backupSize.setValue(Conf.getInt(Const.CONF_BACKUP_SIZE));
-      } else {
-        backupSize.setEnabled(false);
-        backupSize.setValue(0);
-      }
-    } else if ((e.getSource() == jcbProxyNone) || (e.getSource() == jcbProxyHttp)
-        || (e.getSource() == jcbProxySocks)) {
-      final boolean bUseProxy = !jcbProxyNone.isSelected();
-      jtfProxyHostname.setEnabled(bUseProxy);
-      jtfProxyPort.setEnabled(bUseProxy);
-      jtfProxyLogin.setEnabled(bUseProxy);
-      jtfProxyPwd.setEnabled(bUseProxy);
-      jlProxyHostname.setEnabled(bUseProxy);
-      jlProxyPort.setEnabled(bUseProxy);
-      jlProxyLogin.setEnabled(bUseProxy);
-      jlProxyPwd.setEnabled(bUseProxy);
-    } else if (e.getSource() == jcbAutoCover) {
-      if (jcbAutoCover.isSelected()) {
-        jcbCoverSize.setEnabled(true);
-        jlCoverSize.setEnabled(true);
-      } else {
-        jlCoverSize.setEnabled(false);
-        jcbCoverSize.setEnabled(false);
-      }
-    } else if (e.getSource() == jcbAudioScrobbler) {
-      if (jcbAudioScrobbler.isSelected()) {
-        jlASUser.setEnabled(true);
-        jtfASUser.setEnabled(true);
-        jlASPassword.setEnabled(true);
-        jpfASPassword.setEnabled(true);
-      } else {
-        jlASUser.setEnabled(false);
-        jtfASUser.setEnabled(false);
-        jlASPassword.setEnabled(false);
-        jpfASPassword.setEnabled(false);
-      }
-    } else if (e.getSource() == scbLanguage) {
-      Locale locale = LocaleManager.getLocaleForDesc(((JLabel) scbLanguage.getSelectedItem())
-          .getText());
-      final String sLocal = locale.getLanguage();
-      final String sPreviousLocal = LocaleManager.getLocale().getLanguage();
-      if (!sPreviousLocal.equals(sLocal)) {
-        // local has changed
-        someOptionsAppliedAtNextStartup = true;
-      }
-    } else if (e.getSource() == jcbHotkeys) {
-      someOptionsAppliedAtNextStartup = true;
-    } else if (e.getSource() == jbCatalogRefresh) {
-      new Thread("Parameter Catalog refresh Thread") {
-        @Override
-        public void run() {
-          UtilGUI.waiting();
-          // Force albums to search for new covers
-          AlbumManager.getInstance().resetCoverCache();
-          // Clean thumbs
-          ThumbnailManager.cleanThumbs(THUMBNAIL_SIZE_50X50);
-          ThumbnailManager.cleanThumbs(THUMBNAIL_SIZE_100X100);
-          ThumbnailManager.cleanThumbs(THUMBNAIL_SIZE_150X150);
-          ThumbnailManager.cleanThumbs(THUMBNAIL_SIZE_200X200);
-          ThumbnailManager.cleanThumbs(THUMBNAIL_SIZE_250X250);
-          ThumbnailManager.cleanThumbs(THUMBNAIL_SIZE_300X300);
-          UtilGUI.stopWaiting();
-          // For catalog view's update
-          ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
-          // Display a message
-          Messages.showInfoMessage(Messages.getString("Success"));
-
-        }
-      }.start();
-    }
-  }
-
-  /**
-   * Apply parameters.
-   */
-  private void applyParameters() {
-    // **Read all parameters**
-    // Options
-    Conf.setProperty(Const.CONF_OPTIONS_HIDE_UNMOUNTED,
-        Boolean.toString(jcbDisplayUnmounted.isSelected()));
-    Conf.setProperty(Const.CONF_OPTIONS_PUSH_ON_CLICK,
-        Boolean.toString(jcbDefaultActionClick.isSelected()));
-    Conf.setProperty(Const.CONF_OPTIONS_PUSH_ON_DROP,
-        Boolean.toString(jcbDefaultActionDrop.isSelected()));
-    Conf.setProperty(Const.CONF_OPTIONS_HOTKEYS, Boolean.toString(jcbHotkeys.isSelected()));
-    Conf.setProperty(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE,
-        Boolean.toString(jcbAudioScrobbler.isSelected()));
-    Conf.setProperty(Const.CONF_LASTFM_INFO,
-        Boolean.toString(jcbEnableLastFMInformation.isSelected()));
-    Conf.setProperty(Const.CONF_LASTFM_USER, jtfASUser.getText());
-    Conf.setProperty(Const.CONF_LASTFM_PASSWORD,
-        UtilString.rot13(new String(jpfASPassword.getPassword())));
-    final int iLogLevel = scbLogLevel.getSelectedIndex();
-    Log.setVerbosity(iLogLevel);
-    Conf.setProperty(Const.CONF_OPTIONS_LOG_LEVEL, Integer.toString(iLogLevel));
-    Conf.setProperty(Const.CONF_OPTIONS_INTRO_BEGIN, Integer.toString(introPosition.getValue()));
-    Conf.setProperty(Const.CONF_OPTIONS_INTRO_LENGTH, Integer.toString(introLength.getValue()));
-    Conf.setProperty(Const.CONF_TAGS_USE_PARENT_DIR, Boolean.toString(jcbUseParentDir.isSelected()));
-    Conf.setProperty(Const.CONF_DROP_PLAYED_TRACKS_FROM_QUEUE,
-        Boolean.toString(jcbDropPlayedTracksFromQueue.isSelected()));
-    final String sBestofSize = jtfBestofSize.getText();
-    if (!sBestofSize.isEmpty()) {
-      Conf.setProperty(Const.CONF_BESTOF_TRACKS_SIZE, sBestofSize);
-    }
-    Locale locale = LocaleManager.getLocaleForDesc(((JLabel) scbLanguage.getSelectedItem())
-        .getText());
-    final String sLocal = locale.getLanguage();
-    Conf.setProperty(Const.CONF_OPTIONS_LANGUAGE, sLocal);
-    // force refresh of bestof files
-    RatingManager.setRateHasChanged(true);
-    final String sNoveltiesAge = jtfNoveltiesAge.getText();
-    if (!sNoveltiesAge.isEmpty()) {
-      Conf.setProperty(Const.CONF_OPTIONS_NOVELTIES_AGE, sNoveltiesAge);
-    }
-    final String sVisiblePlanned = jtfVisiblePlanned.getText();
-    if (!sVisiblePlanned.isEmpty()) {
-      Conf.setProperty(Const.CONF_OPTIONS_VISIBLE_PLANNED, sVisiblePlanned);
-    }
-    final int oldDuration = Conf.getInt(Const.CONF_FADE_DURATION);
-    // Show an hideable message if user set cross fade under linux for sound
-    // server information
-    if (UtilSystem.isUnderLinux() && (oldDuration == 0)
-        && (oldDuration != crossFadeDuration.getValue())) {
-      Messages.showHideableWarningMessage(Messages.getString("ParameterView.210"),
-          Const.CONF_NOT_SHOW_AGAIN_CROSS_FADE);
-    }
-    Conf.setProperty(Const.CONF_FADE_DURATION, Integer.toString(crossFadeDuration.getValue()));
-    // Startup
-    if (jrbNothing.isSelected()) {
-      Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOTHING);
-    } else if (jrbLast.isSelected()) {
-      Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST);
-    } else if (jrbLastKeepPos.isSelected()) {
-      Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
-    } else if (jrbShuffle.isSelected()) {
-      Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_SHUFFLE);
-    } else if (jrbFile.isSelected()) {
-      Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_ITEM);
-    } else if (jrbBestof.isSelected()) {
-      Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_BESTOF);
-    } else if (jrbNovelties.isSelected()) {
-      Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOVELTIES);
-    }
-    // Confirmations
-    Conf.setProperty(Const.CONF_CONFIRMATIONS_DELETE_FILE,
-        Boolean.toString(jcbBeforeDelete.isSelected()));
-    Conf.setProperty(Const.CONF_CONFIRMATIONS_EXIT, Boolean.toString(jcbBeforeExit.isSelected()));
-    Conf.setProperty(Const.CONF_CONFIRMATIONS_REMOVE_DEVICE,
-        Boolean.toString(jcbBeforeRemoveDevice.isSelected()));
-    Conf.setProperty(Const.CONF_CONFIRMATIONS_DELETE_COVER,
-        Boolean.toString(jcbBeforeDeleteCover.isSelected()));
-    Conf.setProperty(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY,
-        Boolean.toString(jcbBeforeClearingHistory.isSelected()));
-    Conf.setProperty(Const.CONF_CONFIRMATIONS_RESET_RATINGS,
-        Boolean.toString(jcbBeforeResetingRatings.isSelected()));
-    // History
-    final String sHistoryDuration = jtfHistory.getText();
-    if (!sHistoryDuration.isEmpty()) {
-      Conf.setProperty(Const.CONF_HISTORY, sHistoryDuration);
-    }
-    // Patterns
-    Conf.setProperty(Const.CONF_PATTERN_REFACTOR, jtfRefactorPattern.getText());
-    Conf.setProperty(Const.CONF_PATTERN_ANIMATION, jtfAnimationPattern.getText());
-    Conf.setProperty(Const.CONF_PATTERN_FRAME_TITLE, jtfFrameTitle.getText());
-    Conf.setProperty(Const.CONF_PATTERN_BALLOON_NOTIFIER, jtfBalloonNotifierPattern.getText());
-    Conf.setProperty(Const.CONF_PATTERN_INFORMATION, jtfInformationPattern.getText());
-
-    // Advanced
-    Conf.setProperty(Const.CONF_BACKUP_SIZE, Integer.toString(backupSize.getValue()));
-    Conf.setProperty(Const.CONF_COLLECTION_CHARSET, jcbCollectionEncoding.getSelectedItem()
-        .toString());
-    Conf.setProperty(Const.CONF_REGEXP, Boolean.toString(jcbRegexp.isSelected()));
-    Conf.setProperty(Const.CONF_USE_VOLNORM, Boolean.toString(jcbUseVolnorm.isSelected()));
-    Conf.setProperty(Const.CONF_CHECK_FOR_UPDATE, Boolean.toString(jcbCheckUpdates.isSelected()));
-    Conf.setProperty(Const.CONF_FORCE_FILE_DATE, Boolean.toString(jcbForceFileDate.isSelected()));
-    // Apply new mplayer path and display a warning message if changed
-    final String oldMplayerPath = Conf.getString(Const.CONF_MPLAYER_PATH_FORCED);
-    if (!(oldMplayerPath.equals(jtfMPlayerPath.getText()))) {
-      this.someOptionsAppliedAtNextStartup = true;
-    }
-    Conf.setProperty(Const.CONF_MPLAYER_PATH_FORCED, jtfMPlayerPath.getText());
-    Conf.setProperty(Const.CONF_MPLAYER_ARGS, jtfMPlayerArgs.getText());
-    Conf.setProperty(Const.CONF_ENV_VARIABLES, jtfEnvVariables.getText());
-    Conf.setProperty(Const.CONF_EXPLORER_PATH, jtfExplorerPath.getText());
-
-    // GUI
-    Conf.setProperty(Const.CONF_CATALOG_PAGE_SIZE, Integer.toString(jsCatalogPages.getValue()));
-    Conf.setProperty(Const.CONF_SHOW_POPUPS, Boolean.toString(jcbShowPopups.isSelected()));
-    final int oldFont = Conf.getInt(Const.CONF_FONTS_SIZE);
-    // Display a message if font size changed
-    if (oldFont != jsFonts.getValue()) {
-      someOptionsAppliedAtNextStartup = true;
-    }
-    Conf.setProperty(Const.CONF_FONTS_SIZE, Integer.toString(jsFonts.getValue()));
-    // Notificator type
-    String notificatorTypeDisplayed = (String) jcbNotificationType.getSelectedItem();
-    for (NotificatorTypes notificatorType : NotificatorTypes.values()) {
-      if (Messages.getString(NOTIFICATOR_PREFIX + notificatorType).equals(notificatorTypeDisplayed)) {
-        Conf.setProperty(Const.CONF_UI_NOTIFICATOR_TYPE, notificatorType.name());
-      }
-    }
-
-    // Message if show systray is changed
-    final boolean bOldShowSystray = Conf.getBoolean(Const.CONF_SHOW_SYSTRAY);
-    if (bOldShowSystray != jcbShowSystray.isSelected()) {
-      someOptionsAppliedAtNextStartup = true;
-    }
-    Conf.setProperty(Const.CONF_SHOW_SYSTRAY, Boolean.toString(jcbShowSystray.isSelected()));
-
-    // Minimize to tray
-    Conf.setProperty(Const.CONF_MINIMIZE_TO_TRAY, Boolean.toString(jcbMinimizeToTray.isSelected()));
-
-    final int oldPerspectiveSize = Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE);
-    // If we perspective size changed and no font message have been already
-    // displayed, display a message
-    if (oldPerspectiveSize != jsPerspectiveSize.getValue()) {
-      someOptionsAppliedAtNextStartup = true;
-    }
-    Conf.setProperty(Const.CONF_PERSPECTIVE_ICONS_SIZE,
-        Integer.toString(jsPerspectiveSize.getValue()));
-    // LAF change
-    final String oldTheme = Conf.getString(Const.CONF_OPTIONS_LNF);
-    Conf.setProperty(Const.CONF_OPTIONS_LNF, (String) scbLAF.getSelectedItem());
-    if (!oldTheme.equals(scbLAF.getSelectedItem())) {
-      // theme will be applied at next startup
-      Messages.showHideableWarningMessage(Messages.getString("ParameterView.233"),
-          Const.CONF_NOT_SHOW_AGAIN_LAF_CHANGE);
-      bLAFMessage = true;
-    }
-    // If jajuk home changes, write new path in bootstrap file
-    if ((SessionService.getWorkspace() != null)
-        && !SessionService.getWorkspace().equals(psJajukWorkspace.getUrl())) {
-      // Check workspace directory
-      if (!psJajukWorkspace.getUrl().trim().isEmpty()) {
-        // Check workspace presence and create it if required
-        final java.io.File fWorkspace = new java.io.File(psJajukWorkspace.getUrl());
-        if (!fWorkspace.exists() && !fWorkspace.mkdirs()) {
-          Log.warn("Could not create directory " + fWorkspace.toString());
-        }
-        if (!fWorkspace.canRead()) {
-          Messages.showErrorMessage(165);
-          return;
-        }
-      }
-      try {
-        final String newWorkspace = psJajukWorkspace.getUrl();
-        // If target workspace doesn't exist, copy current repository to
-        // the new workspace
-        // (keep old repository for security and for use
-        // by others users in multi-session mode)
-        boolean bPreviousPathExist = true;
-        // bPreviousPathExist is true if destination workspace already
-        // exists,
-        // it is then only a workspace switch
-        if (!new java.io.File(psJajukWorkspace.getUrl() + '/'
-            + (SessionService.isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk"))
-            .exists()) {
-          UtilGUI.waiting();
-          final java.io.File from = SessionService.getConfFileByPath("");
-          final java.io.File dest = new java.io.File(newWorkspace + '/'
-              + (SessionService.isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk"));
-          // Remove the session file to avoid getting a message when
-          // switching to new workspace
-          java.io.File session = SessionService.getSessionIdFile();
-          session.delete();
-
-          UtilSystem.copyRecursively(from, dest);
-          bPreviousPathExist = false;
-        }
-        // Change the workspace so the very last conf (like current
-        // track)
-        // will be saved directly to target workspace. We don't do
-        // this if the workspace already exist to avoid overwriting other
-        // configuration.
-        SessionService.setWorkspace(psJajukWorkspace.getUrl());
-        //Commit the bootstrap file
-        SessionService.commitBootstrapFile();
-
-        UtilGUI.stopWaiting();
-        // Display a warning message and restart Jajuk
-        if (bPreviousPathExist) {
-          Messages.getChoice(Messages.getString("ParameterView.247"), JOptionPane.DEFAULT_OPTION,
-              JOptionPane.INFORMATION_MESSAGE);
-        } else {
-          Messages.getChoice(Messages.getString("ParameterView.209"), JOptionPane.DEFAULT_OPTION,
-              JOptionPane.INFORMATION_MESSAGE);
-        }
-        // Exit Jajuk
-        try {
-          ActionManager.getAction(JajukActions.EXIT).perform(null);
-        } catch (Exception e1) {
-          Log.error(e1);
-        }
-
-      } catch (final Exception e) {
-        Messages.showErrorMessage(24);
-        Log.error(e);
-      }
-    }
-
-    // Network
-    Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS,
-        Boolean.toString(jcbNoneInternetAccess.isSelected()));
-    Conf.setProperty(Const.CONF_NETWORK_USE_PROXY, Boolean.toString(!jcbProxyNone.isSelected()));
-    if (jcbProxyHttp.isSelected()) {
-      Conf.setProperty(Const.CONF_NETWORK_PROXY_TYPE, Const.PROXY_TYPE_HTTP);
-    } else if (jcbProxySocks.isSelected()) {
-      Conf.setProperty(Const.CONF_NETWORK_PROXY_TYPE, Const.PROXY_TYPE_SOCKS);
-    }
-    Conf.setProperty(Const.CONF_NETWORK_PROXY_HOSTNAME, jtfProxyHostname.getText());
-    Conf.setProperty(Const.CONF_NETWORK_PROXY_PORT, jtfProxyPort.getText());
-    Conf.setProperty(Const.CONF_NETWORK_PROXY_LOGIN, jtfProxyLogin.getText());
-    Conf.setProperty(Const.CONF_NETWORK_PROXY_PWD,
-        UtilString.rot13(new String(jtfProxyPwd.getPassword())));
-    Conf.setProperty(Const.CONF_NETWORK_CONNECTION_TO, Integer.toString(connectionTO.getValue()));
-    // Force global reload of proxy variables
-    DownloadManager.setDefaultProxySettings();
-    // Covers
-    Conf.setProperty(Const.CONF_COVERS_MIRROW_COVER, Boolean.toString(jcb3dCover.isSelected()));
-    ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
-    Conf.setProperty(Const.CONF_COVERS_AUTO_COVER, Boolean.toString(jcbAutoCover.isSelected()));
-    Conf.setProperty(Const.CONF_COVERS_SHUFFLE, Boolean.toString(jcbShuffleCover.isSelected()));
-    Conf.setProperty(Const.CONF_COVERS_SAVE_EXPLORER_FRIENDLY,
-        Boolean.toString(jcbSaveExplorerFriendly.isSelected()));
-    Conf.setProperty(Const.CONF_COVERS_SIZE, Integer.toString(jcbCoverSize.getSelectedIndex()));
-    Conf.setProperty(Const.FILE_DEFAULT_COVER, jtfDefaultCoverSearchPattern.getText());
-
-    // configuration
-    try {
-      Conf.commit();
-    } catch (final Exception e) {
-      Log.error(113, e);
-      Messages.showErrorMessage(113);
-    }
-    // Force a full refresh (useful for catalog view for instance)
-    ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
-    // display a message
-    InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.109"),
-        InformationJPanel.MessageType.INFORMATIVE);
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.IView#getDesc()
    */
+  @Override
   public String getDesc() {
     return Messages.getString("ParameterView.87");
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.events.Observer#getRegistrationKeys()
    */
+  @Override
   public Set<JajukEvents> getRegistrationKeys() {
     final Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
     eventSubjectSet.add(JajukEvents.PARAMETERS_CHANGE);
     return eventSubjectSet;
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.IView#display()
+  /**
+   * Inits the ui history.
+   *
+   *
+   * @return the j panel
    */
-  public void initUI() {
-    // Use this common action listener for UI options that need to launch
-    // event
-    final ActionListener alUI = new ActionListener() {
-
-      public void actionPerformed(ActionEvent e) {
-        // Store configuration
-        Conf.setProperty(Const.CONF_SHOW_POPUPS, Boolean.toString(jcbShowPopups.isSelected()));
-        Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS,
-            Boolean.toString(jcbNoneInternetAccess.isSelected()));
-        // Launch an event that can be trapped by the tray to
-        // synchronize the state
-        Properties details = new Properties();
-        details.put(Const.DETAIL_ORIGIN, ParameterView.this);
-        ObservationManager.notify(new JajukEvent(JajukEvents.PARAMETERS_CHANGE, details));
-      }
-
-    };
-
-    // --History
-    JPanel jpHistory = new JPanel(new MigLayout("insets 10, gapy 15"));
+  private JPanel initUIHistory() {
+    JPanel jpHistory = new JPanel(new MigLayout("insets 10, gapy 15", "[fill][fill]"));
     jtfHistory = new JTextField();
     jtfHistory.setInputVerifier(new InputVerifier() {
       @Override
@@ -928,53 +280,65 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
       }
     });
     jtfHistory.setToolTipText(Messages.getString("ParameterView.2"));
+    jcbManualRatings = new JCheckBox(Messages.getString("ParameterView.307"));
+    jcbManualRatings.setToolTipText(Messages.getString("ParameterView.308"));
     jbClearHistory = new JButton(Messages.getString("ParameterView.3"),
         IconLoader.getIcon(JajukIcons.CLEAR));
     jbClearHistory.setToolTipText(Messages.getString("ParameterView.4"));
-    jbClearHistory.addActionListener(this);
-
+    jbClearHistory.addActionListener(updateHelper);
     jbResetRatings = new JButton(Messages.getString("ParameterView.186"),
         IconLoader.getIcon(JajukIcons.CLEAR));
     jbResetRatings.setToolTipText(Messages.getString("ParameterView.187"));
-    jbResetRatings.addActionListener(this);
-
+    jbResetRatings.addActionListener(updateHelper);
     jbResetPreferences = new JButton(Messages.getString("ParameterView.249"),
         IconLoader.getIcon(JajukIcons.CLEAR));
     jbResetPreferences.setToolTipText(Messages.getString("ParameterView.250"));
-    jbResetPreferences.addActionListener(this);
-
+    jbResetPreferences.addActionListener(updateHelper);
+    jbExportRatings = new JButton(ActionManager.getAction(JajukActions.EXPORT_RATINGS));
+    jbImportRatings = new JButton(ActionManager.getAction(JajukActions.IMPORT_RATINGS));
     JLabel jlHistory = new JLabel(Messages.getString("ParameterView.0"));
     jlHistory.setToolTipText(Messages.getString("ParameterView.2"));
     jpHistory.add(jlHistory);
-    jpHistory.add(jtfHistory, "wrap,grow");
+    jpHistory.add(jtfHistory);
     jpHistory.add(jbClearHistory, "wrap");
+    jpHistory.add(jcbManualRatings, "wrap");
     jpHistory.add(jbResetRatings);
-    jpHistory.add(jbResetPreferences);
+    jpHistory.add(jbResetPreferences, "wrap");
+    jpHistory.add(jbExportRatings);
+    jpHistory.add(jbImportRatings);
+    return jpHistory;
+  }
 
-    // --Startup
+  /**
+   * Inits the ui startup.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUIStartup() {
     JPanel jpStart = new JPanel(new MigLayout("insets 10,gapy 15", "[][grow][]"));
     bgStart = new ButtonGroup();
     jrbNothing = new JRadioButton(Messages.getString("ParameterView.10"));
     jrbNothing.setToolTipText(Messages.getString("ParameterView.11"));
-    jrbNothing.addItemListener(this);
+    jrbNothing.addItemListener(updateHelper);
     jrbLast = new JRadioButton(Messages.getString("ParameterView.12"));
     jrbLast.setToolTipText(Messages.getString("ParameterView.13"));
-    jrbLast.addItemListener(this);
+    jrbLast.addItemListener(updateHelper);
     jrbLastKeepPos = new JRadioButton(Messages.getString("ParameterView.135"));
     jrbLastKeepPos.setToolTipText(Messages.getString("ParameterView.136"));
-    jrbLastKeepPos.addItemListener(this);
+    jrbLastKeepPos.addItemListener(updateHelper);
     jrbShuffle = new JRadioButton(Messages.getString("ParameterView.14"));
     jrbShuffle.setToolTipText(Messages.getString("ParameterView.15"));
-    jrbShuffle.addItemListener(this);
+    jrbShuffle.addItemListener(updateHelper);
     jrbBestof = new JRadioButton(Messages.getString("ParameterView.131"));
     jrbBestof.setToolTipText(Messages.getString("ParameterView.132"));
-    jrbBestof.addItemListener(this);
+    jrbBestof.addItemListener(updateHelper);
     jrbNovelties = new JRadioButton(Messages.getString("ParameterView.133"));
     jrbNovelties.setToolTipText(Messages.getString("ParameterView.134"));
-    jrbNovelties.addItemListener(this);
+    jrbNovelties.addItemListener(updateHelper);
     jrbFile = new JRadioButton(Messages.getString("ParameterView.16"));
     jrbFile.setToolTipText(Messages.getString("ParameterView.17"));
-    jrbFile.addItemListener(this);
+    jrbFile.addItemListener(updateHelper);
     sbSearch = new SearchBox() {
       private static final long serialVersionUID = 1L;
 
@@ -1012,32 +376,60 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jpStart.add(jrbBestof, "wrap");
     jpStart.add(jrbNovelties, "wrap");
     jpStart.add(jrbFile);
-    jpStart.add(sbSearch, "grow,wrap");
+    jpStart.add(sbSearch, "grow,wrap"); //NOSONAR
+    return jpStart;
+  }
 
-    // --Confirmations
-    jpConfirmations = new JPanel(new MigLayout("insets 10,gapy 15"));
+  /**
+  * Inits the webradios panel.
+  *
+  *
+  * @return the j panel
+  */
+  private JPanel initWebradios() {
+    JPanel jpWebradios = new JPanel(new MigLayout("insets 10, gapy 15"));
+    jbReloadRadiosPreset = new JButton(Messages.getString("WebRadioView.10"),
+        IconLoader.getIcon(JajukIcons.CLEAR));
+    jbReloadRadiosPreset.setToolTipText(Messages.getString("WebRadioView.11"));
+    jbReloadRadiosPreset.addActionListener(updateHelper);
+    jpWebradios.add(jbReloadRadiosPreset);
+    return jpWebradios;
+  }
 
+  /**
+   * Inits the ui confirmations.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUIConfirmations() {
+    JPanel jpConfirmations = new JPanel(new MigLayout("insets 10,gapy 15"));
     jcbBeforeDelete = new JCheckBox(Messages.getString("ParameterView.27"));
     jcbBeforeDelete.setToolTipText(Messages.getString("ParameterView.28"));
-
     jcbBeforeExit = new JCheckBox(Messages.getString("ParameterView.29"));
     jcbBeforeExit.setToolTipText(Messages.getString("ParameterView.30"));
-
     jcbBeforeRemoveDevice = new JCheckBox(Messages.getString("ParameterView.164"));
     jcbBeforeRemoveDevice.setToolTipText(Messages.getString("ParameterView.165"));
-
     jcbBeforeDeleteCover = new JCheckBox(Messages.getString("ParameterView.171"));
     jcbBeforeDeleteCover.setToolTipText(Messages.getString("ParameterView.172"));
-
     jcbBeforeClearingHistory = new JCheckBox(Messages.getString("ParameterView.188"));
     jcbBeforeClearingHistory.setToolTipText(Messages.getString("ParameterView.188"));
-
     jcbBeforeResetingRatings = new JCheckBox(Messages.getString("ParameterView.189"));
     jcbBeforeResetingRatings.setToolTipText(Messages.getString("ParameterView.189"));
-
     jcbBeforeRefactorFiles = new JCheckBox(Messages.getString("ParameterView.194"));
     jcbBeforeRefactorFiles.setToolTipText(Messages.getString("ParameterView.194"));
-
+    jcbBeforeWritingTag = new JCheckBox(Messages.getString("ParameterView.309"));
+    jcbBeforeWritingTag.setToolTipText(Messages.getString("ParameterView.309"));
+    jbResetDontShowAgain = new JButton(Messages.getString("ParameterView.310"));
+    jbResetDontShowAgain.setToolTipText(Messages.getString("ParameterView.311"));
+    jbResetDontShowAgain.addActionListener(new ActionListener() {
+      @Override
+      public void actionPerformed(ActionEvent e) {
+        Conf.resetDontShowAgain();
+        InformationJPanel.getInstance().setMessage(Messages.getString("Success"),
+            MessageType.INFORMATIVE);
+      }
+    });
     jpConfirmations.add(jcbBeforeDelete, "wrap");
     jpConfirmations.add(jcbBeforeExit, "wrap");
     jpConfirmations.add(jcbBeforeRemoveDevice, "wrap");
@@ -1045,8 +437,46 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jpConfirmations.add(jcbBeforeClearingHistory, "wrap");
     jpConfirmations.add(jcbBeforeResetingRatings, "wrap");
     jpConfirmations.add(jcbBeforeRefactorFiles, "wrap");
+    jpConfirmations.add(jcbBeforeWritingTag, "wrap");
+    jpConfirmations.add(jbResetDontShowAgain);
+    return jpConfirmations;
+  }
+
+  /**
+   * Inits the sound tab.
+   *
+   * @return the jpanel
+   */
+  private JPanel initUISound() {
+    JPanel jpSound = new JPanel(new MigLayout("insets 10,gapy 15,gapx 10", "[][grow,200:300:300]"));//NOSONAR
+    JLabel jlCrossFadeDuration = new JLabel(Messages.getString("ParameterView.190"));
+    jlCrossFadeDuration.setToolTipText(Messages.getString("ParameterView.191"));
+    crossFadeDuration = new JSlider(0, 30, 0);
+    crossFadeDuration.setMajorTickSpacing(10);
+    crossFadeDuration.setMinorTickSpacing(1);
+    crossFadeDuration.setPaintTicks(true);
+    crossFadeDuration.setPaintLabels(true);
+    crossFadeDuration.setToolTipText(Messages.getString("ParameterView.191"));
+    crossFadeDuration.addMouseWheelListener(new DefaultMouseWheelListener(crossFadeDuration));
+    jcbUseVolnorm = new JCheckBox(Messages.getString("ParameterView.262"));
+    jcbUseVolnorm.setToolTipText(Messages.getString("ParameterView.263"));
+    jcbUseVolnorm.addActionListener(updateHelper);
+    jcbEnableBitPerfect = new JCheckBox(Messages.getString("ParameterView.285"));
+    jcbEnableBitPerfect.setToolTipText(Messages.getString("ParameterView.286"));
+    jcbEnableBitPerfect.addActionListener(updateHelper);
+    jpSound.add(jlCrossFadeDuration);
+    jpSound.add(crossFadeDuration, "grow,wrap");
+    jpSound.add(jcbUseVolnorm, "wrap");
+    jpSound.add(jcbEnableBitPerfect);
+    return jpSound;
+  }
 
-    // --- Modes ---
+  /**
+   * Inits the ui modes.
+   *
+   * @return the jpanel
+   */
+  private JPanel initUIModes() {
     // Intro
     // intro position
     introPosition = new JSlider(0, 100, 0);
@@ -1056,7 +486,6 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     introPosition.setPaintLabels(true);
     introPosition.setToolTipText(Messages.getString("ParameterView.60"));
     introPosition.addMouseWheelListener(new DefaultMouseWheelListener(introPosition));
-
     // intro length
     JLabel jlIntroLength = new JLabel(Messages.getString("ParameterView.61"));
     jlIntroLength.setToolTipText(Messages.getString("ParameterView.62"));
@@ -1067,7 +496,6 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     introLength.setPaintLabels(true);
     introLength.setToolTipText(Messages.getString("ParameterView.62"));
     introLength.addMouseWheelListener(new DefaultMouseWheelListener(introLength));
-
     // Best of size
     JLabel jlBestofSize = new JLabel(Messages.getString("ParameterView.111"));
     jlBestofSize.setToolTipText(Messages.getString("ParameterView.112"));
@@ -1081,7 +509,7 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
 
       @Override
       public boolean verify(final JComponent input) {
-        final JTextField tf = (JTextField) input;
+        final JTextField tf = (JTextField) input; //NOSONAR
         final String sText = tf.getText();
         try {
           final int iValue = Integer.parseInt(sText);
@@ -1089,7 +517,7 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
             jbOK.setEnabled(false);
             return false;
           }
-        } catch (final Exception e) {
+        } catch (final RuntimeException e) {
           return false;
         }
         jbOK.setEnabled(true);
@@ -1109,7 +537,7 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
 
       @Override
       public boolean verify(final JComponent input) {
-        final JTextField tf = (JTextField) input;
+        final JTextField tf = (JTextField) input; //NOSONAR
         final String sText = tf.getText();
         try {
           final int iValue = Integer.parseInt(sText);
@@ -1125,82 +553,38 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
         return true;
       }
     });
-    // number of visible tracks
-    JLabel jlVisiblePlanned = new JLabel(Messages.getString("ParameterView.177"));
-    jlVisiblePlanned.setToolTipText(Messages.getString("ParameterView.178"));
-    jtfVisiblePlanned = new JTextField(3);
-    jtfVisiblePlanned.setToolTipText(Messages.getString("ParameterView.178"));
-    jtfVisiblePlanned.setInputVerifier(new InputVerifier() {
-      @Override
-      public boolean shouldYieldFocus(final JComponent input) {
-        return verify(input);
-      }
-
-      @Override
-      public boolean verify(final JComponent input) {
-        final JTextField tf = (JTextField) input;
-        final String sText = tf.getText();
-        try {
-          final int iValue = Integer.parseInt(sText);
-          // number of planned tracks between 0 and 100
-          if ((iValue < 0) || (iValue > 100)) {
-            return false;
-          }
-        } catch (final Exception e) {
-          return false;
-        }
-        jbOK.setEnabled(true);
-        return true;
-      }
-    });
-    JLabel jlCrossFadeDuration = new JLabel(Messages.getString("ParameterView.190"));
-    jlCrossFadeDuration.setToolTipText(Messages.getString("ParameterView.191"));
-    crossFadeDuration = new JSlider(0, 30, 0);
-    crossFadeDuration.setMajorTickSpacing(10);
-    crossFadeDuration.setMinorTickSpacing(1);
-    crossFadeDuration.setPaintTicks(true);
-    crossFadeDuration.setPaintLabels(true);
-    crossFadeDuration.setToolTipText(Messages.getString("ParameterView.191"));
-    crossFadeDuration.addMouseWheelListener(new DefaultMouseWheelListener(crossFadeDuration));
-    jcbUseVolnorm = new JCheckBox(Messages.getString("ParameterView.262"));
-    jcbUseVolnorm.setToolTipText(Messages.getString("ParameterView.263"));
-
     // add panels
-    JPanel jpModes = new JPanel(new MigLayout("insets 10,gapy 15,gapx 10",
-        "[][grow,200:300:300][fill]"));
+    JPanel jpModes = new JPanel(new MigLayout("insets 10,gapy 15,gapx 10", "[][grow,200:300:300]"));
     jpModes.add(new JLabel(Messages.getString("ParameterView.59")));
     jpModes.add(introPosition, "grow,wrap");
     jpModes.add(jlIntroLength);
     jpModes.add(introLength, "grow,wrap");
-    jpModes.add(jlCrossFadeDuration);
-    jpModes.add(crossFadeDuration, "grow,wrap");
     jpModes.add(jlBestofSize);
     jpModes.add(jtfBestofSize, "grow,wrap");
     jpModes.add(jlNoveltiesAge);
     jpModes.add(jtfNoveltiesAge, "grow,wrap");
-    jpModes.add(jlVisiblePlanned);
-    jpModes.add(jtfVisiblePlanned, "grow,wrap");
-    jpModes.add(jcbUseVolnorm);
+    return jpModes;
+  }
 
-    // --Options
+  /**
+   * Inits the ui options.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUIOptions() {
     jcbDisplayUnmounted = new JCheckBox(Messages.getString("JajukJMenuBar.24"));
     jcbDisplayUnmounted.setToolTipText(Messages.getString("ParameterView.35"));
-    jcbDisplayUnmounted.addActionListener(alUI);
-
     jcbDefaultActionClick = new JCheckBox(Messages.getString("ParameterView.179"));
     jcbDefaultActionClick.setToolTipText(Messages.getString("ParameterView.180"));
-
     jcbDefaultActionDrop = new JCheckBox(Messages.getString("ParameterView.181"));
     jcbDefaultActionDrop.setToolTipText(Messages.getString("ParameterView.182"));
-
     jcbHotkeys = new JCheckBox(Messages.getString("ParameterView.196"));
-    jcbHotkeys.addActionListener(this);
+    jcbHotkeys.addActionListener(updateHelper);
     jcbHotkeys.setToolTipText(Messages.getString("ParameterView.197"));
     // Disable this option if not under windows
     jcbHotkeys.setEnabled(UtilSystem.isUnderWindows());
-
     scbLanguage = new SteppedComboBox();
-
     scbLanguage.setRenderer(new BasicComboBoxRenderer() {
       private static final long serialVersionUID = -6943363556191659895L;
 
@@ -1214,19 +598,19 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
         return this;
       }
     });
-
     scbLanguage.removeAllItems();
     for (String sDesc : LocaleManager.getLocalesDescs()) {
       scbLanguage.addItem(new JLabel(sDesc, Messages.getIcon(sDesc), SwingConstants.LEFT));
     }
     scbLanguage.setToolTipText(Messages.getString("ParameterView.42"));
-    scbLanguage.addActionListener(this);
+    scbLanguage.addActionListener(updateHelper);
     jcbUseParentDir = new JCheckBox(Messages.getString("ParameterView.101"));
     jcbUseParentDir.setToolTipText(Messages.getString("ParameterView.102"));
-    jcbDropPlayedTracksFromQueue = new JCheckBox(Messages.getString("ParameterView.266"));
-    jcbDropPlayedTracksFromQueue.setToolTipText(Messages.getString("ParameterView.267"));
-
-    jpOptions = new JPanel(new MigLayout("insets 10, gapy 15, wrap 1"));
+    jcbShowVideos = new JCheckBox(Messages.getString("ParameterView.301"));
+    jcbShowVideos.setToolTipText(Messages.getString("ParameterView.302"));
+    jcbPreserveFileDates = new JCheckBox(Messages.getString("ParameterView.305"));
+    jcbPreserveFileDates.setToolTipText(Messages.getString("ParameterView.306"));
+    JPanel jpOptions = new JPanel(new MigLayout("insets 10, gapy 15, wrap 1"));
     jpOptions.add(new JLabel(Messages.getString("ParameterView.38")), "split 2,gapleft 5");
     jpOptions.add(scbLanguage);
     jpOptions.add(jcbDisplayUnmounted);
@@ -1234,12 +618,21 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jpOptions.add(jcbDefaultActionDrop);
     jpOptions.add(jcbHotkeys);
     jpOptions.add(jcbUseParentDir);
-    jpOptions.add(jcbDropPlayedTracksFromQueue);
+    jpOptions.add(jcbShowVideos);
+    jpOptions.add(jcbPreserveFileDates);
+    return jpOptions;
+  }
 
-    // --Patterns
-    jpTags = new JPanel(new MigLayout("insets 10, gapy 15, wrap 2", "[][grow]"));
+  /**
+   * Inits the ui patterns.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUIPatterns() {
+    JPanel patterns = new JPanel(new MigLayout("insets 10, gapy 15, wrap 2", "[][grow]"));
     JLabel jlRefactorPattern = new JLabel(Messages.getString("ParameterView.192"));
-    jlRefactorPattern.setToolTipText(Messages.getString("ParameterView.193"));
+    jlRefactorPattern.setToolTipText(Messages.getString("ParameterView.193"));//NOSONAR
     jtfRefactorPattern = new JFormattedTextField();
     jtfRefactorPattern.setToolTipText(Messages.getString("ParameterView.193"));
     jtfRefactorPattern.setInputVerifier(new PatternInputVerifier());
@@ -1247,39 +640,43 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jlAnimationPattern.setToolTipText(Messages.getString("ParameterView.193"));
     jtfAnimationPattern = new JTextField();
     jtfAnimationPattern.setToolTipText(Messages.getString("ParameterView.193"));
-
     // Frame Title Options
     JLabel jlFrameTitle = new JLabel(Messages.getString("ParameterView.248"));
     jlFrameTitle.setToolTipText(Messages.getString("ParameterView.193"));
     jtfFrameTitle = new JTextField();
     jtfFrameTitle.setToolTipText(Messages.getString("ParameterView.193"));
-
     // Balloon Notifier pattern
     JLabel jlBalloonNotifierPattern = new JLabel(Messages.getString("ParameterView.277"));
     jlBalloonNotifierPattern.setToolTipText(Messages.getString("ParameterView.278"));
     jtfBalloonNotifierPattern = new JTextField();
     jtfBalloonNotifierPattern.setToolTipText(Messages.getString("ParameterView.278"));
-
     // Information view pattern
     JLabel jlInformationPattern = new JLabel(Messages.getString("ParameterView.279"));
     jlInformationPattern.setToolTipText(Messages.getString("ParameterView.280"));
     jtfInformationPattern = new JTextField();
     jtfInformationPattern.setToolTipText(Messages.getString("ParameterView.280"));
+    patterns.add(jlRefactorPattern);
+    patterns.add(jtfRefactorPattern, "grow"); //NOSONAR
+    patterns.add(jlAnimationPattern);
+    patterns.add(jtfAnimationPattern, "grow");
+    patterns.add(jlFrameTitle);
+    patterns.add(jtfFrameTitle, "grow");
+    patterns.add(jlBalloonNotifierPattern);
+    patterns.add(jtfBalloonNotifierPattern, "grow");
+    patterns.add(jlInformationPattern);
+    patterns.add(jtfInformationPattern, "grow");
+    return patterns;
+  }
 
-    jpTags.add(jlRefactorPattern);
-    jpTags.add(jtfRefactorPattern, "grow");
-    jpTags.add(jlAnimationPattern);
-    jpTags.add(jtfAnimationPattern, "grow");
-    jpTags.add(jlFrameTitle);
-    jpTags.add(jtfFrameTitle, "grow");
-    jpTags.add(jlBalloonNotifierPattern);
-    jpTags.add(jtfBalloonNotifierPattern, "grow");
-    jpTags.add(jlInformationPattern);
-    jpTags.add(jtfInformationPattern, "grow");
-
-    // --Advanced
+  /**
+   * Inits the ui advanced.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUIAdvanced() {
     jcbBackup = new JCheckBox(Messages.getString("ParameterView.116"));
-    jcbBackup.addActionListener(this);
+    jcbBackup.addActionListener(updateHelper);
     jcbBackup.setToolTipText(Messages.getString("ParameterView.117"));
     backupSize = new JSlider(0, 100);
     backupSize.setMajorTickSpacing(20);
@@ -1288,16 +685,8 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     backupSize.setPaintLabels(true);
     backupSize.setToolTipText(Messages.getString("ParameterView.119"));
     backupSize.addMouseWheelListener(new DefaultMouseWheelListener(backupSize));
-    JLabel jlCollectionEncoding = new JLabel(Messages.getString("ParameterView.120"));
-    jlCollectionEncoding.setToolTipText(Messages.getString("ParameterView.121"));
-    jcbCollectionEncoding = new JComboBox();
-    jcbCollectionEncoding.setToolTipText(Messages.getString("ParameterView.121"));
     jcbRegexp = new JCheckBox(Messages.getString("ParameterView.113"));
-    jcbRegexp.setSelected(Conf.getBoolean(Const.CONF_REGEXP));
     jcbRegexp.setToolTipText(Messages.getString("ParameterView.114"));
-
-    jcbCollectionEncoding.addItem("UTF-8");
-    jcbCollectionEncoding.addItem("UTF-16");
     JLabel jlLogLevel = new JLabel(Messages.getString("ParameterView.46"));
     scbLogLevel = new SteppedComboBox();
     scbLogLevel.addItem(Messages.getString("ParameterView.47"));
@@ -1330,21 +719,15 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     }
     jcbCheckUpdates = new JCheckBox(Messages.getString("ParameterView.234"));
     jcbCheckUpdates.setToolTipText(Messages.getString("ParameterView.234"));
-    jcbCheckUpdates.setSelected(Conf.getBoolean(Const.CONF_CHECK_FOR_UPDATE));
     jcbForceFileDate = new JCheckBox(Messages.getString("ParameterView.244"));
     jcbForceFileDate.setToolTipText(Messages.getString("ParameterView.245"));
-    jcbForceFileDate.setSelected(Conf.getBoolean(Const.CONF_FORCE_FILE_DATE));
-
     JLabel jlExplorer = new JLabel(Messages.getString("ParameterView.269"));
     jlExplorer.setToolTipText(Messages.getString("ParameterView.270"));
     jtfExplorerPath = new JTextField();
     jtfExplorerPath.setToolTipText(Messages.getString("ParameterView.270"));
-
-    jpAdvanced = new JPanel(new MigLayout("insets 10,gapy 15, gapx 10", "[][grow][fill]"));
+    JPanel jpAdvanced = new JPanel(new MigLayout("insets 10,gapy 15, gapx 10", "[][grow][fill]"));
     jpAdvanced.add(jcbBackup);
     jpAdvanced.add(backupSize, "wrap,grow");
-    jpAdvanced.add(jlCollectionEncoding);
-    jpAdvanced.add(jcbCollectionEncoding, "wrap,grow");
     jpAdvanced.add(jlLogLevel);
     jpAdvanced.add(scbLogLevel, "wrap,grow");
     jpAdvanced.add(jlMPlayerPath);
@@ -1360,23 +743,28 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jpAdvanced.add(jcbRegexp, "wrap");
     jpAdvanced.add(jcbCheckUpdates, "wrap");
     jpAdvanced.add(jcbForceFileDate, "wrap");
+    return jpAdvanced;
+  }
 
-    // - Network
+  /**
+   * Inits the ui network.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUINetwork() {
     bgProxy = new ButtonGroup();
     jcbProxyNone = new JRadioButton(Messages.getString("ParameterView.236"));
     jcbProxyNone.setToolTipText(Messages.getString("ParameterView.236"));
-    jcbProxyNone.addActionListener(this);
-
+    jcbProxyNone.addActionListener(updateHelper);
     jcbNoneInternetAccess = new JCheckBox(Messages.getString("ParameterView.264"));
     jcbNoneInternetAccess.setToolTipText(Messages.getString("ParameterView.265"));
-    jcbNoneInternetAccess.addActionListener(alUI);
-
     jcbProxyHttp = new JRadioButton(Messages.getString("ParameterView.237"));
     jcbProxyHttp.setToolTipText(Messages.getString("ParameterView.237"));
-    jcbProxyHttp.addActionListener(this);
+    jcbProxyHttp.addActionListener(updateHelper);
     jcbProxySocks = new JRadioButton(Messages.getString("ParameterView.238"));
     jcbProxySocks.setToolTipText(Messages.getString("ParameterView.238"));
-    jcbProxySocks.addActionListener(this);
+    jcbProxySocks.addActionListener(updateHelper);
     bgProxy.add(jcbProxyNone);
     bgProxy.add(jcbProxyHttp);
     bgProxy.add(jcbProxySocks);
@@ -1396,7 +784,7 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
 
       @Override
       public boolean verify(final JComponent input) {
-        final JTextField tf = (JTextField) input;
+        final JTextField tf = (JTextField) input;//NOSONAR
         final String sText = tf.getText();
         try {
           final int iValue = Integer.parseInt(sText);
@@ -1420,7 +808,6 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jlProxyPwd.setToolTipText(Messages.getString("ParameterView.239"));
     jtfProxyPwd = new JPasswordField();
     jtfProxyPwd.setToolTipText(Messages.getString("ParameterView.239"));
-
     jlConnectionTO = new JLabel(Messages.getString("ParameterView.160"));
     jlConnectionTO.setToolTipText(Messages.getString("ParameterView.160"));
     connectionTO = new JSlider(0, 60);
@@ -1444,17 +831,24 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jpProxy.add(jtfProxyLogin, "wrap,grow");
     jpProxy.add(jlProxyPwd);
     jpProxy.add(jtfProxyPwd, "wrap,grow");
-
-    jpNetwork = new JPanel(new MigLayout("insets 10,gapy 15, gapx 10", "[grow]"));
+    JPanel jpNetwork = new JPanel(new MigLayout("insets 10,gapy 15, gapx 10", "[grow]"));
     jpNetwork.add(jcbNoneInternetAccess, "wrap");
     jpNetwork.add(jlConnectionTO, "split 2");
     jpNetwork.add(connectionTO, "wrap,grow,width 200!");
     jpNetwork.add(jpProxy, "span");
+    return jpNetwork;
+  }
 
-    // - Last.FM
+  /**
+   * Inits the ui last fm.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUILastFM() {
     jcbAudioScrobbler = new JCheckBox(Messages.getString("ParameterView.199"));
     jcbAudioScrobbler.setToolTipText(Messages.getString("ParameterView.200"));
-    jcbAudioScrobbler.addActionListener(this);
+    jcbAudioScrobbler.addActionListener(updateHelper);
     jlASUser = new JLabel(Messages.getString("ParameterView.201"));
     jtfASUser = new JTextField();
     jtfASUser.setToolTipText(Messages.getString("ParameterView.202"));
@@ -1464,21 +858,29 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jcbEnableLastFMInformation = new JCheckBox(Messages.getString("ParameterView.240"));
     jcbEnableLastFMInformation.setToolTipText(Messages.getString("ParameterView.241"));
     // Add items
-    jpLastFM = new JPanel(new MigLayout("insets 10,gapy 15,gapx 10", "[grow]"));
+    JPanel jpLastFM = new JPanel(new MigLayout("insets 10,gapy 15,gapx 10", "[grow]"));
     jpLastFM.add(jcbEnableLastFMInformation, "wrap");
     jpLastFM.add(jcbAudioScrobbler, "wrap");
     jpLastFM.add(jlASUser);
     jpLastFM.add(jtfASUser, "wrap,grow,width 100:300:300");
     jpLastFM.add(jlASPassword);
     jpLastFM.add(jpfASPassword, "wrap,grow,width 100:300:300");
+    return jpLastFM;
+  }
 
-    // - Cover
+  /**
+   * Inits the ui covers.
+   *
+   *
+   * @return the jpanel
+   */
+  private JPanel initUICovers() {
     jcbAutoCover = new JCheckBox(Messages.getString("ParameterView.148"));
     jcbAutoCover.setToolTipText(Messages.getString("ParameterView.149"));
-    jcbAutoCover.addActionListener(this);
+    jcbAutoCover.addActionListener(updateHelper);
     jcbShuffleCover = new JCheckBox(Messages.getString("ParameterView.166"));
     jcbShuffleCover.setToolTipText(Messages.getString("ParameterView.167"));
-    jcbShuffleCover.addActionListener(this);
+    jcbShuffleCover.addActionListener(updateHelper);
     jlCoverSize = new JLabel(Messages.getString("ParameterView.150"));
     jlCoverSize.setToolTipText(Messages.getString("ParameterView.151"));
     jcbCoverSize = new JComboBox();
@@ -1488,32 +890,37 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jcbCoverSize.addItem(Messages.getString("ParameterView.213"));
     jcbCoverSize.addItem(Messages.getString("ParameterView.214"));
     jcbCoverSize.addItem(Messages.getString("ParameterView.215"));
-
     jcb3dCover = new JCheckBox(Messages.getString("ParameterView.273"));
     jcb3dCover.setToolTipText(Messages.getString("ParameterView.274"));
-
-    jlDefaultCoverSearchPattern = new JLabel();
-    jlDefaultCoverSearchPattern.setText(Messages.getString("ParameterView.256"));
+    jcb3dCoverFS = new JCheckBox(Messages.getString("ParameterView.283"));
+    jcb3dCoverFS.setToolTipText(Messages.getString("ParameterView.284"));
+    jlDefaultCoverSearchPattern = new JLabel(Messages.getString("ParameterView.256"));
     jlDefaultCoverSearchPattern.setToolTipText(Messages.getString("ParameterView.257"));
     jtfDefaultCoverSearchPattern = new JTextField();
     jtfDefaultCoverSearchPattern.setToolTipText(Messages.getString("ParameterView.257"));
-
     jcbSaveExplorerFriendly = new JCheckBox(Messages.getString("ParameterView.260"));
     jcbSaveExplorerFriendly.setToolTipText(Messages.getString("ParameterView.261"));
-    jcbSaveExplorerFriendly.addActionListener(this);
-
+    jcbSaveExplorerFriendly.addActionListener(updateHelper);
     // Add items
-    jpCovers = new JPanel(new MigLayout("insets 10,gapy 15,gapx 10", "[40%][40%]"));
+    JPanel jpCovers = new JPanel(new MigLayout("insets 10,gapy 15,gapx 10", "[40%][40%]"));
     jpCovers.add(jcbShuffleCover, "wrap");
     jpCovers.add(jcbAutoCover, "wrap");
-    jpCovers.add(jcb3dCover, "wrap");
+    jpCovers.add(jcb3dCover, "split 2");
+    jpCovers.add(jcb3dCoverFS, "wrap");
     jpCovers.add(jcbSaveExplorerFriendly, "wrap");
     jpCovers.add(jlCoverSize);
     jpCovers.add(jcbCoverSize, "wrap,grow");
     jpCovers.add(jlDefaultCoverSearchPattern);
     jpCovers.add(jtfDefaultCoverSearchPattern, "wrap,grow");
+    return jpCovers;
+  }
 
-    // -- User interface --
+  /**
+   * Inits the GUI tab.
+   *
+   * @return the jpanel
+   */
+  private JPanel initUIGUI() {
     // Catalog view
     jlCatalogPages = new JLabel(Messages.getString("ParameterView.221"));
     jlCatalogPages.setToolTipText(Messages.getString("ParameterView.222"));
@@ -1524,31 +931,36 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jsCatalogPages.setPaintLabels(true);
     jsCatalogPages.setToolTipText(Integer.toString(jsCatalogPages.getValue()));
     jsCatalogPages.addChangeListener(new ChangeListener() {
+      @Override
       public void stateChanged(ChangeEvent e) {
         jsCatalogPages.setToolTipText(Integer.toString(jsCatalogPages.getValue()));
       }
     });
     jcbShowPopups = new JCheckBox(Messages.getString("ParameterView.228"));
-    jcbShowPopups.addActionListener(alUI);
-
+    jcbShowPopups.setToolTipText(Messages.getString("ParameterView.292"));
+    // Splashscreen
+    jcbSplashscreen = new JCheckBox(Messages.getString("ParameterView.290"));
+    jcbSplashscreen.setToolTipText(Messages.getString("ParameterView.291"));
     jcbShowSystray = new JCheckBox(Messages.getString("ParameterView.271"));
     // Disable this option if the tray is not supported by the platform
     jcbShowSystray.setEnabled(SystemTray.isSupported());
-    // Disable minimize to systray optino if unchecked
+    // Disable minimize to systray option if unchecked
     jcbShowSystray.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {
-        jcbMinimizeToTray.setSelected(jcbShowSystray.isSelected());
         jcbMinimizeToTray.setEnabled(jcbShowSystray.isSelected());
+        jcbClickTrayAlwaysDisplayWindow.setEnabled(jcbShowSystray.isSelected());
+        if (!jcbShowSystray.isSelected()) {
+          jcbMinimizeToTray.setSelected(false);
+          jcbClickTrayAlwaysDisplayWindow.setSelected(false);
+        }
       }
     });
     jcbShowSystray.setToolTipText(Messages.getString("ParameterView.272"));
-
     jcbMinimizeToTray = new JCheckBox(Messages.getString("ParameterView.281"));
-    // Disable this option if the tray is not supported by the platform
-    jcbMinimizeToTray.setEnabled(SystemTray.isSupported());
     jcbMinimizeToTray.setToolTipText(Messages.getString("ParameterView.282"));
-
+    jcbClickTrayAlwaysDisplayWindow = new JCheckBox(Messages.getString("ParameterView.303"));
+    jcbClickTrayAlwaysDisplayWindow.setToolTipText(Messages.getString("ParameterView.304"));
     JLabel jlPerspectiveSize = new JLabel(Messages.getString("ParameterView.246"));
     jsPerspectiveSize = new JSlider(16, 45, Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE));
     jsPerspectiveSize.setSnapToTicks(true);
@@ -1560,18 +972,26 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jbCatalogRefresh = new JajukButton(Messages.getString("CatalogView.19"),
         IconLoader.getIcon(JajukIcons.REFRESH));
     jbCatalogRefresh.setToolTipText(Messages.getString("CatalogView.3"));
-    jbCatalogRefresh.addActionListener(this);
+    jbCatalogRefresh.addActionListener(updateHelper);
     final JXCollapsiblePane catalogView = new JXCollapsiblePane();
     catalogView.setLayout(new VerticalLayout(10));
     catalogView.setCollapsed(true);
-    final ToggleLink toggle = new ToggleLink(Messages.getString("ParameterView.229"), catalogView);
+    final ToggleLink toggleCatalog = new ToggleLink(Messages.getString("ParameterView.229"),
+        catalogView);
     final JPanel jpCatalogSize = new JPanel();
     jpCatalogSize.setLayout(new HorizontalLayout());
     jpCatalogSize.add(jlCatalogPages);
     jpCatalogSize.add(jsCatalogPages);
     catalogView.add(jpCatalogSize);
     catalogView.add(jbCatalogRefresh);
-
+    //Title view
+    jcbTitleAnimation = new JCheckBox(Messages.getString("ParameterView.288"));
+    jcbTitleAnimation.setToolTipText(Messages.getString("ParameterView.288"));
+    final JXCollapsiblePane titleView = new JXCollapsiblePane();
+    titleView.add(jcbTitleAnimation);
+    titleView.setCollapsed(true);
+    final ToggleLink toggleTitle = new ToggleLink(Messages.getString("ParameterView.289"),
+        titleView);
     // Font selector
     jlFonts = new JLabel(Messages.getString("ParameterView.223"));
     jsFonts = new JSlider(8, 16, Conf.getInt(Const.CONF_FONTS_SIZE));
@@ -1581,7 +1001,6 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jsFonts.setPaintTicks(true);
     jsFonts.setPaintLabels(true);
     jsFonts.setToolTipText(Messages.getString("ParameterView.224"));
-
     // Notification type
     jlNotificationType = new JLabel(Messages.getString("ParameterView.275"));
     jlNotificationType.setToolTipText(Messages.getString("ParameterView.276"));
@@ -1591,7 +1010,6 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
       String notificatorType = Messages.getString(NOTIFICATOR_PREFIX + type);
       jcbNotificationType.addItem(notificatorType);
     }
-
     // LaF
     jlLAF = new JLabel(Messages.getString("ParameterView.43"));
     jlLAF.setToolTipText(Messages.getString("ParameterView.44"));
@@ -1605,13 +1023,14 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     }
     scbLAF.setToolTipText(Messages.getString("ParameterView.44"));
     // Refresh full GUI at each LAF change as a preview
-    scbLAF.addActionListener(this);
-
+    scbLAF.addActionListener(updateHelper);
     // Add items
-    jpUI = new JPanel(new MigLayout("insets 10,gapx 10,gapy 15"));
+    JPanel jpUI = new JPanel(new MigLayout("insets 10,gapx 10,gapy 15"));
     jpUI.add(jcbShowPopups, "wrap");
-    jpUI.add(jcbShowSystray, "split 2");
-    jpUI.add(jcbMinimizeToTray, "wrap");
+    jpUI.add(jcbSplashscreen, "wrap");
+    jpUI.add(jcbShowSystray, "split 3");
+    jpUI.add(jcbMinimizeToTray);
+    jpUI.add(jcbClickTrayAlwaysDisplayWindow, "wrap");
     jpUI.add(jlFonts);
     jpUI.add(jsFonts, "wrap,grow");
     jpUI.add(jlNotificationType);
@@ -1620,21 +1039,44 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     jpUI.add(scbLAF, "wrap,grow");
     jpUI.add(jlPerspectiveSize);
     jpUI.add(jsPerspectiveSize, "wrap,grow");
-    jpUI.add(toggle, "wrap,grow");
+    jpUI.add(toggleCatalog, "wrap,grow");
     jpUI.add(catalogView, "wrap,grow,span");
+    jpUI.add(toggleTitle, "wrap,grow");
+    jpUI.add(titleView, "wrap,grow,span");
+    return jpUI;
+  }
 
+  /*
+   * (non-Javadoc)
+   *
+   * @see org.jajuk.ui.IView#display()
+   */
+  @Override
+  public void initUI() {
+    JPanel jpHistory = initUIHistory();
+    JPanel jpStartup = initUIStartup();
+    JPanel jpConfirmations = initUIConfirmations();
+    JPanel jpModes = initUIModes();
+    JPanel jpSound = initUISound();
+    JPanel jpOptions = initUIOptions();
+    JPanel jpPatterns = initUIPatterns();
+    JPanel jpAdvanced = initUIAdvanced();
+    JPanel jpNetwork = initUINetwork();
+    JPanel jpLastFM = initUILastFM();
+    JPanel jpCovers = initUICovers();
+    JPanel jpUI = initUIGUI();
+    JPanel jpWebradios = initWebradios();
     // --OK/cancel panel
     jbOK = new JButton(Messages.getString("ParameterView.85"), IconLoader.getIcon(JajukIcons.OK));
-    jbOK.addActionListener(this);
+    jbOK.addActionListener(updateHelper);
     jbDefault = new JButton(Messages.getString("ParameterView.86"),
         IconLoader.getIcon(JajukIcons.DEFAULTS_BIG));
-    jbDefault.addActionListener(this);
-
+    jbDefault.addActionListener(updateHelper);
     // --Global layout
     // add main panels
     jtpMain = new JTabbedPane(SwingConstants.TOP);
     // ScrollPane without border
-    class JajukJScrollPane extends JScrollPane {
+    final class JajukJScrollPane extends JScrollPane {
       private static final long serialVersionUID = 4564343623724771988L;
 
       private JajukJScrollPane(final Component view) {
@@ -1644,11 +1086,13 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
     }
     jtpMain.addTab(Messages.getString("ParameterView.33"), new JajukJScrollPane(jpOptions));
     jtpMain.addTab(Messages.getString("ParameterView.226"), new JajukJScrollPane(jpModes));
+    jtpMain.addTab(Messages.getString("ParameterView.287"), new JajukJScrollPane(jpSound));
     jtpMain.addTab(Messages.getString("ParameterView.225"), new JajukJScrollPane(jpUI));
-    jtpMain.addTab(Messages.getString("ParameterView.19"), new JajukJScrollPane(jpStart));
-    jtpMain.addTab(Messages.getString("ParameterView.98"), new JajukJScrollPane(jpTags));
+    jtpMain.addTab(Messages.getString("ParameterView.19"), new JajukJScrollPane(jpStartup));
+    jtpMain.addTab(Messages.getString("ParameterView.98"), new JajukJScrollPane(jpPatterns));
     jtpMain.addTab(Messages.getString("ParameterView.8"), new JajukJScrollPane(jpHistory));
     jtpMain.addTab(Messages.getString("ParameterView.235"), new JajukJScrollPane(jpLastFM));
+    jtpMain.addTab(Messages.getString("WebRadioView.0"), new JajukJScrollPane(jpWebradios));
     jtpMain.addTab(Messages.getString("ParameterView.159"), new JajukJScrollPane(jpCovers));
     jtpMain.addTab(Messages.getString("ParameterView.26"), new JajukJScrollPane(jpConfirmations));
     jtpMain.addTab(Messages.getString("ParameterView.139"), new JajukJScrollPane(jpNetwork));
@@ -1661,43 +1105,22 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
       Log.error(e);
       jtpMain.setSelectedIndex(0);
     }
-    jtpMain.addChangeListener(this);
+    jtpMain.addChangeListener(updateHelper);
     setLayout(new MigLayout("insets 10,gapx 10", "[grow]", "[grow][]"));
     add(jtpMain, "wrap,span,grow");
     add(jbOK, "split 2,right,sg group1");
     add(jbDefault, "sg group1");
     // update widgets state
-    updateSelection();
+    updateHelper.updateGUIFromConf();
     ObservationManager.register(this);
   }
 
   /*
    * (non-Javadoc)
-   * 
-   * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
-   */
-  public void itemStateChanged(final ItemEvent e) {
-    if (e.getSource() == jrbFile) { // jrbFile has been selected or
-      // deselected
-      sbSearch.setEnabled(jrbFile.isSelected());
-    }
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent )
-   */
-  public void stateChanged(final ChangeEvent e) {
-    // when changing tab, store it for future jajuk sessions
-    Conf.setProperty(Const.CONF_OPTIONS_TAB, Integer.toString(jtpMain.getSelectedIndex()));
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.base.Observer#update(org.jajuk.base.Event)
    */
+  @Override
   public void update(final JajukEvent event) {
     final JajukEvents subject = event.getSubject();
     if (JajukEvents.PARAMETERS_CHANGE.equals(subject)) {
@@ -1710,199 +1133,34 @@ public class ParameterView extends ViewAdapter implements ActionListener, ItemLi
       SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
-          updateSelection();
+          updateHelper.updateGUIFromConf();
         }
       });
     }
   }
 
-  /**
-   * Set widgets to specified value in options.
-   */
-  private void updateSelection() {
-    jtfHistory.setText(Conf.getString(Const.CONF_HISTORY));
-    if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_ITEM)) {
-      jrbFile.setSelected(true);
-      sbSearch.setEnabled(true);
-    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_LAST)) {
-      jrbLast.setSelected(true);
-    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_LAST_KEEP_POS)) {
-      jrbLastKeepPos.setSelected(true);
-    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_NOTHING)) {
-      jrbNothing.setSelected(true);
-    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_SHUFFLE)) {
-      jrbShuffle.setSelected(true);
-    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_BESTOF)) {
-      jrbBestof.setSelected(true);
-    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_NOVELTIES)) {
-      jrbNovelties.setSelected(true);
-    }
-    // set chosen track in file selection
-    String conf = Conf.getString(Const.CONF_STARTUP_ITEM);
-    String item = conf.substring(conf.indexOf('/') + 1, conf.length());
-    if (!StringUtils.isBlank(item)) {
-      if (conf.matches(SearchResultType.FILE.name() + ".*")) {
-        File file = FileManager.getInstance().getFileByID(item);
-        if (file != null) {
-          sbSearch.setText(file.getTrack().getName());
-        } else {
-          // the file exists no more, remove its id as startup file
-          Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
-        }
-      } else if (conf.matches(SearchResultType.WEBRADIO.name() + ".*")) {
-        WebRadio radio = WebRadioManager.getInstance().getWebRadioByName(item);
-        if (radio != null) {
-          sbSearch.setText(radio.getName());
-        } else {
-          // the file exists no more, remove its id as startup file
-          Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
-        }
-      }
-    } else {
-      sbSearch.setText("");
-    }
-    // Confirmations
-    jcbBeforeDelete.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_DELETE_FILE));
-    jcbBeforeExit.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_EXIT));
-    jcbBeforeRemoveDevice.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_REMOVE_DEVICE));
-    jcbBeforeDeleteCover.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_DELETE_COVER));
-    jcbBeforeClearingHistory.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY));
-    jcbBeforeResetingRatings.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS));
-    jcbBeforeRefactorFiles.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_REFACTOR_FILES));
-    // options
-    jcbDisplayUnmounted.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED));
-    jcbDefaultActionClick.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
-    jcbDefaultActionDrop.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_DROP));
-    jcbHotkeys.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HOTKEYS));
-
-    String rightLanguageDesc = LocaleManager.getDescForLocale(Conf
-        .getString(Const.CONF_OPTIONS_LANGUAGE));
-    // Select the right language
-    int index = 0;
-    for (String desc : LocaleManager.getLocalesDescs()) {
-      if (desc.equals(rightLanguageDesc)) {
-        scbLanguage.setSelectedIndex(index);
-        break;
-      }
-      index++;
-    }
-    scbLanguage.addActionListener(this);
-    scbLogLevel.setSelectedIndex(Integer.parseInt(Conf.getString(Const.CONF_OPTIONS_LOG_LEVEL)));
-    introLength.setValue(Conf.getInt(Const.CONF_OPTIONS_INTRO_LENGTH));
-    introPosition.setValue(Conf.getInt(Const.CONF_OPTIONS_INTRO_BEGIN));
-    jtfBestofSize.setText(Conf.getString(Const.CONF_BESTOF_TRACKS_SIZE));
-    jtfNoveltiesAge.setText(Conf.getString(Const.CONF_OPTIONS_NOVELTIES_AGE));
-    jtfVisiblePlanned.setText(Conf.getString(Const.CONF_OPTIONS_VISIBLE_PLANNED));
-    crossFadeDuration.setValue(Conf.getInt(Const.CONF_FADE_DURATION));
-    jcbUseParentDir.setSelected(Conf.getBoolean(Const.CONF_TAGS_USE_PARENT_DIR));
-    jcbDropPlayedTracksFromQueue.setSelected(Conf
-        .getBoolean(Const.CONF_DROP_PLAYED_TRACKS_FROM_QUEUE));
-    jcbUseVolnorm.setSelected(Conf.getBoolean(Const.CONF_USE_VOLNORM));
-    // advanced
-    final int iBackupSize = Conf.getInt(Const.CONF_BACKUP_SIZE);
-    if (iBackupSize <= 0) { // backup size =0 means no backup
-      jcbBackup.setSelected(false);
-      backupSize.setEnabled(false);
-    } else {
-      jcbBackup.setSelected(true);
-      backupSize.setEnabled(true);
-    }
-    backupSize.setValue(iBackupSize);
-    jcbCollectionEncoding.setSelectedItem(Conf.getString(Const.CONF_COLLECTION_CHARSET));
-    jtfRefactorPattern.setText(Conf.getString(Const.CONF_PATTERN_REFACTOR));
-    jtfAnimationPattern.setText(Conf.getString(Const.CONF_PATTERN_ANIMATION));
-    jtfFrameTitle.setText(Conf.getString(Const.CONF_PATTERN_FRAME_TITLE));
-    jtfBalloonNotifierPattern.setText(Conf.getString(Const.CONF_PATTERN_BALLOON_NOTIFIER));
-    jtfInformationPattern.setText(Conf.getString(Const.CONF_PATTERN_INFORMATION));
-
-    jtfMPlayerPath.setText(Conf.getString(Const.CONF_MPLAYER_PATH_FORCED));
-    jtfMPlayerArgs.setText(Conf.getString(Const.CONF_MPLAYER_ARGS));
-    jtfEnvVariables.setText(Conf.getString(Const.CONF_ENV_VARIABLES));
-    jtfExplorerPath.setText(Conf.getString(Const.CONF_EXPLORER_PATH));
-
-    // Network
-    jcbNoneInternetAccess.setSelected(Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS));
-    final boolean bUseProxy = Conf.getBoolean(Const.CONF_NETWORK_USE_PROXY);
-    jcbProxyNone.setSelected(bUseProxy);
-    jtfProxyHostname.setText(Conf.getString(Const.CONF_NETWORK_PROXY_HOSTNAME));
-    jtfProxyHostname.setEnabled(bUseProxy);
-    jlProxyHostname.setEnabled(bUseProxy);
-    jtfProxyPort.setText(Conf.getString(Const.CONF_NETWORK_PROXY_PORT));
-    jtfProxyPort.setEnabled(bUseProxy);
-    jlProxyPort.setEnabled(bUseProxy);
-    jtfProxyLogin.setText(Conf.getString(Const.CONF_NETWORK_PROXY_LOGIN));
-    jtfProxyLogin.setEnabled(bUseProxy);
-    jlProxyLogin.setEnabled(bUseProxy);
-    jtfProxyPwd.setText(UtilString.rot13(Conf.getString(Const.CONF_NETWORK_PROXY_PWD)));
-    jtfProxyPwd.setEnabled(bUseProxy);
-    jlProxyPwd.setEnabled(bUseProxy);
-    connectionTO.setValue(Conf.getInt(Const.CONF_NETWORK_CONNECTION_TO));
-    if (!Conf.getBoolean(Const.CONF_NETWORK_USE_PROXY)) {
-      jcbProxyNone.setSelected(true);
-    } else if (Const.PROXY_TYPE_HTTP.equals(Conf.getString(Const.CONF_NETWORK_PROXY_TYPE))) {
-      jcbProxyHttp.setSelected(true);
-    } else if (Const.PROXY_TYPE_SOCKS.equals(Conf.getString(Const.CONF_NETWORK_PROXY_TYPE))) {
-      jcbProxySocks.setSelected(true);
-    }
-    // Covers
-    jcbAutoCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
-    jlCoverSize.setEnabled(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
-    jcb3dCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER));
-    jcbCoverSize.setEnabled(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
-    jcbCoverSize.setSelectedIndex(Conf.getInt(Const.CONF_COVERS_SIZE));
-    jcbShuffleCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_SHUFFLE));
-    jcbSaveExplorerFriendly.setSelected(Conf.getBoolean(Const.CONF_COVERS_SAVE_EXPLORER_FRIENDLY));
-    jtfDefaultCoverSearchPattern.setText(Conf.getString(Const.FILE_DEFAULT_COVER));
-    jcbAudioScrobbler.setSelected(Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE));
-    jcbEnableLastFMInformation.setSelected(Conf.getBoolean(Const.CONF_LASTFM_INFO));
-    jtfASUser.setText(Conf.getString(Const.CONF_LASTFM_USER));
-    jpfASPassword.setText(UtilString.rot13(Conf.getString(Const.CONF_LASTFM_PASSWORD)));
-    if (!Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE)) {
-      jlASUser.setEnabled(false);
-      jtfASUser.setEnabled(false);
-      jlASPassword.setEnabled(false);
-      jpfASPassword.setEnabled(false);
-    }
-    // UI
-    String notificatorType = Messages.getString(NOTIFICATOR_PREFIX
-        + Conf.getString(Const.CONF_UI_NOTIFICATOR_TYPE));
-    jcbNotificationType.setSelectedItem(notificatorType);
-
-    jcbShowSystray.setSelected(Conf.getBoolean(Const.CONF_SHOW_SYSTRAY));
-    jcbMinimizeToTray.setSelected(Conf.getBoolean(Const.CONF_MINIMIZE_TO_TRAY));
-
-    scbLAF.removeActionListener(this);
-    scbLAF.setSelectedItem(Conf.getString(Const.CONF_OPTIONS_LNF));
-    scbLAF.addActionListener(this);
-    jsPerspectiveSize.setValue(Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE));
-  }
-
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.Container#removeAll()
    */
   @Override
   public void removeAll() {
     // We have to override removeAll() to work around a memory leak related to SearchBox..
-
     // make sure that the search box stops waking to free up the reference to the Timer
     sbSearch.close();
-
     super.removeAll();
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.ui.views.ViewAdapter#cleanup()
    */
   @Override
   public void cleanup() {
     // make sure that the search box stops to free up the reference to the Timer
     sbSearch.close();
-
     super.cleanup();
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/ParameterViewGUIHelper.java b/src/main/java/org/jajuk/ui/views/ParameterViewGUIHelper.java
new file mode 100644
index 0000000..4769314
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/views/ParameterViewGUIHelper.java
@@ -0,0 +1,892 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.views;
+
+import java.awt.SystemTray;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Properties;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.SwingWorker;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.apache.commons.lang.StringUtils;
+import org.jajuk.base.AlbumManager;
+import org.jajuk.base.DeviceManager;
+import org.jajuk.base.File;
+import org.jajuk.base.FileManager;
+import org.jajuk.base.SearchResult.SearchResultType;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.services.core.RatingService;
+import org.jajuk.services.core.SessionService;
+import org.jajuk.services.notification.NotificatorTypes;
+import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioHelper;
+import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.ui.actions.ActionManager;
+import org.jajuk.ui.actions.JajukActions;
+import org.jajuk.ui.thumbnails.ThumbnailManager;
+import org.jajuk.ui.widgets.InformationJPanel;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.DownloadManager;
+import org.jajuk.util.LocaleManager;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilGUI;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.UtilSystem;
+import org.jajuk.util.log.Log;
+
+/**
+ * Helper class containing GUI update code from and to configuration.
+ */
+public class ParameterViewGUIHelper implements ActionListener, ItemListener, ChangeListener {
+  /** Associated Parameter view. */
+  ParameterView pv;
+  /** Do some updates require a restart ?. */
+  boolean someOptionsAppliedAtNextStartup = false;
+
+  /**
+   * Default constructor.
+   *
+   * @param pv the associated parameter view
+   */
+  ParameterViewGUIHelper(ParameterView pv) {
+    this.pv = pv;
+  }
+
+  /**
+  * Apply parameters from GUI to configuration.
+  */
+  void updateConfFromGUI() {
+    // Options
+    updateConfFromGUIOptions();
+    // Startup
+    updateConfFromGUIStartup();
+    // Confirmations
+    updateConfFromGUIConfirmation();
+    // History
+    updateConfFromGUIHistory();
+    // Patterns
+    updateConfFromGUIPatterns();
+    // Advanced
+    updateConfFromGUIAdvanced();
+    // GUI
+    updateConfFromGUIGUI();
+    // If jajuk home changes, write new path in bootstrap file
+    handleWorkspaceChange();
+    // Network
+    updateConfFromGUINetwork();
+    // Covers
+    updateConfFromGUICover();
+    // display a message
+    InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.109"),
+        InformationJPanel.MessageType.INFORMATIVE);
+  }
+
+  /**
+   * Set widgets to specified value in options.
+   */
+  void updateGUIFromConf() {
+    // History
+    updateGUIFromConfHistory();
+    // Confirmations
+    updateGUIFromConfConfirmations();
+    // Options
+    updateGUIFromConfOptions();
+    // Advanced
+    updateGUIFromConfAdvanced();
+    //Startup
+    updateGUIFromConfStartup();
+    // Network
+    updateGUIFromConfNetwork();
+    // Covers
+    updateGUIFromConfCovers();
+    // UI
+    updateGUIFromConfGUI();
+  }
+
+  /**
+   * Update history tab.
+   *
+   */
+  private void updateGUIFromConfHistory() {
+    pv.jtfHistory.setText(Conf.getString(Const.CONF_HISTORY));
+    pv.jcbManualRatings.setSelected(Conf.getBoolean(Const.CONF_MANUAL_RATINGS));
+  }
+
+  /**
+   * Update Confirmations tab.
+   *
+   */
+  private void updateGUIFromConfConfirmations() {
+    pv.jcbBeforeDelete.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_DELETE_FILE));
+    pv.jcbBeforeExit.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_EXIT));
+    pv.jcbBeforeRemoveDevice.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_REMOVE_DEVICE));
+    pv.jcbBeforeDeleteCover.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_DELETE_COVER));
+    pv.jcbBeforeClearingHistory
+        .setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY));
+    pv.jcbBeforeResetingRatings
+        .setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS));
+    pv.jcbBeforeRefactorFiles.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_REFACTOR_FILES));
+    pv.jcbBeforeWritingTag.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_BEFORE_TAG_WRITE));
+  }
+
+  /**
+   * Update "Options", "LastFM" and "Modes" tabs.
+   */
+  private void updateGUIFromConfOptions() {
+    pv.jcbDisplayUnmounted.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED));
+    pv.jcbDefaultActionClick.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
+    pv.jcbDefaultActionDrop.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_DROP));
+    pv.jcbHotkeys.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HOTKEYS));
+    String rightLanguageDesc = LocaleManager.getDescForLocale(Conf
+        .getString(Const.CONF_OPTIONS_LANGUAGE));
+    // Select the right language
+    int index = 0;
+    for (String desc : LocaleManager.getLocalesDescs()) {
+      if (desc.equals(rightLanguageDesc)) {
+        pv.scbLanguage.setSelectedIndex(index);
+        break;
+      }
+      index++;
+    }
+    pv.scbLanguage.addActionListener(this);
+    pv.scbLogLevel.setSelectedIndex(Integer.parseInt(Conf.getString(Const.CONF_OPTIONS_LOG_LEVEL)));
+    pv.introLength.setValue(Conf.getInt(Const.CONF_OPTIONS_INTRO_LENGTH));
+    pv.introPosition.setValue(Conf.getInt(Const.CONF_OPTIONS_INTRO_BEGIN));
+    pv.jtfBestofSize.setText(Conf.getString(Const.CONF_BESTOF_TRACKS_SIZE));
+    pv.jtfNoveltiesAge.setText(Conf.getString(Const.CONF_OPTIONS_NOVELTIES_AGE));
+    pv.crossFadeDuration.setValue(Conf.getInt(Const.CONF_FADE_DURATION));
+    pv.jcbUseParentDir.setSelected(Conf.getBoolean(Const.CONF_TAGS_USE_PARENT_DIR));
+    pv.jcbUseVolnorm.setSelected(Conf.getBoolean(Const.CONF_USE_VOLNORM));
+    pv.jcbEnableBitPerfect.setSelected(Conf.getBoolean(Const.CONF_BIT_PERFECT));
+    // Disable features incompatible with Bit-perfect mode
+    pv.jcbUseVolnorm.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
+    pv.crossFadeDuration.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
+    pv.jcbShowVideos.setSelected(Conf.getBoolean(Const.CONF_SHOW_VIDEOS));
+    pv.jcbPreserveFileDates.setSelected(Conf.getBoolean(Const.CONF_PRESERVE_FILE_DATES));
+  }
+
+  /**
+   * Update Start-up tab.
+   */
+  private void updateGUIFromConfStartup() {
+    if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_ITEM)) {
+      pv.jrbFile.setSelected(true);
+      pv.sbSearch.setEnabled(true);
+    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_LAST)) {
+      pv.jrbLast.setSelected(true);
+    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_LAST_KEEP_POS)) {
+      pv.jrbLastKeepPos.setSelected(true);
+    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_NOTHING)) {
+      pv.jrbNothing.setSelected(true);
+    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_SHUFFLE)) {
+      pv.jrbShuffle.setSelected(true);
+    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_BESTOF)) {
+      pv.jrbBestof.setSelected(true);
+    } else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_NOVELTIES)) {
+      pv.jrbNovelties.setSelected(true);
+    }
+    // set chosen track in file selection
+    String conf = Conf.getString(Const.CONF_STARTUP_ITEM);
+    String item = conf.substring(conf.indexOf('/') + 1, conf.length());
+    if (!StringUtils.isBlank(item)) {
+      if (conf.matches(SearchResultType.FILE.name() + ".*")) {
+        File file = FileManager.getInstance().getFileByID(item);
+        if (file != null) {
+          pv.sbSearch.setText(file.getTrack().getName());
+        } else {
+          // the file exists no more, remove its id as startup file
+          Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
+        }
+      } else if (conf.matches(SearchResultType.WEBRADIO.name() + ".*")) {
+        WebRadio radio = WebRadioManager.getInstance().getWebRadioByName(item);
+        if (radio != null) {
+          pv.sbSearch.setText(radio.getName());
+        } else {
+          // the file exists no more, remove its id as startup file
+          Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
+        }
+      }
+    } else {
+      pv.sbSearch.setText("");
+    }
+  }
+
+  /**
+   * Update advanced tab.
+   *
+   */
+  private void updateGUIFromConfAdvanced() {
+    final int backupSize = Conf.getInt(Const.CONF_BACKUP_SIZE);
+    if (backupSize <= 0) { // backup size =0 means no backup
+      pv.jcbBackup.setSelected(false);
+      pv.backupSize.setEnabled(false);
+    } else {
+      pv.jcbBackup.setSelected(true);
+      pv.backupSize.setEnabled(true);
+    }
+    pv.backupSize.setValue(backupSize);
+    pv.jtfRefactorPattern.setText(Conf.getString(Const.CONF_PATTERN_REFACTOR));
+    pv.jtfAnimationPattern.setText(Conf.getString(Const.CONF_PATTERN_ANIMATION));
+    pv.jtfFrameTitle.setText(Conf.getString(Const.CONF_PATTERN_FRAME_TITLE));
+    pv.jtfBalloonNotifierPattern.setText(Conf.getString(Const.CONF_PATTERN_BALLOON_NOTIFIER));
+    pv.jtfInformationPattern.setText(Conf.getString(Const.CONF_PATTERN_INFORMATION));
+    pv.jtfMPlayerPath.setText(Conf.getString(Const.CONF_MPLAYER_PATH_FORCED));
+    pv.jtfMPlayerArgs.setText(Conf.getString(Const.CONF_MPLAYER_ARGS));
+    pv.jtfEnvVariables.setText(Conf.getString(Const.CONF_ENV_VARIABLES));
+    pv.jtfExplorerPath.setText(Conf.getString(Const.CONF_EXPLORER_PATH));
+    pv.jcbRegexp.setSelected(Conf.getBoolean(Const.CONF_REGEXP));
+    pv.jcbCheckUpdates.setSelected(Conf.getBoolean(Const.CONF_CHECK_FOR_UPDATE));
+    pv.jcbForceFileDate.setSelected(Conf.getBoolean(Const.CONF_FORCE_FILE_DATE));
+    pv.psJajukWorkspace.setURL(Conf.getString(Const.CONF_TARGET_WORKSPACE_PATH));
+  }
+
+  /**
+   * Update selection network.
+   *
+   */
+  private void updateGUIFromConfNetwork() {
+    pv.jcbNoneInternetAccess.setSelected(Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS));
+    final boolean bUseProxy = Conf.getBoolean(Const.CONF_NETWORK_USE_PROXY);
+    pv.jcbProxyNone.setSelected(bUseProxy);
+    pv.jtfProxyHostname.setText(Conf.getString(Const.CONF_NETWORK_PROXY_HOSTNAME));
+    pv.jtfProxyHostname.setEnabled(bUseProxy);
+    pv.jlProxyHostname.setEnabled(bUseProxy);
+    pv.jtfProxyPort.setText(Conf.getString(Const.CONF_NETWORK_PROXY_PORT));
+    pv.jtfProxyPort.setEnabled(bUseProxy);
+    pv.jlProxyPort.setEnabled(bUseProxy);
+    pv.jtfProxyLogin.setText(Conf.getString(Const.CONF_NETWORK_PROXY_LOGIN));
+    pv.jtfProxyLogin.setEnabled(bUseProxy);
+    pv.jlProxyLogin.setEnabled(bUseProxy);
+    pv.jtfProxyPwd.setText(UtilString.rot13(Conf.getString(Const.CONF_NETWORK_PROXY_PWD)));
+    pv.jtfProxyPwd.setEnabled(bUseProxy);
+    pv.jlProxyPwd.setEnabled(bUseProxy);
+    pv.connectionTO.setValue(Conf.getInt(Const.CONF_NETWORK_CONNECTION_TO));
+    if (!Conf.getBoolean(Const.CONF_NETWORK_USE_PROXY)) {
+      pv.jcbProxyNone.setSelected(true);
+    } else if (Const.PROXY_TYPE_HTTP.equals(Conf.getString(Const.CONF_NETWORK_PROXY_TYPE))) {
+      pv.jcbProxyHttp.setSelected(true);
+    } else if (Const.PROXY_TYPE_SOCKS.equals(Conf.getString(Const.CONF_NETWORK_PROXY_TYPE))) {
+      pv.jcbProxySocks.setSelected(true);
+    }
+  }
+
+  /**
+   * Update selection covers.
+   *
+   */
+  private void updateGUIFromConfCovers() {
+    pv.jcbAutoCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
+    pv.jlCoverSize.setEnabled(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
+    pv.jcb3dCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER));
+    pv.jcb3dCoverFS.setSelected(Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER_FS_MODE));
+    pv.jcbCoverSize.setEnabled(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
+    pv.jcbCoverSize.setSelectedIndex(Conf.getInt(Const.CONF_COVERS_SIZE));
+    pv.jcbShuffleCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_SHUFFLE));
+    pv.jcbSaveExplorerFriendly.setSelected(Conf
+        .getBoolean(Const.CONF_COVERS_SAVE_EXPLORER_FRIENDLY));
+    pv.jtfDefaultCoverSearchPattern.setText(Conf.getString(Const.FILE_DEFAULT_COVER));
+    pv.jcbAudioScrobbler.setSelected(Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE));
+    pv.jcbEnableLastFMInformation.setSelected(Conf.getBoolean(Const.CONF_LASTFM_INFO));
+    pv.jtfASUser.setText(Conf.getString(Const.CONF_LASTFM_USER));
+    pv.jpfASPassword.setText(UtilString.rot13(Conf.getString(Const.CONF_LASTFM_PASSWORD)));
+    if (!Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE)) {
+      pv.jlASUser.setEnabled(false);
+      pv.jtfASUser.setEnabled(false);
+      pv.jlASPassword.setEnabled(false);
+      pv.jpfASPassword.setEnabled(false);
+    }
+  }
+
+  /**
+   * Update GUI tab.
+   */
+  private void updateGUIFromConfGUI() {
+    String notificatorType = Messages.getString(ParameterView.NOTIFICATOR_PREFIX
+        + Conf.getString(Const.CONF_UI_NOTIFICATOR_TYPE));
+    pv.jcbNotificationType.setSelectedItem(notificatorType);
+    pv.jcbShowSystray.setSelected(Conf.getBoolean(Const.CONF_SHOW_SYSTRAY));
+    pv.jcbMinimizeToTray.setEnabled(SystemTray.isSupported() && pv.jcbShowSystray.isSelected());
+    pv.jcbMinimizeToTray.setSelected(Conf.getBoolean(Const.CONF_MINIMIZE_TO_TRAY));
+    pv.jcbClickTrayAlwaysDisplayWindow.setSelected(Conf
+        .getBoolean(Const.CONF_TRAY_CLICK_DISPLAY_WINDOW));
+    pv.jcbClickTrayAlwaysDisplayWindow.setEnabled(SystemTray.isSupported());
+    pv.jcbSplashscreen.setSelected(Conf.getBoolean(Const.CONF_SPLASH_SCREEN));
+    pv.scbLAF.removeActionListener(this);
+    pv.scbLAF.setSelectedItem(Conf.getString(Const.CONF_OPTIONS_LNF));
+    pv.scbLAF.addActionListener(this);
+    pv.jsPerspectiveSize.setValue(Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE));
+    pv.jcbTitleAnimation.setSelected(Conf.getBoolean(Const.CONF_TITLE_ANIMATION));
+  }
+
+  /**
+  * Apply parameters options.
+  * Options for "Options", "LastFM", "Sound" and "Modes" tabs
+  *
+  */
+  private void updateConfFromGUIOptions() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    properties.put(Const.CONF_OPTIONS_HIDE_UNMOUNTED,
+        Boolean.toString(pv.jcbDisplayUnmounted.isSelected()));
+    properties.put(Const.CONF_OPTIONS_PUSH_ON_CLICK,
+        Boolean.toString(pv.jcbDefaultActionClick.isSelected()));
+    properties.put(Const.CONF_OPTIONS_PUSH_ON_DROP,
+        Boolean.toString(pv.jcbDefaultActionDrop.isSelected()));
+    properties.put(Const.CONF_OPTIONS_HOTKEYS, Boolean.toString(pv.jcbHotkeys.isSelected()));
+    properties.put(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE,
+        Boolean.toString(pv.jcbAudioScrobbler.isSelected()));
+    properties.put(Const.CONF_LASTFM_INFO,
+        Boolean.toString(pv.jcbEnableLastFMInformation.isSelected()));
+    properties.put(Const.CONF_LASTFM_USER, pv.jtfASUser.getText());
+    properties.put(Const.CONF_LASTFM_PASSWORD,
+        UtilString.rot13(new String(pv.jpfASPassword.getPassword())));
+    final int iLogLevel = pv.scbLogLevel.getSelectedIndex();
+    Log.setVerbosity(iLogLevel);
+    properties.put(Const.CONF_OPTIONS_LOG_LEVEL, Integer.toString(iLogLevel));
+    properties.put(Const.CONF_OPTIONS_INTRO_BEGIN, Integer.toString(pv.introPosition.getValue()));
+    properties.put(Const.CONF_OPTIONS_INTRO_LENGTH, Integer.toString(pv.introLength.getValue()));
+    properties.put(Const.CONF_TAGS_USE_PARENT_DIR,
+        Boolean.toString(pv.jcbUseParentDir.isSelected()));
+    final String sBestofSize = pv.jtfBestofSize.getText();
+    if (!sBestofSize.isEmpty()) {
+      properties.put(Const.CONF_BESTOF_TRACKS_SIZE, sBestofSize);
+    }
+    Locale locale = LocaleManager.getLocaleForDesc(((JLabel) pv.scbLanguage.getSelectedItem())
+        .getText());
+    final String sLocal = locale.getLanguage();
+    properties.put(Const.CONF_OPTIONS_LANGUAGE, sLocal);
+    // force refresh of bestof files
+    RatingService.setRateHasChanged(true);
+    final String sNoveltiesAge = pv.jtfNoveltiesAge.getText();
+    if (!sNoveltiesAge.isEmpty()) {
+      properties.put(Const.CONF_OPTIONS_NOVELTIES_AGE, sNoveltiesAge);
+    }
+    final int oldDuration = Conf.getInt(Const.CONF_FADE_DURATION);
+    // Show an hideable message if user set cross fade under linux for sound
+    // server information
+    if (UtilSystem.isUnderLinux() && (oldDuration == 0)
+        && (oldDuration != pv.crossFadeDuration.getValue())) {
+      Messages.showHideableWarningMessage(Messages.getString("ParameterView.210"),
+          Const.CONF_NOT_SHOW_AGAIN_CROSS_FADE);
+    }
+    properties.put(Const.CONF_FADE_DURATION, Integer.toString(pv.crossFadeDuration.getValue()));
+    properties.put(Const.CONF_USE_VOLNORM, Boolean.toString(pv.jcbUseVolnorm.isSelected()));
+    properties.put(Const.CONF_BIT_PERFECT, Boolean.toString(pv.jcbEnableBitPerfect.isSelected()));
+    boolean oldShowVideo = Conf.getBoolean(Const.CONF_SHOW_VIDEOS);
+    if (oldShowVideo != pv.jcbShowVideos.isSelected()) {
+      this.someOptionsAppliedAtNextStartup = true;
+    }
+    properties.put(Const.CONF_SHOW_VIDEOS, Boolean.toString(pv.jcbShowVideos.isSelected()));
+    properties.put(Const.CONF_PRESERVE_FILE_DATES,
+        Boolean.toString(pv.jcbPreserveFileDates.isSelected()));
+    Conf.setProperties(properties);
+  }
+
+  /**
+   * Apply parameters startup.
+   *
+   */
+  private void updateConfFromGUIStartup() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    if (pv.jrbNothing.isSelected()) {
+      properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOTHING);
+    } else if (pv.jrbLast.isSelected()) {
+      properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST);
+    } else if (pv.jrbLastKeepPos.isSelected()) {
+      properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
+    } else if (pv.jrbShuffle.isSelected()) {
+      properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_SHUFFLE);
+    } else if (pv.jrbFile.isSelected()) {
+      properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_ITEM);
+    } else if (pv.jrbBestof.isSelected()) {
+      properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_BESTOF);
+    } else if (pv.jrbNovelties.isSelected()) {
+      properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOVELTIES);
+    }
+    Conf.setProperties(properties);
+  }
+
+  /**
+   * Apply parameters confirmation.
+   *
+   */
+  private void updateConfFromGUIConfirmation() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    properties.put(Const.CONF_CONFIRMATIONS_DELETE_FILE,
+        Boolean.toString(pv.jcbBeforeDelete.isSelected()));
+    properties.put(Const.CONF_CONFIRMATIONS_EXIT, Boolean.toString(pv.jcbBeforeExit.isSelected()));
+    properties.put(Const.CONF_CONFIRMATIONS_REMOVE_DEVICE,
+        Boolean.toString(pv.jcbBeforeRemoveDevice.isSelected()));
+    properties.put(Const.CONF_CONFIRMATIONS_DELETE_COVER,
+        Boolean.toString(pv.jcbBeforeDeleteCover.isSelected()));
+    properties.put(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY,
+        Boolean.toString(pv.jcbBeforeClearingHistory.isSelected()));
+    properties.put(Const.CONF_CONFIRMATIONS_RESET_RATINGS,
+        Boolean.toString(pv.jcbBeforeResetingRatings.isSelected()));
+    properties.put(Const.CONF_CONFIRMATIONS_REFACTOR_FILES,
+        Boolean.toString(pv.jcbBeforeRefactorFiles.isSelected()));
+    properties.put(Const.CONF_CONFIRMATIONS_BEFORE_TAG_WRITE,
+        Boolean.toString(pv.jcbBeforeWritingTag.isSelected()));
+    Conf.setProperties(properties);
+  }
+
+  /**
+   * Apply parameters history.
+   *
+   */
+  private void updateConfFromGUIHistory() {
+    final String sHistoryDuration = pv.jtfHistory.getText();
+    if (!sHistoryDuration.isEmpty()) {
+      Conf.setProperty(Const.CONF_HISTORY, sHistoryDuration);
+    }
+    boolean oldManualValue = Conf.getBoolean(Const.CONF_MANUAL_RATINGS);
+    if (pv.jcbManualRatings.isSelected() != oldManualValue) {
+      Conf.setProperty(Const.CONF_MANUAL_RATINGS,
+          Boolean.toString(pv.jcbManualRatings.isSelected()));
+      ObservationManager.notify(new JajukEvent(JajukEvents.RATING_MODE_CHANGED));
+    }
+  }
+
+  /**
+   * Apply parameters patterns.
+   *
+   */
+  private void updateConfFromGUIPatterns() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    properties.put(Const.CONF_PATTERN_REFACTOR, pv.jtfRefactorPattern.getText());
+    properties.put(Const.CONF_PATTERN_ANIMATION, pv.jtfAnimationPattern.getText());
+    properties.put(Const.CONF_PATTERN_FRAME_TITLE, pv.jtfFrameTitle.getText());
+    properties.put(Const.CONF_PATTERN_BALLOON_NOTIFIER, pv.jtfBalloonNotifierPattern.getText());
+    properties.put(Const.CONF_PATTERN_INFORMATION, pv.jtfInformationPattern.getText());
+    Conf.setProperties(properties);
+  }
+
+  /**
+   * Apply parameters advanced.
+   *
+   */
+  private void updateConfFromGUIAdvanced() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    properties.put(Const.CONF_BACKUP_SIZE, Integer.toString(pv.backupSize.getValue()));
+    properties.put(Const.CONF_REGEXP, Boolean.toString(pv.jcbRegexp.isSelected()));
+    properties.put(Const.CONF_CHECK_FOR_UPDATE, Boolean.toString(pv.jcbCheckUpdates.isSelected()));
+    properties.put(Const.CONF_FORCE_FILE_DATE, Boolean.toString(pv.jcbForceFileDate.isSelected()));
+    // Apply new mplayer path and display a warning message if changed
+    final String oldMplayerPath = Conf.getString(Const.CONF_MPLAYER_PATH_FORCED);
+    if (!(oldMplayerPath.equals(pv.jtfMPlayerPath.getText()))) {
+      this.someOptionsAppliedAtNextStartup = true;
+    }
+    properties.put(Const.CONF_MPLAYER_PATH_FORCED, pv.jtfMPlayerPath.getText());
+    properties.put(Const.CONF_MPLAYER_ARGS, pv.jtfMPlayerArgs.getText());
+    properties.put(Const.CONF_ENV_VARIABLES, pv.jtfEnvVariables.getText());
+    properties.put(Const.CONF_EXPLORER_PATH, pv.jtfExplorerPath.getText());
+    Conf.setProperties(properties);
+  }
+
+  /**
+   * Apply parameters gui.
+   *
+   */
+  private void updateConfFromGUIGUI() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    properties.put(Const.CONF_CATALOG_PAGE_SIZE, Integer.toString(pv.jsCatalogPages.getValue()));
+    properties.put(Const.CONF_SHOW_POPUPS, Boolean.toString(pv.jcbShowPopups.isSelected()));
+    properties.put(Const.CONF_SPLASH_SCREEN, Boolean.toString(pv.jcbSplashscreen.isSelected()));
+    final int oldFont = Conf.getInt(Const.CONF_FONTS_SIZE);
+    // Display a message if font size changed
+    if (oldFont != pv.jsFonts.getValue()) {
+      this.someOptionsAppliedAtNextStartup = true;
+    }
+    properties.put(Const.CONF_FONTS_SIZE, Integer.toString(pv.jsFonts.getValue()));
+    // Notificator type
+    String notificatorTypeDisplayed = (String) pv.jcbNotificationType.getSelectedItem();
+    for (NotificatorTypes notificatorType : NotificatorTypes.values()) {
+      if (Messages.getString(ParameterView.NOTIFICATOR_PREFIX + notificatorType).equals(
+          notificatorTypeDisplayed)) {
+        properties.put(Const.CONF_UI_NOTIFICATOR_TYPE, notificatorType.name());
+      }
+    }
+    // Message if show systray is changed
+    final boolean bOldShowSystray = Conf.getBoolean(Const.CONF_SHOW_SYSTRAY);
+    if (bOldShowSystray != pv.jcbShowSystray.isSelected()) {
+      this.someOptionsAppliedAtNextStartup = true;
+    }
+    properties.put(Const.CONF_SHOW_SYSTRAY, Boolean.toString(pv.jcbShowSystray.isSelected()));
+    properties.put(Const.CONF_TITLE_ANIMATION, Boolean.toString(pv.jcbTitleAnimation.isSelected()));
+    // Minimize to tray
+    properties
+        .put(Const.CONF_MINIMIZE_TO_TRAY, Boolean.toString(pv.jcbMinimizeToTray.isSelected()));
+    properties.put(Const.CONF_TRAY_CLICK_DISPLAY_WINDOW,
+        Boolean.toString(pv.jcbClickTrayAlwaysDisplayWindow.isSelected()));
+    final int oldPerspectiveSize = Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE);
+    // If we perspective size changed and no font message have been already
+    // displayed, display a message
+    if (oldPerspectiveSize != pv.jsPerspectiveSize.getValue()) {
+      this.someOptionsAppliedAtNextStartup = true;
+    }
+    properties.put(Const.CONF_PERSPECTIVE_ICONS_SIZE,
+        Integer.toString(pv.jsPerspectiveSize.getValue()));
+    // LAF change
+    final String oldTheme = Conf.getString(Const.CONF_OPTIONS_LNF);
+    properties.put(Const.CONF_OPTIONS_LNF, (String) pv.scbLAF.getSelectedItem());
+    if (!oldTheme.equals(pv.scbLAF.getSelectedItem())) {
+      // theme will be applied at next startup
+      Messages.showHideableWarningMessage(Messages.getString("ParameterView.233"),
+          Const.CONF_NOT_SHOW_AGAIN_LAF_CHANGE);
+      pv.bLAFMessage = true;
+    }
+    Conf.setProperties(properties);
+  }
+
+  /**
+  * Apply parameters network.
+  *
+  */
+  private void updateConfFromGUINetwork() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    properties.put(Const.CONF_NETWORK_NONE_INTERNET_ACCESS,
+        Boolean.toString(pv.jcbNoneInternetAccess.isSelected()));
+    properties.put(Const.CONF_NETWORK_USE_PROXY, Boolean.toString(!pv.jcbProxyNone.isSelected()));
+    if (pv.jcbProxyHttp.isSelected()) {
+      properties.put(Const.CONF_NETWORK_PROXY_TYPE, Const.PROXY_TYPE_HTTP);
+    } else if (pv.jcbProxySocks.isSelected()) {
+      properties.put(Const.CONF_NETWORK_PROXY_TYPE, Const.PROXY_TYPE_SOCKS);
+    }
+    properties.put(Const.CONF_NETWORK_PROXY_HOSTNAME, pv.jtfProxyHostname.getText());
+    properties.put(Const.CONF_NETWORK_PROXY_PORT, pv.jtfProxyPort.getText());
+    properties.put(Const.CONF_NETWORK_PROXY_LOGIN, pv.jtfProxyLogin.getText());
+    properties.put(Const.CONF_NETWORK_PROXY_PWD,
+        UtilString.rot13(new String(pv.jtfProxyPwd.getPassword())));
+    properties.put(Const.CONF_NETWORK_CONNECTION_TO, Integer.toString(pv.connectionTO.getValue()));
+    Conf.setProperties(properties);
+    // Force global reload of proxy variables
+    DownloadManager.setDefaultProxySettings();
+  }
+
+  /**
+   * Apply parameters cover.
+   *
+   */
+  private void updateConfFromGUICover() {
+    HashMap<String, String> properties = new HashMap<String, String>(10);
+    properties.put(Const.CONF_COVERS_MIRROW_COVER, Boolean.toString(pv.jcb3dCover.isSelected()));
+    properties.put(Const.CONF_COVERS_MIRROW_COVER_FS_MODE,
+        Boolean.toString(pv.jcb3dCoverFS.isSelected()));
+    ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
+    properties.put(Const.CONF_COVERS_AUTO_COVER, Boolean.toString(pv.jcbAutoCover.isSelected()));
+    properties.put(Const.CONF_COVERS_SHUFFLE, Boolean.toString(pv.jcbShuffleCover.isSelected()));
+    properties.put(Const.CONF_COVERS_SAVE_EXPLORER_FRIENDLY,
+        Boolean.toString(pv.jcbSaveExplorerFriendly.isSelected()));
+    properties.put(Const.CONF_COVERS_SIZE, Integer.toString(pv.jcbCoverSize.getSelectedIndex()));
+    properties.put(Const.FILE_DEFAULT_COVER, pv.jtfDefaultCoverSearchPattern.getText());
+    Conf.setProperties(properties);
+  }
+
+  /**
+  * Handle workspace change.
+  *
+  */
+  private void handleWorkspaceChange() {
+    if (!Conf.getString(Const.CONF_TARGET_WORKSPACE_PATH).equals(pv.psJajukWorkspace.getUrl())) {
+      Conf.setProperty(Const.CONF_TARGET_WORKSPACE_PATH, pv.psJajukWorkspace.getUrl());
+      // Check workspace directory
+      if (!pv.psJajukWorkspace.getUrl().trim().isEmpty()) {
+        // Check workspace presence and create it if required
+        final java.io.File fWorkspace = new java.io.File(pv.psJajukWorkspace.getUrl());
+        if (!fWorkspace.exists() && !fWorkspace.mkdirs()) {
+          Log.warn("Could not create directory " + fWorkspace.toString());
+        }
+        if (!fWorkspace.canRead()) {
+          Messages.showErrorMessage(165);
+          return;
+        }
+      }
+      try {
+        final String newWorkspace = pv.psJajukWorkspace.getUrl();
+        // If target workspace doesn't exist, copy current repository to
+        // the new workspace
+        // (keep old repository for security and for use
+        // by others users in multi-session mode)
+        boolean bPreviousPathExist = true;
+        // bPreviousPathExist is true if destination workspace already
+        // exists,
+        // it is then only a workspace switch
+        if (!new java.io.File(pv.psJajukWorkspace.getUrl() + '/'
+            + (SessionService.isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk"))
+            .exists()) {
+          UtilGUI.waiting();
+          final java.io.File from = SessionService.getConfFileByPath("");
+          final java.io.File dest = new java.io.File(newWorkspace + '/'
+              + (SessionService.isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk"));
+          UtilSystem.copyRecursively(from, dest);
+          bPreviousPathExist = false;
+        }
+        // Change the workspace so the very last conf (like current
+        // track)
+        // will be saved directly to target workspace. We don't do
+        // this if the workspace already exist to avoid overwriting other
+        // configuration.
+        SessionService.setWorkspace(pv.psJajukWorkspace.getUrl());
+        //Commit the bootstrap file
+        SessionService.commitBootstrapFile();
+        UtilGUI.stopWaiting();
+        // Display a warning message and restart Jajuk
+        if (bPreviousPathExist) {
+          Messages.getChoice(Messages.getString("ParameterView.247"), JOptionPane.DEFAULT_OPTION,
+              JOptionPane.INFORMATION_MESSAGE);
+        } else {
+          Messages.getChoice(Messages.getString("ParameterView.209"), JOptionPane.DEFAULT_OPTION,
+              JOptionPane.INFORMATION_MESSAGE);
+        }
+        // Exit Jajuk
+        try {
+          ActionManager.getAction(JajukActions.EXIT).perform(null);
+        } catch (Exception e1) {
+          Log.error(e1);
+        }
+      } catch (final Exception e) {
+        Messages.showErrorMessage(24);
+        Log.error(e);
+      }
+    }
+  }
+
+  /*
+  * (non-Javadoc)
+  *
+  * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+  */
+  @Override
+  public void actionPerformed(final ActionEvent e) {
+    if (e.getSource() == pv.jbClearHistory) {
+      // show confirmation message if required
+      if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY)) {
+        final int iResu = Messages.getChoice(Messages.getString("Confirmation_clear_history"),
+            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
+        if (iResu != JOptionPane.YES_OPTION) {
+          return;
+        }
+      }
+      ObservationManager.notify(new JajukEvent(JajukEvents.CLEAR_HISTORY));
+    } else if (e.getSource() == pv.scbLAF) {
+      // Refresh full GUI at each LAF change as a preview
+      UtilGUI.setupSubstanceLookAndFeel((String) pv.scbLAF.getSelectedItem());
+      UtilGUI.updateAllUIs();
+    } else if (e.getSource() == pv.jbResetRatings) {
+      // show confirmation message if required
+      if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS)) {
+        final int iResu = Messages.getChoice(Messages.getString("Confirmation_reset_ratings"),
+            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
+        if (iResu != JOptionPane.YES_OPTION) {
+          return;
+        }
+      }
+      ObservationManager.notify(new JajukEvent(JajukEvents.RATE_RESET));
+    } else if (e.getSource() == pv.jbResetPreferences) {
+      // show confirmation message if required
+      if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS)) {
+        final int iResu = Messages.getChoice(Messages.getString("Confirmation_reset_preferences"),
+            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
+        if (iResu != JOptionPane.YES_OPTION) {
+          return;
+        }
+      }
+      if (!DeviceManager.getInstance().isAnyDeviceRefreshing()) {
+        ObservationManager.notify(new JajukEvent(JajukEvents.PREFERENCES_RESET));
+      } else {
+        Messages.showErrorMessage(120);
+      }
+    } else if (e.getSource() == pv.jbOK) {
+      updateConfFromGUI();
+      // Notify any client than wait for parameters updates
+      final Properties details = new Properties();
+      details.put(Const.DETAIL_ORIGIN, this);
+      ObservationManager.notify(new JajukEvent(JajukEvents.PARAMETERS_CHANGE, details));
+      if (someOptionsAppliedAtNextStartup) {
+        // Inform user that some parameters will apply only at
+        // next startup
+        Messages.showInfoMessage(Messages.getString("ParameterView.198"));
+        someOptionsAppliedAtNextStartup = false;
+      }
+      // Update Mute state according to bit-perfect mode
+      ActionManager.getAction(JajukActions.MUTE_STATE).setEnabled(
+          !Conf.getBoolean(Const.CONF_BIT_PERFECT));
+    } else if (e.getSource() == pv.jbDefault) {
+      int resu = Messages.getChoice(Messages.getString("Confirmation_defaults"),
+          JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
+      if (resu == JOptionPane.OK_OPTION) {
+        Conf.setDefaultProperties();
+        updateGUIFromConf();// update UI
+        InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.110"),
+            InformationJPanel.MessageType.INFORMATIVE);
+        updateConfFromGUI();
+        Messages.showInfoMessage(Messages.getString("ParameterView.198"));
+      }
+    } else if (e.getSource() == pv.jcbBackup) {
+      // if backup option is unchecked, reset backup size
+      if (pv.jcbBackup.isSelected()) {
+        pv.backupSize.setEnabled(true);
+        pv.backupSize.setValue(Conf.getInt(Const.CONF_BACKUP_SIZE));
+      } else {
+        pv.backupSize.setEnabled(false);
+        pv.backupSize.setValue(0);
+      }
+    } else if ((e.getSource() == pv.jcbProxyNone) || (e.getSource() == pv.jcbProxyHttp)
+        || (e.getSource() == pv.jcbProxySocks)) {
+      final boolean bUseProxy = !pv.jcbProxyNone.isSelected();
+      pv.jtfProxyHostname.setEnabled(bUseProxy);
+      pv.jtfProxyPort.setEnabled(bUseProxy);
+      pv.jtfProxyLogin.setEnabled(bUseProxy);
+      pv.jtfProxyPwd.setEnabled(bUseProxy);
+      pv.jlProxyHostname.setEnabled(bUseProxy);
+      pv.jlProxyPort.setEnabled(bUseProxy);
+      pv.jlProxyLogin.setEnabled(bUseProxy);
+      pv.jlProxyPwd.setEnabled(bUseProxy);
+    } else if (e.getSource() == pv.jcbAutoCover) {
+      if (pv.jcbAutoCover.isSelected()) {
+        pv.jcbCoverSize.setEnabled(true);
+        pv.jlCoverSize.setEnabled(true);
+      } else {
+        pv.jlCoverSize.setEnabled(false);
+        pv.jcbCoverSize.setEnabled(false);
+      }
+    } else if (e.getSource() == pv.jcbAudioScrobbler) {
+      if (pv.jcbAudioScrobbler.isSelected()) {
+        pv.jlASUser.setEnabled(true);
+        pv.jtfASUser.setEnabled(true);
+        pv.jlASPassword.setEnabled(true);
+        pv.jpfASPassword.setEnabled(true);
+      } else {
+        pv.jlASUser.setEnabled(false);
+        pv.jtfASUser.setEnabled(false);
+        pv.jlASPassword.setEnabled(false);
+        pv.jpfASPassword.setEnabled(false);
+      }
+    } else if (e.getSource() == pv.scbLanguage) {
+      Locale locale = LocaleManager.getLocaleForDesc(((JLabel) pv.scbLanguage.getSelectedItem())
+          .getText());
+      final String sLocal = locale.getLanguage();
+      final String sPreviousLocal = LocaleManager.getLocale().getLanguage();
+      if (!sPreviousLocal.equals(sLocal)) {
+        // local has changed
+        someOptionsAppliedAtNextStartup = true;
+      }
+    } else if (e.getSource() == pv.jcbHotkeys) {
+      someOptionsAppliedAtNextStartup = true;
+    } else if (e.getSource() == pv.jbCatalogRefresh) {
+      new Thread("Parameter Catalog refresh Thread") {
+        @Override
+        public void run() {
+          UtilGUI.waiting();
+          // Force albums to search for new covers
+          AlbumManager.getInstance().resetCoverCache();
+          // Clean thumbs
+          ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_50X50);
+          ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_100X100);
+          ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_150X150);
+          ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_200X200);
+          ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_250X250);
+          ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_300X300);
+          UtilGUI.stopWaiting();
+          // For catalog view's update
+          ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
+          // Display a message
+          Messages.showInfoMessage(Messages.getString("Success"));
+        }
+      }.start();
+    }
+    // Bit-perfect and audio normalization/cross fade options are mutually exclusive
+    else if (e.getSource().equals(pv.jcbEnableBitPerfect)) {
+      pv.jcbUseVolnorm.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
+      if (pv.jcbUseVolnorm.isSelected() && pv.jcbEnableBitPerfect.isSelected()) {
+        pv.jcbUseVolnorm.setSelected(false);
+      }
+      pv.crossFadeDuration.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
+    } else if (e.getSource().equals(pv.jbReloadRadiosPreset)) {
+      SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
+        @Override
+        protected Boolean doInBackground() throws Exception {
+          try {
+            java.io.File fPresets = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
+            DownloadManager.download(new URL(Const.URL_WEBRADIO_PRESETS), fPresets);
+            WebRadioHelper.loadPresetsRadios(fPresets);
+            return true;
+          } catch (Exception ex) {
+            Log.error(ex);
+            return false;
+          }
+        }
+
+        @Override
+        protected void done() {
+          try {
+            boolean result = get();
+            if (result) {
+              Messages.showInfoMessage(Messages.getString("Success"));
+              ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
+            } else {
+              Messages.showErrorMessage(9);
+            }
+          } catch (Exception e) {
+            Log.error(e);
+          }
+        }
+      };
+      worker.execute();
+    }
+  }
+
+  /*
+  * (non-Javadoc)
+  *
+  * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
+  */
+  @Override
+  public void itemStateChanged(final ItemEvent e) {
+    if (e.getSource() == pv.jrbFile) { // jrbFile has been selected or
+      // deselected
+      pv.sbSearch.setEnabled(pv.jrbFile.isSelected());
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   *
+   * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent )
+   */
+  @Override
+  public void stateChanged(final ChangeEvent e) {
+    // when changing tab, store it for future jajuk sessions
+    Conf.setProperty(Const.CONF_OPTIONS_TAB, Integer.toString(pv.jtpMain.getSelectedIndex()));
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/views/PlaylistView.java b/src/main/java/org/jajuk/ui/views/PlaylistView.java
index 845fb84..e43cd70 100644
--- a/src/main/java/org/jajuk/ui/views/PlaylistView.java
+++ b/src/main/java/org/jajuk/ui/views/PlaylistView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.Color;
@@ -31,6 +30,7 @@ import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Properties;
@@ -60,7 +60,6 @@ import javax.swing.table.TableColumn;
 import net.miginfocom.swing.MigLayout;
 
 import org.jajuk.base.Device;
-import org.jajuk.base.DeviceManager;
 import org.jajuk.base.Directory;
 import org.jajuk.base.DirectoryManager;
 import org.jajuk.base.File;
@@ -84,7 +83,6 @@ import org.jajuk.ui.helpers.PlaylistEditorTransferHandler;
 import org.jajuk.ui.helpers.PlaylistRepositoryTableModel;
 import org.jajuk.ui.helpers.PlaylistTableModel;
 import org.jajuk.ui.helpers.PreferencesJMenu;
-import org.jajuk.ui.helpers.TwoStepsDisplayable;
 import org.jajuk.ui.widgets.InformationJPanel;
 import org.jajuk.ui.widgets.JajukButton;
 import org.jajuk.ui.widgets.JajukJSplitPane;
@@ -104,114 +102,65 @@ import org.jajuk.util.log.Log;
 import org.jdesktop.swingx.decorator.ColorHighlighter;
 
 /**
- * Adapter for playlists editors *.
+ * Playlist view. This views contains two parts : the "repository" selection panel (list of smart playlists icons 
+ * + the list of playlists table) and the playlist editor table.
  */
 public class PlaylistView extends ViewAdapter implements ActionListener, ListSelectionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -2851288035506442507L;
-
-  /*
-   * Some widgets are private to make sure QueueView that extends this class will not use them 
-   * TODO refactoring : check for unifying smart and regular playlists (a single mouse adapter for ie)
-   */
-  /** DOCUMENT_ME. */
-  private JajukJSplitPane split;
-
   // --Editor--
-  /** DOCUMENT_ME. */
+  /** The playlist editor panel. */
   private JPanel jpEditor;
-
-  /** DOCUMENT_ME. */
+  /** The editor controls panel. */
   JPanel jpEditorControl;
-
-  /** DOCUMENT_ME. */
+  /** Button to run the playlist. */
   private JajukButton jbRun;
-
-  /** DOCUMENT_ME. */
+  /** Button to save the current playlist. */
   JajukButton jbSave;
-
-  /** DOCUMENT_ME. */
+  /** Button to remove the current item from the current playlist. */
   JajukButton jbRemove;
-
-  /** DOCUMENT_ME. */
+  /** Button to push the current item sooner in the playlist. */
   JajukButton jbUp;
-
-  /** DOCUMENT_ME. */
+  /** Button to drop down the current item in the curren tplaylist. */
   JajukButton jbDown;
-
-  /** DOCUMENT_ME. */
+  /** Add a shuffle track button. */
   JajukButton jbAddShuffle;
-
-  /** DOCUMENT_ME. */
+  /** Shuffle playlist button. */
+  JajukButton jbShufflePlaylist;
+  /** Button to clear the current playlist. */
   JajukButton jbClear;
-
-  /** DOCUMENT_ME. */
+  /** Title displayed in the editor part. */
   JLabel jlTitle;
-
-  /** DOCUMENT_ME. */
+  /** Editor table. */
   JajukTable editorTable;
-
-  /** DOCUMENT_ME. */
+  /** Menu item : play. */
   JMenuItem jmiFilePlay;
-
-  /** DOCUMENT_ME. */
-  private JMenuItem jmiFilePush;
-
-  /** DOCUMENT_ME. */
-  private JMenuItem jmiFileFrontPush;
-
-  /** DOCUMENT_ME. */
-  private JMenuItem jmiFileAddFavorites;
-
-  /** DOCUMENT_ME. */
+  /** Menu item : remove. */
   JMenuItem jmiFileRemove;
-
-  /** DOCUMENT_ME. */
+  /** Menu item : up. */
   JMenuItem jmiFileUp;
-
-  /** DOCUMENT_ME. */
+  /** Menu item : down. */
   JMenuItem jmiFileDown;
-
-  /** DOCUMENT_ME. */
-  private JMenuItem jmiFileProperties;
-
-  /** DOCUMENT_ME. */
-  private JMenuItem jmiFileCopyURL;
-
+  /** Menu item : Open with Explorer. */
+  JMenuItem jmiOpenExplorer;
+  /** Menu item : delete. */
+  JMenuItem jmiDelete;
   /** Current playlist. */
   Playlist plf;
-
   /** Editor Model. */
   protected PlaylistTableModel editorModel;
-
-  /** DOCUMENT_ME. */
+  /** Preference menu for current item. */
   PreferencesJMenu pjmFilesEditor;
-
   // --- Repository ---
-  /** DOCUMENT_ME. */
+  /** Repository panel. */
   private PlaylistRepository repositoryPanel;
-
-  /** DOCUMENT_ME. */
+  /** "New" smart playlist. */
   private SmartPlaylistView spNew;
-
-  /** DOCUMENT_ME. */
-  private SmartPlaylistView spNovelties;
-
-  /** DOCUMENT_ME. */
-  private SmartPlaylistView spBookmark;
-
-  /** DOCUMENT_ME. */
-  private SmartPlaylistView spBestof;
-
   /** Selected smart playlist. */
   private SmartPlaylistView spSelected;
-
-  /** List of selected files in the editor table. We don't just rely upon JajukTable's selection because we need here a deep selection computation including playlists contents */
-  List<File> selectedFiles = new ArrayList<File>(20);
-
   /** Mouse adapter for smart playlist items. */
-  MouseAdapter ma = new JajukMouseAdapter() {
+  private MouseAdapter ma = new JajukMouseAdapter() {
+    private static final long serialVersionUID = 1L;
 
     @Override
     public void handleAction(final MouseEvent e) {
@@ -227,8 +176,9 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
         if ((files == null) || (files.size() == 0)) {
           Messages.showErrorMessage(18);
         } else {
-          QueueModel.push(UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files), Conf
-              .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), false);
+          QueueModel.push(
+              UtilFeatures.createStackItems(UtilFeatures.applyPlayOption(files),
+                  Conf.getBoolean(Const.CONF_STATE_REPEAT), true), false);
         }
       } else { // user changed of smart playlist selection
         selectSmartPlaylist(sp);
@@ -256,18 +206,16 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       // but we disable some items like delete or properties
       // Add generic menus
       JPopupMenu menu = new JPopupMenu();
-
       JMenuItem jmiPlay = new JMenuItem(ActionManager.getAction(JajukActions.PLAY_SELECTION));
-      JMenuItem jmiFrontPush = new JMenuItem(ActionManager
-          .getAction(JajukActions.PUSH_FRONT_SELECTION));
+      JMenuItem jmiFrontPush = new JMenuItem(
+          ActionManager.getAction(JajukActions.PUSH_FRONT_SELECTION));
       JMenuItem jmiPush = new JMenuItem(ActionManager.getAction(JajukActions.PUSH_SELECTION));
-      JMenuItem jmiPlayRepeat = new JMenuItem(ActionManager
-          .getAction(JajukActions.PLAY_REPEAT_SELECTION));
-      JMenuItem jmiPlayShuffle = new JMenuItem(ActionManager
-          .getAction(JajukActions.PLAY_SHUFFLE_SELECTION));
+      JMenuItem jmiPlayRepeat = new JMenuItem(
+          ActionManager.getAction(JajukActions.PLAY_REPEAT_SELECTION));
+      JMenuItem jmiPlayShuffle = new JMenuItem(
+          ActionManager.getAction(JajukActions.PLAY_SHUFFLE_SELECTION));
       JMenuItem jmiPrepareParty = new JMenuItem(ActionManager.getAction(JajukActions.PREPARE_PARTY));
       JMenuItem jmiRepositorySaveAs = new JMenuItem(ActionManager.getAction(JajukActions.SAVE_AS));
-
       menu.add(jmiPlay);
       menu.add(jmiFrontPush);
       menu.add(jmiPush);
@@ -276,11 +224,9 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       menu.addSeparator();
       menu.add(jmiPrepareParty);
       menu.add(jmiRepositorySaveAs);
-
       for (MenuElement item : menu.getSubElements()) {
         ((JComponent) item).putClientProperty(Const.DETAIL_SELECTION, spSelected.getPlaylist());
       }
-
       menu.show(e.getComponent(), e.getX(), e.getY());
     }
   };
@@ -290,10 +236,9 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
    * 
    * @param sp the smart playlist
    */
-  void selectSmartPlaylist(SmartPlaylistView sp) {
+  private void selectSmartPlaylist(SmartPlaylistView sp) {
     // remove table selection so an event will be thrown if user click on the table
     repositoryPanel.jtable.getSelectionModel().clearSelection();
-
     // remove item border
     if (spSelected != null) {
       spSelected.getIcon().setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
@@ -301,13 +246,6 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
     sp.getIcon().setBorder(BorderFactory.createLineBorder(Color.ORANGE, 5));
     // set new item
     spSelected = sp;
-    try {
-      selectedFiles.clear();
-      selectedFiles.addAll(sp.getPlaylist().getFiles());
-    } catch (JajukException e) {
-      Log.error(e);
-      return;
-    }
     // Update playlist editor
     selectPlaylist(sp.getPlaylist());
   }
@@ -324,9 +262,8 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   /**
    * Inits the editor panel.
    */
-  public void initEditorPanel() {
+  private void initEditorPanel() {
     jpEditor = new JPanel();
-
     // Control panel
     jpEditorControl = new JPanel();
     jpEditorControl.setBorder(BorderFactory.createEtchedBorder());
@@ -348,24 +285,25 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
     jbAddShuffle = new JajukButton(IconLoader.getIcon(JajukIcons.ADD_SHUFFLE));
     jbAddShuffle.setToolTipText(Messages.getString("AbstractPlaylistEditorView.10"));
     jbAddShuffle.addActionListener(this);
+    jbShufflePlaylist = new JajukButton(IconLoader.getIcon(JajukIcons.SHUFFLE_GLOBAL_16X16));
+    jbShufflePlaylist.setToolTipText(Messages.getString("AbstractPlaylistEditorView.30"));
+    jbShufflePlaylist.addActionListener(this);
     jbClear = new JajukButton(IconLoader.getIcon(JajukIcons.CLEAR));
     jbClear.setToolTipText(Messages.getString("AbstractPlaylistEditorView.9"));
     jbClear.addActionListener(this);
     jlTitle = new JLabel("");
-
     JToolBar jtb = new JajukJToolbar();
-
     // Add items
     jpEditorControl.setLayout(new MigLayout("ins 0", "[][grow][]"));
     jtb.add(jbRun);
     jtb.add(jbSave);
     jtb.add(jbRemove);
     jtb.add(jbAddShuffle);
+    jtb.add(jbShufflePlaylist);
     jtb.add(jbUp);
     jtb.add(jbDown);
     jtb.addSeparator();
     jtb.add(jbClear);
-
     jpEditorControl.add(jtb, "left,gapright 5::");
     jpEditorControl.add(jlTitle, "center");
     editorModel = new PlaylistTableModel(false);
@@ -381,18 +319,15 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
     editorTable.getColumnModel().getColumn(0).setMaxWidth(20);
     editorTable.getTableHeader().setPreferredSize(new Dimension(0, 20));
     editorTable.showColumns(editorTable.getColumnsConf());
-    //  Note : don't add a ListSelectionListener here, see JajukTable code, 
-    //  all the event code is centralized over there 
+    // see JajukTable code, all the event code is centralized over there
     editorTable.addListSelectionListener(this);
     jpEditor.setLayout(new MigLayout("ins 0", "[grow]"));
     jpEditor.add(jpEditorControl, "growx,wrap");
     JScrollPane jsp = new JScrollPane(editorTable);
     jpEditor.add(jsp, "growx");
-
     initMenuItems();
-
     ColorHighlighter colorHighlighter = new ColorHighlighter(new PlayHighlighterPredicate(
-        editorModel), Color.ORANGE, null);
+        editorTable), Color.ORANGE, null);
     editorTable.addHighlighter(colorHighlighter);
     // register events
     ObservationManager.register(this);
@@ -414,7 +349,6 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
     editorTable.setCommand(new ILaunchCommand() {
       @Override
       public void launch(int nbClicks) {
-
         int iSelectedCol = editorTable.getSelectedColumn();
         // Convert column selection as columns may have been moved
         iSelectedCol = editorTable.convertColumnIndexToModel(iSelectedCol);
@@ -427,8 +361,8 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
             // We launch all tracks from this
             // position
             // to the end of playlist
-            QueueModel.push(editorModel.getItemsFrom(editorTable.getSelectedRow()), Conf
-                .getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
+            QueueModel.push(editorModel.getItemsFrom(editorTable.getSelectedRow()),
+                Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
           }
         }
       }
@@ -442,27 +376,34 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   void initMenuItems() {
     jmiFilePlay = new JMenuItem(ActionManager.getAction(JajukActions.PLAY_SELECTION));
     jmiFilePlay.putClientProperty(Const.DETAIL_SELECTION, editorTable.getSelection());
-    jmiFileFrontPush = new JMenuItem(ActionManager.getAction(JajukActions.PUSH_FRONT_SELECTION));
+    JMenuItem jmiFileFrontPush = new JMenuItem(
+        ActionManager.getAction(JajukActions.PUSH_FRONT_SELECTION));
     jmiFileFrontPush.putClientProperty(Const.DETAIL_SELECTION, editorTable.getSelection());
-    jmiFilePush = new JMenuItem(ActionManager.getAction(JajukActions.PUSH_SELECTION));
+    JMenuItem jmiFilePush = new JMenuItem(ActionManager.getAction(JajukActions.PUSH_SELECTION));
     jmiFilePush.putClientProperty(Const.DETAIL_SELECTION, editorTable.getSelection());
-    jmiFileAddFavorites = new JMenuItem(ActionManager.getAction(JajukActions.BOOKMARK_SELECTION));
+    JMenuItem jmiFileAddFavorites = new JMenuItem(
+        ActionManager.getAction(JajukActions.BOOKMARK_SELECTION));
     jmiFileAddFavorites.putClientProperty(Const.DETAIL_SELECTION, editorTable.getSelection());
-    jmiFileProperties = new JMenuItem(ActionManager.getAction(JajukActions.SHOW_PROPERTIES));
+    JMenuItem jmiFileProperties = new JMenuItem(
+        ActionManager.getAction(JajukActions.SHOW_PROPERTIES));
     jmiFileProperties.putClientProperty(Const.DETAIL_SELECTION, editorTable.getSelection());
-    jmiFileRemove = new JMenuItem(Messages.getString("AbstractPlaylistEditorView.5"), IconLoader
-        .getIcon(JajukIcons.REMOVE));
+    jmiFileRemove = new JMenuItem(Messages.getString("AbstractPlaylistEditorView.5"),
+        IconLoader.getIcon(JajukIcons.REMOVE));
     jmiFileRemove.addActionListener(this);
-    jmiFileUp = new JMenuItem(Messages.getString("AbstractPlaylistEditorView.6"), IconLoader
-        .getIcon(JajukIcons.UP));
+    jmiFileUp = new JMenuItem(Messages.getString("AbstractPlaylistEditorView.6"),
+        IconLoader.getIcon(JajukIcons.UP));
     jmiFileUp.addActionListener(this);
-    jmiFileDown = new JMenuItem(Messages.getString("AbstractPlaylistEditorView.7"), IconLoader
-        .getIcon(JajukIcons.DOWN));
+    jmiFileDown = new JMenuItem(Messages.getString("AbstractPlaylistEditorView.7"),
+        IconLoader.getIcon(JajukIcons.DOWN));
     jmiFileDown.addActionListener(this);
     pjmFilesEditor = new PreferencesJMenu(editorTable.getSelection());
-    jmiFileCopyURL = new JMenuItem(ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD));
+    JMenuItem jmiFileCopyURL = new JMenuItem(
+        ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD));
     jmiFileCopyURL.putClientProperty(Const.DETAIL_CONTENT, editorTable.getSelection());
-
+    jmiOpenExplorer = new JMenuItem(ActionManager.getAction(JajukActions.OPEN_EXPLORER));
+    jmiOpenExplorer.putClientProperty(Const.DETAIL_CONTENT, editorTable.getSelection());
+    jmiDelete = new JMenuItem(ActionManager.getAction(JajukActions.DELETE));
+    jmiDelete.putClientProperty(Const.DETAIL_SELECTION, editorTable.getSelection());
     editorTable.getMenu().add(jmiFilePlay);
     editorTable.getMenu().add(jmiFileFrontPush);
     editorTable.getMenu().add(jmiFilePush);
@@ -472,6 +413,8 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
     editorTable.getMenu().add(jmiFileDown);
     editorTable.getMenu().addSeparator();
     editorTable.getMenu().add(jmiFileCopyURL);
+    editorTable.getMenu().add(jmiOpenExplorer);
+    editorTable.getMenu().add(jmiDelete);
     editorTable.getMenu().addSeparator();
     editorTable.getMenu().add(pjmFilesEditor);
     editorTable.getMenu().add(jmiFileAddFavorites);
@@ -487,14 +430,13 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   @Override
   public void initUI() {
     initEditorPanel();
-
     spNew = new SmartPlaylistView(Type.NEW);
     spNew.addMouseListener(ma);
-    spBestof = new SmartPlaylistView(Type.BESTOF);
+    SmartPlaylistView spBestof = new SmartPlaylistView(Type.BESTOF);
     spBestof.addMouseListener(ma);
-    spNovelties = new SmartPlaylistView(Type.NOVELTIES);
+    SmartPlaylistView spNovelties = new SmartPlaylistView(Type.NOVELTIES);
     spNovelties.addMouseListener(ma);
-    spBookmark = new SmartPlaylistView(Type.BOOKMARK);
+    SmartPlaylistView spBookmark = new SmartPlaylistView(Type.BOOKMARK);
     spBookmark.addMouseListener(ma);
     JPanel jpSmartPlaylists = new JPanel();
     jpSmartPlaylists.setLayout(new FlowLayout(FlowLayout.LEFT));
@@ -508,8 +450,7 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
     repositoryPanel.setPerspective(getPerspective());
     jpRepository.add(jpSmartPlaylists, "growx,wrap");
     jpRepository.add(repositoryPanel, "growx");
-
-    split = new JajukJSplitPane(JSplitPane.VERTICAL_SPLIT);
+    JajukJSplitPane split = new JajukJSplitPane(JSplitPane.VERTICAL_SPLIT);
     split.setDividerLocation(0.5d);
     split.add(jpRepository);
     split.add(jpEditor);
@@ -525,10 +466,8 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   protected void setKeystrokes() {
     // Bind keystrokes and selection
     editorTable.putClientProperty(Const.DETAIL_SELECTION, editorTable.getSelection());
-    
     InputMap inputMap = editorTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
     ActionMap actionMap = editorTable.getActionMap();
-
     // Properties ALT/ENTER
     JajukAction action = ActionManager.getAction(JajukActions.SHOW_PROPERTIES);
     inputMap.put(KeyStroke.getKeyStroke("alt ENTER"), "properties");
@@ -566,7 +505,7 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   }
 
   /**
-   * Sets the renderers. DOCUMENT_ME
+   * Sets the renderers. 
    */
   void setRenderers() {
     // set right cell renderer for play and rate icons
@@ -648,14 +587,13 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   }
 
   /**
-   * Refresh current playlist. DOCUMENT_ME
+   * Refresh current playlist. 
    */
   private void refreshCurrentPlaylist() {
     if (plf == null) { // nothing ? leave
       return;
     }
     List<File> files = null;
-
     // Try to get playlist content
     try {
       files = plf.getFiles();
@@ -663,17 +601,14 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       if (editorTable.getSelectionModel().getMinSelectionIndex() == -1) {
         setButtonState();
       }
-      editorModel.setItems(UtilFeatures.createStackItems(files, Conf
-          .getBoolean(Const.CONF_STATE_REPEAT_ALL), true));
+      editorModel.setItems(UtilFeatures.createStackItems(files,
+          Conf.getBoolean(Const.CONF_STATE_REPEAT), true));
       editorModel.populateModel(editorTable.getColumnsConf());
       int[] rows = editorTable.getSelectedRows();
-
       try {
         editorModel.setRefreshing(true);
-
         // Force table refreshing
         editorModel.fireTableDataChanged();
-
         // Save selection
         for (int element : rows) {
           // set saved selection after a refresh
@@ -682,17 +617,14 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       } finally {
         editorModel.setRefreshing(false);
       }
-
       // Refresh the preference menu according to the selection
       // (useful on rating change for a single-row model for ie)
       pjmFilesEditor.resetUI(editorTable.getSelection());
-
     } catch (JajukException je) {
       Log.warn("Cannot parse playlist : " + plf.getAbsolutePath());
       // Clear the model so we don't keep previous playlist tracks
       editorModel.clear();
     }
-
   }
 
   /**
@@ -701,11 +633,9 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
    * @param plf the playlist (smart or not)
    */
   private void selectPlaylist(Playlist plf) {
-
     // remove selection
     editorTable.getSelectionModel().clearSelection();
     PlaylistView.this.plf = plf;
-
     // set title label
     jlTitle.setText(plf.getName());
     if (plf.getType() == Playlist.Type.BESTOF) {
@@ -741,6 +671,7 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
         jbClear.setEnabled(false);
         jbDown.setEnabled(false);
         jbAddShuffle.setEnabled(false);
+        jbShufflePlaylist.setEnabled(false);
         jbRemove.setEnabled(false);
         jbUp.setEnabled(false);
         jbSave.setEnabled(false);
@@ -749,12 +680,14 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
           jbClear.setEnabled(false);
           jbDown.setEnabled(false);
           jbAddShuffle.setEnabled(false);
+          jbShufflePlaylist.setEnabled(false);
           jbRemove.setEnabled(false);
           jbUp.setEnabled(false);
         } else if (plf.getType() == Playlist.Type.BOOKMARK) {
           jbClear.setEnabled(true);
           jbDown.setEnabled(false);
           jbAddShuffle.setEnabled(false);
+          jbShufflePlaylist.setEnabled(false);
           jbRemove.setEnabled(false);
           jbUp.setEnabled(false);
         } else {
@@ -765,6 +698,7 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
           jbUp.setEnabled(false);
           // add at the FIFO end by default even with no selection
           jbAddShuffle.setEnabled(true);
+          jbShufflePlaylist.setEnabled(true);
           // set it to false just for startup because nothing is selected
           jbRemove.setEnabled(false);
         }
@@ -799,7 +733,7 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
             Messages.showErrorMessage(je.getCode());
           }
         } else {
-          // Save as for normal playlists
+          // "Save as" for any other playlist type
           new Thread("Playlist Action Thread") {
             @Override
             public void run() {
@@ -808,24 +742,14 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
                 // special playlist, same behavior than a save as
                 plf.saveAs();
                 // If the new playlist is saved in a known device location,
-                // force a
-                // refresh to make it visible immediately (issue #1263)
-                boolean known = false;
-                Device knownDevice = null;
-                for (Device device : DeviceManager.getInstance().getDevices()) {
-                  if (UtilSystem.isAncestor(device.getFio(), plf.getFIO())) {
-                    known = true;
-                    knownDevice = device;
-                    break;
-                  }
-                }
-                if (known) {
+                // force a refresh to make it visible immediately (issue #1263)
+                Device knownDevice = UtilSystem.getDeviceForFio(plf.getFIO());
+                if (knownDevice != null) {
                   Directory directory = DirectoryManager.getInstance().getDirectoryForIO(
                       plf.getFIO().getParentFile(), knownDevice);
                   directory.refresh(false);
                   // Force a table refresh to show the new playlist if it has
-                  // been
-                  // saved in a known device
+                  // been saved in a known device
                   ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
                 }
               } catch (JajukException je) {
@@ -875,8 +799,12 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
           Messages.showErrorMessage(je.getCode());
           Log.error(je);
         }
+      } else if (ae.getSource() == jbShufflePlaylist) {
+        List<File> files = plf.getFiles();
+        Collections.shuffle(files);
+        editorModel.fireTableDataChanged();
       }
-    } catch (Exception e2) {
+    } catch (JajukException e2) {
       Log.error(e2);
     } finally {
       // force immediate table refresh
@@ -888,7 +816,7 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
    * Import files, used when drag / dropping for ie.
    * 
    * @param files files to be imported
-   * @param position DOCUMENT_ME
+   * @param position 
    */
   public void importFiles(List<File> files, int position) {
     plf.addFiles(UtilFeatures.applyPlayOption(files), position);
@@ -896,22 +824,22 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   }
 
   /**
-   * Removes the selection. DOCUMENT_ME
+   * Removes the selection. 
    */
   private void removeSelection() {
-    int[] iRows = editorTable.getSelectedRows();
-    if (iRows.length > 1) {// if multiple selection, remove
+    int[] selectedRows = editorTable.getSelectedRows();
+    if (selectedRows.length > 1) {// if multiple selection, remove
       // selection
       editorTable.getSelectionModel().removeIndexInterval(0, editorTable.getRowCount() - 1);
     }
-    for (int i = 0; i < iRows.length; i++) {
+    for (int i = 0; i < selectedRows.length; i++) {
       // don't forget that index changes when removing
-      plf.remove(iRows[i] - i);
+      plf.remove(selectedRows[i] - i);
     }
     // set selection to last line if end reached
-    int iLastRow = editorTable.getRowCount() - 1;
-    if (iRows[0] == editorTable.getRowCount()) {
-      editorTable.getSelectionModel().setSelectionInterval(iLastRow, iLastRow);
+    int lastRow = editorTable.getRowCount() - 1;
+    if (selectedRows[0] == lastRow && editorTable.getRowCount() > 0) {
+      editorTable.getSelectionModel().setSelectionInterval(lastRow - 1, lastRow - 1);
     }
   }
 
@@ -927,18 +855,15 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   /**
    * Called when table selection changed.
    * 
-   * @param e DOCUMENT_ME
+   * @param e 
    */
   @Override
   public void valueChanged(ListSelectionEvent e) {
     ListSelectionModel selection = (ListSelectionModel) e.getSource();
     if (!selection.isSelectionEmpty()) {
-      updateSelection();
-      updateInformationView(selectedFiles);
-
+      updateInformationPanel(getSelectedFiles());
       // Refresh the preference menu according to the selection
       pjmFilesEditor.resetUI(editorTable.getSelection());
-
       // -- now analyze each button --
       // Remove button
       // check for first row remove case : we can't remove currently
@@ -1001,7 +926,7 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
    * 
    * @param files : selection to consider
    */
-  void updateInformationView(List<File> files) {
+  void updateInformationPanel(List<File> files) {
     // Update information view
     // Compute recursive selection size, nb of items...
     long lSize = 0l;
@@ -1012,8 +937,8 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
     StringBuilder sbOut = new StringBuilder().append(files.size()).append(
         Messages.getString("FilesTreeView.52"));
     if (lSize > 1024) { // more than 1024 MB -> in GB
-      sbOut.append(lSize / 1024).append('.').append(lSize % 1024).append(
-          Messages.getString("FilesTreeView.53"));
+      sbOut.append(lSize / 1024).append('.').append(lSize % 1024)
+          .append(Messages.getString("FilesTreeView.53"));
     } else {
       sbOut.append(lSize).append(Messages.getString("FilesTreeView.54"));
     }
@@ -1021,14 +946,17 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
   }
 
   /**
-   * Update editor files selection.
+   * Get selection as files.
+   * 
+   * @return selected files
    */
-  void updateSelection() {
-    selectedFiles.clear();
+  List<File> getSelectedFiles() {
+    List<File> selectedFiles = new ArrayList<File>(10);
     for (Item item : editorTable.getSelection()) {
       File file = (File) item;
       selectedFiles.add(file);
     }
+    return selectedFiles;
   }
 
   /**
@@ -1046,17 +974,11 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
    * This class is not a view but the playlist upper panel of the PlaylistView
    * It leverages the Abstract Playlist code (filters...)
    */
-  class PlaylistRepository extends AbstractTableView implements TwoStepsDisplayable {
-
+  private class PlaylistRepository extends AbstractTableView {
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = 3842568503545896845L;
-
-    /** DOCUMENT_ME. */
-    JMenuItem jmiRepositorySaveAs;
-
-    /** DOCUMENT_ME. */
-    JMenuItem jmiPrepareParty;
-
+    private JMenuItem jmiRepositorySaveAs;
+    private JMenuItem jmiPrepareParty;
     /** List of playlists for which we already displayed a warning message if it contains old or external entries. */
     private final List<Playlist> alreadyWarned = new ArrayList<Playlist>(10);
 
@@ -1068,31 +990,16 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       columnsConf = CONF_PLAYLIST_REPOSITORY_COLUMNS;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.jajuk.ui.views.AbstractTableView#initTable()
-     */
     @Override
     void initTable() {
       // required by abstract superclass, but nothing to do here...
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.jajuk.ui.views.AbstractTableView#populateTable()
-     */
     @Override
     JajukTableModel populateTable() {
       return new PlaylistRepositoryTableModel();
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.jajuk.ui.views.IView#getDesc()
-     */
     @Override
     public String getDesc() {
       return null;
@@ -1109,21 +1016,11 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       return PlaylistView.this.getID() + "/PlaylistRepository";
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.jajuk.ui.views.IView#initUI()
-     */
     @Override
     public void initUI() {
       UtilGUI.populate(this);
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.jajuk.ui.helpers.TwoStepsDisplayable#shortCall(java.lang.Object)
-     */
     @Override
     public void shortCall(Object in) {
       jtable = new JajukTable(model, true, columnsConf);
@@ -1133,39 +1030,29 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       jmiPrepareParty = new JMenuItem(ActionManager.getAction(JajukActions.PREPARE_PARTY));
       jmiPrepareParty.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
       pjmTracks = new PreferencesJMenu(jtable.getSelection());
-
+      jmiOpenExplorer = new JMenuItem(ActionManager.getAction(JajukActions.OPEN_EXPLORER));
+      jmiOpenExplorer.putClientProperty(Const.DETAIL_CONTENT, jtable.getSelection());
+      jtable.getMenu().add(jmiOpenExplorer);
       jtable.getMenu().add(jmiPrepareParty);
       jtable.getMenu().add(jmiRepositorySaveAs);
-
       jtable.getMenu().addSeparator();
       jtable.getMenu().add(pjmTracks);
       jtable.getMenu().addSeparator();
-
       // Add this generic menu item manually to ensure it's the last one in
       // the list for GUI reasons
       jtable.getMenu().add(jmiProperties);
       jtbEditable.setVisible(false);
       jtbSync.setVisible(false);
-
       // Select "New" playlist as default
       selectSmartPlaylist(spNew);
-
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.jajuk.ui.helpers.TwoStepsDisplayable#longCall()
-     */
     @Override
     public Object longCall() {
       super.longCall();
       return null;
     }
 
-    /* (non-Javadoc)
-    * @see org.jajuk.ui.views.AbstractTableView#onSelectionChange()
-    */
     @Override
     void onSelectionChange() {
       Playlist playlist = null;
@@ -1191,12 +1078,11 @@ public class PlaylistView extends ViewAdapter implements ActionListener, ListSel
       // Select the playlist even if it cannot be read (we still have some titles)
       selectPlaylist(playlist);
       if (files != null) {
-        updateInformationView(files);
+        updateInformationPanel(files);
       } else {
         // Reset selection tip
         InformationJPanel.getInstance().setSelection(Messages.getString("InformationJPanel.9"));
       }
     }
-
   }
 }
diff --git a/src/main/java/org/jajuk/ui/views/QueueView.java b/src/main/java/org/jajuk/ui/views/QueueView.java
index 74f3b55..91141f6 100644
--- a/src/main/java/org/jajuk/ui/views/QueueView.java
+++ b/src/main/java/org/jajuk/ui/views/QueueView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,13 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -73,28 +73,45 @@ import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilFeatures;
+import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 import org.jdesktop.swingx.decorator.ColorHighlighter;
-import org.jvnet.substance.SubstanceLookAndFeel;
-import org.jvnet.substance.api.SubstanceColorScheme;
-import org.jvnet.substance.api.SubstanceSkin;
+import org.jdesktop.swingx.decorator.ComponentAdapter;
+import org.jdesktop.swingx.decorator.HighlightPredicate;
+import org.pushingpixels.substance.api.DecorationAreaType;
+import org.pushingpixels.substance.api.SubstanceColorScheme;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
+import org.pushingpixels.substance.api.SubstanceSkin;
 
 /**
  * Adapter for playlists editors *.
  */
 public class QueueView extends PlaylistView {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -2851288035506442507L;
-
-  /** DOCUMENT_ME. */
   private JScrollPane jsp;
-
-  /** DOCUMENT_ME. */
   private JajukToggleButton jtbAutoScroll;
-
   /** Last scrolled-item *. */
   private StackItem lastScrolledItem;
+  /** Stop after button. */
+  private JajukToggleButton jtbStopAfter;
+  /** Action when user clicks on stop after. */
+  private ActionListener alStopAfter = new ActionListener() {
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      QueueModel.setStopAfter(jtbStopAfter.isSelected());
+    }
+  };
+  /** Action for auto scrolling. */
+  private ActionListener alAutoScroll = new ActionListener() {
+    @Override
+    public void actionPerformed(ActionEvent e) {
+      Conf.setProperty(Const.CONF_AUTO_SCROLL, Boolean.toString(jtbAutoScroll.isSelected()));
+      if (jtbAutoScroll.isSelected()) {
+        autoScroll();
+      }
+    }
+  };
 
   /*
    * (non-Javadoc)
@@ -124,37 +141,28 @@ public class QueueView extends PlaylistView {
     jbAddShuffle.setToolTipText(Messages.getString("AbstractPlaylistEditorView.10"));
     jbAddShuffle.addActionListener(this);
     jlTitle = new JLabel(" [" + QueueModel.getQueue().size() + "]");
-
     jbClear = new JajukButton(IconLoader.getIcon(JajukIcons.CLEAR));
     jbClear.setToolTipText(Messages.getString("QueueView.1"));
     jbClear.addActionListener(this);
-
+    jtbStopAfter = new JajukToggleButton(IconLoader.getIcon(JajukIcons.STOP_AFTER));
+    jtbStopAfter.setToolTipText(Messages.getString("QueueView.3"));
+    jtbStopAfter.addActionListener(alStopAfter);
     jtbAutoScroll = new JajukToggleButton(IconLoader.getIcon(JajukIcons.AUTOSCROLL));
     jtbAutoScroll.setToolTipText(Messages.getString("QueueView.2"));
     jtbAutoScroll.setSelected(Conf.getBoolean(Const.CONF_AUTO_SCROLL));
-    jtbAutoScroll.addActionListener(new ActionListener() {
-      @Override
-      public void actionPerformed(ActionEvent e) {
-        Conf.setProperty(Const.CONF_AUTO_SCROLL, Boolean.toString(jtbAutoScroll.isSelected()));
-        if (jtbAutoScroll.isSelected()) {
-          autoScroll();
-        }
-      }
-    });
-
+    jtbAutoScroll.addActionListener(alAutoScroll);
     JToolBar jtb = new JajukJToolbar();
     jtb.add(jbSave);
     jtb.add(jbRemove);
     jtb.add(jbAddShuffle);
     jtb.add(jbUp);
     jtb.add(jbDown);
-    jtb.addSeparator();
     jtb.add(jbClear);
-
     // Add items
     jpEditorControl.setLayout(new MigLayout("insets 5", "[][grow][]"));
     jpEditorControl.add(jtb, "left,gapright 15::");
     jpEditorControl.add(jlTitle, "center,gapright 5,grow");
+    jpEditorControl.add(jtbStopAfter, "right");
     jpEditorControl.add(jtbAutoScroll, "right");
     editorModel = new PlaylistTableModel(true);
     editorTable = new JajukTable(editorModel, CONF_QUEUE_COLUMNS);
@@ -175,11 +183,11 @@ public class QueueView extends PlaylistView {
     jsp.setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 0));
     add(jsp, BorderLayout.CENTER);
     // menu items
-    jmiFilePlay = new JMenuItem(Messages.getString("TracksTableView.7"), IconLoader
-        .getIcon(JajukIcons.PLAY_16X16));
+    jmiFilePlay = new JMenuItem(Messages.getString("TracksTableView.7"),
+        IconLoader.getIcon(JajukIcons.PLAY_16X16));
     // We don't use regular action for the play because it has very special
-    // behavior here in the queue view : it must go to selection without keeping
-    // previous FIFO
+    // behavior here in the queue view : it must go to selection without
+    // keeping previous FIFO
     jmiFilePlay.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {
@@ -187,9 +195,10 @@ public class QueueView extends PlaylistView {
       }
     });
     initMenuItems();
-
+    //handle track removing for the queue when deleting it
+    jmiDelete.addActionListener(this);
     SubstanceSkin theme = SubstanceLookAndFeel.getCurrentSkin();
-    SubstanceColorScheme scheme = theme.getMainActiveColorScheme();
+    SubstanceColorScheme scheme = theme.getActiveColorScheme(DecorationAreaType.NONE);
     Color queueHighlighterColor = null;
     if (scheme.isDark()) {
       queueHighlighterColor = scheme.getUltraLightColor();
@@ -199,6 +208,15 @@ public class QueueView extends PlaylistView {
     ColorHighlighter colorHighlighter = new ColorHighlighter(new IndexHighlighterPredicate(),
         queueHighlighterColor, null);
     editorTable.addHighlighter(colorHighlighter);
+    HighlightPredicate hpPlaying = new HighlightPredicate() {
+      @Override
+      public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
+        int convertedRow = editorTable.convertRowIndexToModel(adapter.row);
+        return QueueModel.isPlayingTrack() && convertedRow == QueueModel.getIndex();
+      }
+    };
+    ColorHighlighter playHighlighter = new ColorHighlighter(hpPlaying, Color.ORANGE, null);
+    editorTable.addHighlighter(playHighlighter);
     // register events
     ObservationManager.register(this);
     // Add key listener to enable row suppression using SUPR key
@@ -208,9 +226,7 @@ public class QueueView extends PlaylistView {
         // The fact that a selection can be removed or not is
         // in the jbRemove state
         if (e.getKeyCode() == KeyEvent.VK_DELETE && jbRemove.isEnabled()) {
-          removeSelection();
-          // Refresh table
-          refreshQueue();
+          removeAction();
         }
       }
     });
@@ -228,7 +244,7 @@ public class QueueView extends PlaylistView {
           StackItem item = editorModel.getStackItem(editorTable.getSelectedRow());
           if (item.isPlanned()) {
             item.setPlanned(false);
-            item.setRepeat(Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL));
+            item.setRepeat(Conf.getBoolean(Const.CONF_STATE_REPEAT));
             item.setUserLaunch(true);
             QueueModel.push(item, Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
           } else { // non planned items
@@ -237,8 +253,7 @@ public class QueueView extends PlaylistView {
         }
       }
     });
-    //  Note : don't add a ListSelectionListener here, see JajukTable code, 
-    //  all the event code is centralized over there 
+    // see JajukTable code, all the event code is centralized over there
     editorTable.addListSelectionListener(this);
     // Register keystrokes over table
     super.setKeystrokes();
@@ -247,8 +262,8 @@ public class QueueView extends PlaylistView {
   }
 
   /**
-   * Go to selected row, do it asynchronously because FIFO.goTO() can freeze the
-   * GUI
+   * Go to selected row, do it asynchronously because FIFO.goTO() can freeze
+   * the GUI
    */
   private void goToSelection() {
     new Thread("Queue Selection Thread") {
@@ -287,6 +302,7 @@ public class QueueView extends PlaylistView {
     eventSubjectSet.add(JajukEvents.VIEW_REFRESH_REQUEST);
     eventSubjectSet.add(JajukEvents.RATE_CHANGED);
     eventSubjectSet.add(JajukEvents.PARAMETERS_CHANGE);
+    eventSubjectSet.add(JajukEvents.PLAYER_STOP);
     return eventSubjectSet;
   }
 
@@ -312,18 +328,16 @@ public class QueueView extends PlaylistView {
       public void run() {
         try {
           JajukEvents subject = event.getSubject();
-          editorTable.setAcceptColumnsEvents(false); // flag reloading to avoid
-          // wrong
+          editorTable.setAcceptColumnsEvents(false); // flag reloading
           if (JajukEvents.QUEUE_NEED_REFRESH.equals(subject)
               || JajukEvents.DEVICE_REFRESH.equals(subject)
               || JajukEvents.DEVICE_MOUNT.equals(subject)
               || JajukEvents.DEVICE_UNMOUNT.equals(subject)
               || JajukEvents.RATE_CHANGED.equals(subject)
               || JajukEvents.PARAMETERS_CHANGE.equals(subject)) {
-            editorModel.getItems().clear();
-            editorModel.getPlanned().clear();
             refreshQueue();
-            // Only scroll if song actually changed, otherwise, any queue refresh
+            // Only scroll if song actually changed, otherwise, any
+            // queue refresh
             // would scroll and annoy users
             if (Conf.getBoolean(CONF_AUTO_SCROLL) && QueueModel.getCurrentItem() != null
                 && !QueueModel.getCurrentItem().equals(lastScrolledItem)) {
@@ -343,7 +357,6 @@ public class QueueView extends PlaylistView {
             setRenderers();
             editorTable.addColumnIntoConf((String) properties.get(Const.DETAIL_CONTENT));
             editorTable.showColumns(editorTable.getColumnsConf());
-
             editorModel.getItems().clear();
             editorModel.getPlanned().clear();
             refreshQueue();
@@ -360,19 +373,21 @@ public class QueueView extends PlaylistView {
             // remove item from configuration cols
             editorTable.removeColumnFromConf((String) properties.get(Const.DETAIL_CONTENT));
             editorTable.showColumns(editorTable.getColumnsConf());
-
             editorModel.getItems().clear();
             editorModel.getPlanned().clear();
             refreshQueue();
           } else if (JajukEvents.VIEW_REFRESH_REQUEST.equals(subject)) {
-            // force filter to refresh if the events has been triggered by the
-            // table itself after a column change
+            // force filter to refresh if the events has been
+            // triggered by the table itself after a column change
             JTable table = (JTable) event.getDetails().get(Const.DETAIL_CONTENT);
             if (table.equals(editorTable)) {
               editorModel.getItems().clear();
               editorModel.getPlanned().clear();
               refreshQueue();
             }
+          } else if (JajukEvents.PLAYER_STOP.equals(subject)) {
+            // Reset stop after button on a player stop
+            jtbStopAfter.setSelected(false);
           }
         } catch (Exception e) {
           Log.error(e);
@@ -383,45 +398,38 @@ public class QueueView extends PlaylistView {
         }
       }
     });
-
   }
 
   /**
    * Auto scroll to played track if option is enabled.
    */
   private void autoScroll() {
-
     SwingUtilities.invokeLater(new Runnable() {
       @Override
       public void run() {
-
         if (QueueModel.getQueueSize() > 0) {
           double index = QueueModel.getIndex();
           double size = QueueModel.getQueueSize() + QueueModel.getPlanned().size();
           double factor = (index / size);
           int value = (int) (factor * jsp.getVerticalScrollBar().getMaximum());
-
           // 'center' played track
           value -= (jsp.getVerticalScrollBar().getHeight() / 2) - (editorTable.getRowHeight() / 2);
-
           if (value < 0) {
             value = 0;
           }
           if (value >= jsp.getVerticalScrollBar().getMinimum()
               && value <= jsp.getVerticalScrollBar().getMaximum()) {
             jsp.getVerticalScrollBar().setValue(value);
-
           }
         }
       }
     });
-
   }
 
   /**
-   * Refresh queue. DOCUMENT_ME
+   * Refresh queue. 
    */
-  private void refreshQueue() {
+  private synchronized void refreshQueue() {
     // when nothing is selected, set default button state
     if (editorTable.getSelectionModel().getMinSelectionIndex() == -1) {
       setDefaultButtonState();
@@ -431,22 +439,21 @@ public class QueueView extends PlaylistView {
     ((JajukTableModel) editorTable.getModel()).populateModel(editorTable.getColumnsConf());
     // save selection to avoid reseting selection the user is doing
     int[] rows = editorTable.getSelectedRows();
-
     try {
       editorModel.setRefreshing(true);
       // force table refresh
       editorModel.fireTableDataChanged();
-
       for (int element : rows) {
         // set saved selection after a refresh
         editorTable.getSelectionModel().addSelectionInterval(element, element);
       }
+      // Refresh menu item along with preference icon. This is only useful when 
+      // a user change the preference and display again the menu (right click) again
+      // without changing the selection.
+      pjmFilesEditor.resetUI(editorTable.getSelection());
     } finally {
       editorModel.setRefreshing(false);
     }
-    // Refresh the preference menu according to the selection 
-    // (useful on rating change for a single-row model for ie)
-    pjmFilesEditor.resetUI(editorTable.getSelection());
   }
 
   /**
@@ -470,14 +477,29 @@ public class QueueView extends PlaylistView {
   /*
    * (non-Javadoc)
    * 
-   * @see org.jajuk.ui.views.PlaylistView#actionPerformed(java.awt.event.ActionEvent)
+   * @see
+   * org.jajuk.ui.views.PlaylistView#actionPerformed(java.awt.event.ActionEvent
+   * )
    */
   @Override
   public void actionPerformed(ActionEvent ae) {
     try {
       if (ae.getSource() == jbSave) {
-        // special playlist, same behavior than a save as
-        plf.saveAs();
+        // special playlist, same behavior than a save as 
+        // (to be done in a thread because saveAs() uses invokeAndWait())
+        new Thread("SaveAsAction") {
+          @Override
+          public void run() {
+            try {
+              plf.saveAs();
+            } catch (JajukException je) {
+              Log.error(je);
+              Messages.showErrorMessage(je.getCode());
+            } catch (Exception ex) {
+              Log.error(ex);
+            }
+          }
+        }.start();
         // notify playlist repository to refresh
         ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
       } else if (ae.getSource() == jbDown || ae.getSource() == jbUp
@@ -501,22 +523,23 @@ public class QueueView extends PlaylistView {
           }
         }
       } else if (ae.getSource() == jbRemove || ae.getSource() == jmiFileRemove) {
-        removeSelection();
-        refreshQueue();
+        removeAction();
       } else if (ae.getSource() == jbAddShuffle) {
         int iRow = editorTable.getSelectedRow();
         if (iRow < 0
         // no row is selected, add to the end
             || iRow > QueueModel.getQueue().size()) {
-          // row can be on planned track if user select a planned track and if
+          // row can be on planned track if user select a planned
+          // track and if
           // fifo is reduced after tracks have been played
           iRow = QueueModel.getQueue().size();
         }
         File file = FileManager.getInstance().getShuffleFile();
         List<File> files = new ArrayList<File>();
         files.add(file);
-        QueueModel.insert(UtilFeatures.createStackItems(files, Conf
-            .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), iRow);
+        QueueModel.insert(
+            UtilFeatures.createStackItems(files, Conf.getBoolean(Const.CONF_STATE_REPEAT), true),
+            iRow);
         refreshQueue();
       } else if (ae.getSource() == jbClear) {
         // Reset the FIFO
@@ -527,130 +550,113 @@ public class QueueView extends PlaylistView {
         } catch (Exception e) {
           Log.error(e);
         }
+      } else if (ae.getSource() == jmiDelete) {
+        // We remove the track. It has already been deleted in the DELETE action.
+        removeAction();
       }
     } catch (Exception e2) {
       Log.error(e2);
     }
   }
 
-  /**
-   * Removes the selection. DOCUMENT_ME
-   */
-  private void removeSelection() {
-    int[] iRows = editorTable.getSelectedRows();
-    if (iRows.length > 1) {// if multiple selection, remove
-      // selection
+  private void removeAction() {
+    int[] selectedRows = editorTable.getSelectedRows();
+    removeItems(selectedRows);
+    // Update selection : if multiple selection, remove selection, for multiple selection, we disable buttons after the actions
+    if (selectedRows.length > 1) {
       editorTable.getSelectionModel().removeIndexInterval(0, editorTable.getRowCount() - 1);
+      setDefaultButtonState();
     }
-    for (int i = 0; i < iRows.length; i++) {
-      // don't forget that index changes when removing
-      plf.remove(iRows[i] - i);
-    }
-    // set selection to last line if end reached
-    int iLastRow = editorTable.getRowCount() - 1;
-    if (iRows[0] == editorTable.getRowCount()) {
-      editorTable.getSelectionModel().setSelectionInterval(iLastRow, iLastRow);
+    // No queue refresh as it will be triggered indirectly by the QUEUE_NEED_REFRESH events
+    updateInformationPanel(getSelectedFiles());
+  }
+
+  protected void removeItems(int[] selectedRows) {
+    // Remove items
+    HashSet<Integer> rows = new HashSet<Integer>();
+    for (Integer i : selectedRows) {
+      rows.add(i);
     }
+    plf.remove(rows);
+    // Refresh queue asynchronously to serialize refresh due to remove() call. This is necessary only for the case where 
+    // we drop a non-playing track.
+    ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH));
   }
 
   /**
    * Called when table selection changed.
    * 
-   * @param e DOCUMENT_ME
+   * @param e
+   *            
    */
   @Override
   public void valueChanged(ListSelectionEvent e) {
     ListSelectionModel selection = (ListSelectionModel) e.getSource();
-    if (!selection.isSelectionEmpty()) {
-      updateSelection();
-      updateInformationView(selectedFiles);
-      // Refresh the preference menu according to the selection
-      pjmFilesEditor.resetUI(editorTable.getSelection());
-      int selectedRow = selection.getMaxSelectionIndex();
-      // true if selected line is a planned track
-      boolean bPlanned = false;
-      if (selectedRow > editorModel.getItems().size() - 1) {
-        // means it is a planned track
-        bPlanned = true;
-      }
-      // -- now analyze each button --
-      // Remove button
-      if (bPlanned) {
-        jbRemove.setEnabled(false);
-        jmiFileRemove.setEnabled(false);
-      } else {
-        // check for current track case : we can't remove currently
-        // played track
-        jbRemove.setEnabled(!selectionContainsCurrentTrack(selection));
-        jmiFileRemove.setEnabled(!selectionContainsCurrentTrack(selection));
-      }
-
-      // Add shuffle button
-      // No adding for planned track
-      jbAddShuffle.setEnabled(!bPlanned);
+    updateButtonsStateForSelection(selection.getMinSelectionIndex(),
+        selection.getMaxSelectionIndex());
+    updateInformationPanel(getSelectedFiles());
+  }
 
-      // Up button
-      if (selection.getMinSelectionIndex() != selection.getMaxSelectionIndex()) {
-        // check if several rows have been selected :
-        // doesn't supported yet
+  private void updateButtonsStateForSelection(int min, int max) {
+    // Refresh the preference menu according to the selection
+    pjmFilesEditor.resetUI(editorTable.getSelection());
+    int selectedRow = max;
+    // true if selected line is a planned track
+    boolean bPlanned = false;
+    if (selectedRow > editorModel.getItems().size() - 1) {
+      // means it is a planned track
+      bPlanned = true;
+    }
+    // -- now analyze each button --
+    // Remove button
+    jbRemove.setEnabled(!bPlanned);
+    jmiFileRemove.setEnabled(!bPlanned);
+    // Add shuffle button
+    // No adding for planned track
+    jbAddShuffle.setEnabled(!bPlanned);
+    // Up button
+    if (min != max) {
+      // check if several rows have been selected 
+      jbUp.setEnabled(false);
+      jmiFileUp.setEnabled(false);
+    } else {
+      // still here ?
+      if (bPlanned) {
+        // No up/down buttons for planned tracks
         jbUp.setEnabled(false);
         jmiFileUp.setEnabled(false);
-      } else {
-        // still here ?
-        if (bPlanned) {
-          // No up/down buttons for planned tracks
+      } else { // normal item
+        if (min == 0) {
+          // already at the top
           jbUp.setEnabled(false);
           jmiFileUp.setEnabled(false);
-        } else { // normal item
-          if (selection.getMinSelectionIndex() == 0) {
-            // already at the top
-            jbUp.setEnabled(false);
-            jmiFileUp.setEnabled(false);
-          } else {
-            jbUp.setEnabled(true);
-            jmiFileUp.setEnabled(true);
-          }
+        } else {
+          jbUp.setEnabled(true);
+          jmiFileUp.setEnabled(true);
         }
       }
-      // Down button
-      if (selection.getMinSelectionIndex() != selection.getMaxSelectionIndex()) {
-        // check if several rows have been selected :
-        // doesn't supported yet
+    }
+    // Down button
+    if (min != max) {
+      // check if several rows have been selected :
+      // doesn't supported yet
+      jbDown.setEnabled(false);
+      jmiFileDown.setEnabled(false);
+    } else { // yet here ?
+      if (bPlanned) {
+        // No up/down buttons for planned tracks
         jbDown.setEnabled(false);
         jmiFileDown.setEnabled(false);
-      } else { // yet here ?
-        if (bPlanned) {
-          // No up/down buttons for planned tracks
+      } else { // normal item
+        if (max < editorModel.getItems().size() - 1) {
+          // a normal item can't go in the planned items
+          jbDown.setEnabled(true);
+          jmiFileDown.setEnabled(true);
+        } else {
           jbDown.setEnabled(false);
           jmiFileDown.setEnabled(false);
-        } else { // normal item
-          if (selection.getMaxSelectionIndex() < editorModel.getItems().size() - 1) {
-            // a normal item can't go in the planned items
-            jbDown.setEnabled(true);
-            jmiFileDown.setEnabled(true);
-          } else {
-            jbDown.setEnabled(false);
-            jmiFileDown.setEnabled(false);
-          }
         }
       }
     }
   }
-
-  /**
-   * Return whether a given row selection contains the current played track.
-   * 
-   * @param selection the selection
-   * 
-   * @return whether a given row selection contains the current played track
-   */
-  private boolean selectionContainsCurrentTrack(ListSelectionModel selection) {
-    for (int i = selection.getMinSelectionIndex(); i <= selection.getMaxSelectionIndex(); i++) {
-      if (QueueModel.getItem(i).equals(QueueModel.getCurrentItem())) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/jajuk/ui/views/StatView.java b/src/main/java/org/jajuk/ui/views/StatView.java
index bde03b8..4ea064d 100644
--- a/src/main/java/org/jajuk/ui/views/StatView.java
+++ b/src/main/java/org/jajuk/ui/views/StatView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.text.DateFormat;
@@ -47,6 +46,7 @@ import org.jajuk.base.TrackManager;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
+import org.jajuk.util.Conf;
 import org.jajuk.util.Messages;
 import org.jajuk.util.ReadOnlyIterator;
 import org.jajuk.util.UtilGUI;
@@ -84,7 +84,6 @@ import org.jfree.util.SortOrder;
  * Help perspective.
  */
 public class StatView extends ViewAdapter {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -141,7 +140,7 @@ public class StatView extends ViewAdapter {
       // Cleanup genre with weight < 5 %
       for (Map.Entry<Genre, Integer> entry : genreNbTracks.entrySet()) {
         double d = entry.getValue();
-        if (iTotal > 0 && d / iTotal < 0.05) {
+        if (iTotal > 0 && d / iTotal < Conf.getFloat(CONF_STATS_MIN_VALUE_GENRE_DISPLAY) / 100) {
           // less than 5% -> go to others
           dOthers += d;
         } else {
@@ -153,7 +152,6 @@ public class StatView extends ViewAdapter {
         double dValue = Math.round(100 * (dOthers / iTotal));
         pdata.setValue(Messages.getString("StatView.0"), dValue);
       }
-
       // chart
       jfchart = ChartFactory.createPieChart3D(Messages.getString("StatView.1"), pdata, true, true,
           true);
@@ -233,9 +231,7 @@ public class StatView extends ViewAdapter {
    */
   private ChartPanel createCollectionSize() {
     try {
-
       final DateFormat additionFormatter = UtilString.getAdditionDateFormatter();
-
       CategoryDataset cdata = null;
       JFreeChart jfchart = null;
       int iMonthsNumber = 5; // number of mounts we show, mounts
@@ -258,7 +254,6 @@ public class StatView extends ViewAdapter {
       for (int i = 0; i < iMonthsNumber + 1; i++) {
         data[0][i] = (double) lSizeByMonth[i] / 1073741824;
       }
-
       cdata = DatasetUtilities.createCategoryDataset(new String[] { "" },
           getMonthsLabels(iMonthsNumber), data);
       // chart, use local copy of method to use better format string for
@@ -273,13 +268,11 @@ public class StatView extends ViewAdapter {
           true, // tooltips
           false, // urls
           "{1} = {2} GB");
-
       CategoryPlot plot = jfchart.getCategoryPlot();
       CategoryAxis axis = plot.getDomainAxis();
       new CategoryLabelPosition(RectangleAnchor.TOP, TextBlockAnchor.TOP_RIGHT,
           TextAnchor.TOP_RIGHT, -Math.PI / 8.0, CategoryLabelWidthType.CATEGORY, 0);
       axis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
-
       // set the background color for the chart...
       plot.setNoDataMessage(Messages.getString("StatView.10"));
       plot.setForegroundAlpha(0.5f);
@@ -296,17 +289,17 @@ public class StatView extends ViewAdapter {
   // otherwise hardcoded in ChartFactory
   /**
    * Creates the bar chart3 d.
-   * DOCUMENT_ME
    * 
-   * @param title DOCUMENT_ME
-   * @param categoryAxisLabel DOCUMENT_ME
-   * @param valueAxisLabel DOCUMENT_ME
-   * @param dataset DOCUMENT_ME
-   * @param orientation DOCUMENT_ME
-   * @param legend DOCUMENT_ME
-   * @param tooltips DOCUMENT_ME
-   * @param urls DOCUMENT_ME
-   * @param format DOCUMENT_ME
+   * 
+   * @param title 
+   * @param categoryAxisLabel 
+   * @param valueAxisLabel 
+   * @param dataset 
+   * @param orientation 
+   * @param legend 
+   * @param tooltips 
+   * @param urls 
+   * @param format 
    * 
    * @return the j free chart
    */
@@ -315,30 +308,22 @@ public class StatView extends ViewAdapter {
       boolean tooltips, boolean urls, String format) {
     if (orientation == null)
       throw new IllegalArgumentException("Null 'orientation' argument.");
-
     CategoryAxis categoryAxis = new CategoryAxis3D(categoryAxisLabel);
     ValueAxis valueAxis = new NumberAxis3D(valueAxisLabel);
-
     BarRenderer3D renderer = new BarRenderer3D();
     if (tooltips)
       renderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator(format, NumberFormat
           .getInstance()));
-
     if (urls)
       renderer.setBaseItemURLGenerator(new StandardCategoryURLGenerator());
-
     CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer);
-
     plot.setOrientation(orientation);
     if (orientation == PlotOrientation.HORIZONTAL) {
-
       plot.setRowRenderingOrder(SortOrder.DESCENDING);
       plot.setColumnRenderingOrder(SortOrder.DESCENDING);
     }
     plot.setForegroundAlpha(0.75F);
-
     JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
-
     ChartFactory.getChartTheme().apply(chart);
     return chart;
   }
@@ -351,7 +336,6 @@ public class StatView extends ViewAdapter {
   private ChartPanel createTrackNumber() {
     try {
       final DateFormat additionFormatter = UtilString.getAdditionDateFormatter();
-
       CategoryDataset cdata = null;
       JFreeChart jfchart = null;
       // number of months we show, mounts
@@ -371,7 +355,6 @@ public class StatView extends ViewAdapter {
           }
         }
       }
-
       double[][] data = new double[1][iMonthsNumber + 1];
       // cannot use System.arraycopy() here because we have different types in
       // the arrays...
@@ -381,7 +364,6 @@ public class StatView extends ViewAdapter {
       }
       cdata = DatasetUtilities.createCategoryDataset(new String[] { "" },
           getMonthsLabels(iMonthsNumber), data);
-
       // chart, use local copy of method to use better format string for
       // tooltips
       jfchart = createBarChart3D(Messages.getString("StatView.12"), // chart
@@ -399,7 +381,6 @@ public class StatView extends ViewAdapter {
       new CategoryLabelPosition(RectangleAnchor.TOP, TextBlockAnchor.TOP_RIGHT,
           TextAnchor.TOP_RIGHT, -Math.PI / 8.0, CategoryLabelWidthType.CATEGORY, 0);
       axis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
-
       // set the background color for the chart...
       plot.setNoDataMessage(Messages.getString("StatView.15"));
       plot.setForegroundAlpha(0.5f);
@@ -432,7 +413,6 @@ public class StatView extends ViewAdapter {
     JajukEvents subject = event.getSubject();
     if (JajukEvents.DEVICE_REFRESH.equals(subject) || JajukEvents.DEVICE_DELETE.equals(subject)) {
       SwingUtilities.invokeLater(new Runnable() {
-
         @Override
         public void run() {
           try {
@@ -440,27 +420,22 @@ public class StatView extends ViewAdapter {
             if (getComponentCount() > 0) {
               removeAll();
             }
-
             ChartPanel cp1 = createGenreRepartition();
             if (cp1 != null) {
               add(cp1);
             }
-
             ChartPanel cp2 = createCollectionSize();
             if (cp2 != null) {
               add(cp2, "wrap");
             }
-
             ChartPanel cp3 = createTrackNumber();
             if (cp3 != null) {
               add(cp3);
             }
-
             ChartPanel cp4 = createDeviceRepartition();
             if (cp4 != null) {
               add(cp4, "wrap");
             }
-
             revalidate();
             repaint();
           } finally {
@@ -502,7 +477,7 @@ public class StatView extends ViewAdapter {
   /**
    * Get months as integers.
    * 
-   * @param iMonthsNumber DOCUMENT_ME
+   * @param iMonthsNumber 
    * 
    * @return the months
    */
diff --git a/src/main/java/org/jajuk/ui/views/SuggestionView.java b/src/main/java/org/jajuk/ui/views/SuggestionView.java
index 2b4ffaf..0def3b2 100644
--- a/src/main/java/org/jajuk/ui/views/SuggestionView.java
+++ b/src/main/java/org/jajuk/ui/views/SuggestionView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import ext.FlowScrollPanel;
@@ -79,84 +78,49 @@ import org.jdesktop.swingx.JXBusyLabel;
  * Show suggested albums based on current collection (bestof, novelties) and
  * LAstFM.
  */
+ at SuppressWarnings("serial")
 public class SuggestionView extends ViewAdapter {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private JTabbedPane tabs;
-
-  /** DOCUMENT_ME. */
   protected String artist;
 
-  /**
-   * DOCUMENT_ME.
-   */
-  enum SuggestionType {
+  //Remove tab border, see
+  // http://forum.java.sun.com/thread.jspa?threadID=260746&messageID=980405
+  class MyTabbedPaneUI extends javax.swing.plaf.basic.BasicTabbedPaneUI {
+    @Override
+    protected Insets getContentBorderInsets(int tabPlacement) {
+      return new Insets(0, 0, 0, 0);
+    }
 
-    /** DOCUMENT_ME. */
-    BEST_OF,
-    
-    /** DOCUMENT_ME. */
-    NEWEST,
-    
-    /** DOCUMENT_ME. */
-    RARE,
-    
-    /** DOCUMENT_ME. */
-    OTHERS_ALBUMS,
-    
-    /** DOCUMENT_ME. */
-    SIMILAR_ARTISTS
+    @Override
+    protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex) {
+      // nothing to do here...
+    }
   }
 
-  /** DOCUMENT_ME. */
-  JScrollPane jpBestof;
+  enum SuggestionType {
+    BEST_OF, NEWEST, RARE, OTHERS_ALBUMS, SIMILAR_ARTISTS
+  }
 
-  /** DOCUMENT_ME. */
+  JScrollPane jpBestof;
   JScrollPane jpNewest;
-
-  /** DOCUMENT_ME. */
   JScrollPane jpRare;
-
-  /** DOCUMENT_ME. */
   JScrollPane jpOthersAlbums;
-
-  /** DOCUMENT_ME. */
   JScrollPane jpSimilarArtists;
-
-  /** DOCUMENT_ME. */
   private int comp = 0;
-
-  /** DOCUMENT_ME. */
   List<Album> albumsNewest;
-
-  /** DOCUMENT_ME. */
   List<Album> albumsPrefered;
-
-  /** DOCUMENT_ME. */
   List<Album> albumsRare;
-
   /** Currently selected thumb. */
   AbstractThumbnail selectedThumb;
-
-  /** DOCUMENT_ME. */
   private AlbumListInfo albums;
-
-  /** DOCUMENT_ME. */
   private SimilarArtistsInfo similar;
+  JXBusyLabel busyLocal1 = new JXBusyLabel();
+  JXBusyLabel busyLocal2 = new JXBusyLabel();
+  JXBusyLabel busyLocal3 = new JXBusyLabel();
+  JXBusyLabel busyLastFM1 = new JXBusyLabel();
+  JXBusyLabel busyLastFM2 = new JXBusyLabel();
 
-  /**
-   * DOCUMENT_ME.
-   */
-  class ThumbMouseListener extends MouseAdapter {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.awt.event.MouseAdapter#mousePressed(java.awt.event.MouseEvent)
-     */
+  private class ThumbMouseListener extends MouseAdapter {
     @Override
     public void mousePressed(MouseEvent e) {
       AbstractThumbnail thumb = (AbstractThumbnail) ((JLabel) e.getSource()).getParent();
@@ -171,72 +135,40 @@ public class SuggestionView extends ViewAdapter {
     }
   }
 
-  /**
-   * Instantiates a new suggestion view.
-   */
   public SuggestionView() {
     super();
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.views.IView#getDesc()
-   */
   @Override
   public String getDesc() {
     return Messages.getString("SuggestionView.0");
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.views.IView#populate()
-   */
   @Override
   public void initUI() {
     tabs = new JTabbedPane();
-    // Remove tab border, see
-    // http://forum.java.sun.com/thread.jspa?threadID=260746&messageID=980405
-    class MyTabbedPaneUI extends javax.swing.plaf.basic.BasicTabbedPaneUI {
-      @Override
-      protected Insets getContentBorderInsets(int tabPlacement) {
-        return new Insets(0, 0, 0, 0);
-      }
-
-      @Override
-      protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex) {
-        // nothing to do here...
-      }
-    }
     // Now use the new TabbedPaneUI
     tabs.setUI(new MyTabbedPaneUI());
-
     // Fill tabs with empty tabs
-    tabs.addTab(Messages.getString("SuggestionView.1"), UtilGUI.getCentredPanel(new JLabel(Messages
-        .getString("WikipediaView.3"))));
-    tabs.addTab(Messages.getString("SuggestionView.2"), UtilGUI.getCentredPanel(new JLabel(Messages
-        .getString("WikipediaView.3"))));
-    tabs.addTab(Messages.getString("SuggestionView.5"), UtilGUI.getCentredPanel(new JLabel(Messages
-        .getString("WikipediaView.3"))));
-    tabs.addTab(Messages.getString("SuggestionView.3"), new JLabel(Messages
-        .getString("SuggestionView.7")));
-    tabs.addTab(Messages.getString("SuggestionView.4"), new JLabel(Messages
-        .getString("SuggestionView.7")));
-
-    // Refresh tabs on demand only, add changelisterner after tab creation to
-    // avoid that the stored tab is overwrited at startup
-    tabs.addChangeListener(new ChangeListener() {
-      @Override
-      public void stateChanged(ChangeEvent arg0) {
-        refreshLastFMCollectionTabs();
-        // store the selected tab
-        Conf.setProperty(getClass().getName() + "_"
-            + ((getPerspective() == null) ? "solo" : getPerspective().getID()), Integer.toString(
-            tabs.getSelectedIndex()).toString());
-      }
-    });
+    tabs.addTab(Messages.getString("SuggestionView.1"),
+        UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3"))));
+    tabs.addTab(Messages.getString("SuggestionView.2"),
+        UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3"))));
+    tabs.addTab(Messages.getString("SuggestionView.5"),
+        UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3"))));
+    tabs.addTab(Messages.getString("SuggestionView.3"),
+        new JLabel(Messages.getString("SuggestionView.7")));
+    tabs.addTab(Messages.getString("SuggestionView.4"),
+        new JLabel(Messages.getString("SuggestionView.7")));
+    addTabChangeListener();
+    selectTabFromConf();
+    refreshLocalCollectionTabs();
+    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+    add(tabs);
+    ObservationManager.register(this);
+  }
 
+  private void selectTabFromConf() {
     if (Conf.containsProperty(getClass().getName() + "_"
         + ((getPerspective() == null) ? "solo" : getPerspective().getID()))) {
       int index = Conf.getInt(getClass().getName() + "_"
@@ -245,21 +177,23 @@ public class SuggestionView extends ViewAdapter {
         tabs.setSelectedIndex(index);
       }
     }
+  }
 
-    // Add panels
-    refreshLocalCollectionTabs();
-    // Add tabs
-    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
-    add(tabs);
-    // Look for events
-    ObservationManager.register(this);
+  private void addTabChangeListener() {
+    // Refresh tabs on demand only, add changeListerner after tab creation to
+    // avoid the stored tab to be overwriten at startup
+    tabs.addChangeListener(new ChangeListener() {
+      @Override
+      public void stateChanged(ChangeEvent arg0) {
+        refreshLastFMCollectionTabs();
+        // store the selected tab
+        Conf.setProperty(getClass().getName() + "_"
+            + ((getPerspective() == null) ? "solo" : getPerspective().getID()),
+            Integer.toString(tabs.getSelectedIndex()).toString());
+      }
+    });
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.events.Observer#getRegistrationKeys()
-   */
   @Override
   public Set<JajukEvents> getRegistrationKeys() {
     Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
@@ -275,23 +209,20 @@ public class SuggestionView extends ViewAdapter {
    */
   private void refreshLocalCollectionTabs() {
     // Display a busy panel in the mean-time
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        JXBusyLabel busy1 = new JXBusyLabel();
-        busy1.setBusy(true);
-        JXBusyLabel busy2 = new JXBusyLabel();
-        busy2.setBusy(true);
-        JXBusyLabel busy3 = new JXBusyLabel();
-        busy3.setBusy(true);
-        // stop all existing busy labels before we add the new ones...
-        stopAllBusyLabels();
-        tabs.setComponentAt(0, UtilGUI.getCentredPanel(busy1));
-        tabs.setComponentAt(1, UtilGUI.getCentredPanel(busy2));
-        tabs.setComponentAt(2, UtilGUI.getCentredPanel(busy3));
-      }
-    });
-
+    // For some reasons, if we put that code into an invokeLater() call
+    // it is executed after the next done() in next swing worker, no clue why
+    // As a compromise, we only show busy label when called in EDT (not the case when the 
+    // call is from an update() )
+    if (SwingUtilities.isEventDispatchThread()) {
+      busyLocal1.setBusy(true);
+      busyLocal2.setBusy(true);
+      busyLocal3.setBusy(true);
+      // stop all existing busy labels before we add the new ones...
+      //stopAllBusyLabels();
+      tabs.setComponentAt(0, UtilGUI.getCentredPanel(busyLocal1));
+      tabs.setComponentAt(1, UtilGUI.getCentredPanel(busyLocal2));
+      tabs.setComponentAt(2, UtilGUI.getCentredPanel(busyLocal3));
+    }
     SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
       JScrollPane jsp1;
       JScrollPane jsp2;
@@ -299,14 +230,19 @@ public class SuggestionView extends ViewAdapter {
 
       @Override
       public Void doInBackground() {
-        // Refresh thumbs for required albums
-        List<Album> albums = new ArrayList<Album>(10);
         albumsPrefered = AlbumManager.getInstance().getBestOfAlbums(
             Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED), NB_BESTOF_ALBUMS);
         albumsNewest = AlbumManager.getInstance().getNewestAlbums(
             Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED), NB_BESTOF_ALBUMS);
         albumsRare = AlbumManager.getInstance().getRarelyListenAlbums(
             Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED), NB_BESTOF_ALBUMS);
+        refreshThumbsForLocalAlbums();
+        return null;
+      }
+
+      private void refreshThumbsForLocalAlbums() {
+        // Refresh thumbs for required albums
+        List<Album> albums = new ArrayList<Album>(10);
         albums.addAll(albumsPrefered);
         albums.addAll(albumsNewest);
         albums.addAll(albumsRare);
@@ -316,7 +252,6 @@ public class SuggestionView extends ViewAdapter {
             ThumbnailManager.refreshThumbnail(album, 100);
           }
         }
-        return null;
       }
 
       @Override
@@ -324,12 +259,12 @@ public class SuggestionView extends ViewAdapter {
         jsp1 = getLocalSuggestionsPanel(SuggestionType.BEST_OF);
         jsp2 = getLocalSuggestionsPanel(SuggestionType.NEWEST);
         jsp3 = getLocalSuggestionsPanel(SuggestionType.RARE);
-        // If panel is void, add a void panel as a null object keeps
-        // previous element
-        stopAllBusyLabels();
-        tabs.setComponentAt(0, (jsp1 == null) ? new JPanel() : jsp1);
-        tabs.setComponentAt(1, (jsp2 == null) ? new JPanel() : jsp2);
-        tabs.setComponentAt(2, (jsp3 == null) ? new JPanel() : jsp3);
+        busyLocal1.setBusy(false);
+        busyLocal2.setBusy(false);
+        busyLocal3.setBusy(false);
+        tabs.setComponentAt(0, jsp1);
+        tabs.setComponentAt(1, jsp2);
+        tabs.setComponentAt(2, jsp3);
       }
     };
     sw.execute();
@@ -337,7 +272,7 @@ public class SuggestionView extends ViewAdapter {
 
   /**
    * Refresh last fm collection tabs.
-   * DOCUMENT_ME
+   * 
    */
   private void refreshLastFMCollectionTabs() {
     String newArtist = null;
@@ -357,7 +292,6 @@ public class SuggestionView extends ViewAdapter {
       SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
-          stopAllBusyLabels();
           tabs.setComponentAt(3, new JLabel(Messages.getString("SuggestionView.7")));
           tabs.setComponentAt(4, new JLabel(Messages.getString("SuggestionView.7")));
         }
@@ -374,20 +308,15 @@ public class SuggestionView extends ViewAdapter {
     SwingUtilities.invokeLater(new Runnable() {
       @Override
       public void run() {
-        JXBusyLabel busy1 = new JXBusyLabel();
-        busy1.setBusy(true);
-        JXBusyLabel busy2 = new JXBusyLabel();
-        busy2.setBusy(true);
-        // stop all existing busy labels before we add the new ones...
-        stopAllBusyLabels();
-        tabs.setComponentAt(3, UtilGUI.getCentredPanel(busy1));
-        tabs.setComponentAt(4, UtilGUI.getCentredPanel(busy2));
+        busyLastFM1.setBusy(true);
+        busyLastFM2.setBusy(true);
+        tabs.setComponentAt(3, UtilGUI.getCentredPanel(busyLastFM1));
+        tabs.setComponentAt(4, UtilGUI.getCentredPanel(busyLastFM2));
       }
     });
     // Use a swing worker as construct takes a lot of time
     SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
       JScrollPane jsp1;
-
       JScrollPane jsp2;
 
       @Override
@@ -406,18 +335,19 @@ public class SuggestionView extends ViewAdapter {
       public void done() {
         jsp1 = getLastFMSuggestionsPanel(SuggestionType.OTHERS_ALBUMS, false);
         jsp2 = getLastFMSuggestionsPanel(SuggestionType.SIMILAR_ARTISTS, false);
-        stopAllBusyLabels();
-        tabs.setComponentAt(3, (jsp1 == null) ? new JPanel() : jsp1);
-        tabs.setComponentAt(4, (jsp2 == null) ? new JPanel() : jsp2);
+        busyLastFM1.setBusy(false);
+        busyLastFM2.setBusy(false);
+        tabs.setComponentAt(3, jsp1);
+        tabs.setComponentAt(4, jsp2);
       }
-
     };
     sw.execute();
   }
 
   /**
    * Pre-load other album (done outside the EDT).
-   * 
+  
+   *
    * @throws Exception the exception
    */
   void preFetchOthersAlbum() throws Exception {
@@ -425,6 +355,7 @@ public class SuggestionView extends ViewAdapter {
     // Perform images downloads and caching
     if (albums != null && albums.getAlbums().size() > 0) {
       for (AlbumInfo album : albums.getAlbums()) {
+        // stop this list of albums if there was another file launched in the meantime 
         String albumUrl = album.getBigCoverURL();
         if (StringUtils.isBlank(albumUrl)) {
           continue;
@@ -440,7 +371,7 @@ public class SuggestionView extends ViewAdapter {
 
   /**
    * Pre-load other album (done outside the EDT).
-   * 
+     *
    * @throws Exception the exception
    */
   void preFetchSimilarArtists() throws Exception {
@@ -450,6 +381,7 @@ public class SuggestionView extends ViewAdapter {
     if (similar != null && similar.getArtists() != null) {
       List<ArtistInfo> artists = similar.getArtists();
       for (ArtistInfo similarArtist : artists) {
+        // stop this list of albums if there was another file launched in the meantime, another refresh will take place anyway 
         String artistUrl = similarArtist.getImageUrl();
         if (StringUtils.isBlank(artistUrl)) {
           continue;
@@ -465,9 +397,9 @@ public class SuggestionView extends ViewAdapter {
 
   /**
    * Return the result panel for local albums.
-   * 
-   * @param type DOCUMENT_ME
-   * 
+   *
+   * @param type 
+   *
    * @return the local suggestions panel
    */
   JScrollPane getLocalSuggestionsPanel(SuggestionType type) {
@@ -500,10 +432,10 @@ public class SuggestionView extends ViewAdapter {
 
   /**
    * Return the result panel for lastFM information.
-   * 
-   * @param type DOCUMENT_ME
-   * @param artistView DOCUMENT_ME
-   * 
+   *
+   * @param type 
+   * @param artistView 
+   *
    * @return the last fm suggestions panel
    */
   JScrollPane getLastFMSuggestionsPanel(SuggestionType type, boolean artistView) {
@@ -524,7 +456,6 @@ public class SuggestionView extends ViewAdapter {
             flowPanel.add(thumb);
           }
         }
-
       }
       // No result found
       else {
@@ -551,38 +482,31 @@ public class SuggestionView extends ViewAdapter {
     return jsp;
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.Observer#update(java.lang.String)
-   */
   @Override
   public void update(JajukEvent event) {
-    synchronized (SuggestionView.class) {
-      JajukEvents subject = event.getSubject();
-      if (subject.equals(JajukEvents.FILE_LAUNCHED)) {
-        comp++;
-        // Change local collection suggestions every 10 track plays
-        if (comp % 10 == 0) {
-          refreshLocalCollectionTabs();
-        }
-        // update last.fm panels
-        refreshLastFMCollectionTabs();
-      } else if (subject.equals(JajukEvents.PARAMETERS_CHANGE) && isLastFMTabsVisible()) {
-        // The show/hide unmounted may have changed, refresh local
-        // collection panels
-        refreshLastFMCollectionTabs();
-      } else if (subject.equals(JajukEvents.COVER_DEFAULT_CHANGED)
-          || subject.equals(JajukEvents.SUGGESTIONS_REFRESH)) {
-        // New default cover, refresh the view
+    JajukEvents subject = event.getSubject();
+    if (subject.equals(JajukEvents.FILE_LAUNCHED)) {
+      // Change local collection suggestions every 10 track plays
+      if (comp % 10 == 0) {
         refreshLocalCollectionTabs();
       }
+      comp++;
+      // update last.fm panels
+      refreshLastFMCollectionTabs();
+    } else if (subject.equals(JajukEvents.PARAMETERS_CHANGE) && isLastFMTabsVisible()) {
+      // The show/hide unmounted may have changed, refresh local
+      // collection panels
+      refreshLastFMCollectionTabs();
+    } else if (subject.equals(JajukEvents.COVER_DEFAULT_CHANGED)
+        || subject.equals(JajukEvents.SUGGESTIONS_REFRESH)) {
+      // New default cover, refresh the view
+      refreshLocalCollectionTabs();
     }
   }
 
   /**
    * [Perf].
-   * 
+   *
    * @return whether LastFM tabs are visible or not
    */
   private boolean isLastFMTabsVisible() {
@@ -602,7 +526,7 @@ public class SuggestionView extends ViewAdapter {
 
   /**
    * Gets the nothing found panel.
-   * 
+   *
    * @return a panel with text explaining why no item has been found
    */
   JPanel getNothingFoundPanel() {
diff --git a/src/main/java/org/jajuk/ui/views/TracksTableView.java b/src/main/java/org/jajuk/ui/views/TracksTableView.java
index 425fcbf..44f410b 100644
--- a/src/main/java/org/jajuk/ui/views/TracksTableView.java
+++ b/src/main/java/org/jajuk/ui/views/TracksTableView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import javax.swing.JMenuItem;
@@ -27,9 +26,7 @@ import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.JajukActions;
 import org.jajuk.ui.helpers.JajukTableModel;
 import org.jajuk.ui.helpers.TracksTableModel;
-import org.jajuk.ui.helpers.TwoStepsDisplayable;
 import org.jajuk.ui.widgets.JajukTable;
-import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
@@ -37,15 +34,10 @@ import org.jajuk.util.UtilGUI;
 /**
  * Logical table view.
  */
-public class TracksTableView extends AbstractTableView implements TwoStepsDisplayable {
-
+public class TracksTableView extends AbstractTableView {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiTrackPlayAlbum;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiTrackPlayArtist;
 
   /**
@@ -123,16 +115,4 @@ public class TracksTableView extends AbstractTableView implements TwoStepsDispla
     // model creation
     return new TracksTableModel(getID());
   }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.views.AbstractTableView#initTable()
-   */
-  @Override
-  void initTable() {
-    boolean bEditable = Conf.getBoolean(Const.CONF_TRACKS_TABLE_EDITION);
-    jtbEditable.setSelected(bEditable);
-  }
-
 }
diff --git a/src/main/java/org/jajuk/ui/views/TracksTreeView.java b/src/main/java/org/jajuk/ui/views/TracksTreeView.java
index 0a0d50e..51a3d81 100644
--- a/src/main/java/org/jajuk/ui/views/TracksTreeView.java
+++ b/src/main/java/org/jajuk/ui/views/TracksTreeView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.Component;
@@ -83,17 +82,16 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
-import org.jvnet.substance.api.renderers.SubstanceDefaultTreeCellRenderer;
+import org.pushingpixels.substance.api.renderers.SubstanceDefaultTreeCellRenderer;
 
 /**
  * Logical tree view.
  */
 public class TracksTreeView extends AbstractTreeView implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** Sorting method selection combo. */
+  /** Sorting method selection combo. 
+   * <br>DO NOT PARAMETRIZE THIS COMBO, 1.6 COMPILATION WOULD FAIL*/
   private JComboBox jcbSort;
 
   /*
@@ -142,25 +140,18 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
     jcbSort.setSelectedIndex(Conf.getInt(Const.CONF_LOGICAL_TREE_SORT_ORDER));
     jcbSort.setActionCommand(JajukEvents.LOGICAL_TREE_SORT.toString());
     jcbSort.addActionListener(this);
-
     // Album details
     final JMenuItem jmiShowAlbumDetails = new JMenuItem(
         ActionManager.getAction(JajukActions.SHOW_ALBUM_DETAILS));
     jmiShowAlbumDetails.putClientProperty(Const.DETAIL_SELECTION, alSelected);
-
     top = new TreeRootElement(Messages.getString("TracksTreeView.27"));
-
     // Register on the list for subject we are interested in
     ObservationManager.register(this);
-
     // populate the tree
     populateTree();
-
     // create tree
     createTree(false);
-
     jtree.setCellRenderer(new TracksTreeCellRenderer());
-
     /**
      * CAUTION ! we register several listeners against this tree Swing can't
      * ensure the order where listeners will treat them so don't rely on the
@@ -168,17 +159,14 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
      */
     // Tree selection listener to detect a selection
     jtree.addTreeSelectionListener(new TracksTreeSelectionListener());
-
     // Listen for double click
     jtree.addMouseListener(new TracksMouseAdapter(jmiShowAlbumDetails));
-
     // Expansion analyze to keep expended state
     jtree.addTreeExpansionListener(new TracksTreeExpansionListener());
     jtree.setAutoscrolls(true);
     // DND support
     jtree.setTransferHandler(new TreeTransferHandler(jtree));
     jtree.setDragEnabled(true);
-
     jspTree = new JScrollPane(jtree);
     jspTree.setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 0));
     setLayout(new MigLayout("ins 3", "[][grow][][]", "[][grow]"));
@@ -193,7 +181,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
   /**
    * Fill the tree.
    */
-
   @Override
   public void populateTree() {
     // Use a refreshing flag, not a 'synchronized' here (see deadlock, bug #1756 (Deadlock in AbstractTreeView and PerspectiveManager) 
@@ -205,12 +192,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
       refreshing = true;
       // delete previous tree
       top.removeAllChildren();
-
-      // see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6472844 for a
-      // small memory leak that is caused here...
-      if (jtree != null && jtree.getModel() != null) {
-        ((DefaultTreeModel) (jtree.getModel())).reload();
-      }
       TrackComparatorType comparatorType = TrackComparatorType.values()[Conf
           .getInt(Const.CONF_LOGICAL_TREE_SORT_ORDER)];
       if (comparatorType == TrackComparatorType.GENRE_ARTIST_ALBUM) {
@@ -239,6 +220,11 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
       else if (comparatorType == TrackComparatorType.HITS_ALBUM) {
         populateTreeByHits();
       }
+      // see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6472844 for a
+      // small memory leak that is caused here...
+      if (jtree != null && jtree.getModel() != null) {
+        ((DefaultTreeModel) (jtree.getModel())).reload();
+      }
     } finally {
       refreshing = false;
     }
@@ -259,52 +245,53 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         Artist artist = track.getArtist();
         AlbumNode albumNode = null;
         Album album = track.getAlbum();
-
         // create genre
-        Enumeration e = top.children();
-        boolean b = false;
-        while (e.hasMoreElements()) { // check the genre doesn't
-          // already exist
-          GenreNode sn = (GenreNode) e.nextElement();
-          if (sn.getGenre().equals(genre)) {
-            b = true;
-            genreNode = sn;
-            break;
+        {
+          Enumeration<GenreNode> e = top.children();
+          boolean b = false;
+          while (e.hasMoreElements()) { // check the genre doesn't
+            // already exist
+            GenreNode sn = e.nextElement();
+            if (sn.getGenre().equals(genre)) {
+              b = true;
+              genreNode = sn;
+              break;
+            }
+          }
+          if (!b) {
+            genreNode = new GenreNode(genre);
+            top.add(genreNode);
           }
         }
-        if (!b) {
-          genreNode = new GenreNode(genre);
-          top.add(genreNode);
-        }
-        // create artist
-        if (genreNode != null) {
-          e = genreNode.children();
-        } else {
+        if (genreNode == null) {
           continue;
         }
-        b = false;
-        while (e.hasMoreElements()) { // check if the artist doesn't
-          // already exist
-          ArtistNode an = (ArtistNode) e.nextElement();
-          if (an.getArtist().equals(artist)) {
-            b = true;
-            artistNode = an;
-            break;
+        // create artist
+        {
+          Enumeration<ArtistNode> e2 = genreNode.children();
+          boolean b = false;
+          while (e2.hasMoreElements()) { // check if the artist doesn't
+            // already exist
+            ArtistNode an = e2.nextElement();
+            if (an.getArtist().equals(artist)) {
+              b = true;
+              artistNode = an;
+              break;
+            }
+          }
+          if (!b) {
+            artistNode = new ArtistNode(artist);
+            genreNode.add(artistNode);
           }
-        }
-        if (!b) {
-          artistNode = new ArtistNode(artist);
-          genreNode.add(artistNode);
         }
         // create album
-        if (artistNode != null) {
-          e = artistNode.children();
-        } else {
+        if (artistNode == null) {
           continue;
         }
-        b = false;
-        while (e.hasMoreElements()) {
-          AlbumNode an = (AlbumNode) e.nextElement();
+        Enumeration<AlbumNode> e3 = artistNode.children();
+        boolean b = false;
+        while (e3.hasMoreElements()) {
+          AlbumNode an = e3.nextElement();
           if (an.getAlbum().equals(album)) {
             b = true;
             albumNode = an;
@@ -335,33 +322,33 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         Artist artist = track.getArtist();
         AlbumNode albumNode = null;
         Album album = track.getAlbum();
-
         // create artist
-        Enumeration e = top.children();
-        boolean b = false;
-        while (e.hasMoreElements()) { // check if the artist doesn't
-          // already exist
-          ArtistNode an = (ArtistNode) e.nextElement();
-          if (an.getArtist().equals(artist)) {
-            b = true;
-            artistNode = an;
-            break;
+        {
+          Enumeration<ArtistNode> e = top.children();
+          boolean b = false;
+          while (e.hasMoreElements()) { // check if the artist doesn't
+            // already exist
+            ArtistNode an = e.nextElement();
+            if (an.getArtist().equals(artist)) {
+              b = true;
+              artistNode = an;
+              break;
+            }
+          }
+          if (!b) {
+            artistNode = new ArtistNode(artist);
+            top.add(artistNode);
           }
         }
-        if (!b) {
-          artistNode = new ArtistNode(artist);
-          top.add(artistNode);
-        }
-        // create album
-        if (artistNode != null) {
-          e = artistNode.children();
-        } else {
+        if (artistNode == null) {
           continue;
         }
-        b = false;
-        while (e.hasMoreElements()) { // check if the album doesn't
+        // create album
+        Enumeration<AlbumNode> e2 = artistNode.children();
+        boolean b = false;
+        while (e2.hasMoreElements()) { // check if the album doesn't
           // already exist
-          AlbumNode an = (AlbumNode) e.nextElement();
+          AlbumNode an = e2.nextElement();
           if (an.getAlbum().equals(album)) {
             b = true;
             albumNode = an;
@@ -378,7 +365,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         }
       }
     }
-
   }
 
   /**
@@ -395,31 +381,32 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         Album album = track.getAlbum();
         Year year = track.getYear();
         // create Year
-        Enumeration e = top.children();
-        boolean b = false;
-        // check if the artist doesn't already exist
-        while (e.hasMoreElements()) {
-          YearNode yn = (YearNode) e.nextElement();
-          if (yn.getYear().equals(year)) {
-            b = true;
-            yearNode = yn;
-            break;
+        {
+          Enumeration<YearNode> e = top.children();
+          boolean b = false;
+          // check if the artist doesn't already exist
+          while (e.hasMoreElements()) {
+            YearNode yn = e.nextElement();
+            if (yn.getYear().equals(year)) {
+              b = true;
+              yearNode = yn;
+              break;
+            }
+          }
+          if (!b) {
+            yearNode = new YearNode(year);
+            top.add(yearNode);
           }
         }
-        if (!b) {
-          yearNode = new YearNode(year);
-          top.add(yearNode);
-        }
-        // create album
-        if (yearNode != null) {
-          e = yearNode.children();
-        } else {
+        if (yearNode == null) {
           continue;
         }
-        b = false;
-        while (e.hasMoreElements()) { // check if the album doesn't
+        // create album
+        Enumeration<AlbumNode> e1 = yearNode.children();
+        boolean b = false;
+        while (e1.hasMoreElements()) { // check if the album doesn't
           // already exist
-          AlbumNode an = (AlbumNode) e.nextElement();
+          AlbumNode an = e1.nextElement();
           if (an.getAlbum().equals(album)) {
             b = true;
             albumNode = an;
@@ -545,8 +532,8 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
   /**
    * Utility method used by populateByDiscovery method.
    * 
-   * @param node DOCUMENT_ME
-   * @param track DOCUMENT_ME
+   * @param node 
+   * @param track 
    */
   @SuppressWarnings("unchecked")
   private void addTrackAndAlbum(DefaultMutableTreeNode node, Track track) {
@@ -569,7 +556,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
     if (currentAlbum != null) {
       currentAlbum.add(new TrackNode(track));
     }
-
   }
 
   /*
@@ -609,7 +595,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
     // expand all
     for (int i = 0; i < jtree.getRowCount(); i++) {
       boolean bExp = false;
-
       Object o = jtree.getPathForRow(i).getLastPathComponent();
       if (o instanceof GenreNode) {
         Genre genre = ((GenreNode) o).getGenre();
@@ -624,7 +609,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         Year year = ((YearNode) o).getYear();
         bExp = year.getBooleanValue(Const.XML_EXPANDED);
       }
-
       // now expand row if it should be expanded
       if (bExp) {
         jtree.expandRow(i);
@@ -634,10 +618,9 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
 
   // needs to be inner class as it accesses various members
   /**
-   * DOCUMENT_ME.
+   * .
    */
   class TracksTreeSelectionListener implements TreeSelectionListener {
-
     /*
      * (non-Javadoc)
      * 
@@ -650,16 +633,13 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
       if (tpSelected == null) {
         return;
       }
-
       // get all components recursively
       alSelected.clear();
       selectedRecursively.clear();
       int items = handleSelected(tpSelected);
-
       StringBuilder sbOut = new StringBuilder().append(items).append(
           Messages.getString("TracksTreeView.31"));
       InformationJPanel.getInstance().setSelection(sbOut.toString());
-
       // Notify the tree selection change (used by tree/table sync)
       if (!bInternalAction) {
         Properties properties = new Properties();
@@ -669,7 +649,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         properties.put(Const.DETAIL_VIEW, getID());
         ObservationManager.notify(new JajukEvent(JajukEvents.TREE_SELECTION_CHANGED, properties));
       }
-
       // Update preference menu
       pjmTracks.resetUI(alSelected);
     }
@@ -677,7 +656,7 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
     /**
      * Handle selected.
      * 
-     * @param tpSelected DOCUMENT_ME
+     * @param tpSelected 
      * 
      * @return the int
      */
@@ -698,7 +677,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
             alSelected.add((Item) userObject);
           }
         }
-
         // return all child nodes recursively
         Enumeration<DefaultMutableTreeNode> e2 = ((DefaultMutableTreeNode) o)
             .depthFirstEnumeration();
@@ -722,14 +700,12 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
    * Tracks Tree view mouse adapter.
    */
   class TracksMouseAdapter extends JajukMouseAdapter {
-
-    /** DOCUMENT_ME. */
     private final JMenuItem jmiShowAlbumDetails;
 
     /**
      * Instantiates a new tracks mouse adapter.
      * 
-     * @param jmiShowAlbumDetails DOCUMENT_ME
+     * @param jmiShowAlbumDetails 
      */
     public TracksMouseAdapter(JMenuItem jmiShowAlbumDetails) {
       super();
@@ -749,8 +725,8 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
           File file = track.getBestFile(false);
           if (file != null) {
             try {
-              QueueModel.push(new StackItem(file, Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL),
-                  true), Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
+              QueueModel.push(new StackItem(file, Conf.getBoolean(Const.CONF_STATE_REPEAT), true),
+                  Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
             } catch (JajukException je) {
               Log.error(je);
             }
@@ -779,7 +755,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         jtree.getSelectionModel().setSelectionPath(path);
       }
       paths = jtree.getSelectionModel().getSelectionPaths();
-
       // test mix between types ( not allowed )
       String sClass = paths[0].getLastPathComponent().getClass().toString();
       for (int i = 0; i < paths.length; i++) {
@@ -787,7 +762,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
           return;
         }
       }
-
       // display menus according node type
       buildMenu(e);
     }
@@ -795,7 +769,7 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
     /**
      * Builds the menu.
      * 
-     * @param e DOCUMENT_ME
+     * @param e 
      */
     private void buildMenu(final MouseEvent e) {
       if (paths[0].getLastPathComponent() instanceof TrackNode) {
@@ -877,7 +851,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
       } else if (paths[0].getLastPathComponent() instanceof DefaultMutableTreeNode) {
         // Collection menu
         JPopupMenu jmenuCollection = new JPopupMenu();
-
         // Collection Report
         Action actionReportCollection = ActionManager.getAction(JajukActions.CREATE_REPORT);
         JMenuItem jmiCollectionReport = new JMenuItem(actionReportCollection);
@@ -885,30 +858,21 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
         // to be able to get it
         jmiCollectionReport.putClientProperty(Const.DETAIL_ORIGIN, COLLECTION_LOGICAL);
         jmenuCollection.add(jmiCollectionReport);
-
         // Find duplicate files
         Action actionDuplicateFiles = ActionManager.getAction(JajukActions.FIND_DUPLICATE_FILES);
         JMenuItem jmiCollectionDuplicateFiles = new JMenuItem(actionDuplicateFiles);
         jmenuCollection.add(jmiCollectionDuplicateFiles);
-
         jmenuCollection.show(jtree, e.getX(), e.getY());
       }
     }
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.views.AbstractTreeView#scrollTo(org.jajuk.base.Item)
-   */
   @Override
   void scrollTo(Item item) {
     // Set manual change because we force here tree selection and
     // we don't want to force table views to synchronize
     bInternalAction = true;
     try {
-      // Clear selection so we only select new synchronized item
-      jtree.getSelectionModel().clearSelection();
       // make sure the main element is expanded
       jtree.expandRow(0);
       Track track = null;
@@ -951,7 +915,62 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
           if (tested.getID() == track.getID()) {
             jtree.expandRow(i);
             jtree.scrollPathToVisible(jtree.getPathForRow(i));
-            jtree.getSelectionModel().addSelectionPath(jtree.getPathForRow(i));
+          }
+        }
+      }
+    } finally {
+      bInternalAction = false;
+    }
+  }
+
+  @Override
+  void selectNodes(List<Item> items) {
+    // Set manual change because we force here tree selection and
+    // we don't want to force table views to synchronize
+    bInternalAction = true;
+    try {
+      // Clear selection so we only select new synchronized item
+      jtree.getSelectionModel().clearSelection();
+      // make sure the main element is expanded
+      jtree.expandRow(0);
+      for (Item item : items) {
+        Track track = null;
+        // received item is a file when the event comes from a queue view in the
+        // track perspective
+        if (item instanceof File) {
+          track = ((File) item).getTrack();
+        } else {
+          track = (Track) item;
+        }
+        for (int i = 0; i < jtree.getRowCount(); i++) {
+          Object o = jtree.getPathForRow(i).getLastPathComponent();
+          if (o instanceof AlbumNode) {
+            Album testedAlbum = ((AlbumNode) o).getAlbum();
+            if (track.getAlbum().equals(testedAlbum)) {
+              jtree.expandRow(i);
+            }
+          } else if (o instanceof ArtistNode) {
+            Artist testedArtist = ((ArtistNode) o).getArtist();
+            if (track.getArtist().equals(testedArtist)) {
+              jtree.expandRow(i);
+            }
+          } else if (o instanceof GenreNode) {
+            Genre testedGenre = ((GenreNode) o).getGenre();
+            if (track.getGenre().equals(testedGenre)) {
+              jtree.expandRow(i);
+            }
+          } else if (o instanceof YearNode) {
+            Year testedYear = ((YearNode) o).getYear();
+            if (track.getYear().equals(testedYear)) {
+              jtree.expandRow(i);
+            }
+          } else if (o instanceof TrackNode) {
+            Track tested = ((TrackNode) o).getTrack();
+            // == here thanks to .intern optimization
+            if (tested.getID() == track.getID()) {
+              jtree.expandRow(i);
+              jtree.getSelectionModel().addSelectionPath(jtree.getPathForRow(i));
+            }
           }
         }
       }
@@ -965,7 +984,6 @@ public class TracksTreeView extends AbstractTreeView implements ActionListener {
  * Genre node
  */
 class GenreNode extends DefaultMutableTreeNode {
-
   private static final long serialVersionUID = 1L;
 
   /**
@@ -997,7 +1015,6 @@ class GenreNode extends DefaultMutableTreeNode {
  * Artist node
  */
 class ArtistNode extends DefaultMutableTreeNode {
-
   /**
    * 
    */
@@ -1032,7 +1049,6 @@ class ArtistNode extends DefaultMutableTreeNode {
  * Year node
  */
 class YearNode extends DefaultMutableTreeNode {
-
   /**
    * 
    */
@@ -1071,7 +1087,6 @@ class YearNode extends DefaultMutableTreeNode {
  * Album node
  */
 class AlbumNode extends DefaultMutableTreeNode {
-
   private static final long serialVersionUID = 1L;
 
   /**
@@ -1103,7 +1118,6 @@ class AlbumNode extends DefaultMutableTreeNode {
  * Track node
  */
 class TrackNode extends DefaultMutableTreeNode {
-
   private static final long serialVersionUID = 1L;
 
   /**
@@ -1136,7 +1150,6 @@ class TrackNode extends DefaultMutableTreeNode {
  * Discovery date filter tree node
  */
 class DiscoveryDateNode extends DefaultMutableTreeNode {
-
   /**
    * @param string
    */
@@ -1163,7 +1176,6 @@ class DiscoveryDateNode extends DefaultMutableTreeNode {
   }
 
   private static final long serialVersionUID = 7123195836014138019L;
-
 }
 
 class TracksTreeCellRenderer extends SubstanceDefaultTreeCellRenderer {
@@ -1174,7 +1186,6 @@ class TracksTreeCellRenderer extends SubstanceDefaultTreeCellRenderer {
       boolean expanded, boolean leaf, int row, boolean hasFocus) {
     super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
     setFont(FontManager.getInstance().getFont(JajukFont.PLAIN));
-
     if (value instanceof GenreNode) {
       setIcon(IconLoader.getIcon(JajukIcons.GENRE));
     } else if (value instanceof ArtistNode) {
@@ -1192,7 +1203,6 @@ class TracksTreeCellRenderer extends SubstanceDefaultTreeCellRenderer {
     } else {
       setIcon(IconLoader.getIcon(JajukIcons.LIST));
     }
-
     return this;
   }
 }
diff --git a/src/main/java/org/jajuk/ui/views/ViewAdapter.java b/src/main/java/org/jajuk/ui/views/ViewAdapter.java
index 7846c71..2c20e84 100644
--- a/src/main/java/org/jajuk/ui/views/ViewAdapter.java
+++ b/src/main/java/org/jajuk/ui/views/ViewAdapter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import com.vlsolutions.swing.docking.DockKey;
@@ -35,27 +34,20 @@ import org.jajuk.events.Observer;
 import org.jajuk.ui.perspectives.IPerspective;
 import org.jajuk.ui.widgets.JajukTable;
 import org.jajuk.util.Const;
-import org.jdesktop.swingx.JXBusyLabel;
 import org.jdesktop.swingx.JXPanel;
 
 /**
  * Default implementation for views.
  */
+ at SuppressWarnings("serial")
 public abstract class ViewAdapter extends JXPanel implements IView, Const, Comparable<IView>,
     Observer {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1526958318911770642L;
-
   /** Populated state. */
-  private boolean bIsPopulated = false;
-
+  private boolean isPopulated = false;
   /** View ID; note that a same view can be used several times in the same or in others perspectives. */
   private String sID;
-
   /** Associated perspective*. */
   private IPerspective perspective;
-
   /** Associated DockKey. */
   private final DockKey key;
 
@@ -64,7 +56,6 @@ public abstract class ViewAdapter extends JXPanel implements IView, Const, Compa
    */
   public ViewAdapter() {
     super();
-
     // create a new DockKey (note that ID is set in setID() method)
     key = new DockKey();
     // View title
@@ -90,17 +81,12 @@ public abstract class ViewAdapter extends JXPanel implements IView, Const, Compa
    */
   @Override
   public boolean isPopulated() {
-    return bIsPopulated;
+    return isPopulated;
   }
 
-  /**
-   * Sets the is populated.
-   * 
-   * @param isPopulated Defines, if this View is populated fully.
-   */
   @Override
-  public void setIsPopulated(boolean isPopulated) {
-    bIsPopulated = isPopulated;
+  public void setPopulated() {
+    isPopulated = true;
   }
 
   /*
@@ -232,57 +218,6 @@ public abstract class ViewAdapter extends JXPanel implements IView, Const, Compa
     // required by interface, but nothing to do here...
   }
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.Container#removeAll()
-   */
-  @Override
-  public void removeAll() {
-    // We have to override removeAll() to work around a memory leak related to
-    // JXBusyLabel..
-
-    // first look for any JXBusyLabel and stop it
-    stopAllBusyLabels(this);
-
-    super.removeAll();
-  }
-
-  /**
-   * walk through the list of components and stop any BusyLabel.
-   */
-  public void stopAllBusyLabels() {
-    stopAllBusyLabels(this);
-  }
-
-  /**
-   * walk through the list of components and stop any BusyLabel.
-   * 
-   * @param c DOCUMENT_ME
-   */
-  private static void stopAllBusyLabels(Container c) {
-    for (int i = 0; i < c.getComponentCount(); i++) {
-      Component comp = c.getComponent(i);
-      if (comp instanceof JXBusyLabel) {
-        JXBusyLabel busy = (JXBusyLabel) comp;
-        if (busy.isBusy()) {
-          // make sure we correctly stop the BusyLabel in all cases here,
-          // sometimes this did not work...
-          // this can probably removed after upgrading swingx, see
-          // https://swingx.dev.java.net/issues/show_bug.cgi?id=626
-          busy.setBusy(false);
-        }
-      } else if (comp instanceof Container) {
-        // recursively call the Container to also look at it's components
-        stopAllBusyLabels((Container) comp);
-      }
-    }
-  }
-
-  /**
-   * Cleanup.
-   * DOCUMENT_ME
-   */
   public void cleanup() {
     // unregister any component that is still registered as observer
     cleanupRecursive(this);
@@ -291,22 +226,19 @@ public abstract class ViewAdapter extends JXPanel implements IView, Const, Compa
   /**
    * walk through the list of components and unregister any Observer to free all references.
    * 
-   * @param c DOCUMENT_ME
+   * @param c 
    */
   private static void cleanupRecursive(Container c) {
     for (int i = 0; i < c.getComponentCount(); i++) {
       Component comp = c.getComponent(i);
-
       // unregister any Observer that is contained as Component here, e.g. JajukTable instances
       if (comp instanceof Observer) {
         ObservationManager.unregister((Observer) comp);
       }
-
       // iterate over all KeyListeners and remove them
       for (KeyListener key : comp.getKeyListeners()) {
         comp.removeKeyListener(key);
       }
-
       if (comp instanceof JajukTable) {
         // JajukTable sends TABLE_SELECTION_CHANGED with views as part of the properties. Therefore try to clean up these references 
         // here for every JajukTable that we find by sending an empty TABLE_SELECTION_CHANGED event which clears the last one that is still stored
@@ -319,7 +251,6 @@ public abstract class ViewAdapter extends JXPanel implements IView, Const, Compa
         // we also need to cleanup the RepositoryPanel
         ((ViewAdapter) comp).cleanup();
       }
-
       // recursively call any Container to also look at it's components
       if (comp instanceof Container) {
         cleanupRecursive((Container) comp);
diff --git a/src/main/java/org/jajuk/ui/views/ViewFactory.java b/src/main/java/org/jajuk/ui/views/ViewFactory.java
index dee723e..911925e 100644
--- a/src/main/java/org/jajuk/ui/views/ViewFactory.java
+++ b/src/main/java/org/jajuk/ui/views/ViewFactory.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.util.ArrayList;
@@ -32,7 +31,6 @@ import org.jajuk.ui.perspectives.IPerspective;
  * View Factory, creates view item and manages their ID.
  */
 public final class ViewFactory {
-
   /**
    * No instantiation *.
    */
@@ -57,7 +55,6 @@ public final class ViewFactory {
     }
     view.setID(className.getName() + '/' + id);
     view.setPerspective(perspective);
-
     return view;
   }
 
@@ -69,7 +66,6 @@ public final class ViewFactory {
    * @TODO Refactor this, the known views should be get by reflection (from the
    * default perspectives XML file ?)
    */
-  @SuppressWarnings("unchecked")
   public static List<Class<? extends IView>> getKnownViews() {
     List<Class<? extends IView>> out = new ArrayList<Class<? extends IView>>();
     // Take one instance of each set of view instances mapped to each view
@@ -92,14 +88,15 @@ public final class ViewFactory {
     out.add(AlbumsTableView.class);
     out.add(QueueView.class);
     out.add(ArtistView.class);
-    Collections.sort(out, new Comparator() {
+    out.add(WebRadioView.class);
+    Collections.sort(out, new Comparator<Object>() {
       @Override
       public int compare(Object view1, Object view2) {
         String s1;
         String s2;
         try {
-          s1 = ((IView) ((Class) view1).newInstance()).getDesc();
-          s2 = ((IView) ((Class) view2).newInstance()).getDesc();
+          s1 = ((IView) ((Class<?>) view1).newInstance()).getDesc();
+          s2 = ((IView) ((Class<?>) view2).newInstance()).getDesc();
         } catch (Exception e) {
           throw new RuntimeException(e);
         }
diff --git a/src/main/java/org/jajuk/ui/views/WebRadioView.java b/src/main/java/org/jajuk/ui/views/WebRadioView.java
new file mode 100644
index 0000000..e6475be
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/views/WebRadioView.java
@@ -0,0 +1,211 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $$Revision: 2510 $$
+ */
+package org.jajuk.ui.views;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.BorderFactory;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+
+import org.jajuk.base.Item;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.services.players.QueueModel;
+import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.services.webradio.WebRadioOrigin;
+import org.jajuk.ui.actions.ActionManager;
+import org.jajuk.ui.actions.JajukActions;
+import org.jajuk.ui.helpers.ILaunchCommand;
+import org.jajuk.ui.helpers.JajukTableModel;
+import org.jajuk.ui.helpers.PlayHighlighterPredicate;
+import org.jajuk.ui.helpers.WebRadioTableModel;
+import org.jajuk.ui.widgets.JajukButton;
+import org.jajuk.ui.widgets.JajukTable;
+import org.jajuk.ui.wizard.PropertiesDialog;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilGUI;
+import org.jdesktop.swingx.decorator.ColorHighlighter;
+
+/**
+ * Webradio view.
+ * Show preselected webradios and allow filtering by tag. 
+ * 
+ */
+public class WebRadioView extends AbstractTableView {
+  private static final long serialVersionUID = 1L;
+  /** Add a new web radio button */
+  private JajukButton jbNewRadio;
+
+  /**
+   * Constructor
+   * 
+   */
+  public WebRadioView() {
+    super();
+    columnsConf = CONF_WEBRADIO_COLUMNS;
+    editableConf = CONF_WEBRADIO_TABLE_EDITION;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.jajuk.ui.views.IView#getDesc()
+   */
+  @Override
+  public String getDesc() {
+    return Messages.getString("WebRadioView.0");
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.jajuk.ui.views.IView#populate()
+   */
+  @Override
+  public void initUI() {
+    UtilGUI.populate(this);
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.events.Observer#update(org.jajuk.events.JajukEvent)
+   */
+  @Override
+  public void update(final JajukEvent event) {
+    SwingUtilities.invokeLater(new Runnable() {
+      @Override
+      public void run() {
+        if (JajukEvents.PLAYER_STOP.equals(event.getSubject())
+            || JajukEvents.WEBRADIO_LAUNCHED.equals(event.getSubject())
+            || JajukEvents.DEVICE_REFRESH.equals(event.getSubject())) {
+          model.populateModel(jtable.getColumnsConf());
+          model.fireTableDataChanged();
+          // force filter to refresh
+          applyFilter(sAppliedCriteria, sAppliedFilter);
+        }
+      }
+    });
+  }
+
+  /*
+  * (non-Javadoc)
+  *
+  * @see org.jajuk.events.Observer#getRegistrationKeys()
+  */
+  @Override
+  public Set<JajukEvents> getRegistrationKeys() {
+    Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
+    eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
+    eventSubjectSet.add(JajukEvents.PLAYER_STOP);
+    eventSubjectSet.add(JajukEvents.DEVICE_REFRESH);
+    return eventSubjectSet;
+  }
+
+  /**
+   * (non-Javadoc)
+   * 
+   * @see org.jajuk.ui.views.AbstractTableView#populateTable()
+   */
+  @Override
+  synchronized JajukTableModel populateTable() {
+    // model creation
+    return new WebRadioTableModel();
+  }
+
+  /**
+   * Code used in child class SwingWorker for display computations (used in
+   * initUI()).
+   *
+   * @param in 
+   */
+  @Override
+  public void shortCall(Object in) {
+    jtable = new JajukTable(model, true, columnsConf);
+    jbNewRadio = new JajukButton(IconLoader.getIcon(JajukIcons.ADD));
+    jbNewRadio.setToolTipText(Messages.getString("WebRadioView.8"));
+    // Open a Webradio Properties Dialog 
+    jbNewRadio.addActionListener(new ActionListener() {
+      @Override
+      public void actionPerformed(ActionEvent e) {
+        // Create a new and void webradio
+        final WebRadio radio = WebRadioManager.getInstance().registerWebRadio("");
+        radio.setProperty(XML_ORIGIN, WebRadioOrigin.CUSTOM);
+        List<Item> webradios = new ArrayList<Item>();
+        webradios.add(radio);
+        new PropertiesDialog(webradios);
+      }
+    });
+    ColorHighlighter colorHighlighter = new ColorHighlighter(new PlayHighlighterPredicate(jtable),
+        Color.ORANGE, null);
+    jtable.addHighlighter(colorHighlighter);
+    jmiDelete = new JMenuItem(ActionManager.getAction(JajukActions.DELETE));
+    jmiDelete.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
+    jmiFileCopyURL = new JMenuItem(ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD));
+    jmiFileCopyURL.putClientProperty(Const.DETAIL_CONTENT, jtable.getSelection());
+    jmiProperties = new JMenuItem(ActionManager.getAction(JajukActions.SHOW_PROPERTIES));
+    jmiProperties.putClientProperty(Const.DETAIL_SELECTION, jtable.getSelection());
+    //Add menu items
+    jtable.getMenu().add(jmiFileCopyURL);
+    jtable.getMenu().add(jmiDelete);
+    jtable.getMenu().addSeparator();
+    jtable.getMenu().add(jmiProperties);
+    // Set a default behavior for double click or click on the play column
+    jtable.setCommand(new ILaunchCommand() {
+      @Override
+      public void launch(int nbClicks) {
+        // Ignore event if several rows are selected
+        if (jtable.getSelectedColumnCount() != 1) {
+          return;
+        }
+        int iSelectedCol = jtable.getSelectedColumn();
+        // Convert column selection as columns may have been moved
+        iSelectedCol = jtable.convertColumnIndexToModel(iSelectedCol);
+        // We launch the selection :
+        // - In any case if user clicked on the play column (column 0)
+        // - Or in case of double click on any column 
+        if (iSelectedCol == 0 || // click on play icon
+            // double click on any column and edition state false
+            (nbClicks == 2 && !jtbEditable.isSelected())) {
+          WebRadio radio = (WebRadio) model.getItemAt(jtable.convertRowIndexToModel(jtable
+              .getSelectedRow()));
+          // launch it
+          QueueModel.launchRadio(radio);
+        }
+      }
+    });
+    // Control panel
+    jpControl = new JPanel();
+    jpControl.setBorder(BorderFactory.createEtchedBorder());
+    // Call common code of AbstractTableView
+    createGenericGUI(jbNewRadio);
+    initTable();
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/views/WikipediaView.java b/src/main/java/org/jajuk/ui/views/WikipediaView.java
index dfb4418..e0514c4 100644
--- a/src/main/java/org/jajuk/ui/views/WikipediaView.java
+++ b/src/main/java/org/jajuk/ui/views/WikipediaView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.views;
 
 import java.awt.FlowLayout;
@@ -64,55 +63,28 @@ import org.jajuk.util.log.Log;
  * Wikipedia view.
  */
 public class WikipediaView extends ViewAdapter implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   JLabel jlLanguage;
-
-  /** DOCUMENT_ME. */
   JComboBox jcbLanguage;
-
   /** Cobra web browser. */
   JajukHtmlPanel browser;
-
-  /** DOCUMENT_ME. */
   JButton jbCopy;
-
-  /** DOCUMENT_ME. */
   JButton jbLaunchInExternalBrowser;
-
-  /** DOCUMENT_ME. */
   JToggleButton jbArtistSearch;
-
-  /** DOCUMENT_ME. */
   JToggleButton jbAlbumSearch;
-
-  /** DOCUMENT_ME. */
   JToggleButton jbTrackSearch;
-
   /** Language index. */
   int indexLang = 0;
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   enum Type {
-
-    /** DOCUMENT_ME. */
-    ARTIST,
-    
-    /** DOCUMENT_ME. */
-    ALBUM,
-    
-    /** DOCUMENT_ME. */
-    TRACK
+    ARTIST, ALBUM, TRACK
   }
 
-  /** DOCUMENT_ME. */
   Type type = Type.ARTIST;
-
   /** Current search. */
   String search = null;
 
@@ -146,8 +118,8 @@ public class WikipediaView extends ViewAdapter implements ActionListener {
     JajukAction aCopy = ActionManager.getAction(JajukActions.COPY_TO_CLIPBOARD);
     jbCopy = new JButton(aCopy);
     if (UtilSystem.isBrowserSupported()) {
-      jbLaunchInExternalBrowser = new JButton(ActionManager
-          .getAction(JajukActions.LAUNCH_IN_BROWSER));
+      jbLaunchInExternalBrowser = new JButton(
+          ActionManager.getAction(JajukActions.LAUNCH_IN_BROWSER));
       // Remove text inside the buttons
       jbLaunchInExternalBrowser.setText(null);
     }
@@ -168,7 +140,6 @@ public class WikipediaView extends ViewAdapter implements ActionListener {
     bg.add(jbArtistSearch);
     bg.add(jbAlbumSearch);
     bg.add(jbTrackSearch);
-
     JToolBar jtb = new JajukJToolbar();
     jtb.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
     // Add items
@@ -182,28 +153,23 @@ public class WikipediaView extends ViewAdapter implements ActionListener {
       jtb.addSeparator();
     }
     jtb.add(jcbLanguage);
-
     JPanel jpCommand = new JPanel();
     jpCommand.setBorder(BorderFactory.createEtchedBorder());
     jpCommand.setLayout(new FlowLayout(FlowLayout.LEFT));
     jpCommand.add(jtb);
-
     // global layout
     setLayout(new MigLayout("ins 0", "[grow]", "[][grow]"));
     browser = new JajukHtmlPanel();
     add(jpCommand, "growx,wrap");
     add(browser, "grow");
-
     // Display default page at startup is none track launch
     // avoid to launch this if a track is playing
     // to avoid thread concurrency
     if (QueueModel.getPlayingFile() == null) {
       reset();
     }
-
     // subscriptions to events
     ObservationManager.register(WikipediaView.this);
-
     // Force initial message refresh
     UtilFeatures.updateStatus(this);
   }
@@ -270,10 +236,8 @@ public class WikipediaView extends ViewAdapter implements ActionListener {
       } catch (Exception e) {
         Log.error(e);
       }
-
       return;
     }
-
     Thread t = new Thread("Wikipedia Search Thread") {
       @Override
       public void run() {
@@ -307,8 +271,9 @@ public class WikipediaView extends ViewAdapter implements ActionListener {
           }
           // Store the search to avoid future identical searches
           WikipediaView.this.search = lSearch;
-
-          URL url = new URL(("http://"
+          // Wikipedia now redirect to HTTPS automatically so we need to use the
+          // HTTPS URL
+          URL url = new URL(("https://"
               + LocaleManager.getLocaleForDesc((String) jcbLanguage.getSelectedItem())
               + ".wikipedia.org/wiki/" + lSearch).replaceAll(" ", "_"));
           Log.debug("Wikipedia search: {{" + url + "}}");
@@ -327,7 +292,6 @@ public class WikipediaView extends ViewAdapter implements ActionListener {
         } catch (Exception e) {
           Log.error(e);
         }
-
       }
     };
     t.setPriority(Thread.MIN_PRIORITY);
@@ -339,7 +303,7 @@ public class WikipediaView extends ViewAdapter implements ActionListener {
    */
   /**
    * Reset.
-   * DOCUMENT_ME
+   * 
    */
   private void reset() {
     // Reset current search
diff --git a/src/main/java/org/jajuk/ui/widgets/AmbienceComboBox.java b/src/main/java/org/jajuk/ui/widgets/AmbienceComboBox.java
index 83e22c7..070227b 100644
--- a/src/main/java/org/jajuk/ui/widgets/AmbienceComboBox.java
+++ b/src/main/java/org/jajuk/ui/widgets/AmbienceComboBox.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -49,10 +49,8 @@ import org.jajuk.util.log.Log;
  * Ambience selection combo box.
  */
 public class AmbienceComboBox extends SteppedComboBox {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** An instance of the ambience combo listener. */
   private AmbienceListener ambienceListener;
 
@@ -60,7 +58,6 @@ public class AmbienceComboBox extends SteppedComboBox {
    * Ambience combo listener.
    */
   private class AmbienceListener implements ActionListener {
-
     /* (non-Javadoc)
      * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
      */
@@ -115,8 +112,8 @@ public class AmbienceComboBox extends SteppedComboBox {
       removeItemListener(element);
     }
     removeAllItems();
-    addItem(new JLabel(Messages.getString("CommandJPanel.19"), IconLoader
-        .getIcon(JajukIcons.CONFIGURATION), SwingConstants.LEFT));
+    addItem(new JLabel(Messages.getString("CommandJPanel.19"),
+        IconLoader.getIcon(JajukIcons.CONFIGURATION), SwingConstants.LEFT));
     addItem(new JLabel("<html><i>" + Messages.getString("DigitalDJWizard.64") + "</i></html>",
         IconLoader.getIcon(JajukIcons.GENRE), SwingConstants.LEFT));
     // Add available ambiences
@@ -167,5 +164,4 @@ public class AmbienceComboBox extends SteppedComboBox {
     ambienceListener = new AmbienceListener();
     addActionListener(ambienceListener);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/CommandJPanel.java b/src/main/java/org/jajuk/ui/widgets/CommandJPanel.java
index 20692de..ecfb080 100644
--- a/src/main/java/org/jajuk/ui/widgets/CommandJPanel.java
+++ b/src/main/java/org/jajuk/ui/widgets/CommandJPanel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -30,8 +30,6 @@ import static org.jajuk.ui.actions.JajukActions.PREVIOUS_ALBUM;
 import static org.jajuk.ui.actions.JajukActions.PREVIOUS_TRACK;
 import static org.jajuk.ui.actions.JajukActions.STOP_TRACK;
 import ext.DropDownButton;
-import ext.scrollablepopupmenu.XCheckedButton;
-import ext.scrollablepopupmenu.XJPopupMenu;
 
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
@@ -43,9 +41,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import javax.swing.Action;
 import javax.swing.ButtonGroup;
-import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JLabel;
@@ -68,9 +64,6 @@ import org.jajuk.events.Observer;
 import org.jajuk.services.dj.DigitalDJ;
 import org.jajuk.services.dj.DigitalDJManager;
 import org.jajuk.services.players.Player;
-import org.jajuk.services.players.QueueModel;
-import org.jajuk.services.webradio.WebRadio;
-import org.jajuk.services.webradio.WebRadioManager;
 import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.ui.actions.ActionUtil;
 import org.jajuk.ui.actions.JajukAction;
@@ -82,7 +75,6 @@ import org.jajuk.ui.substance.CircleButtonShaper;
 import org.jajuk.ui.substance.LeftConcaveButtonShaper;
 import org.jajuk.ui.substance.RightConcaveButtonShaper;
 import org.jajuk.ui.substance.RoundRectButtonShaper;
-import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
@@ -91,7 +83,8 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.UtilFeatures;
 import org.jajuk.util.log.Log;
 import org.jdesktop.swingx.JXPanel;
-import org.jvnet.substance.SubstanceLookAndFeel;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
+
 
 /**
  * Command panel ( static view )
@@ -101,99 +94,39 @@ import org.jvnet.substance.SubstanceLookAndFeel;
  */
 public class CommandJPanel extends JXPanel implements ActionListener, ChangeListener, Observer,
     MouseWheelListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   // singleton
-  /** DOCUMENT_ME. */
   private static CommandJPanel command = new CommandJPanel();
-
   // widgets declaration
-
   /** Continue mode button. */
   private JajukToggleButton jbContinue;
-
-  /** DOCUMENT_ME. */
   private JajukToggleButton jbRepeat;
-
-  /** DOCUMENT_ME. */
-  private JajukToggleButton jbRandom;
-
-  /** DOCUMENT_ME. */
+  private JajukToggleButton jbShuffle;
   private JToolBar jtbSpecial;
-
-  /** DOCUMENT_ME. */
   private DropDownButton ddbGlobalRandom;
-
-  /** DOCUMENT_ME. */
   private JRadioButtonMenuItem jmiShuffleModeSong;
-
-  /** DOCUMENT_ME. */
   private JRadioButtonMenuItem jmiShuffleModeAlbum;
-
-  /** DOCUMENT_ME. */
   private JRadioButtonMenuItem jmiShuffleModeAlbum2;
-
-  /** DOCUMENT_ME. */
   private JPopupMenu popupGlobalRandom;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbBestof;
-
-  /** DOCUMENT_ME. */
   private DropDownButton ddbNovelties;
-
-  /** DOCUMENT_ME. */
   private JPopupMenu popupNovelties;
-
-  /** DOCUMENT_ME. */
-  private DropDownButton ddbWebRadio;
-
-  /** DOCUMENT_ME. */
-  private XJPopupMenu popupWebRadio;
-
-  /** DOCUMENT_ME. */
+  private WebRadioButton webRadioButton;
   private JRadioButtonMenuItem jmiNoveltiesModeSong;
-
-  /** DOCUMENT_ME. */
   private JRadioButtonMenuItem jmiNoveltiesModeAlbum;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbNorm;
-
-  /** DOCUMENT_ME. */
   private DropDownButton ddbDDJ;
-
-  /** DOCUMENT_ME. */
   private JPopupMenu popupDDJ;
-
-  /** DOCUMENT_ME. */
   private JButton jbPrevious;
-
-  /** DOCUMENT_ME. */
   private JButton jbNext;
-
-  /** DOCUMENT_ME. */
   private JButton jbPlayPause;
-
-  /** DOCUMENT_ME. */
   private JButton jbStop;
-
-  /** DOCUMENT_ME. */
   private JSlider jsVolume;
-
-  /** DOCUMENT_ME. */
   private JLabel jlVolume;
-
-  /** DOCUMENT_ME. */
   private PreferenceToolbar evaltoobar;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbMute;
-
   // variables declaration
-  /** DOCUMENT_ME. */
   private JajukToggleButton jbRepeatAll;
 
   /**
@@ -215,16 +148,14 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
 
   /**
    * Inits the ui.
-   * DOCUMENT_ME
+   * 
    */
   public void initUI() {
     // Instanciate the PlayerStateMediator to listen for player basic controls
     PlayerStateMediator.getInstance();
-
     // Install keystrokes on invisible components
     ActionUtil.installKeystrokes(CommandJPanel.this, ActionManager.getAction(NEXT_ALBUM),
         ActionManager.getAction(PREVIOUS_ALBUM));
-
     // Mode toolbar
     // we need an inner toolbar to apply size properly
     JPanel jpModes = new JPanel();
@@ -236,16 +167,14 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
     jbRepeat.setSelected(Conf.getBoolean(Const.CONF_STATE_REPEAT));
     jbRepeatAll = new JajukToggleButton(ActionManager.getAction(JajukActions.REPEAT_ALL_MODE));
     jbRepeatAll.setSelected(Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL));
-    jbRandom = new JajukToggleButton(ActionManager.getAction(JajukActions.SHUFFLE_MODE));
-    jbRandom.setSelected(Conf.getBoolean(Const.CONF_STATE_SHUFFLE));
+    jbShuffle = new JajukToggleButton(ActionManager.getAction(JajukActions.SHUFFLE_MODE));
+    jbShuffle.setSelected(Conf.getBoolean(Const.CONF_STATE_SHUFFLE));
     jpModes.add(jbContinue);
     jpModes.add(jbRepeat);
     jpModes.add(jbRepeatAll);
-    jpModes.add(jbRandom);
-
+    jpModes.add(jbShuffle);
     // Eval toolbar
     evaltoobar = new PreferenceToolbar();
-
     // Volume
     int iVolume = (int) (100 * Conf.getFloat(Const.CONF_VOLUME));
     // Perform bounds test, -1 or >100 can occur in some undefined cases (see
@@ -269,7 +198,6 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
         ActionManager.getAction(JajukActions.INCREASE_VOLUME));
     ActionUtil.installKeystrokes(jsVolume, ActionManager.getAction(JajukActions.DECREASE_VOLUME),
         ActionManager.getAction(JajukActions.INCREASE_VOLUME));
-
     // Special functions toolbar
     jtbSpecial = new JajukJToolbar();
     ddbGlobalRandom = new DropDownButton(IconLoader.getIcon(JajukIcons.SHUFFLE_GLOBAL)) {
@@ -306,9 +234,7 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
     popupGlobalRandom.add(jmiShuffleModeAlbum);
     popupGlobalRandom.add(jmiShuffleModeAlbum2);
     ddbGlobalRandom.setText("");// no text visible
-
     jbBestof = new JajukButton(ActionManager.getAction(JajukActions.BEST_OF));
-
     ddbNovelties = new DropDownButton(IconLoader.getIcon(JajukIcons.NOVELTIES)) {
       private static final long serialVersionUID = 1L;
 
@@ -335,7 +261,6 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
     popupNovelties.add(jmiNoveltiesModeAlbum);
     ddbNovelties.setText("");// no text visible
     jbNorm = new JajukButton(ActionManager.getAction(FINISH_ALBUM));
-
     // Radio tool bar
     popupDDJ = new JPopupMenu();
     ddbDDJ = new DropDownButton(IconLoader.getIcon(JajukIcons.DIGITAL_DJ)) {
@@ -350,29 +275,14 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
     populateDJs();
     // no text visible
     ddbDDJ.setText("");
-
-    popupWebRadio = new XJPopupMenu(JajukMainWindow.getInstance());
-    ddbWebRadio = new DropDownButton(IconLoader.getIcon(JajukIcons.WEBRADIO)) {
-      private static final long serialVersionUID = 1L;
-
-      @Override
-      protected JPopupMenu getPopupMenu() {
-        return popupWebRadio;
-      }
-    };
-    ddbWebRadio.setAction(ActionManager.getAction(JajukActions.WEB_RADIO));
-    populateWebRadios();
-    // no text
-    ddbWebRadio.setText("");
+    webRadioButton = new WebRadioButton(IconLoader.getIcon(JajukIcons.WEBRADIO));
     JToolBar jtbWebRadio = new JajukJToolbar();
-    ddbWebRadio.addToToolBar(jtbWebRadio);
-
+    webRadioButton.addToToolBar(jtbWebRadio);
     ddbDDJ.addToToolBar(jtbSpecial);
     ddbNovelties.addToToolBar(jtbSpecial);
     ddbGlobalRandom.addToToolBar(jtbSpecial);
     jtbSpecial.add(jbBestof);
     jtbSpecial.add(jbNorm);
-
     // Play buttons
     jbPrevious = new JajukButton(ActionManager.getAction(PREVIOUS_TRACK));
     // Manage right click : replay the track (this not triggers an action so we use a MouseAdapter here)
@@ -401,13 +311,10 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
     jbStop = new JajukButton(ActionManager.getAction(STOP_TRACK));
     jbStop.putClientProperty(SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY,
         new RoundRectButtonShaper());
-
     // Add items
     setLayout(new MigLayout("insets 5 0 0 5", "[grow][grow][grow]"));
-
     add(jtbWebRadio, "left,split 2,gapright 10");
     add(jtbSpecial, "left,gapright 10");
-
     add(jbStop, "center,split 7,width 40!,height 30,gapright 5!");
     add(jbPrevious, "center,width 58!,height 30!,gapright 0");
     add(jbPlayPause, "center,width 45!,height 45!,gapright 0");
@@ -415,16 +322,12 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
     add(jbMute, "center,width 42!,height 30!,gapright 5");
     add(jsVolume, "center,growx,width 25::100,gapright 3");
     add(jlVolume, "width 40!,gapright 10");
-
     add(jpModes, "right,split 2,gapright 5");
     add(evaltoobar, "right");
-
     // register to player events
     ObservationManager.register(CommandJPanel.this);
-
     // Update initial status
     UtilFeatures.updateStatus(this);
-
   }
 
   /*
@@ -439,14 +342,16 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
     eventSubjectSet.add(JajukEvents.PLAYER_PLAY);
     eventSubjectSet.add(JajukEvents.PLAYER_PAUSE);
     eventSubjectSet.add(JajukEvents.PLAYER_RESUME);
-    eventSubjectSet.add(JajukEvents.SPECIAL_MODE);
+    eventSubjectSet.add(JajukEvents.SMART_FUNCTION_LAUNCHED);
     eventSubjectSet.add(JajukEvents.ZERO);
-    eventSubjectSet.add(JajukEvents.REPEAT_MODE_STATUS_CHANGED);
+    eventSubjectSet.add(JajukEvents.MODE_STATUS_CHANGED);
     eventSubjectSet.add(JajukEvents.CLEAR_HISTORY);
     eventSubjectSet.add(JajukEvents.VOLUME_CHANGED);
     eventSubjectSet.add(JajukEvents.DJS_CHANGE);
     eventSubjectSet.add(JajukEvents.WEBRADIOS_CHANGE);
     eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
+    eventSubjectSet.add(JajukEvents.PARAMETERS_CHANGE);
+    eventSubjectSet.add(JajukEvents.DEVICE_REFRESH);
     return eventSubjectSet;
   }
 
@@ -501,7 +406,8 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
    */
   @Override
   public void mouseWheelMoved(MouseWheelEvent e) {
-    if (e.getSource() == jsVolume || e.getSource() == jbMute) {
+    if (e.getSource() == jsVolume
+        || (e.getSource() == jbMute && !Conf.getBoolean(Const.CONF_BIT_PERFECT))) {
       int iOld = jsVolume.getValue();
       float newVolume = ((float) (iOld - (e.getUnitsToScroll() * 3))) / 100;
       Player.setVolume(newVolume);
@@ -538,28 +444,13 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
         } else if (JajukEvents.PLAYER_RESUME.equals(subject)) {
           // Enable the volume when resuming (fix a mplayer issue, see
           // above)
-          jsVolume.setEnabled(true);
+          jsVolume.setEnabled(!Conf.getBoolean(Const.CONF_BIT_PERFECT));
           jbMute.addMouseWheelListener(CommandJPanel.this);
           jsVolume.addMouseWheelListener(CommandJPanel.this);
         } else if (JajukEvents.PLAYER_PLAY.equals(subject)) {
-          jsVolume.setEnabled(true);
-        } else if (JajukEvents.SPECIAL_MODE.equals(subject)) {
-          if (ObservationManager.getDetail(event, Const.DETAIL_ORIGIN).equals(
-              Const.DETAIL_SPECIAL_MODE_NORMAL)) {
-            // deselect shuffle mode
-            Conf.setProperty(Const.CONF_STATE_SHUFFLE, Const.FALSE);
-            JajukJMenuBar.getInstance().setShuffleSelected(false);
-            CommandJPanel.getInstance().jbRandom.setSelected(false);
-            // computes planned tracks
-            QueueModel.computesPlanned(true);
-          }
-        } else if (JajukEvents.REPEAT_MODE_STATUS_CHANGED.equals(subject)) {
-          if (ObservationManager.getDetail(event, Const.DETAIL_SELECTION).equals(Const.FALSE)) {
-            // deselect repeat mode
-            Conf.setProperty(Const.CONF_STATE_REPEAT, Const.FALSE);
-            JajukJMenuBar.getInstance().setRepeatSelected(false);
-            CommandJPanel.getInstance().jbRepeat.setSelected(false);
-          }
+          jsVolume.setEnabled(!Conf.getBoolean(Const.CONF_BIT_PERFECT));
+        } else if (JajukEvents.MODE_STATUS_CHANGED.equals(subject)) {
+          updateModesGUIStatus();
         } else if (JajukEvents.VOLUME_CHANGED.equals(event.getSubject())) {
           // Update volume GUI
           jsVolume.removeChangeListener(CommandJPanel.this);
@@ -581,9 +472,14 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
             action.setShortDescription(Messages.getString("CommandJPanel.18"));
           }
         } else if (JajukEvents.WEBRADIOS_CHANGE.equals(event.getSubject())) {
-          populateWebRadios();
+          webRadioButton.populateWebRadios();
         } else if (JajukEvents.WEBRADIO_LAUNCHED.equals(event.getSubject())) {
-          populateWebRadios();
+          webRadioButton.populateWebRadios();
+        } else if (JajukEvents.PARAMETERS_CHANGE.equals(event.getSubject())) {
+          // Disable volume GUI in bit perfect mode
+          jsVolume.setEnabled(!Conf.getBoolean(Const.CONF_BIT_PERFECT));
+        } else if (JajukEvents.DEVICE_REFRESH.equals(event.getSubject())) {
+          webRadioButton.populateWebRadios();
         }
       }
     });
@@ -602,8 +498,8 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
       Iterator<DigitalDJ> it = DigitalDJManager.getInstance().getDJs().iterator();
       while (it.hasNext()) {
         final DigitalDJ dj = it.next();
-        JCheckBoxMenuItem jmi = new JCheckBoxMenuItem(dj.getName(), IconLoader
-            .getIcon(JajukIcons.DIGITAL_DJ_16X16));
+        JCheckBoxMenuItem jmi = new JCheckBoxMenuItem(dj.getName(),
+            IconLoader.getIcon(JajukIcons.DIGITAL_DJ_16X16));
         jmi.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent arg0) {
@@ -626,47 +522,6 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
   }
 
   /**
-   * Populate webradios.
-   */
-  private void populateWebRadios() {
-    try {
-      // Update button tooltip
-      ddbWebRadio.setToolTipText(WebRadioManager.getCurrentWebRadioTooltip());
-      // Clear previous elements
-      popupWebRadio.removeAll();
-      // Add configure radios item
-      JajukAction actionConf = ActionManager.getAction(JajukActions.CONFIGURE_WEBRADIOS);
-      XCheckedButton jmiConf = new XCheckedButton(actionConf);
-      // Set icon so it is correctly displayed after a selection
-      jmiConf.setCheckedIcon((ImageIcon) actionConf.getValue(Action.SMALL_ICON));
-      // The icon should be always displayed
-      jmiConf.setIconAlwaysVisible(true);
-      popupWebRadio.add(jmiConf);
-      for (final WebRadio radio : WebRadioManager.getInstance().getWebRadios()) {
-        XCheckedButton jmi = new XCheckedButton(radio.getName());
-        jmi.addActionListener(new ActionListener() {
-          @Override
-          public void actionPerformed(ActionEvent e) {
-            Conf.setProperty(Const.CONF_DEFAULT_WEB_RADIO, radio.getName());
-            // force to reselect the item
-            populateWebRadios();
-            // update action tooltip on main button with right item
-            JajukAction action = ActionManager.getAction(JajukActions.WEB_RADIO);
-            action.setShortDescription(Const.HTML + Messages.getString("CommandJPanel.25")
-                + Const.P_B + radio.getName() + Const.B_P_HTML);
-          }
-        });
-        jmi.setSelected(Conf.getString(Const.CONF_DEFAULT_WEB_RADIO).equals(radio.getName()));
-        // Show the check icon
-        jmi.setDisplayCheck(true);
-        popupWebRadio.add(jmi);
-      }
-    } catch (Exception e) {
-      Log.error(e);
-    }
-  }
-
-  /**
    * ToString() method.
    * 
    * @return the string
@@ -677,29 +532,12 @@ public class CommandJPanel extends JXPanel implements ActionListener, ChangeList
   }
 
   /**
-   * Sets the repeat selected.
-   * 
-   * @param b the new repeat selected
-   */
-  public void setRepeatSelected(final boolean b) {
-    this.jbRepeat.setSelected(b);
-  }
-
-  /**
-   * Sets the repeat all selected.
-   * 
-   * @param b the new repeat all selected
-   */
-  public void setRepeatAllSelected(final boolean b) {
-    this.jbRepeatAll.setSelected(b);
-  }
-
-  /**
-   * Sets the random selected.
-   * 
-   * @param b the new random selected
+   * Update mode buttons after a mode change
    */
-  public void setRandomSelected(final boolean b) {
-    this.jbRandom.setSelected(b);
+  private void updateModesGUIStatus() {
+    this.jbRepeat.setSelected(Conf.getBoolean(Const.CONF_STATE_REPEAT));
+    this.jbRepeatAll.setSelected(Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL));
+    this.jbContinue.setSelected(Conf.getBoolean(Const.CONF_STATE_CONTINUE));
+    this.jbShuffle.setSelected(Conf.getBoolean(Const.CONF_STATE_SHUFFLE));
   }
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/CopyableLabel.java b/src/main/java/org/jajuk/ui/widgets/CopyableLabel.java
index ae79e30..45059c2 100644
--- a/src/main/java/org/jajuk/ui/widgets/CopyableLabel.java
+++ b/src/main/java/org/jajuk/ui/widgets/CopyableLabel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision: 3132 $
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -25,17 +25,15 @@ import javax.swing.JTextField;
 import org.jajuk.util.log.Log;
 
 /**
- * A label that user whom users can copy content
+ * A label that user whom users can copy content.
  */
 public class CopyableLabel extends JTextField {
-
-  /**
-   * Default serial UID
-   */
+  /** Default serial UID. */
   private static final long serialVersionUID = 1L;
 
   /**
-   * Build a Copyable label
+   * Build a Copyable label.
+   *
    * @param text : text to display
    */
   public CopyableLabel(String text) {
@@ -43,13 +41,14 @@ public class CopyableLabel extends JTextField {
     setBorder(null);
     setOpaque(false);
     setEditable(false);
+    // Not focusable to avoid tabbing between field focus this button instead next field
+    setFocusable(false);
   }
 
   /**
-   * Override setText() method to make sure users can't change it
+   * Override setText() method to make sure users can't change it.
    */
   public void setText() {
     Log.debug("Label edition is not allowed");
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/IconLabel.java b/src/main/java/org/jajuk/ui/widgets/IconLabel.java
index d35476b..d9bb3a1 100644
--- a/src/main/java/org/jajuk/ui/widgets/IconLabel.java
+++ b/src/main/java/org/jajuk/ui/widgets/IconLabel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.Color;
@@ -39,37 +38,29 @@ import org.jajuk.util.log.Log;
  * Encapsulates a label with a text and an icon, used for tables.
  */
 public class IconLabel extends ImageIcon implements Comparable<IconLabel> {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 3794262035337113611L;
-
   /** Text. */
   private final String sText;
-
   /** Background color. */
   private Color cBackground;
-
   /** Foreground color. */
   private Color cForeground;
-
   /** Font. */
   private Font font;
-
   /** Tooltip. */
   private String sTooltip;
-
-  /** DOCUMENT_ME. */
   private static Map<JajukIcons, IconLabel> cachedIcons = new HashMap<JajukIcons, IconLabel>();
 
   /**
    * Constructor.
    * 
-   * @param icon DOCUMENT_ME
-   * @param sText DOCUMENT_ME
-   * @param cBackground DOCUMENT_ME
-   * @param cForeground DOCUMENT_ME
-   * @param font DOCUMENT_ME
-   * @param sTooltip DOCUMENT_ME
+   * @param icon 
+   * @param sText 
+   * @param cBackground 
+   * @param cForeground 
+   * @param font 
+   * @param sTooltip 
    */
   public IconLabel(ImageIcon icon, String sText, Color cBackground, Color cForeground, Font font,
       String sTooltip) {
@@ -82,17 +73,6 @@ public class IconLabel extends ImageIcon implements Comparable<IconLabel> {
   }
 
   /**
-   * Instantiates a new icon label.
-   * 
-   * @param icon DOCUMENT_ME
-   * @param sText DOCUMENT_ME
-   */
-  private IconLabel(ImageIcon icon, String sText) {
-    super(icon.getImage());
-    this.sText = sText;
-  }
-
-  /**
    * Gets the text.
    * 
    * @return Returns the sText.
@@ -162,31 +142,38 @@ public class IconLabel extends ImageIcon implements Comparable<IconLabel> {
     }
   }
 
+  @Override
+  public boolean equals(Object other) {
+    // this also catches null
+    if (!(other instanceof IconLabel)) {
+      return false;
+    }
+    IconLabel otherIcon = (IconLabel) other;
+    return getText().equals(otherIcon.getText());
+  }
+
   /**
    * Gets an IconLabel from a cache for memory saving reasons.
    * Note that this doesn't handle StarIconLabel that owns its own cache.
    * 
-   * @param icon DOCUMENT_ME
+   * @param icon 
    * 
    * @return the icon
    */
   public static IconLabel getIconLabel(JajukIcons icon) {
     if (icon == JajukIcons.TRACK_FIFO_PLANNED) {
       if (!cachedIcons.containsKey(icon)) {
-        cachedIcons.put(icon, new IconLabel(IconLoader.getIcon(JajukIcons.TRACK_FIFO_PLANNED), "",
-            null, null, FontManager.getInstance().getFont(JajukFont.PLANNED), Messages
-                .getString("AbstractPlaylistEditorView.20")));
+        cachedIcons.put(
+            icon,
+            new IconLabel(IconLoader.getIcon(JajukIcons.TRACK_FIFO_PLANNED), "", null, null,
+                FontManager.getInstance().getFont(JajukFont.PLANNED), Messages
+                    .getString("AbstractPlaylistEditorView.20")));
       }
     } else if (icon == JajukIcons.TRACK_FIFO_REPEAT) {
       if (!cachedIcons.containsKey(icon)) {
         cachedIcons.put(icon, new IconLabel(IconLoader.getIcon(icon), "", null, null, null,
             Messages.getString("AbstractPlaylistEditorView.19")));
       }
-    } else if (icon == JajukIcons.TRACK_FIFO_PLAYING) {
-      if (!cachedIcons.containsKey(icon)) {
-        cachedIcons.put(icon, new IconLabel(IconLoader.getIcon(icon), "", null, null, null,
-            Messages.getString("AbstractPlaylistEditorView.29")));
-      }
     } else if (icon == JajukIcons.TRACK_FIFO_NORM) {
       if (!cachedIcons.containsKey(icon)) {
         cachedIcons.put(icon, new IconLabel(IconLoader.getIcon(icon), "", null, null, null,
diff --git a/src/main/java/org/jajuk/ui/widgets/InformationJPanel.java b/src/main/java/org/jajuk/ui/widgets/InformationJPanel.java
index 16dcd61..4401696 100644
--- a/src/main/java/org/jajuk/ui/widgets/InformationJPanel.java
+++ b/src/main/java/org/jajuk/ui/widgets/InformationJPanel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -61,29 +61,20 @@ import org.jdesktop.swingx.JXPanel;
  * Status / information panel ( static view ).
  */
 public final class InformationJPanel extends JXPanel implements Observer {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public static enum MessageType {
-    
-    /** DOCUMENT_ME. */
-    INFORMATIVE, 
- /** DOCUMENT_ME. */
- ERROR, 
- /** DOCUMENT_ME. */
- WARNING
+    INFORMATIVE, ERROR, WARNING
   }
 
   /** Self instance. */
   private static InformationJPanel ijp = new InformationJPanel();
-
   /** Swing Timer to refresh the component. */
   private final Timer timer = new Timer(JajukTimer.DEFAULT_HEARTBEAT, new ActionListener() {
-
     @Override
     public void actionPerformed(ActionEvent e) {
       try {
@@ -104,31 +95,15 @@ public final class InformationJPanel extends JXPanel implements Observer {
   }
 
   // widgets declaration
-
-  /** DOCUMENT_ME. */
   public JLabel jlMessage;
-
-  /** DOCUMENT_ME. */
   JLabel jlSelection;
-
-  /** DOCUMENT_ME. */
   JLabel jlTotal;
-
   // attributes
-
-  /** DOCUMENT_ME. */
   String sMessage;
-
   /** Current message type. */
   MessageType type = MessageType.INFORMATIVE;
-
-  /** DOCUMENT_ME. */
   String sSelection;
-
-  /** DOCUMENT_ME. */
   String sTotalStatus;
-
-  /** DOCUMENT_ME. */
   private final TrackPositionSliderToolbar trackPositionSliderToolbar;
 
   /**
@@ -146,36 +121,29 @@ public final class InformationJPanel extends JXPanel implements Observer {
     jtbMessage.add(jlMessage);
     jtbMessage.add(Box.createHorizontalGlue());
     jtbMessage.addSeparator();
-
     trackPositionSliderToolbar = new TrackPositionSliderToolbar();
-
     jlTotal = new JLabel();
     // Make sure to get always 5 px at the left and right of the label
-    jlTotal.setBorder(new EmptyBorder(0,5,0,5));
+    jlTotal.setBorder(new EmptyBorder(0, 5, 0, 5));
     jlTotal.setToolTipText(Messages.getString("InformationJPanel.5"));
- 
     // selection bar
     jlSelection = new JLabel(Messages.getString("InformationJPanel.9"));
     // Make sure to get always 5 px at the left and right of the label
-    jlSelection.setBorder(new EmptyBorder(0,5,0,3));
-  
+    jlSelection.setBorder(new EmptyBorder(0, 5, 0, 3));
     // add widgets
     setLayout(new MigLayout("insets 2", "[40%,grow][40%,grow][10%,grow][10%,grow]"));
     add(jtbMessage, "grow,left");
     add(trackPositionSliderToolbar, "grow");
     add(jlTotal, "grow");
     add(jlSelection, "grow,right");
-
     // check if some errors occurred before the view has been displayed
     if (ObservationManager.containsEvent(JajukEvents.PLAY_ERROR)) {
-      update(new JajukEvent(JajukEvents.PLAY_ERROR, ObservationManager
-          .getDetailsLastOccurence(JajukEvents.PLAY_ERROR)));
+      update(new JajukEvent(JajukEvents.PLAY_ERROR,
+          ObservationManager.getDetailsLastOccurence(JajukEvents.PLAY_ERROR)));
     }
-
     // check if some track has been launched before the view has been
     // displayed
     UtilFeatures.updateStatus(this);
-
     // register for given events
     ObservationManager.register(this);
     // start timer
@@ -194,6 +162,7 @@ public final class InformationJPanel extends JXPanel implements Observer {
     eventSubjectSet.add(JajukEvents.FILE_LAUNCHED);
     eventSubjectSet.add(JajukEvents.PLAY_ERROR);
     eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
+    eventSubjectSet.add(JajukEvents.WEBRADIO_INFO_UPDATED);
     eventSubjectSet.add(JajukEvents.PLAYER_STOP);
     eventSubjectSet.add(JajukEvents.THUMB_CREATED);
     eventSubjectSet.add(JajukEvents.FILE_COPIED);
@@ -222,8 +191,8 @@ public final class InformationJPanel extends JXPanel implements Observer {
   /**
    * Sets the message.
    * 
-   * @param sMessage DOCUMENT_ME
-   * @param messageType DOCUMENT_ME
+   * @param sMessage 
+   * @param messageType 
    */
   public void setMessage(final String sMessage, final MessageType messageType) {
     this.sMessage = sMessage;
@@ -249,7 +218,7 @@ public final class InformationJPanel extends JXPanel implements Observer {
   /**
    * Sets the selection.
    * 
-   * @param sSelection DOCUMENT_ME
+   * @param sSelection 
    */
   public void setSelection(String sSelection) {
     this.sSelection = sSelection;
@@ -269,7 +238,7 @@ public final class InformationJPanel extends JXPanel implements Observer {
   /**
    * Sets the total time message.
    * 
-   * @param string DOCUMENT_ME
+   * @param string 
    */
   public void setTotalTimeMessage(String string) {
     sTotalStatus = string;
@@ -313,7 +282,6 @@ public final class InformationJPanel extends JXPanel implements Observer {
             }
           } else if (o instanceof WebRadio) {
             WebRadio radio = (WebRadio) o;
-
             // display associated error code is given
             if (detail != null) {
               setMessage(Messages.getErrorMessage(errorCode) + ": " + radio.toString(),
@@ -348,8 +316,6 @@ public final class InformationJPanel extends JXPanel implements Observer {
             String sCurrentTotalMessage = UtilString.formatTimeBySec(timeToPlay);
             setTotalTimeMessage(sCurrentTotalMessage + " [" + QueueModel.getCountTracksLeft() + "]");
           } else if (JajukEvents.ZERO.equals(subject) || JajukEvents.PLAYER_STOP.equals(subject)) {
-            // reset startup position
-            Conf.setProperty(Const.CONF_STARTUP_LAST_POSITION, "0");
             setTotalTimeMessage("00:00:00");
             setMessage(Messages.getString("JajukWindow.18"),
                 InformationJPanel.MessageType.INFORMATIVE);
@@ -375,6 +341,15 @@ public final class InformationJPanel extends JXPanel implements Observer {
               String message = Messages.getString("FIFO.14") + " " + radio.getName();
               setMessage(message, InformationJPanel.MessageType.INFORMATIVE);
             }
+          } else if (JajukEvents.WEBRADIO_INFO_UPDATED.equals(subject)) {
+            if (event.getDetails() == null) {
+              return;
+            }
+            String webradioInfo = (String) event.getDetails().get(Const.CURRENT_RADIO_TRACK);
+            if (webradioInfo != null) {
+              String message = Messages.getString("FIFO.14") + " " + webradioInfo;
+              setMessage(message, InformationJPanel.MessageType.INFORMATIVE);
+            }
           } else if (JajukEvents.FILE_COPIED.equals(subject)) {
             Properties properties = event.getDetails();
             if (properties == null) {
@@ -396,9 +371,9 @@ public final class InformationJPanel extends JXPanel implements Observer {
               String filename = properties.getProperty(Const.DETAIL_CONTENT);
               String target = properties.getProperty(Const.DETAIL_NEW);
               if (filename != null) {
-                setMessage(Messages.getString("Device.46") + filename
-                    + Messages.getString("Device.47") + target + "]",
-                    InformationJPanel.MessageType.INFORMATIVE);
+                setMessage(
+                    Messages.getString("Device.46") + filename + Messages.getString("Device.47")
+                        + target + "]", InformationJPanel.MessageType.INFORMATIVE);
               }
             }
           }
@@ -425,5 +400,4 @@ public final class InformationJPanel extends JXPanel implements Observer {
   public MessageType getMessageType() {
     return type;
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/widgets/JPressButton.java b/src/main/java/org/jajuk/ui/widgets/JPressButton.java
index e69cea4..6e266e7 100644
--- a/src/main/java/org/jajuk/ui/widgets/JPressButton.java
+++ b/src/main/java/org/jajuk/ui/widgets/JPressButton.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -36,16 +36,12 @@ import javax.swing.plaf.ButtonUI;
  * as the button remains pressed.
  */
 public class JPressButton extends JajukButton {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant DEFAULT_INTERVAL.  DOCUMENT_ME */
+  /** The Constant DEFAULT_INTERVAL.   */
   private static final long DEFAULT_INTERVAL = 250;
-
   /** The interval between successive fireActionPerformed() calls. */
   private long actionInterval;
-
   /** Re-use the L&F component of a normal <code>JButton</code>. */
   private static final String UI_CLASS_ID = "ButtonUI";
 
@@ -78,7 +74,7 @@ public class JPressButton extends JajukButton {
    * Creates a button with an icon.
    * 
    * @param icon the Icon image to display on the button
-   * @param actionInterval DOCUMENT_ME
+   * @param actionInterval 
    */
   public JPressButton(Icon icon, long actionInterval) {
     this(null, icon, actionInterval);
@@ -97,7 +93,7 @@ public class JPressButton extends JajukButton {
    * Creates a button with text.
    * 
    * @param text the text of the button
-   * @param actionInterval DOCUMENT_ME
+   * @param actionInterval 
    */
   public JPressButton(String text, long actionInterval) {
     this(text, null, actionInterval);
@@ -119,7 +115,7 @@ public class JPressButton extends JajukButton {
    * supplied.
    * 
    * @param a the <code>Action</code> used to specify the new button
-   * @param actionInterval DOCUMENT_ME
+   * @param actionInterval 
    */
   public JPressButton(Action a, long actionInterval) {
     this();
@@ -143,17 +139,14 @@ public class JPressButton extends JajukButton {
    * 
    * @param text the text of the button
    * @param icon the Icon image to display on the button
-   * @param actionInterval DOCUMENT_ME
+   * @param actionInterval 
    */
   public JPressButton(String text, Icon icon, long actionInterval) {
     this.actionInterval = actionInterval;
-
     // Create the model
     setModel(new PressButtonModel(this));
-
     // initialize
     init(text, icon);
-
     // Set border
     setRolloverEnabled(true);
   }
@@ -208,20 +201,15 @@ public class JPressButton extends JajukButton {
    * @see ActionThread
    */
   public static class PressButtonModel extends DefaultButtonModel {
-
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = 1L;
-
-    /** DOCUMENT_ME. */
     private ActionThread thread;
-
-    /** DOCUMENT_ME. */
     private final JPressButton button;
 
     /**
      * Instantiates a new press button model.
      * 
-     * @param button DOCUMENT_ME
+     * @param button 
      */
     public PressButtonModel(JPressButton button) {
       this.button = button;
@@ -235,13 +223,11 @@ public class JPressButton extends JajukButton {
       if ((isPressed() == b) || !isEnabled()) {
         return;
       }
-
       if (b) {
         stateMask |= PRESSED;
       } else {
         stateMask &= ~PRESSED;
       }
-
       if (isArmed()) {
         int modifiers = 0;
         AWTEvent currentEvent = EventQueue.getCurrentEvent();
@@ -250,7 +236,6 @@ public class JPressButton extends JajukButton {
         } else if (currentEvent instanceof ActionEvent) {
           modifiers = ((ActionEvent) currentEvent).getModifiers();
         }
-
         if (isPressed() && thread == null) {
           thread = button.new ActionThread(new ActionEvent(button, ActionEvent.ACTION_PERFORMED,
               getActionCommand(), EventQueue.getMostRecentEventTime(), modifiers));
@@ -270,20 +255,14 @@ public class JPressButton extends JajukButton {
    * event at a certain interval.
    */
   private class ActionThread extends Thread {
-
-    /** DOCUMENT_ME. */
     private final ActionEvent evt;
-
-    /** DOCUMENT_ME. */
     private boolean active = true;
-
-    /** DOCUMENT_ME. */
     private final long interval;
 
     /**
      * Instantiates a new action thread.
      * 
-     * @param evt DOCUMENT_ME
+     * @param evt 
      */
     public ActionThread(ActionEvent evt) {
       this(evt, DEFAULT_INTERVAL);
@@ -292,12 +271,11 @@ public class JPressButton extends JajukButton {
     /**
      * Instantiates a new action thread.
      * 
-     * @param evt DOCUMENT_ME
-     * @param interval DOCUMENT_ME
+     * @param evt 
+     * @param interval 
      */
     public ActionThread(ActionEvent evt, long interval) {
       super("JPressButton Action Thread");
-
       this.interval = interval;
       this.evt = evt;
     }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukBasicComboPopup.java b/src/main/java/org/jajuk/ui/widgets/JajukBasicComboPopup.java
index a4fb9cb..eb67418 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukBasicComboPopup.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukBasicComboPopup.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.Dimension;
@@ -35,14 +34,13 @@ import javax.swing.plaf.basic.BasicComboPopup;
  * @created 28 nov. 2003
  */
 public class JajukBasicComboPopup extends BasicComboPopup {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
   /**
    * Instantiates a new jajuk basic combo popup.
    * 
-   * @param jcb DOCUMENT_ME
+   * @param jcb 
    */
   public JajukBasicComboPopup(JComboBox jcb) {
     super(jcb);
@@ -80,5 +78,4 @@ public class JajukBasicComboPopup extends BasicComboPopup {
     return new JScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukButton.java b/src/main/java/org/jajuk/ui/widgets/JajukButton.java
index 11caa0c..c16d528 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukButton.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukButton.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -28,7 +28,6 @@ import javax.swing.JButton;
  * jajuk default button, comes with few GUI default properties.
  */
 public class JajukButton extends JButton {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -42,7 +41,7 @@ public class JajukButton extends JButton {
   /**
    * Instantiates a new jajuk button.
    * 
-   * @param icon DOCUMENT_ME
+   * @param icon 
    */
   public JajukButton(Icon icon) {
     this(null, icon);
@@ -51,7 +50,7 @@ public class JajukButton extends JButton {
   /**
    * Instantiates a new jajuk button.
    * 
-   * @param a DOCUMENT_ME
+   * @param a 
    */
   public JajukButton(Action a) {
     super(a);
@@ -62,8 +61,8 @@ public class JajukButton extends JButton {
   /**
    * Instantiates a new jajuk button.
    * 
-   * @param text DOCUMENT_ME
-   * @param icon DOCUMENT_ME
+   * @param text 
+   * @param icon 
    */
   public JajukButton(String text, Icon icon) {
     super(text, icon);
@@ -92,5 +91,4 @@ public class JajukButton extends JButton {
     }
     super.configurePropertiesFromAction(action);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukFileChooser.java b/src/main/java/org/jajuk/ui/widgets/JajukFileChooser.java
index 7342b2e..55aada5 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukFileChooser.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukFileChooser.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -35,11 +35,8 @@ import org.jajuk.util.Messages;
  * Music-oriented file chooser.
  */
 public class JajukFileChooser extends JFileChooser {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private final JajukFileFilter filter;
 
   /**
@@ -49,12 +46,10 @@ public class JajukFileChooser extends JFileChooser {
    */
   public JajukFileChooser(JajukFileFilter jfilter) {
     super();
-
     this.filter = jfilter;
     for (int i = 0; i < jfilter.getFilters().length; i++) {
       addChoosableFileFilter(jfilter.getFilters()[i]);
     }
-
     init();
   }
 
@@ -62,16 +57,14 @@ public class JajukFileChooser extends JFileChooser {
    * Constructor with specified file filter and starting directory/file.
    * 
    * @param jfilter filter to use
-   * @param file DOCUMENT_ME
+   * @param file 
    */
   public JajukFileChooser(JajukFileFilter jfilter, File file) {
     super(file);
-
     this.filter = jfilter;
     for (int i = 0; i < jfilter.getFilters().length; i++) {
       addChoosableFileFilter(jfilter.getFilters()[i]);
     }
-
     init();
   }
 
@@ -92,7 +85,7 @@ public class JajukFileChooser extends JFileChooser {
   /**
    * Force the filter to accept directories.
    * 
-   * @param b DOCUMENT_ME
+   * @param b 
    */
   public void setAcceptDirectories(boolean b) {
     for (int i = 0; i < filter.getFilters().length; i++) {
@@ -103,7 +96,7 @@ public class JajukFileChooser extends JFileChooser {
   /**
    * Make sure to keep the dialog always on top.
    * 
-   * @param parent DOCUMENT_ME
+   * @param parent 
    * 
    * @return the j dialog
    * 
@@ -114,7 +107,5 @@ public class JajukFileChooser extends JFileChooser {
     JDialog dialog = super.createDialog(parent);
     dialog.setAlwaysOnTop(true);
     return dialog;
-
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukHtmlPanel.java b/src/main/java/org/jajuk/ui/widgets/JajukHtmlPanel.java
index 1510a99..8315613 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukHtmlPanel.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukHtmlPanel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.io.BufferedWriter;
@@ -58,20 +57,13 @@ import org.xml.sax.SAXException;
  * Cobra browser HTML panel.
  */
 public class JajukHtmlPanel extends HtmlPanel {
-
-  /** The Constant COLON.  DOCUMENT_ME */
+  /** The Constant COLON.   */
   private static final String COLON = " : ";
-
-  /** The Constant URL_COLON.  DOCUMENT_ME */
+  /** The Constant URL_COLON.   */
   private static final String URL_COLON = "URL: ";
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -4033441908072591661L;
-
-  /** DOCUMENT_ME. */
   private final SimpleHtmlRendererContext rcontext;
-
-  /** DOCUMENT_ME. */
   private final DocumentBuilderImpl dbi;
 
   /**
@@ -87,25 +79,27 @@ public class JajukHtmlPanel extends HtmlPanel {
   }
 
   /**
-   * Display a wikipedia url.
+   * Display a wikipedia url given a cache file.
+   * <p>Download the url to cache if not already in cache</p>
    *
-   * @param url DOCUMENT_ME
-   * @param lang DOCUMENT_ME
+   * @param url 
+   * @param lang 
    */
   public void setURL(final URL url, final String lang) {
-
     SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
       @Override
       public Void doInBackground() {
-        File page = new File(SessionService.getConfFileByPath(Const.FILE_CACHE).getAbsolutePath()
-            + '/' + UtilSystem.getOnlyFile(url.toString() + ".html"));
+    	 File page = new File(SessionService.getConfFileByPath(Const.FILE_CACHE).getAbsolutePath()
+    	            + '/' + UtilSystem.getOnlyFile(url.toString() + ".html"));
+        File expectedCacheFile =  SessionService.getCachePath(url);
         try {
           setCursor(UtilGUI.WAIT_CURSOR);
-
+          if (!expectedCacheFile.exists()) {
+            DownloadManager.downloadToCache(url);
+          }
           // first indicate that we are loading a new page
           setLoading(url);
-
-          String sPage = DownloadManager.downloadText(url);
+          String sPage = DownloadManager.getTextFromCachedFile(url,"UTF-8");
           // Leave if no result
           if (sPage == null) {
             return null;
@@ -133,7 +127,6 @@ public class JajukHtmlPanel extends HtmlPanel {
         } catch (FileNotFoundException e) {
           // This happens whenever the Artist is not listed on Wikipedia, so we should report this more user-friendly
           Log.debug("Could not read page: {{" + url.toString() + " Cache: " + page + "}}");
-
           try {
             setFailedToLoad(Messages.getString("WikipediaView.9") + ": " + url.toString());
           } catch (IOException e1) {
@@ -144,9 +137,8 @@ public class JajukHtmlPanel extends HtmlPanel {
         } catch (IOException e) {
           // report IOException only as warning here as we can expect this to
           // happen frequently with images on the net
-          Log.warn("Could not read page: {{" + url.toString() + " Cache: " + page + "}}", e
-              .getMessage());
-
+          Log.warn("Could not read page: {{" + url.toString() + " Cache: " + page + "}}",
+              e.getMessage());
           try {
             setFailedToLoad(URL_COLON + url + COLON + e.getClass().getSimpleName() + COLON
                 + e.getMessage());
@@ -157,7 +149,6 @@ public class JajukHtmlPanel extends HtmlPanel {
           }
         } catch (Exception e) {
           Log.error(e);
-
           try {
             setFailedToLoad(URL_COLON + url + COLON + e.getClass().getSimpleName() + COLON
                 + e.getMessage());
@@ -225,8 +216,8 @@ public class JajukHtmlPanel extends HtmlPanel {
   /**
    * Make the internal operations.
    * 
-   * @param sPage DOCUMENT_ME
-   * @param page DOCUMENT_ME
+   * @param sPage 
+   * @param page 
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    * @throws SAXException the SAX exception
@@ -251,7 +242,6 @@ public class JajukHtmlPanel extends HtmlPanel {
       // A documentURI should be provided to resolve relative
       // URIs.
       Document document = dbi.parse(is);
-
       // Now set document in panel. This is what causes the
       // document to render.
       setDocument(document, rcontext);
@@ -262,7 +252,7 @@ public class JajukHtmlPanel extends HtmlPanel {
 
   /**
    * Back.
-   * DOCUMENT_ME
+   * 
    */
   public void back() {
     rcontext.back();
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukInformationDialog.java b/src/main/java/org/jajuk/ui/widgets/JajukInformationDialog.java
index 35c5530..460f258 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukInformationDialog.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukInformationDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,20 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
 import java.awt.Color;
-import java.awt.Window;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
-import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JRootPane;
+import javax.swing.JWindow;
 import javax.swing.SwingUtilities;
 import javax.swing.border.EmptyBorder;
 import javax.swing.border.LineBorder;
@@ -41,12 +40,10 @@ import org.jajuk.util.log.Log;
 /**
  * Dialog displayed by slimbar and tray or notificators.
  */
-public class JajukInformationDialog extends JDialog {
-
+public class JajukInformationDialog extends JWindow {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** Has this dialog already been hidden ? */
+  /** Has this dialog already been hidden ?. */
   private boolean hasAlreadyBeenHidden = false;
 
   /**
@@ -55,18 +52,13 @@ public class JajukInformationDialog extends JDialog {
    * @param text : text to display
    * @param owner parent owner, see  #1582 ([Linux] Void entry in task bar for information dialog)
    */
-  public JajukInformationDialog(String text, Window owner) {
+  public JajukInformationDialog(String text) {
     // An annoying entry appears under linux in the taskbar. We have no way so far to fix it.
-    // We tried this trick : set the owner window to fix a JRE issue under Linux only
-    // See http://www.velocityreviews.com/forums/t125048-re-jdialog-in-taskbar-under-linux.html
-    // It fixes the problem but a new problem arises : the main window appears / disappears
-    // with the toast, it is even worse than the previous issue.
-    super(owner);
+    //see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7078460
+    super();
     setFocusableWindowState(false);
     setFocusable(false);
-    setUndecorated(true);
-    // Don't use setAlwaysOnTop or the toast steals the focus, see #1636
-    //setAlwaysOnTop(true);
+    setAlwaysOnTop(true);
     getRootPane().setWindowDecorationStyle(JRootPane.NONE);
     getRootPane().setBorder(new LineBorder(Color.BLACK));
     JLabel jl = new JLabel(text);
@@ -82,7 +74,6 @@ public class JajukInformationDialog extends JDialog {
     // Fix for #1778 : the Window.dispose() method doesn't seem to work (under Linux at least) if the component is not visible.
     // We add a component listener to detect hide/show. If the dialog has already been hidden once, it is disposed.
     addComponentListener(new ComponentAdapter() {
-
       @Override
       public void componentShown(ComponentEvent e) {
         if (hasAlreadyBeenHidden) {
@@ -122,7 +113,7 @@ public class JajukInformationDialog extends JDialog {
   }
 
   /**
-   * Close the dialog
+   * Close the dialog.
    */
   public void close() {
     // Call dispose from the EDT, otherwise, it seems to block in some rare cases under
@@ -133,7 +124,5 @@ public class JajukInformationDialog extends JDialog {
         dispose();
       }
     });
-
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukJDialog.java b/src/main/java/org/jajuk/ui/widgets/JajukJDialog.java
index 51d3748..ff0d9c7 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukJDialog.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukJDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.Frame;
@@ -35,7 +34,6 @@ import org.jajuk.util.UtilGUI;
  * Custom JDialog.
  */
 public class JajukJDialog extends JDialog {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 3280008357821054703L;
 
@@ -44,19 +42,17 @@ public class JajukJDialog extends JDialog {
    */
   public JajukJDialog() {
     super(JajukMainWindow.getInstance());
-
     setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
   }
 
   /**
    * The Constructor.
    * 
-   * @param owner DOCUMENT_ME
-   * @param modal DOCUMENT_ME
+   * @param owner 
+   * @param modal 
    */
   public JajukJDialog(Frame owner, boolean modal) {
     super(owner, modal);
-
     setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
   }
 
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukJMenuBar.java b/src/main/java/org/jajuk/ui/widgets/JajukJMenuBar.java
index 4c98cbf..18260ff 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukJMenuBar.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukJMenuBar.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -85,155 +85,56 @@ import org.jajuk.util.log.Log;
  * Singleton.
  */
 public final class JajukJMenuBar extends JMenuBar implements Observer {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** The singleton. */
   static JajukJMenuBar jjmb = new JajukJMenuBar();
-
-  /** DOCUMENT_ME. */
   JMenu file;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiFileExit;
-
-  /** DOCUMENT_ME. */
   JMenu views;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiRestoreDefaultViews;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiRestoreDefaultViewsAllPerpsectives;
-
-  /** DOCUMENT_ME. */
   JMenu properties;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiNewProperty;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiRemoveProperty;
-
-  /** DOCUMENT_ME. */
   JMenu mode;
-
-  /** DOCUMENT_ME. */
   JCheckBoxMenuItem jcbShowPopups;
-
-  /** DOCUMENT_ME. */
   JCheckBoxMenuItem jcbNoneInternetAccess;
-
-  /** DOCUMENT_ME. */
   private final JCheckBoxMenuItem jcbmiRepeat;
-
-  /** DOCUMENT_ME. */
   private final JCheckBoxMenuItem jcbmiShuffle;
-
-  /** DOCUMENT_ME. */
   private final JCheckBoxMenuItem jcbmiContinue;
-
-  /** DOCUMENT_ME. */
   private final JCheckBoxMenuItem jcbmiIntro;
-
-  /** DOCUMENT_ME. */
   private final JCheckBoxMenuItem jcbmiKaraoke;
-
-  /** DOCUMENT_ME. */
   JMenuBar mainmenu;
-
-  /** DOCUMENT_ME. */
   JMenu smart;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiShuffle;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiBestof;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiNovelties;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiFinishAlbum;
-
-  /** DOCUMENT_ME. */
   JMenu tools;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiduplicateFinder;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmialarmClock;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiprepareParty;
-
-  /** DOCUMENT_ME. */
   JMenu configuration;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDJ;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiAmbience;
-
-  /** DOCUMENT_ME. */
-  JMenuItem jmiWebradios;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiWizard;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiOptions;
-
-  /** DOCUMENT_ME. */
   JCheckBoxMenuItem jmiUnmounted;
-
-  /** DOCUMENT_ME. */
   JMenu help;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiHelp;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiTipOfTheDay;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiQualityAgent;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiTraces;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiCheckforUpdates;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiAbout;
-
-  /** DOCUMENT_ME. */
   JLabel jlUpdate;
-
-  /** DOCUMENT_ME. */
   JButton jbGC;
-
-  /** DOCUMENT_ME. */
-  JButton jbCommit;
-
-  /** DOCUMENT_ME. */
   JButton jbSlim;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbFull = null;
-
-  /** DOCUMENT_ME. */
   private final JCheckBoxMenuItem jcbmiRepeatAll;
-
   /** The jmi activate tags. */
   private JMenuItem jmiActivateTags;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jmiDonate;
 
   /**
@@ -243,26 +144,21 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
     setAlignmentX(0.0f);
     // File menu
     file = new JMenu(Messages.getString("JajukJMenuBar.0"));
-
     jmiFileExit = new JMenuItem(ActionManager.getAction(JajukActions.EXIT));
     file.add(jmiFileExit);
-
     // Properties menu
     properties = new JMenu(Messages.getString("JajukJMenuBar.5"));
-
     jmiNewProperty = new JMenuItem(ActionManager.getAction(CUSTOM_PROPERTIES_ADD));
     jmiRemoveProperty = new JMenuItem(ActionManager.getAction(CUSTOM_PROPERTIES_REMOVE));
     jmiActivateTags = new JMenuItem(ActionManager.getAction(EXTRA_TAGS_WIZARD));
     properties.add(jmiNewProperty);
     properties.add(jmiRemoveProperty);
     properties.add(jmiActivateTags);
-
     // View menu
     views = new JMenu(Messages.getString("JajukJMenuBar.8"));
     jmiRestoreDefaultViews = new JMenuItem(ActionManager.getAction(VIEW_RESTORE_DEFAULTS));
-    jmiRestoreDefaultViewsAllPerpsectives = new JMenuItem(ActionManager
-        .getAction(JajukActions.ALL_VIEW_RESTORE_DEFAULTS));
-
+    jmiRestoreDefaultViewsAllPerpsectives = new JMenuItem(
+        ActionManager.getAction(JajukActions.ALL_VIEW_RESTORE_DEFAULTS));
     views.add(jmiRestoreDefaultViews);
     views.add(jmiRestoreDefaultViewsAllPerpsectives);
     views.addSeparator();
@@ -283,20 +179,18 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
           PerspectiveAdapter current = (PerspectiveAdapter) PerspectiveManager
               .getCurrentPerspective();
           IView newView = ViewFactory.createView(view, current,
-              (int) (Integer.MAX_VALUE * UtilSystem.getRandom().nextDouble()));
+              Math.abs(UtilSystem.getRandom().nextInt()));
           newView.initUI();
-          newView.setIsPopulated(true);
+          newView.setPopulated();
           current.addDockable(newView);
         }
       });
       jmViews.add(jmi);
     }
     views.add(jmViews);
-
     // Mode menu
     String modeText = Messages.getString("JajukJMenuBar.9");
     mode = new JMenu(ActionUtil.strip(modeText));
-
     jcbmiRepeat = new JCheckBoxMenuItem(ActionManager.getAction(REPEAT_MODE));
     jcbmiRepeat.setSelected(Conf.getBoolean(Const.CONF_STATE_REPEAT));
     jcbmiRepeatAll = new JCheckBoxMenuItem(ActionManager.getAction(REPEAT_ALL_MODE));
@@ -308,27 +202,29 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
     jcbmiIntro = new JCheckBoxMenuItem(ActionManager.getAction(INTRO_MODE));
     jcbmiIntro.setSelected(Conf.getBoolean(Const.CONF_STATE_INTRO));
     jcbmiKaraoke = new JCheckBoxMenuItem(ActionManager.getAction(JajukActions.KARAOKE_MODE));
-    jcbmiKaraoke.setSelected(Conf.getBoolean(Const.CONF_STATE_KARAOKE));
-
+    if (Conf.getBoolean(Const.CONF_BIT_PERFECT)) {
+      jcbmiKaraoke.setEnabled(false);
+      jcbmiKaraoke.setSelected(false);
+      Conf.setProperty(Const.CONF_STATE_KARAOKE, Const.FALSE);
+    } else {
+      jcbmiKaraoke.setSelected(Conf.getBoolean(Const.CONF_STATE_KARAOKE));
+    }
     mode.add(jcbmiRepeat);
     mode.add(jcbmiRepeatAll);
     mode.add(jcbmiShuffle);
     mode.add(jcbmiContinue);
     mode.add(jcbmiIntro);
     mode.add(jcbmiKaraoke);
-
     // Smart Menu
     smart = new JMenu(Messages.getString("JajukJMenuBar.29"));
     jmiShuffle = new SizedJMenuItem(ActionManager.getAction(JajukActions.SHUFFLE_GLOBAL));
     jmiBestof = new SizedJMenuItem(ActionManager.getAction(JajukActions.BEST_OF));
     jmiNovelties = new SizedJMenuItem(ActionManager.getAction(JajukActions.NOVELTIES));
     jmiFinishAlbum = new SizedJMenuItem(ActionManager.getAction(JajukActions.FINISH_ALBUM));
-
     smart.add(jmiShuffle);
     smart.add(jmiBestof);
     smart.add(jmiNovelties);
     smart.add(jmiFinishAlbum);
-
     // Tools Menu
     tools = new JMenu(Messages.getString("JajukJMenuBar.28"));
     jmiduplicateFinder = new JMenuItem(ActionManager.getAction(JajukActions.FIND_DUPLICATE_FILES));
@@ -338,22 +234,17 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
     tools.add(jmialarmClock);
     tools.add(jmiprepareParty);
     // tools.addSeparator();
-
     // Configuration menu
     configuration = new JMenu(Messages.getString("JajukJMenuBar.21"));
     jmiDJ = new JMenuItem(ActionManager.getAction(CONFIGURE_DJS));
     // Overwrite default icon
     jmiDJ.setIcon(IconLoader.getIcon(JajukIcons.DIGITAL_DJ_16X16));
     jmiAmbience = new JMenuItem(ActionManager.getAction(CONFIGURE_AMBIENCES));
-    jmiWebradios = new JMenuItem(ActionManager.getAction(JajukActions.CONFIGURE_WEBRADIOS));
-    jmiWebradios.setIcon(IconLoader.getIcon(JajukIcons.WEBRADIO_16X16));
     jmiWizard = new JMenuItem(ActionManager.getAction(SIMPLE_DEVICE_WIZARD));
     jmiOptions = new JMenuItem(ActionManager.getAction(OPTIONS));
-
     jmiUnmounted = new JCheckBoxMenuItem(ActionManager.getAction(JajukActions.UNMOUNTED));
     jmiUnmounted.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED));
     jmiUnmounted.putClientProperty(Const.DETAIL_ORIGIN, jmiUnmounted);
-
     jcbShowPopups = new JCheckBoxMenuItem(Messages.getString("ParameterView.228"));
     jcbShowPopups.setSelected(Conf.getBoolean(Const.CONF_SHOW_POPUPS));
     jcbShowPopups.addActionListener(new ActionListener() {
@@ -364,30 +255,26 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
         ObservationManager.notify(new JajukEvent(JajukEvents.PARAMETERS_CHANGE));
       }
     });
-
     jcbNoneInternetAccess = new JCheckBoxMenuItem(Messages.getString("ParameterView.264"));
     jcbNoneInternetAccess.setToolTipText(Messages.getString("ParameterView.265"));
     jcbNoneInternetAccess.setSelected(Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS));
     jcbNoneInternetAccess.addActionListener(new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent e) {
-        Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, Boolean
-            .toString(jcbNoneInternetAccess.isSelected()));
+        Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS,
+            Boolean.toString(jcbNoneInternetAccess.isSelected()));
         // force parameter view to take this into account
         ObservationManager.notify(new JajukEvent(JajukEvents.PARAMETERS_CHANGE));
       }
     });
-
     configuration.add(jmiUnmounted);
     configuration.add(jcbShowPopups);
     configuration.add(jcbNoneInternetAccess);
     configuration.addSeparator();
     configuration.add(jmiDJ);
     configuration.add(jmiAmbience);
-    configuration.add(jmiWebradios);
     configuration.add(jmiWizard);
     configuration.add(jmiOptions);
-
     // Help menu
     String helpText = Messages.getString("JajukJMenuBar.14");
     help = new JMenu(ActionUtil.strip(helpText));
@@ -398,7 +285,6 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
     jmiTraces = new JMenuItem(ActionManager.getAction(SHOW_TRACES));
     jmiCheckforUpdates = new JMenuItem(ActionManager.getAction(JajukActions.CHECK_FOR_UPDATES));
     jmiTipOfTheDay = new JMenuItem(ActionManager.getAction(TIP_OF_THE_DAY));
-
     help.add(jmiHelp);
     help.add(jmiTipOfTheDay);
     // Install this action only if Desktop class is supported, it is used to
@@ -411,7 +297,6 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
     help.add(jmiCheckforUpdates);
     help.add(jmiDonate);
     help.add(jmiAbout);
-
     mainmenu = new JMenuBar();
     mainmenu.add(file);
     mainmenu.add(views);
@@ -421,33 +306,25 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
     mainmenu.add(tools);
     mainmenu.add(configuration);
     mainmenu.add(help);
-
     // Apply mnemonics (Alt + first char of the menu keystroke)
     applyMnemonics();
-
     if (SessionService.isTestMode()) {
-      jbCommit = new JajukButton(ActionManager.getAction(JajukActions.COMMIT));
       jbGC = new JajukButton(ActionManager.getAction(JajukActions.GC));
     }
     jbSlim = new JajukButton(ActionManager.getAction(JajukActions.SLIM_JAJUK));
     jbFull = new JajukButton(ActionManager.getAction(JajukActions.FULLSCREEN_JAJUK));
-
     JMenuBar eastmenu = new JMenuBar();
     // only show GC-button in test-mode
     if (SessionService.isTestMode()) {
-      eastmenu.add(jbCommit);
       eastmenu.add(jbGC);
     }
     eastmenu.add(jbSlim);
     eastmenu.add(jbFull);
-
     setLayout(new BorderLayout());
     add(mainmenu, BorderLayout.WEST);
     add(eastmenu, BorderLayout.EAST);
-
     // Check for new release and display the icon if a new release is available
     SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
-
       @Override
       public Void doInBackground() {
         UpgradeManager.checkForUpdate();
@@ -469,7 +346,6 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
           add(jlUpdate);
         }
       }
-
     };
     // Search online for upgrade if the option is set and if the none Internet
     // access option is not set
@@ -499,6 +375,7 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
     Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
     eventSubjectSet.add(JajukEvents.PARAMETERS_CHANGE);
     eventSubjectSet.add(JajukEvents.SLIMBAR_VISIBILTY_CHANGED);
+    eventSubjectSet.add(JajukEvents.MODE_STATUS_CHANGED);
     return eventSubjectSet;
   }
 
@@ -524,7 +401,6 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
   @Override
   public void update(final JajukEvent event) {
     SwingUtilities.invokeLater(new Runnable() {
-
       @Override
       public void run() {
         if (JajukEvents.PARAMETERS_CHANGE.equals(event.getSubject())
@@ -533,64 +409,30 @@ public final class JajukJMenuBar extends JMenuBar implements Observer {
           jmiUnmounted.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED));
           jcbNoneInternetAccess.setSelected(Conf
               .getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS));
+          // No karaoke mode and bit-perfect options are mutually exclusive
+          if (Conf.getBoolean(Const.CONF_BIT_PERFECT)) {
+            jcbmiKaraoke.setSelected(false);
+            jcbmiKaraoke.setEnabled(false);
+            Conf.setProperty(Const.CONF_STATE_KARAOKE, Const.FALSE);
+          } else {
+            jcbmiKaraoke.setEnabled(true);
+          }
+        } else if (JajukEvents.MODE_STATUS_CHANGED.equals(event.getSubject())) {
+          updateModesGUIStatus();
         }
       }
-
     });
   }
 
   /**
-   * Sets the repeat selected.
-   * 
-   * @param b the new repeat selected
+   * Update mode buttons after a mode change
    */
-  public void setRepeatSelected(final boolean b) {
-    jcbmiRepeat.setSelected(b);
+  private void updateModesGUIStatus() {
+    this.jcbmiRepeat.setSelected(Conf.getBoolean(Const.CONF_STATE_REPEAT));
+    this.jcbmiRepeatAll.setSelected(Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL));
+    this.jcbmiContinue.setSelected(Conf.getBoolean(Const.CONF_STATE_CONTINUE));
+    this.jcbmiShuffle.setSelected(Conf.getBoolean(Const.CONF_STATE_SHUFFLE));
+    this.jcbmiKaraoke.setSelected(Conf.getBoolean(Const.CONF_STATE_KARAOKE));
+    this.jcbmiIntro.setSelected(Conf.getBoolean(Const.CONF_STATE_INTRO));
   }
-
-  /**
-   * Sets the repeat all selected.
-   * 
-   * @param b the new repeat all selected
-   */
-  public void setRepeatAllSelected(final boolean b) {
-    jcbmiRepeatAll.setSelected(b);
-  }
-
-  /**
-   * Sets the shuffle selected.
-   * 
-   * @param b the new shuffle selected
-   */
-  public void setShuffleSelected(final boolean b) {
-    jcbmiShuffle.setSelected(b);
-  }
-
-  /**
-   * Sets the continue selected.
-   * 
-   * @param b the new continue selected
-   */
-  public void setContinueSelected(final boolean b) {
-    jcbmiContinue.setSelected(b);
-  }
-
-  /**
-   * Sets the intro selected.
-   * 
-   * @param b the new intro selected
-   */
-  public void setIntroSelected(final boolean b) {
-    jcbmiIntro.setSelected(b);
-  }
-
-  /**
-   * Sets the karaoke selected.
-   * 
-   * @param b the new karaoke selected
-   */
-  public void setKaraokeSelected(final boolean b) {
-    jcbmiKaraoke.setSelected(b);
-  }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukJSplitPane.java b/src/main/java/org/jajuk/ui/widgets/JajukJSplitPane.java
index 18d7231..77e3117 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukJSplitPane.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukJSplitPane.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -29,17 +29,10 @@ import javax.swing.JSplitPane;
  * http://www.jguru.com/faq/view.jsp?EID=27191
  */
 public class JajukJSplitPane extends JSplitPane {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -7358047597849102849L;
-
-  /** DOCUMENT_ME. */
   protected boolean isPainted = false;
-
-  /** DOCUMENT_ME. */
   protected boolean hasProportionalLocation = false;
-
-  /** DOCUMENT_ME. */
   protected double proportionalLocation = -1;
 
   /* (non-Javadoc)
@@ -72,7 +65,7 @@ public class JajukJSplitPane extends JSplitPane {
   /**
    * Instantiates a new jajuk j split pane.
    * 
-   * @param orientation DOCUMENT_ME
+   * @param orientation 
    */
   public JajukJSplitPane(int orientation) {
     super(orientation);
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukJToolbar.java b/src/main/java/org/jajuk/ui/widgets/JajukJToolbar.java
index 813af80..b026bfb 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukJToolbar.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukJToolbar.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -27,7 +27,6 @@ import javax.swing.SwingConstants;
  * Jajuk specific toolbar : non opaque and non floatable.
  */
 public class JajukJToolbar extends JToolBar {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 3947108459544670564L;
 
@@ -41,7 +40,7 @@ public class JajukJToolbar extends JToolBar {
   /**
    * Instantiates a new jajuk j toolbar.
    * 
-   * @param i DOCUMENT_ME
+   * @param i 
    */
   public JajukJToolbar(int i) {
     super(i);
@@ -50,5 +49,4 @@ public class JajukJToolbar extends JToolBar {
     setRollover(true);
     setBorder(null);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukTable.java b/src/main/java/org/jajuk/ui/widgets/JajukTable.java
index 7ab69d8..e144da6 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukTable.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukTable.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.event.MouseEvent;
@@ -39,7 +38,6 @@ import javax.swing.JTable;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.event.TableColumnModelEvent;
-import javax.swing.event.TableColumnModelListener;
 import javax.swing.table.TableColumn;
 import javax.swing.table.TableModel;
 
@@ -75,42 +73,32 @@ import org.jdesktop.swingx.table.TableColumnExt;
  * <p>
  * Bring a menu displayed on right click.
  */
-public class JajukTable extends JXTable implements Observer, TableColumnModelListener,
-    ListSelectionListener {
-
+public class JajukTable extends JXTable implements Observer, ListSelectionListener {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private final String sConf;
-
-  /** User Selection*. */
+  /** User Selection
+   *  <br>KEEP THIS LIST because actions are mapped to this object directly : 
+   * {@code jmiFileCopyURL.putClientProperty(Const.DETAIL_CONTENT, editorTable.getSelection()); 
+   */
   private final List<Item> selection = new ArrayList<Item>();
-
   /** DOCUMENT_ME. */
   private final JPopupMenu jmenu;
-
   /** Specific action on double click. */
   private ILaunchCommand command;
-
+  private volatile boolean manualSelectionRequired = false;
   /** Model refreshing flag. */
   private volatile boolean acceptColumnsEvents = false;
-
-  /** The Constant FORMATTER. DOCUMENT_ME */
+  /** The Constant FORMATTER.  */
   private static final DateFormat FORMATTER = UtilString.getLocaleDateFormatter();
-
   /** Stores the last index of column move to*. */
   private int lastToIndex = 0;
-
   /** Mouse draging flag. */
   private boolean isMouseDragging;
-
   /** List of list selection listeners whose valueChanged() method is called by this class valueChanged() method to avoid concurrency between them. Otherwise, the preference menu item could be set with the previous selection value. */
   List<ListSelectionListener> listeners = new ArrayList<ListSelectionListener>(1);
-
   /** The Jajuk table mouse adapter used to handle click events. */
   JajukMouseAdapter ma = new JajukMouseAdapter() {
-
     @Override
     public void handlePopup(MouseEvent e) {
       int iSelectedRow = rowAtPoint(e.getPoint());
@@ -134,22 +122,21 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Return drop row.
-   * 
+   *
    * @return drop row
    */
-  @SuppressWarnings("cast")
   public int getDropRow() {
-    JTable.DropLocation dl = (JTable.DropLocation) getDropLocation();
+    JTable.DropLocation dl = getDropLocation();
     return dl.getRow();
   }
 
   /**
    * Constructor.
-   * 
+   *
    * @param model : model to use
    * @param bSortable : is this table sortable
-   * @param sConf DOCUMENT_ME
-   * 
+   * @param sConf 
+   *
    * @sConf: configuration variable used to store columns conf
    */
   public JajukTable(TableModel model, boolean bSortable, String sConf) {
@@ -162,14 +149,11 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
     jmenu = new JPopupMenu();
     setShowGrid(false);
     init(bSortable);
-
     // Listen for clicks
     addMouseListener(ma);
-
     //Let Laf handle drag gesture recognition (don't remove it or
     // a mouse clik disable multiple selection)
     setDragEnabled(true);
-
     // Add the Alternate Highlighter
     addHighlighter(UtilGUI.getAlternateHighlighter());
     // Register itself to incoming events
@@ -178,7 +162,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Register a new list selection listener.
-   * 
+   *
    * @param listener the listener to register
    */
   public void addListSelectionListener(ListSelectionListener listener) {
@@ -187,10 +171,10 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Constructor.
-   * 
+   *
    * @param model : model to use
-   * @param sConf DOCUMENT_ME
-   * 
+   * @param sConf 
+   *
    * @sConf: configuration variable used to store columns conf
    */
   public JajukTable(TableModel model, String sConf) {
@@ -198,9 +182,9 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
   }
 
   /**
-   * Inits the. DOCUMENT_ME
-   * 
-   * @param bSortable DOCUMENT_ME
+   * Inits the. 
+   *
+   * @param bSortable 
    */
   private void init(boolean bSortable) {
     super.setSortable(bSortable);
@@ -209,14 +193,14 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Select columns to show colsToShow list of columns id to keep.
-   * 
-   * @param colsToShow DOCUMENT_ME
+   *
+   * @param colsToShow 
    */
-  @SuppressWarnings("unchecked")
   public void showColumns(List<String> colsToShow) {
     boolean acceptColumnsEventsSave = acceptColumnsEvents;
     // Ignore columns event during these actions
     acceptColumnsEvents = false;
+    @SuppressWarnings("rawtypes")
     Iterator it = ((DefaultTableColumnModelExt) getColumnModel()).getColumns(false).iterator();
     while (it.hasNext()) {
       TableColumnExt col = (TableColumnExt) it.next();
@@ -237,7 +221,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
    */
   /**
    * Reorder columns.
-   * DOCUMENT_ME
+   * 
    */
   private void reorderColumns() {
     // Build the index array
@@ -269,24 +253,19 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
         getColumnModel().addColumn(column);
       }
     }
-
     // set stored column width
-
     // disable auto-resize temporary to set stored sizes
     setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     String tableID = getTableId();
-
     for (int currentColumnIndex = 0; currentColumnIndex < getColumnModel().getColumnCount(); currentColumnIndex++) {
       String identifier = ((JajukTableModel) getModel())
           .getIdentifier(convertColumnIndexToModel(currentColumnIndex));
       String confId = tableID + "." + identifier + ".width";
-
       if (Conf.containsProperty(confId)) {
         getColumnModel().getColumn(currentColumnIndex).setPreferredWidth(Conf.getInt(confId));
       }
     }
     setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
-
     // must be done here and not before we add columns
     if (Conf.containsProperty(getConfKeyForIsHorizontalScrollable())) {
       setHorizontalScrollEnabled(Conf.getBoolean(getConfKeyForIsHorizontalScrollable()));
@@ -295,7 +274,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Gets the columns conf.
-   * 
+   *
    * @return list of visible columns names as string
    */
   public List<String> getColumnsConf() {
@@ -310,8 +289,8 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Add a new property into columns conf.
-   * 
-   * @param property DOCUMENT_ME
+   *
+   * @param property 
    */
   public void addColumnIntoConf(String property) {
     if (sConf == null) {
@@ -326,8 +305,8 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Remove a property from columns conf.
-   * 
-   * @param property DOCUMENT_ME
+   *
+   * @param property 
    */
   public void removeColumnFromConf(String property) {
     if (sConf == null) {
@@ -339,7 +318,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
   }
 
   /**
-   * Column change. DOCUMENT_ME
+   * Column change. 
    */
   private void columnChange() {
     // ignore this column change when reloading
@@ -359,7 +338,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see javax.swing.JTable#columnAdded(javax.swing.event.TableColumnModelEvent)
    */
   @Override
@@ -370,7 +349,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @seeorg.jdesktop.swingx.JXTable#columnRemoved(javax.swing.event. TableColumnModelEvent)
    */
   @Override
@@ -381,7 +360,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see javax.swing.JTable#columnMoved(javax.swing.event.TableColumnModelEvent)
    */
   @Override
@@ -422,9 +401,9 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Gets the columns conf.
-   * 
-   * @param alCol DOCUMENT_ME
-   * 
+   *
+   * @param alCol 
+   *
    * @return columns configuration from given list of columns identifiers
    */
   private String getColumnsConf(List<String> alCol) {
@@ -443,9 +422,9 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * add tooltips to each cell.
-   * 
-   * @param e DOCUMENT_ME
-   * 
+   *
+   * @param e 
+   *
    * @return the tool tip text
    */
   @Override
@@ -471,23 +450,28 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Select a list of rows.
-   * 
+   *
    * @param indexes list of row indexes to be selected
    */
   public void setSelectedRows(int[] indexes) {
-    for (int element : indexes) {
-      addRowSelectionInterval(element, element);
+    try {
+      manualSelectionRequired = true;
+      for (int element : indexes) {
+        addRowSelectionInterval(element, element);
+      }
+    } finally {
+      manualSelectionRequired = false;
     }
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see javax.swing.JTable#valueChanged(javax.swing.event.ListSelectionEvent)
    */
   @Override
   public void valueChanged(ListSelectionEvent e) {
-    if (e.getValueIsAdjusting()) {
+    if (e.getValueIsAdjusting() || manualSelectionRequired) {
       return;
     }
     // Ignore event if the model is refreshing
@@ -496,7 +480,6 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
         return;
       }
     }
-    updateSelection();
     // throw a table selection changed event providing the current perspective, view and
     // selection (used for tree/table sync)
     Properties properties = new Properties();
@@ -508,7 +491,6 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
       properties.put(Const.DETAIL_VIEW, parentView);
     }
     ObservationManager.notify(new JajukEvent(JajukEvents.TABLE_SELECTION_CHANGED, properties));
-
     // Call specific behaviors
     for (ListSelectionListener listener : listeners) {
       listener.valueChanged(e);
@@ -516,30 +498,30 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
   }
 
   /**
-   * Update the selection.
+   * Gets the selection.
+   *
+   * @return the selection
    */
-  public void updateSelection() {
-    JajukTableModel model = (JajukTableModel) getModel();
+  public List<Item> getSelection() {
     selection.clear();
+    JajukTableModel model = (JajukTableModel) getModel();
+    // we need this because when an item is dropped, the previous selection is still here but 
+    // the model is void so we get some out of bounds exceptions
+    // Maybe we should do better here.
+    if (model.getRowCount() == 0) {
+      return selection;
+    }
     int[] rows = getSelectedRows();
     for (int element : rows) {
       Item o = model.getItemAt(convertRowIndexToModel(element));
       selection.add(o);
     }
-  }
-
-  /**
-   * Gets the selection.
-   * 
-   * @return the selection
-   */
-  public List<Item> getSelection() {
-    return this.selection;
+    return selection;
   }
 
   /**
    * Return generic popup menu for items in a table. <br>
-   * 
+   *
    * @return generic popup menu for items in a table
    */
   public JPopupMenu getMenu() {
@@ -548,52 +530,37 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
    */
-  /**
-   * Mouse clicked.
-   * DOCUMENT_ME
-   * 
-   * @param e DOCUMENT_ME
-   */
+  @SuppressWarnings("unused")
   public void mouseClicked(MouseEvent e) {
     // nothing to do here for now
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
    */
-  /**
-   * Mouse entered.
-   * DOCUMENT_ME
-   * 
-   * @param e DOCUMENT_ME
-   */
+  @SuppressWarnings("unused")
   public void mouseEntered(MouseEvent e) {
     // nothing to do here for now
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
    */
-  /**
-   * Mouse exited.
-   * DOCUMENT_ME
-   * 
-   * @param e DOCUMENT_ME
-   */
+  @SuppressWarnings("unused")
   public void mouseExited(MouseEvent e) {
     // nothing to do here for now
   }
 
   /**
    * Gets the command.
-   * 
+   *
    * @return the command
    */
   public ILaunchCommand getCommand() {
@@ -602,7 +569,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Sets the command.
-   * 
+   *
    * @param command the new command
    */
   public void setCommand(ILaunchCommand command) {
@@ -611,7 +578,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Sets the accept columns events.
-   * 
+   *
    * @param acceptColumnsEvents the new accept columns events
    */
   public void setAcceptColumnsEvents(boolean acceptColumnsEvents) {
@@ -620,7 +587,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.events.Observer#getRegistrationKeys()
    */
   @Override
@@ -632,25 +599,21 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.jajuk.events.Observer#update(org.jajuk.events.JajukEvent)
    */
   @Override
   public void update(JajukEvent event) {
     JajukEvents subject = event.getSubject();
     if (JajukEvents.EXITING.equals(subject)) {
-      Conf.setProperty(getConfKeyForIsHorizontalScrollable(), Boolean
-          .toString(isHorizontalScrollEnabled()));
-
+      Conf.setProperty(getConfKeyForIsHorizontalScrollable(),
+          Boolean.toString(isHorizontalScrollEnabled()));
       // store column margin
       String tableID = getTableId();
-
       for (int currentColumnIndex = 0; currentColumnIndex < getColumnModel().getColumnCount(); currentColumnIndex++) {
-
         String width = Integer.toString(getColumnModel().getColumn(currentColumnIndex).getWidth());
         String identifier = ((JajukTableModel) getModel())
             .getIdentifier(convertColumnIndexToModel(currentColumnIndex));
-
         Conf.setProperty(tableID + "." + identifier + ".width", width);
       }
     }
@@ -658,7 +621,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Gets the conf key for is horizontal scrollable.
-   * 
+   *
    * @return the conf key for is horizontal scrollable
    */
   private String getConfKeyForIsHorizontalScrollable() {
@@ -667,7 +630,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   /**
    * Gets the table id.
-   * 
+   *
    * @return the table id
    */
   private String getTableId() {
@@ -682,7 +645,7 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
    * Remove previous alternate highlighter and add a new one
    * It is required because after theme change, the alternate
    * highlighter colors are no more valid.
-   * 
+   *
    * @see org.jdesktop.swingx.JXTable#updateUI()
    */
   @Override
@@ -701,12 +664,11 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
 
   // Fix for a JRE issue,see   :
   // During a single adjusting ListSelectionEvent, several rows can be selected
-  // before the drag actually begins (except when using SINGLE_SELECTION selection mode). 
+  // before the drag actually begins (except when using SINGLE_SELECTION selection mode).
   // For instance, select row 1 and release mouse
   // then select row 2 without releasing the mouse and begin to drag from the top to the bottom :
   // in some cases, when dragging quickly, rows 2 AND 3 (and even row 4 sometimes) are selected.
   // Fix thanks jeffsabin  in http://forums.sun.com/thread.jspa?threadID=5436355
-
   /* (non-Javadoc)
    * @see javax.swing.JComponent#processMouseEvent(java.awt.event.MouseEvent)
    */
@@ -754,5 +716,4 @@ public class JajukTable extends JXTable implements Observer, TableColumnModelLis
       super.changeSelection(rowIndex, columnIndex, toggle, extend);
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukToast.java b/src/main/java/org/jajuk/ui/widgets/JajukToast.java
index 4e66ba1..4352fe4 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukToast.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukToast.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,12 +16,10 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
-import java.awt.Window;
-
 import org.jajuk.ui.helpers.animations.AnimationCompletedEvent;
 import org.jajuk.ui.helpers.animations.AnimationCompletedListener;
 import org.jajuk.ui.helpers.animations.FadeAnimation;
@@ -35,18 +33,16 @@ import org.jajuk.util.log.Log;
  * Animated information dialog that appears and disappears by itself.
  */
 public class JajukToast extends JajukInformationDialog {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
   /**
    * Instantiates a new jajuk toast.
    * 
-   * @param text DOCUMENT_ME
-   * @param owner parent owner, see  #1582 ([Linux] Void entry in task bar for information dialog)
+   * @param text 
    */
-  public JajukToast(String text, Window owner) {
-    super(text, owner);
+  public JajukToast(String text) {
+    super(text);
   }
 
   /*
diff --git a/src/main/java/org/jajuk/ui/widgets/JajukToggleButton.java b/src/main/java/org/jajuk/ui/widgets/JajukToggleButton.java
index f1a954e..9791866 100644
--- a/src/main/java/org/jajuk/ui/widgets/JajukToggleButton.java
+++ b/src/main/java/org/jajuk/ui/widgets/JajukToggleButton.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -31,14 +31,11 @@ import javax.swing.border.Border;
  * A Jajuk button with two states.
  */
 public class JajukToggleButton extends JajukButton {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant PRESSED_BORDER.  DOCUMENT_ME */
+  /** The Constant PRESSED_BORDER.   */
   private static final Border PRESSED_BORDER = BorderFactory.createLoweredBevelBorder();
-
-  /** The Constant UNPRESSED_BORDER.  DOCUMENT_ME */
+  /** The Constant UNPRESSED_BORDER.   */
   private static final Border UNPRESSED_BORDER = BorderFactory.createRaisedBevelBorder();
 
   /**
@@ -51,7 +48,7 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param selected DOCUMENT_ME
+   * @param selected 
    */
   public JajukToggleButton(boolean selected) {
     this(null, null, selected);
@@ -60,7 +57,7 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param icon DOCUMENT_ME
+   * @param icon 
    */
   public JajukToggleButton(Icon icon) {
     this(icon, false);
@@ -69,8 +66,8 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param icon DOCUMENT_ME
-   * @param selected DOCUMENT_ME
+   * @param icon 
+   * @param selected 
    */
   public JajukToggleButton(Icon icon, boolean selected) {
     this(null, icon, selected);
@@ -79,7 +76,7 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param text DOCUMENT_ME
+   * @param text 
    */
   public JajukToggleButton(String text) {
     this(text, false);
@@ -88,8 +85,8 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param text DOCUMENT_ME
-   * @param selected DOCUMENT_ME
+   * @param text 
+   * @param selected 
    */
   public JajukToggleButton(String text, boolean selected) {
     this(text, null, selected);
@@ -98,7 +95,7 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param a DOCUMENT_ME
+   * @param a 
    */
   public JajukToggleButton(Action a) {
     this(a, false);
@@ -107,8 +104,8 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param a DOCUMENT_ME
-   * @param selected DOCUMENT_ME
+   * @param a 
+   * @param selected 
    */
   public JajukToggleButton(Action a, boolean selected) {
     super(a);
@@ -118,8 +115,8 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param text DOCUMENT_ME
-   * @param icon DOCUMENT_ME
+   * @param text 
+   * @param icon 
    */
   public JajukToggleButton(String text, Icon icon) {
     this(text, icon, false);
@@ -128,9 +125,9 @@ public class JajukToggleButton extends JajukButton {
   /**
    * Instantiates a new jajuk toggle button.
    * 
-   * @param text DOCUMENT_ME
-   * @param icon DOCUMENT_ME
-   * @param selected DOCUMENT_ME
+   * @param text 
+   * @param icon 
+   * @param selected 
    */
   public JajukToggleButton(String text, Icon icon, boolean selected) {
     super(text, icon);
@@ -154,5 +151,4 @@ public class JajukToggleButton extends JajukButton {
     setSelected(!isSelected());
     super.fireActionPerformed(event);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/OKCancelPanel.java b/src/main/java/org/jajuk/ui/widgets/OKCancelPanel.java
index 5f8eb9d..06a7d94 100644
--- a/src/main/java/org/jajuk/ui/widgets/OKCancelPanel.java
+++ b/src/main/java/org/jajuk/ui/widgets/OKCancelPanel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.event.ActionListener;
@@ -35,23 +34,17 @@ import org.jajuk.util.Messages;
  * Ok Cancel generic panel.
  */
 public class OKCancelPanel extends JPanel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private final JajukButton jbOk;
-
-  /** DOCUMENT_ME. */
   private final JajukButton jbCancel;
-
   /** Associated action listener. */
   ActionListener al;
 
   /**
    * Instantiates a new oK cancel panel.
    * 
-   * @param al DOCUMENT_ME
+   * @param al 
    */
   public OKCancelPanel(ActionListener al) {
     this.al = al;
@@ -68,9 +61,9 @@ public class OKCancelPanel extends JPanel {
   /**
    * OK Cancel panel with given button names.
    * 
-   * @param al DOCUMENT_ME
-   * @param sOKTitle DOCUMENT_ME
-   * @param sCancelTitle DOCUMENT_ME
+   * @param al 
+   * @param sOKTitle 
+   * @param sCancelTitle 
    */
   public OKCancelPanel(ActionListener al, String sOKTitle, String sCancelTitle) {
     this(al);
@@ -95,5 +88,4 @@ public class OKCancelPanel extends JPanel {
   public JajukButton getCancelButton() {
     return jbCancel;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/PasswordDialog.java b/src/main/java/org/jajuk/ui/widgets/PasswordDialog.java
index be9f45e..a8fb1ad 100644
--- a/src/main/java/org/jajuk/ui/widgets/PasswordDialog.java
+++ b/src/main/java/org/jajuk/ui/widgets/PasswordDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.event.ActionEvent;
@@ -38,20 +37,15 @@ import org.jajuk.util.Messages;
  * A password dialog.
  */
 public class PasswordDialog extends JajukJDialog implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   JPasswordField pf;
-
-  /** DOCUMENT_ME. */
   JOptionPane optionPane;
 
   /**
    * Instantiates a new password dialog.
    * 
-   * @param sMessage DOCUMENT_ME
+   * @param sMessage 
    */
   public PasswordDialog(String sMessage) {
     setTitle(sMessage);
@@ -74,16 +68,12 @@ public class PasswordDialog extends JajukJDialog implements ActionListener {
         }
       }
     });
-
     // Make this dialog display it.
     setContentPane(optionPane);
-
     // Handle window closing correctly.
     setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
-
     // Register an event handler that puts the text into the option pane.
     pf.addActionListener(this);
-
     // Ensure the text field always gets the first focus.
     addComponentListener(new ComponentAdapter() {
       @Override
@@ -101,7 +91,7 @@ public class PasswordDialog extends JajukJDialog implements ActionListener {
   /**
    * This method handles events for the text field.
    * 
-   * @param e DOCUMENT_ME
+   * @param e 
    */
   @Override
   public void actionPerformed(ActionEvent e) {
@@ -117,5 +107,4 @@ public class PasswordDialog extends JajukJDialog implements ActionListener {
   public JOptionPane getOptionPane() {
     return optionPane;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/PathSelector.java b/src/main/java/org/jajuk/ui/widgets/PathSelector.java
index 4fca1f6..9e0b14d 100644
--- a/src/main/java/org/jajuk/ui/widgets/PathSelector.java
+++ b/src/main/java/org/jajuk/ui/widgets/PathSelector.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.Color;
@@ -46,14 +45,9 @@ import org.jajuk.util.filters.DirectoryFilter;
  * PATH selection button opening up a file selector.
  */
 public class PathSelector extends JPanel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -8370527665529267952L;
-
-  /** DOCUMENT_ME. */
   JTextField jtfUrl;
-
-  /** DOCUMENT_ME. */
   JButton button;
 
   /**
@@ -64,7 +58,6 @@ public class PathSelector extends JPanel {
    */
   public PathSelector(final JajukFileFilter filter, final String sDefault) {
     super();
-
     initUI(sDefault);
     button.addActionListener(new ActionListener() {
       @Override
@@ -100,7 +93,6 @@ public class PathSelector extends JPanel {
    */
   public PathSelector(final String sDefault) {
     super();
-
     initUI(sDefault);
     button.addActionListener(new ActionListener() {
       @Override
@@ -141,9 +133,9 @@ public class PathSelector extends JPanel {
 
   /**
    * Inits the ui.
-   * DOCUMENT_ME
    * 
-   * @param sDefault DOCUMENT_ME
+   * 
+   * @param sDefault 
    */
   private void initUI(final String sDefault) {
     // Set layout
@@ -182,7 +174,7 @@ public class PathSelector extends JPanel {
   /**
    * Set tooltip.
    * 
-   * @param s DOCUMENT_ME
+   * @param s 
    */
   @Override
   public void setToolTipText(final String s) {
@@ -198,5 +190,4 @@ public class PathSelector extends JPanel {
   public void setURL(final String sURL) {
     jtfUrl.setText(sURL);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/PerspectiveBarJPanel.java b/src/main/java/org/jajuk/ui/widgets/PerspectiveBarJPanel.java
index c0538da..3c2883a 100644
--- a/src/main/java/org/jajuk/ui/widgets/PerspectiveBarJPanel.java
+++ b/src/main/java/org/jajuk/ui/widgets/PerspectiveBarJPanel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -51,16 +51,12 @@ import org.jdesktop.swingx.JXPanel;
  * Menu bar used to choose the current perspective.
  */
 public final class PerspectiveBarJPanel extends JXPanel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Perspectives tool bar*. */
   private JToolBar jtbPerspective;
-
   /** Self instance. */
   private static PerspectiveBarJPanel pb = new PerspectiveBarJPanel();
-
   /** Perspective button. */
   private final List<JButton> alButtons = new ArrayList<JButton>(10);
 
@@ -91,13 +87,11 @@ public final class PerspectiveBarJPanel extends JXPanel {
       final IPerspective perspective = it.next();
       Font font = FontManager.getInstance().getFont(JajukFont.PERSPECTIVES);
       int iconSize = Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE);
-
       // resize if necessary
       ImageIcon icon = perspective.getIcon();
       if (Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE) != 40) {
         icon = UtilGUI.getResizedImage(icon, iconSize, iconSize);
       }
-
       JButton jb = new JButton(icon);
       jb.setToolTipText(perspective.getDesc());
       jb.setBorder(new EmptyBorder(5, 5, 0, 5));
@@ -132,7 +126,7 @@ public final class PerspectiveBarJPanel extends JXPanel {
   /**
    * Show selected perspective.
    * 
-   * @param perspective DOCUMENT_ME
+   * @param perspective 
    */
   public void setActivated(IPerspective perspective) {
     Collection<IPerspective> perspectives = PerspectiveManager.getPerspectives();
diff --git a/src/main/java/org/jajuk/ui/widgets/PreferenceToolbar.java b/src/main/java/org/jajuk/ui/widgets/PreferenceToolbar.java
index 0bf9eeb..dadbfbb 100644
--- a/src/main/java/org/jajuk/ui/widgets/PreferenceToolbar.java
+++ b/src/main/java/org/jajuk/ui/widgets/PreferenceToolbar.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -55,17 +55,10 @@ import org.jajuk.util.Messages;
  * </p>.
  */
 public class PreferenceToolbar extends JajukJToolbar implements Observer {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 3869208492725759632L;
-
-  /** DOCUMENT_ME. */
   JajukButton jbBan;
-
-  /** DOCUMENT_ME. */
   JComboBox jcbPreference;
-
-  /** DOCUMENT_ME. */
   ActionListener listener;
 
   /**
@@ -73,7 +66,6 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
    */
   public PreferenceToolbar() {
     super();
-
     jbBan = new JajukButton(ActionManager.getAction(JajukActions.BAN));
     // Preference combo:
     /*
@@ -87,7 +79,6 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
     jcbPreference.setMinimumSize(new Dimension(45, 0));
     jcbPreference.setPreferredSize(new Dimension(45, 0));
     jcbPreference.setToolTipText(Messages.getString("Preference.0"));
-
     jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_ADORE));
     jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_LOVE));
     jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_LIKE));
@@ -95,7 +86,6 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
     jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_AVERAGE));
     jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_POOR));
     jcbPreference.addItem(IconLoader.getIcon(JajukIcons.PREFERENCE_HATE));
-
     // Set default to unset preference if not playing and to current track value
     // if playing
     if (!QueueModel.isStopped() && QueueModel.getPlayingFile() != null) {
@@ -103,9 +93,7 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
     } else {
       jcbPreference.setSelectedIndex(3);
     }
-
     listener = new ActionListener() {
-
       @Override
       public void actionPerformed(ActionEvent e) {
         File file = QueueModel.getPlayingFile();
@@ -117,7 +105,6 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
         ObservationManager.notify(new JajukEvent(JajukEvents.RATE_CHANGED));
       }
     };
-
     jcbPreference.addActionListener(listener);
     add(jbBan);
     add(jcbPreference);
@@ -146,7 +133,7 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
   /**
    * Set right combo selection for given selection.
    * 
-   * @param preference DOCUMENT_ME
+   * @param preference 
    */
   public final void setPreference(long preference) {
     jcbPreference.removeActionListener(listener);
@@ -172,7 +159,7 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
           return;
         }
         File current = QueueModel.getPlayingFile();
-        if (JajukEvents.RATE_CHANGED.equals(event.getSubject())) {
+        if (current != null && JajukEvents.RATE_CHANGED.equals(event.getSubject())) {
           setPreference(current.getTrack().getLongValue(Const.XML_TRACK_PREFERENCE));
         } else if (JajukEvents.FILE_LAUNCHED.equals(event.getSubject())) {
           // Update evaluation toolbar
@@ -215,10 +202,9 @@ public class PreferenceToolbar extends JajukJToolbar implements Observer {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private class ComboBoxRenderer extends BasicComboBoxRenderer {
-
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = -6943363556191659895L;
 
diff --git a/src/main/java/org/jajuk/ui/widgets/SearchBox.java b/src/main/java/org/jajuk/ui/widgets/SearchBox.java
index b75dba7..1681e1b 100644
--- a/src/main/java/org/jajuk/ui/widgets/SearchBox.java
+++ b/src/main/java/org/jajuk/ui/widgets/SearchBox.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.BorderLayout;
@@ -31,6 +30,8 @@ import java.awt.Point;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
 import java.awt.event.MouseAdapter;
@@ -64,7 +65,7 @@ import org.jajuk.base.SearchResult.SearchResultType;
 import org.jajuk.base.TrackManager;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
-import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.services.webradio.WebRadioHelper;
 import org.jajuk.ui.actions.JajukAction;
 import org.jajuk.ui.helpers.FontManager;
 import org.jajuk.ui.helpers.FontManager.JajukFont;
@@ -82,34 +83,21 @@ import org.jajuk.util.log.Log;
  * selection implementation (see valueChanged() method) that could be changed
  */
 public class SearchBox extends JTextField implements KeyListener, ListSelectionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Do search panel need a search. */
   private boolean bNeedSearch = false;
-
   /** Default time in ms before launching a search automatically. */
   private static final int WAIT_TIME = 1000;
-
   /** Minimum number of characters to start a search. */
   private static final int MIN_CRITERIA_LENGTH = 2;
-
   /** Search result. */
   private List<SearchResult> alResults;
-
   /** Typed string. */
   private String sTyped;
-
-  /** DOCUMENT_ME. */
   private Popup popup;
-
-  /** DOCUMENT_ME. */
   private JList jlist;
-
-  /** DOCUMENT_ME. */
   private long lDateTyped;
-
   /** Search when typing timer. */
   Timer timer = new Timer(100, new ActionListener() {
     @Override
@@ -124,13 +112,12 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
    * Display results as a jlabel with an icon.
    */
   private static class SearchListRenderer extends JPanel implements ListCellRenderer {
-
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = 8975989658927794678L;
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing .JList,
      * java.lang.Object, int, boolean, boolean)
      */
@@ -157,7 +144,6 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
    */
   public SearchBox() {
     setMargin(new Insets(0, 20, 0, 0));
-    timer.start();
     addKeyListener(this);
     setToolTipText(Messages.getString("SearchBox.0"));
     // We use a font whose size cannot change with font size selected by user
@@ -176,11 +162,23 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
         }
       }
     });
+    // Add a focus listener to select all the text and ease previous text cleanup
+    addFocusListener(new FocusListener() {
+      @Override
+      public void focusLost(FocusEvent e) {
+        setCaretPosition(getText().length());
+      }
+
+      @Override
+      public void focusGained(FocusEvent e) {
+        selectAll();
+      }
+    });
   }
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
    */
   @Override
@@ -190,7 +188,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
    */
   @Override
@@ -209,6 +207,10 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
       } else {
         bNeedSearch = true;
         lDateTyped = System.currentTimeMillis();
+        // make sure the timer is started before it is first used
+        if (!timer.isRunning()) {
+          timer.start();
+        }
       }
     } else if (popup != null) {
       popup.hide();
@@ -217,7 +219,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
    */
   @Override
@@ -236,7 +238,6 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
     // typed before entering this method
     if (sTyped.length() >= MIN_CRITERIA_LENGTH) {
       SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
-
         List<SearchResult> resu = null;
 
         @Override
@@ -245,7 +246,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
             UtilGUI.waiting();
             resu = TrackManager.getInstance().search(sTyped);
             // Add web radio names
-            resu.addAll(WebRadioManager.getInstance().search(sTyped));
+            resu.addAll(WebRadioHelper.search(sTyped));
             // Sort the whole list
             Collections.sort(resu);
           } catch (Exception e) {
@@ -268,7 +269,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
             jlist.setCellRenderer(new SearchListRenderer());
             PopupFactory factory = PopupFactory.getSharedInstance();
             JScrollPane jsp = new JScrollPane(jlist);
-            int width = (int) ((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth() * 0.7f);
+            int width = (int) ((float) Toolkit.getDefaultToolkit().getScreenSize().getWidth() * 0.9f);
             jsp.setMinimumSize(new Dimension(width, 250));
             jsp.setPreferredSize(new Dimension(width, 250));
             jsp.setMaximumSize(new Dimension(width, 250));
@@ -287,15 +288,15 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
             // only on absolute coordinates in opposition to swing
             // widgets)
             SwingUtilities.convertPointToScreen(point, SearchBox.this);
-            if (((int) point.getY() > 300) && (((int) point.getX() + 500 - (width)) > 0)) {
-              popup = factory.getPopup(null, jsp, (int) point.getX() + 500 - (width), (int) point
-                  .getY() - 250);
-            } else if (((int) point.getX() + 500 - (width)) > 0) {
-              popup = factory.getPopup(null, jsp, (int) point.getX() + 500 - (width), (int) point
-                  .getY() + 30);
-            } else {
-              popup = factory.getPopup(null, jsp, 10, (int) point.getY() + 30);
+            int x = 10;
+            int y = (int) point.getY() + 25;
+            if ((int) point.getY() > 300) {
+              y = (int) point.getY() - 250;
             }
+            if (((int) point.getX() + 500 - width) > 0) {
+              x = (int) point.getX() + 500 - width;
+            }
+            popup = factory.getPopup(null, jsp, x, y);
             popup.show();
             jlist.addMouseListener(new MouseAdapter() {
               @Override
@@ -319,7 +320,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
 
   /**
    * Gets the selected index.
-   * 
+   *
    * @return the selected index
    */
   public int getSelectedIndex() {
@@ -347,7 +348,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
 
   /**
    * Display the search icon inside the texfield.
-   * 
+   *
    * @param g the graphics
    */
   @Override
@@ -359,8 +360,8 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
   /**
    * Default list selection implementation (may be overwritten for different
    * behavior).
-   * 
-   * @param e DOCUMENT_ME
+   *
+   * @param e 
    */
   @Override
   public void valueChanged(final ListSelectionEvent e) {
@@ -372,12 +373,11 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
           try {
             // If user selected a file
             if (sr.getType() == SearchResultType.FILE) {
-              QueueModel.push(new StackItem(sr.getFile(), Conf
-                  .getBoolean(Const.CONF_STATE_REPEAT_ALL), true), Conf
-                  .getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
+              QueueModel.push(new StackItem(sr.getFile(), Conf.getBoolean(Const.CONF_STATE_REPEAT),
+                  true), Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
             }
             // User selected a web radio
-            else if (sr.getType() == SearchResultType.WEBRADIO) {
+            else if (sr.getType() == SearchResultType.WEBRADIO && sr.getWebradio() != null) {
               QueueModel.launchRadio(sr.getWebradio());
             }
           } catch (JajukException je) {
@@ -400,7 +400,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
 
   /**
    * Free up resources, timers, ...
-   * 
+   *
    * TODO: I could not find out any way to do this automatically! How can I
    * listen on some event that is sent when the enclosing dialog is closed?
    */
@@ -416,7 +416,7 @@ public class SearchBox extends JTextField implements KeyListener, ListSelectionL
     InputMap inputMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
     ActionMap actionMap = getActionMap();
     inputMap.put(KeyStroke.getKeyStroke("ctrl F"), "search");
-    // We don't create a JajukAction dedicated class for this very simple case 
+    // We don't create a JajukAction dedicated class for this very simple case
     actionMap.put("search", new JajukAction("search", true) {
       private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/org/jajuk/ui/widgets/SearchJPanel.java b/src/main/java/org/jajuk/ui/widgets/SearchJPanel.java
index 6785ecf..c5275b0 100644
--- a/src/main/java/org/jajuk/ui/widgets/SearchJPanel.java
+++ b/src/main/java/org/jajuk/ui/widgets/SearchJPanel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -64,19 +64,14 @@ import org.jdesktop.swingx.JXPanel;
  * Ambience + History + search panel used in main jajuk window.
  */
 public final class SearchJPanel extends JXPanel implements Observer, ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Self instance. */
   private static SearchJPanel ijp = new SearchJPanel();
-
   /** The search box (text field). */
   private SearchBox sbSearch;
-
   /** the combo-genre history. */
   private SteppedComboBox jcbHistory;
-
   /** the Ambience selection combo. */
   private AmbienceComboBox ambiencesCombo;
 
@@ -90,13 +85,11 @@ public final class SearchJPanel extends JXPanel implements Observer, ActionListe
   }
 
   // widgets declaration
-
   /**
    * Instantiates a new search j panel.
    */
   private SearchJPanel() {
     super();
-
   }
 
   /**
@@ -105,17 +98,15 @@ public final class SearchJPanel extends JXPanel implements Observer, ActionListe
   public void initUI() {
     // Instanciate the PlayerStateMediator to listen for player basic controls
     PlayerStateMediator.getInstance();
-
     // Search
     sbSearch = new SearchBox();
     // History
     jcbHistory = new SteppedComboBox();
     final JLabel jlHistory = new JLabel(IconLoader.getIcon(JajukIcons.HISTORY));
     jlHistory.setToolTipText(Messages.getString("CommandJPanel.0"));
-
     // We use a combo box model to make sure we get good performances after
     // rebuilding the entire model like after a refresh
-    jcbHistory.setModel(new DefaultComboBoxModel(History.getInstance().getHistory()));
+    jcbHistory.setModel(new DefaultComboBoxModel(History.getInstance().getItems()));
     // None selection because if we start in stop mode, a selection of the
     // first item will not launch the track because the selected item is
     // still the same and no action event is thrown (Java >= 1.6)
@@ -140,16 +131,13 @@ public final class SearchJPanel extends JXPanel implements Observer, ActionListe
     });
     // Ambience combo
     ambiencesCombo = new AmbienceComboBox();
-
     // Add items
     setLayout(new MigLayout("insets 5 0 4 3,gapx 30", "[grow 20][grow 70][grow 10]"));
     add(ambiencesCombo, "left,gap left 16,growx,width 100::");
     add(jcbHistory, "grow,center");
     add(sbSearch, "right,grow,width 100::");
-
     // register to player events
     ObservationManager.register(this);
-
     // Update initial status
     UtilFeatures.updateStatus(this);
   }
@@ -188,8 +176,8 @@ public final class SearchJPanel extends JXPanel implements Observer, ActionListe
           org.jajuk.base.File file = FileManager.getInstance().getFileByID(hi.getFileId());
           if (file != null) {
             try {
-              QueueModel.push(new StackItem(file, Conf.getBoolean(Const.CONF_STATE_REPEAT_ALL),
-                  true), Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
+              QueueModel.push(new StackItem(file, Conf.getBoolean(Const.CONF_STATE_REPEAT), true),
+                  Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
             } catch (JajukException je) {
               // can be thrown if file is null
             }
@@ -272,5 +260,4 @@ public final class SearchJPanel extends JXPanel implements Observer, ActionListe
           + ambience.getName() + Const.B_P_HTML);
     }
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/widgets/SizedButton.java b/src/main/java/org/jajuk/ui/widgets/SizedButton.java
index 7340868..002680f 100644
--- a/src/main/java/org/jajuk/ui/widgets/SizedButton.java
+++ b/src/main/java/org/jajuk/ui/widgets/SizedButton.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -33,11 +33,8 @@ import org.jajuk.util.UtilGUI;
  * is called in constructor before we can do anything).
  */
 public class SizedButton extends JajukButton {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -3859493434696496345L;
-
-  /** DOCUMENT_ME. */
   private boolean showText = false;
 
   /**
@@ -52,8 +49,8 @@ public class SizedButton extends JajukButton {
   /**
    * Instantiates a new sized button.
    * 
-   * @param text DOCUMENT_ME
-   * @param icon DOCUMENT_ME
+   * @param text 
+   * @param icon 
    */
   public SizedButton(String text, Icon icon) {
     super(text, icon);
@@ -63,7 +60,7 @@ public class SizedButton extends JajukButton {
    * The Constructor.
    * 
    * @param action Action
-   * @param bText DOCUMENT_ME
+   * @param bText 
    */
   public SizedButton(Action action, boolean bText) {
     super(action);
@@ -111,5 +108,4 @@ public class SizedButton extends JajukButton {
   public int getH() {
     return 16;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/SizedJMenuItem.java b/src/main/java/org/jajuk/ui/widgets/SizedJMenuItem.java
index 37e65d6..e2139dd 100644
--- a/src/main/java/org/jajuk/ui/widgets/SizedJMenuItem.java
+++ b/src/main/java/org/jajuk/ui/widgets/SizedJMenuItem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import javax.swing.Action;
@@ -32,7 +31,6 @@ import org.jajuk.util.UtilGUI;
  * Menu item whose icon has a fixed size.
  */
 public class SizedJMenuItem extends JMenuItem {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -3859493402696496345L;
 
@@ -48,11 +46,10 @@ public class SizedJMenuItem extends JMenuItem {
   /**
    * Sets the icon.
    * 
-   * @param icon DOCUMENT_ME
+   * @param icon 
    */
   @Override
   public void setIcon(Icon icon) {
     super.setIcon(UtilGUI.getResizedImage((ImageIcon) icon, 16, 16));
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/SmartPlaylistView.java b/src/main/java/org/jajuk/ui/widgets/SmartPlaylistView.java
index 364bbe8..3eadd06 100644
--- a/src/main/java/org/jajuk/ui/widgets/SmartPlaylistView.java
+++ b/src/main/java/org/jajuk/ui/widgets/SmartPlaylistView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import javax.swing.BorderFactory;
@@ -36,23 +35,18 @@ import org.jajuk.util.Messages;
  * A physical playlist icon + text.
  */
 public class SmartPlaylistView extends JPanel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Icon. */
   private JLabel jlIcon;
-
-  /** DOCUMENT_ME. */
   private final Type type;
-
   /** Associated playlist. */
   private Playlist plf;
 
   /**
    * Constructor.
    * 
-   * @param type DOCUMENT_ME
+   * @param type 
    */
   public SmartPlaylistView(Playlist.Type type) {
     this.type = type;
diff --git a/src/main/java/org/jajuk/ui/widgets/StarIconLabel.java b/src/main/java/org/jajuk/ui/widgets/StarIconLabel.java
index aca2edb..8749a20 100644
--- a/src/main/java/org/jajuk/ui/widgets/StarIconLabel.java
+++ b/src/main/java/org/jajuk/ui/widgets/StarIconLabel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -29,13 +29,10 @@ import javax.swing.ImageIcon;
  * Icon Label supporting rating stars.
  */
 public class StarIconLabel extends IconLabel {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Number of stars. */
   private int starsNumber = -1;
-
   /** Rate *. */
   private int rate = 0;
 
@@ -60,13 +57,13 @@ public class StarIconLabel extends IconLabel {
   /**
    * The Constructor.
    * 
-   * @param icon DOCUMENT_ME
-   * @param sText DOCUMENT_ME
-   * @param cBackground DOCUMENT_ME
-   * @param cForeground DOCUMENT_ME
-   * @param font DOCUMENT_ME
-   * @param rate DOCUMENT_ME
-   * @param starNumber DOCUMENT_ME
+   * @param icon 
+   * @param sText 
+   * @param cBackground 
+   * @param cForeground 
+   * @param font 
+   * @param rate 
+   * @param starNumber 
    */
   public StarIconLabel(ImageIcon icon, String sText, Color cBackground, Color cForeground,
       Font font, int rate, int starNumber) {
@@ -102,4 +99,13 @@ public class StarIconLabel extends IconLabel {
     }
   }
 
+  @Override
+  public boolean equals(Object other) {
+    // this also catches null
+    if (!(other instanceof StarIconLabel)) {
+      return false;
+    }
+    StarIconLabel otherIcon = (StarIconLabel) other;
+    return getStarsNumber() == otherIcon.getStarsNumber();
+  }
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/SteppedComboBox.java b/src/main/java/org/jajuk/ui/widgets/SteppedComboBox.java
index 3d2b59b..27c5be5 100644
--- a/src/main/java/org/jajuk/ui/widgets/SteppedComboBox.java
+++ b/src/main/java/org/jajuk/ui/widgets/SteppedComboBox.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -35,13 +35,9 @@ import org.jajuk.util.log.Log;
 /**
  * Stepped combo box allowing to display a long text in the history bar.
  */
-
 public class SteppedComboBox extends JComboBox {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   protected int popupWidth;
 
   /**
@@ -55,7 +51,7 @@ public class SteppedComboBox extends JComboBox {
   /**
    * Instantiates a new stepped combo box.
    * 
-   * @param aModel DOCUMENT_ME
+   * @param aModel 
    */
   public SteppedComboBox(ComboBoxModel aModel) {
     super(aModel);
@@ -65,7 +61,7 @@ public class SteppedComboBox extends JComboBox {
   /**
    * Instantiates a new stepped combo box.
    * 
-   * @param items DOCUMENT_ME
+   * @param items 
    */
   public SteppedComboBox(final Object[] items) {
     super(items);
@@ -75,9 +71,9 @@ public class SteppedComboBox extends JComboBox {
   /**
    * Instantiates a new stepped combo box.
    * 
-   * @param items DOCUMENT_ME
+   * @param items 
    */
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings({ "unchecked", "rawtypes" })
   public SteppedComboBox(List<?> items) {
     super(new Vector(items));
     init();
@@ -107,11 +103,11 @@ public class SteppedComboBox extends JComboBox {
 
   /**
    * Inits the.
-   * DOCUMENT_ME
+   * 
    */
   protected final void init() {
     try {
-      ComboBoxUI cbui = new org.jvnet.substance.SubstanceComboBoxUI() {
+      ComboBoxUI cbui = new org.pushingpixels.substance.internal.ui.SubstanceComboBoxUI(this) {
         @Override
         protected ComboPopup createPopup() {
           BasicComboPopup popup1 = new org.jajuk.ui.widgets.JajukBasicComboPopup(comboBox);
@@ -122,7 +118,6 @@ public class SteppedComboBox extends JComboBox {
           return popup1;
         }
       };
-
       setUI(cbui);
       popupWidth = 0;
     } catch (Exception e) {
diff --git a/src/main/java/org/jajuk/ui/widgets/ToggleLink.java b/src/main/java/org/jajuk/ui/widgets/ToggleLink.java
index 44984e0..5d4d81e 100644
--- a/src/main/java/org/jajuk/ui/widgets/ToggleLink.java
+++ b/src/main/java/org/jajuk/ui/widgets/ToggleLink.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.widgets;
 
 import java.awt.Font;
@@ -33,7 +32,6 @@ import org.jdesktop.swingx.JXHyperlink;
  * Generic toggle hyperlink to open/collapse a collapsable panel.
  */
 public class ToggleLink extends JXHyperlink {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 8652043694603450888L;
 
@@ -54,5 +52,4 @@ public class ToggleLink extends JXHyperlink {
     toggleAction.putValue(JXCollapsiblePane.EXPAND_ICON, UIManager.getIcon("Tree.collapsedIcon"));
     setFocusPainted(false);
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/widgets/TrackPositionSliderToolbar.java b/src/main/java/org/jajuk/ui/widgets/TrackPositionSliderToolbar.java
index 8f69e79..ef0f9e4 100644
--- a/src/main/java/org/jajuk/ui/widgets/TrackPositionSliderToolbar.java
+++ b/src/main/java/org/jajuk/ui/widgets/TrackPositionSliderToolbar.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.widgets;
 
@@ -55,29 +55,19 @@ import org.jajuk.util.UtilString;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TrackPositionSliderToolbar extends JPanel implements ChangeListener,
     MouseWheelListener, Observer {
-
   /** Generic playing position toolbar, used in information panel a full screen. */
   private static final long serialVersionUID = 1L;
-
   /** Last slider manual move date. */
   private long lDateLastAdjust;
-
-  /** DOCUMENT_ME. */
   private JSlider jsPosition;
-
-  /** DOCUMENT_ME. */
   private JLabel jlCurrent;
-
-  /** DOCUMENT_ME. */
   String sCurrentStatus;
-
   /** Swing Timer to refresh the component. */
   private final Timer timer = new Timer(JajukTimer.D_MS_HEARTBEAT, new ActionListener() {
-
     @Override
     public void actionPerformed(ActionEvent e) {
       try {
@@ -93,27 +83,22 @@ public class TrackPositionSliderToolbar extends JPanel implements ChangeListener
    */
   public TrackPositionSliderToolbar() {
     super();
-
     initGui();
-
     // check if some errors occurred before the view has been displayed
     if (ObservationManager.containsEvent(JajukEvents.PLAY_ERROR)) {
       update(new JajukEvent(JajukEvents.PLAY_ERROR,
           ObservationManager.getDetailsLastOccurence(JajukEvents.PLAY_ERROR)));
     }
-
     // check if some track has been launched before the view has been
     // displayed
     UtilFeatures.updateStatus(this);
-
     // register for given events
     ObservationManager.register(this);
-
     timer.start();
   }
 
   /**
-   * Inits the gui. DOCUMENT_ME
+   * Inits the gui. 
    */
   private void initGui() {
     setLayout(new MigLayout("ins 0 5 0 5", "[70%,fill][30%,grow]"));
@@ -126,8 +111,8 @@ public class TrackPositionSliderToolbar extends JPanel implements ChangeListener
     jlCurrent = new JLabel();
     jlCurrent.setToolTipText(Messages.getString("CommandJPanel.15"));
     jlCurrent.addMouseListener(new TimeDisplaySwitchMouseAdapter());
-    add(jsPosition,"grow");
-    add(jlCurrent,"grow,left");
+    add(jsPosition, "grow");
+    add(jlCurrent, "grow,left");
   }
 
   /*
@@ -148,11 +133,10 @@ public class TrackPositionSliderToolbar extends JPanel implements ChangeListener
   /**
    * Call a seek.
    * 
-   * @param fPosition DOCUMENT_ME
+   * @param fPosition 
    */
   private void setPosition(final float fPosition) {
     new Thread("TrackSlider Position Thread") {
-
       @Override
       public void run() {
         Player.seek(fPosition);
@@ -187,8 +171,8 @@ public class TrackPositionSliderToolbar extends JPanel implements ChangeListener
   /**
    * Set the current status for current track ex : 01:01:01/02:02:02.
    * 
-   * @param lTime DOCUMENT_ME
-   * @param length DOCUMENT_ME
+   * @param lTime 
+   * @param length 
    */
   public final void setCurrentTimeMessage(long lTime, long length) {
     String string;
@@ -303,8 +287,6 @@ public class TrackPositionSliderToolbar extends JPanel implements ChangeListener
             // use set value, not setPosition that would cause
             // a seek that could fail with some formats
             jsPosition.setValue(0);
-            // reset startup position
-            Conf.setProperty(Const.CONF_STARTUP_LAST_POSITION, "0");
             jsPosition.addMouseWheelListener(TrackPositionSliderToolbar.this);
             jsPosition.addChangeListener(TrackPositionSliderToolbar.this);
           } else if (JajukEvents.PLAYER_PAUSE.equals(subject)) {
@@ -340,7 +322,6 @@ public class TrackPositionSliderToolbar extends JPanel implements ChangeListener
    * elapsed time.
    */
   private final class TimeDisplaySwitchMouseAdapter extends MouseAdapter {
-
     /* (non-Javadoc)
      * @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)
      */
diff --git a/src/main/java/org/jajuk/ui/widgets/WebRadioButton.java b/src/main/java/org/jajuk/ui/widgets/WebRadioButton.java
new file mode 100644
index 0000000..06608ac
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/widgets/WebRadioButton.java
@@ -0,0 +1,124 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.widgets;
+
+import ext.DropDownButton;
+import ext.scrollablepopupmenu.XCheckedButton;
+import ext.scrollablepopupmenu.XJPopupMenu;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.ImageIcon;
+import javax.swing.JPopupMenu;
+
+import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioHelper;
+import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.ui.actions.ActionManager;
+import org.jajuk.ui.actions.JajukAction;
+import org.jajuk.ui.actions.JajukActions;
+import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.log.Log;
+
+/**
+ * Factorizes code dealing with Web Radio button shared by command panel and slimbar.
+ */
+public class WebRadioButton extends DropDownButton {
+  /** Associated popup. */
+  private XJPopupMenu popupWebRadio;
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * Instantiates a new web radio button.
+   * @param icon : button icon
+   */
+  public WebRadioButton(ImageIcon icon) {
+    super(icon);
+    setText("");
+    popupWebRadio = new XJPopupMenu(JajukMainWindow.getInstance());
+    setAction(ActionManager.getAction(JajukActions.WEB_RADIO));
+    // Force 16x16 icon 
+    setIcon(icon);
+    populateWebRadios();
+  }
+
+  /* (non-Javadoc)
+   * @see ext.DropDownButton#getPopupMenu()
+   */
+  @Override
+  protected JPopupMenu getPopupMenu() {
+    // Force populating the radios each time the drop down button is pressed to make sure the 
+    // current radio icon is synchronized between slimar and main window, see #1866
+    populateWebRadios();
+    return popupWebRadio;
+  }
+
+  /**
+  * Populate webradios.
+  */
+  public void populateWebRadios() {
+    try {
+      // Update button tooltip
+      setToolTipText(WebRadioHelper.getCurrentWebRadioTooltip());
+      // Clear previous elements
+      popupWebRadio.removeAll();
+      for (final WebRadio radio : WebRadioManager.getInstance().getWebRadios()) {
+        String label = radio.getName();
+        if (UtilString.isNotEmpty(radio.getGenre())) {
+          label += " [" + radio.getGenre() + "]";
+        }
+        XCheckedButton jmi = new XCheckedButton(label);
+        jmi.addActionListener(new ActionListener() {
+          @Override
+          public void actionPerformed(ActionEvent e) {
+            Conf.setProperty(Const.CONF_DEFAULT_WEB_RADIO, radio.getName());
+            // force to reselect the item
+            populateWebRadios();
+            // update action tooltip on main button with right item
+            JajukAction action = ActionManager.getAction(JajukActions.WEB_RADIO);
+            action.setShortDescription(Const.HTML + Messages.getString("CommandJPanel.25")
+                + Const.P_B + radio.getName() + Const.B_P_HTML);
+            // Actually launch the webradio
+            try {
+              action.perform(null);
+            } catch (Exception e1) {
+              Log.error(e1);
+            }
+          }
+        });
+        jmi.setSelected(Conf.getString(Const.CONF_DEFAULT_WEB_RADIO).equals(radio.getName()));
+        // Show the check icon
+        jmi.setDisplayCheck(true);
+        popupWebRadio.add(jmi);
+      }
+      // Force popup resizing
+      popupWebRadio.init();
+    } catch (Exception e) {
+      Log.error(e);
+    }
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/windows/IJajukWindow.java b/src/main/java/org/jajuk/ui/windows/IJajukWindow.java
index fdfc1d9..715e08f 100644
--- a/src/main/java/org/jajuk/ui/windows/IJajukWindow.java
+++ b/src/main/java/org/jajuk/ui/windows/IJajukWindow.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.windows;
 
@@ -35,7 +35,6 @@ package org.jajuk.ui.windows;
  * These states are managed by the WindowStateDecorator
  */
 public interface IJajukWindow {
-
   /**
    * Build the GUI (widgets)
    * <p>
@@ -50,5 +49,4 @@ public interface IJajukWindow {
    * @return the window state decorator
    */
   public WindowStateDecorator getWindowStateDecorator();
-
 }
diff --git a/src/main/java/org/jajuk/ui/windows/JajukFullScreenWindow.java b/src/main/java/org/jajuk/ui/windows/JajukFullScreenWindow.java
index b095bce..d5b4654 100644
--- a/src/main/java/org/jajuk/ui/windows/JajukFullScreenWindow.java
+++ b/src/main/java/org/jajuk/ui/windows/JajukFullScreenWindow.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.windows;
 
@@ -63,7 +63,7 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.UtilGUI;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
-import org.jvnet.substance.SubstanceLookAndFeel;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
 
 /**
  * The full screen window Note that not all operating support full screen mode.
@@ -71,52 +71,24 @@ import org.jvnet.substance.SubstanceLookAndFeel;
  * handle any errors.
  */
 public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -2859302706462954993L;
-
-  /** DOCUMENT_ME. */
   private static JajukFullScreenWindow instance = null;
-
-  /** DOCUMENT_ME. */
   private GraphicsDevice graphicsDevice;
-
-  /** DOCUMENT_ME. */
   private JButton jbPrevious;
-
-  /** DOCUMENT_ME. */
   private JButton jbNext;
-
-  /** DOCUMENT_ME. */
   private JButton jbPlayPause;
-
-  /** DOCUMENT_ME. */
   private JButton jbStop;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbFull;
-
-  /** DOCUMENT_ME. */
   private JajukButton jbExit;
-
-  /** DOCUMENT_ME. */
   private CoverView coverView;
-
   /** State decorator. */
   private WindowStateDecorator decorator;
-
-  /** DOCUMENT_ME. */
   private AnimationView animationView;
-
-  /** DOCUMENT_ME. */
   private JPanel jtbPlay;
-
-  /** DOCUMENT_ME. */
   private Timer hideMouseTimer;
-
   /** Owning frame, see bellow for explanations *. */
   private static JFrame owner;
-
   /**
    * See http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html We have
    * to use a frame owner of this jwindow to allow full screen mode to respond
@@ -127,7 +99,6 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
     owner.setSize(new Dimension(0, 0));
     owner.setUndecorated(true);
     owner.requestFocus();
-
     // Add escape listening to exit full-screen mode
     owner.addKeyListener(new KeyAdapter() {
       @Override
@@ -141,13 +112,13 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
         }
       }
     });
-
     // Install global keystrokes
     WindowGlobalKeystrokeManager.getInstance();
   }
 
   /**
-   * Return whether we should try to switch to fullscreen mode (and lose keystrokes controls) 
+   * Return whether we should try to switch to fullscreen mode (and lose keystrokes controls).
+   *
    * @return whether we should try to switch to fullscreen mode
    */
   private static boolean shouldTryNativeFullScreenmode() {
@@ -164,10 +135,9 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
    * 
    * @return single instance of JajukFullScreenWindow
    */
-  public static JajukFullScreenWindow getInstance() {
+  public static synchronized JajukFullScreenWindow getInstance() {
     if (instance == null) {
       instance = new JajukFullScreenWindow();
-
       instance.decorator = new WindowStateDecorator(instance) {
         @Override
         public void specificBeforeShown() {
@@ -258,9 +228,8 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
    * Instantiates a new jajuk full screen window.
    */
   public JajukFullScreenWindow() {
-    super(owner);
+    super();
     setAlwaysOnTop(true);
-
     // Add Mouse Listener to disable mouse cursor
     addMouseListener(new MouseAdapter() {
       @Override
@@ -268,14 +237,12 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
         hideMouseTimer();
       }
     });
-
     addMouseMotionListener(new MouseMotionAdapter() {
       @Override
       public void mouseMoved(MouseEvent e) {
         hideMouseTimer();
       }
     });
-
     // activate Timer
     hideMouseTimer();
   }
@@ -289,33 +256,26 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
   public void initUI() {
     // Full screen switch button
     jbFull = new JajukButton(ActionManager.getAction(JajukActions.FULLSCREEN_JAJUK));
-
     // Exit button
     jbExit = new JajukButton(ActionManager.getAction(JajukActions.EXIT));
-
     // Animation view
     animationView = new AnimationView();
     animationView.initUI();
-
     // Cover view
     coverView = new CoverView();
     coverView.initUI(false);
-
     // Player toolbar
     jtbPlay = getPlayerPanel();
-
     // Information panel
     TrackPositionSliderToolbar tpst = new TrackPositionSliderToolbar();
-
     // Add items
-    setLayout(new MigLayout("ins 0", "[grow]", "[][grow][70%!][][]"));
+    setLayout(new MigLayout("ins 0,gap 0 0", "[grow]", "[][grow][70%!][][]"));
     add(jbFull, "right,split 2,gapright 5");
     add(jbExit, "right,wrap");
-    add(animationView, "alignx center,aligny top,grow,gap bottom 20,wrap");
+    add(animationView, "alignx center,aligny top,grow,wrap");
     add(coverView, "alignx center, grow,gap bottom 20,wrap");
     add(jtbPlay, "alignx center,gap bottom 20,wrap");
     add(tpst, "alignx center,width 50%!,aligny bottom,gap bottom 10");
-
     // Add a contextual menu to leave full screen mode or quit, see also
     // issue #1492
     // TODO : For some reasons, the popup doesn't appears over the cover pic,
@@ -324,7 +284,6 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
     popup.add(ActionManager.getAction(JajukActions.FULLSCREEN_JAJUK));
     popup.add(ActionManager.getAction(JajukActions.EXIT));
     addMouseListener(new JajukMouseAdapter() {
-
       @Override
       public void handlePopup(MouseEvent e) {
         popup.show(e.getComponent(), e.getX(), e.getY());
@@ -345,7 +304,6 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
   private JPanel getPlayerPanel() {
     JPanel jPanelPlay = new JPanel();
     jPanelPlay.setLayout(new MigLayout("insets 5", "[grow][grow][grow]"));
-
     // previous
     jbPrevious = new JajukButton(ActionManager.getAction(PREVIOUS_TRACK));
     int concavity = IconLoader.getIcon(JajukIcons.PLAYER_PLAY).getIconHeight();
@@ -366,27 +324,22 @@ public class JajukFullScreenWindow extends JWindow implements IJajukWindow {
         }
       }
     });
-
     // next
     jbNext = new JajukButton(ActionManager.getAction(NEXT_TRACK));
     jbNext.putClientProperty(SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY,
         new LeftConcaveButtonShaper(concavity));
-
     // play pause
     jbPlayPause = new JajukButton(ActionManager.getAction(PAUSE_RESUME_TRACK));
     jbPlayPause.putClientProperty(SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY,
         new CircleButtonShaper());
-
     // stop
     jbStop = new JajukButton(ActionManager.getAction(STOP_TRACK));
     jbStop.putClientProperty(SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY,
         new RoundRectButtonShaper());
-
     jPanelPlay.add(jbStop, "center,split 6,width 40!,height 30,gapright 5!");
     jPanelPlay.add(jbPrevious, "center,width 62!,height 30!,gapright 0");
     jPanelPlay.add(jbPlayPause, "center,width 45!,height 45!,gapright 0");
     jPanelPlay.add(jbNext, "center,width 62!,height 30!,gapright 3");
-
     return jPanelPlay;
   }
 
diff --git a/src/main/java/org/jajuk/ui/windows/JajukMainWindow.java b/src/main/java/org/jajuk/ui/windows/JajukMainWindow.java
index 7950c9d..2724206 100644
--- a/src/main/java/org/jajuk/ui/windows/JajukMainWindow.java
+++ b/src/main/java/org/jajuk/ui/windows/JajukMainWindow.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,22 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.windows;
 
 import com.vlsolutions.swing.docking.ui.DockingUISettings;
 
 import java.awt.BorderLayout;
+import java.awt.Dimension;
 import java.awt.Frame;
 import java.awt.GraphicsConfiguration;
-import java.awt.GraphicsEnvironment;
+import java.awt.Rectangle;
 import java.awt.SystemTray;
 import java.awt.Toolkit;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.util.HashSet;
+import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
 
@@ -65,6 +66,7 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilFeatures;
 import org.jajuk.util.UtilGUI;
+import org.jajuk.util.UtilString;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
@@ -76,57 +78,61 @@ import org.jdesktop.swingx.JXPanel;
  * Singleton.
  */
 public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Self instance. */
   private static JajukMainWindow jw;
-
   /** Left side perspective selection panel. */
   private PerspectiveBarJPanel perspectiveBar;
-
   /** Main frame panel. */
   private JPanel jpFrame;
-
   /** specific perspective panel. */
   private JPanel perspectivePanel;
-
   /** State decorator. */
   private WindowStateDecorator decorator;
+  /** Number of pixels around window at initial startup. */
+  private static final int FRAME_INITIAL_BORDER = 60;
+  /** Window minimal width in pixels, set a bit less than 1024px 
+   * (lowest resolution of compatible screens) to avoid a side effect 
+   * due to negative coordinates which leads to display the frame on 
+   * the other screen if larger */
+  private static final int FRAME_MIN_WIDTH_PX = 1000;
+  /** Window minimal height in pixels*/
+  private static final int FRAME_MIN_HEIGHT_PX = 600;
 
   /**
    * Get the window instance and create the specific WindowStateHandler.
    * 
    * @return the instance
    */
-  public static JajukMainWindow getInstance() {
+  public static synchronized JajukMainWindow getInstance() {
     if (jw == null) {
       jw = new JajukMainWindow();
-
       // Install global keystrokes
       WindowGlobalKeystrokeManager.getInstance();
-
       jw.decorator = new WindowStateDecorator(jw) {
         @Override
         public void specificBeforeShown() {
-          jw.applyStoredSize();
-          if (UtilSystem.isUnderLinux()) {
-            // hide and show again is a workaround for a toFront() issue
-            // under Metacity, see
-            // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6472274
-            jw.setVisible(false);
-          }
+          //Nothing here, frame bounds is set after display (see next method)
         }
 
         @Override
         public void specificAfterShown() {
-          // Apply size and location again
-          // (required by Gnome for ie to fix the 0-sized maximized
-          // frame)
-          jw.applyStoredSize();
-          jw.toFront();
-          jw.setState(Frame.NORMAL);
+          // We have to force the new frame state, otherwise the window is deiconified but never gets focus
+          jw.setExtendedState(Frame.NORMAL);
+          //We have to call this next in the EDT to make sure that the window is displayed so maximalize() method get 
+          //proper screen for jw window.
+          SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+              if (Conf.getBoolean(Const.CONF_WINDOW_MAXIMIZED)) {
+                jw.maximalize();
+              } else {
+            	  // We set bounds after display, otherwise, the window is blank under Gnome3
+                jw.applyStoredSize();
+              }
+            }
+          });
           // Need focus for keystrokes
           jw.requestFocus();
           // Make sure to display right title if a track or a webradio is launched at startup
@@ -136,7 +142,7 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
 
         @Override
         public void specificBeforeHidden() {
-          // hide the window only if it is explicitely required
+          // This is required to store last position of frame before hide
           jw.saveSize();
         }
 
@@ -178,14 +184,12 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
       System.setProperty("apple.laf.useScreenMenuBar", "true");
       System.setProperty("apple.awt.showGrowBox", "false");
     }
-
     setTitle(Messages.getString("JajukWindow.17"));
     setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
     setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
     // register for given events
     ObservationManager.register(this);
     addWindowListener(new WindowAdapter() {
-
       @Override
       public void windowClosing(WindowEvent we) {
         // Save windows position
@@ -198,47 +202,29 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
       }
 
       @Override
-      public void windowIconified(WindowEvent we) {
-        // If user set the minimize to tray option and if the tray is supported, we 
-        // minimize to tray only
-        if (Conf.getBoolean(Const.CONF_MINIMIZE_TO_TRAY) && SystemTray.isSupported()) {
-          getWindowStateDecorator().display(false);
-        }
-      }
-
-      @Override
       public void windowDeiconified(WindowEvent we) {
         getWindowStateDecorator().display(true);
       }
-
     });
-
     // Light drag and drop for VLDocking
     UIManager.put("DragControler.paintBackgroundUnderDragRect", Boolean.FALSE);
     DockingUISettings.getInstance().installUI();
-
     // Creates the panel
     jpFrame = (JPanel) getContentPane();
     jpFrame.setOpaque(true);
     jpFrame.setLayout(new BorderLayout());
-
     // create the command bar
     CommandJPanel command = CommandJPanel.getInstance();
     command.initUI();
-
     // Create the search bar
     SearchJPanel searchPanel = SearchJPanel.getInstance();
     searchPanel.initUI();
-
     // Add the search bar
     jpFrame.add(searchPanel, BorderLayout.NORTH);
-
     // Create and add the information bar panel
     InformationJPanel information = InformationJPanel.getInstance();
-
     // Add the information panel
     jpFrame.add(information, BorderLayout.SOUTH);
-
     // Create the perspective manager
     try {
       PerspectiveManager.load();
@@ -250,17 +236,13 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
     perspectivePanel = new JXPanel();
     // Make this panel extensible
     perspectivePanel.setLayout(new BoxLayout(perspectivePanel, BoxLayout.X_AXIS));
-
     // Set menu bar to the frame
     JajukMainWindow.getInstance().setJMenuBar(JajukJMenuBar.getInstance());
-
     // Create the perspective tool bar panel
     perspectiveBar = PerspectiveBarJPanel.getInstance();
     jpFrame.add(perspectiveBar, BorderLayout.WEST);
-
     // Initialize and add the desktop
     PerspectiveManager.init();
-
     // Add main container (contains toolbars + desktop)
     JPanel commandDesktop = new JPanel(new MigLayout("insets 0,gapy 0", "[grow]", "[grow][]"));
     commandDesktop.add(perspectivePanel, "grow,wrap");
@@ -278,6 +260,7 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
     Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
     eventSubjectSet.add(JajukEvents.FILE_LAUNCHED);
     eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
+    eventSubjectSet.add(JajukEvents.WEBRADIO_INFO_UPDATED);
     eventSubjectSet.add(JajukEvents.ZERO);
     eventSubjectSet.add(JajukEvents.PLAYER_STOP);
     return eventSubjectSet;
@@ -287,144 +270,158 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
    * Save current window size and position.
    */
   public void saveSize() {
-
-    boolean maxmimized = false;
-
+    boolean maximized = false;
     if (Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)
         && (getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
-      Log.debug("Frame maximized");
-      maxmimized = true;
+      maximized = true;
     }
-    Conf.setProperty(Const.CONF_WINDOW_MAXIMIZED, Boolean.toString(maxmimized));
-
+    Conf.setProperty(Const.CONF_WINDOW_MAXIMIZED, Boolean.toString(maximized));
     String sValue = (int) getLocationOnScreen().getX() + "," + (int) getLocationOnScreen().getY()
         + "," + getBounds().width + "," + getBounds().height;
-    Log.debug("Frame moved or resized, new bounds=" + sValue);
-
+    Log.debug("Frame position position stored as :" + sValue + " maximalized=" + maximized);
     // Store the new position
     Conf.setProperty(Const.CONF_WINDOW_POSITION, sValue);
   }
 
   /**
-   * Apply size and position stored as property.
+   * Return the forced position as a rectangle or null if no forced position is provided or if the provided position is invalid
+   * <br>See http://jajuk.info/index.php/Hidden_options
+   * <br>The forced position is an hidden option used to force Jajuk window position manually.
+   * @return the forced position as a rectangle or null
    */
-  public void applyStoredSize() {
-    // Note that defaults sizes (for very first startup) are set in
-    // Conf.setDefaultProperties() method ,see
-    // CONF_WINDOW_POSITION
-    int iScreenWidth = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
-    int iScreenHeight = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
-    int iX = 0;
-    int iY = 0;
-    int iHorizSize = 0;
-    int iVertSize = 0;
-    // Forced frame position ?
-    String sForcedValue = Conf.getString(Const.CONF_FRAME_POS_FORCED);
-    if (sForcedValue != null && !sForcedValue.trim().equals("")) {
-      try {
-        StringTokenizer st = new StringTokenizer(sForcedValue, ",");
-        iX = Integer.parseInt(st.nextToken());
-        iY = Integer.parseInt(st.nextToken());
-        iHorizSize = Integer.parseInt(st.nextToken());
-        iVertSize = Integer.parseInt(st.nextToken());
-        setBounds(iX, iY, iHorizSize, iVertSize);
-      } catch (Exception e) {
-        // Wrong forced value
-        Log.error(e);
-        setBounds(Const.FRAME_INITIAL_BORDER, Const.FRAME_INITIAL_BORDER, iScreenWidth - 2
-            * Const.FRAME_INITIAL_BORDER, iScreenHeight - 2 * Const.FRAME_INITIAL_BORDER);
+  private Rectangle getForcedPosition() {
+    try {
+      String forcedPosition = Conf.getString(Const.CONF_FRAME_POS_FORCED);
+      int x = 0;
+      int y = 0;
+      int horizSize = 0;
+      int vertSize = 0;
+      if (UtilString.isNotEmpty(forcedPosition)) {
+        StringTokenizer st = new StringTokenizer(forcedPosition, ",");
+        x = Integer.parseInt(st.nextToken());
+        y = Integer.parseInt(st.nextToken());
+        horizSize = Integer.parseInt(st.nextToken());
+        vertSize = Integer.parseInt(st.nextToken());
+        return new Rectangle(x, y, horizSize, vertSize);
       }
-      return;
+    } catch (Exception e) {
+      Log.error(e);
     }
-    // Detect strange or buggy Window Manager like XGL using this test
-    // and apply default size for them
-    if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
-      setBounds(Const.FRAME_INITIAL_BORDER, Const.FRAME_INITIAL_BORDER, iScreenWidth - 2
-          * Const.FRAME_INITIAL_BORDER, iScreenHeight - 2 * Const.FRAME_INITIAL_BORDER);
-      return;
+    return null;
+  }
+
+  /**
+   * Return the stored position as a rectangle or default coordinates if no stored position is provided or if the stored position is invalid.
+   * @return the stored position as a rectangle or null
+   */
+  Rectangle getStoredPosition() {
+    try {
+      String storedPosition = Conf.getString(Const.CONF_WINDOW_POSITION);
+      int x = 0;
+      int y = 0;
+      int horizSize = 0;
+      int vertSize = 0;
+      if (UtilString.isNotEmpty(storedPosition)) {
+        StringTokenizer st = new StringTokenizer(storedPosition, ",");
+        // We need to floor the position to zero due to issues with dual screens that can produce negative x and y 
+        x = Integer.parseInt(st.nextToken());
+        x = Math.max(x, 0);
+        y = Integer.parseInt(st.nextToken());
+        y = Math.max(y, 0);
+        horizSize = Integer.parseInt(st.nextToken());
+        vertSize = Integer.parseInt(st.nextToken());
+        return new Rectangle(x, y, horizSize, vertSize);
+      }
+    } catch (Exception e) {
+      Log.error(e);
     }
+    return null;
+  }
 
-    // first get the stored position to get the correct display
+  /**
+   * Return whether the window should be maximalized.
+   * <br>Maximized state here refers to maximum size of JFrame on a desktop screen however not covering the taskbar.
+   * <br>Prior to 1.9, "max" was inside CONF_WINDOW_POSITION, then it is 
+   * externalize in a specific boolean property : CONF_WINDOW_MAXIMIZED
+   * 
+   * @return whether the window should be maximalized.
+   */
+  private boolean isMaximalizationRequired() {
+    // CONF_WINDOW_POSITION contains the last session stored position or "max" if maximalized (jajuk <1.9)
     String sPosition = Conf.getString(Const.CONF_WINDOW_POSITION);
-
     // workaround: needed for old configuration files to avoid an exception in
-    // the
-    // StringTokenizer, since Jajuk 1.9 Jajuk stores in an extra property if it
+    // the StringTokenizer, since Jajuk 1.9 Jajuk stores in an extra property if it
     // is maximized
-    if (sPosition.equals(Const.FRAME_MAXIMIZED)) {
-      // Always set a size that is used when un-maximazing the frame
-      setBounds(Const.FRAME_INITIAL_BORDER, Const.FRAME_INITIAL_BORDER, iScreenWidth - 2
-          * Const.FRAME_INITIAL_BORDER, iScreenHeight - 2 * Const.FRAME_INITIAL_BORDER);
-      if (Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
-        setExtendedState(Frame.MAXIMIZED_BOTH);
-      }
-      return;
+    if (Const.FRAME_MAXIMIZED.equals(sPosition)) {
+      return true;
     }
-    // workaround: end
-    // could be removed in future releases, also Const.FRAME_MAXIMIZED
-
-    StringTokenizer st = new StringTokenizer(sPosition, ",");
-    iX = Integer.parseInt(st.nextToken());
-    iY = Integer.parseInt(st.nextToken());
-    iHorizSize = Integer.parseInt(st.nextToken());
-    iVertSize = Integer.parseInt(st.nextToken());
-    // second set the stored position/size
-    setLocation(iX, iY);
-    setSize(iHorizSize, iVertSize);
+    return Conf.getBoolean(Const.CONF_WINDOW_MAXIMIZED);
+  }
 
-    // get the display conf where the main frame is displayed, if the position
-    // is outside, the default screen is returned
+  /**
+   * Actually maximalize this frame.
+   * Do not call this when hidden before the first screen will always been returned.
+   */
+  private void maximalize() {
     GraphicsConfiguration gConf = UtilGUI.getGraphicsDeviceOfMainFrame().getDefaultConfiguration();
-    int iScreenXzero = (int) gConf.getBounds().getX();
-    int iScreenYzero = (int) gConf.getBounds().getY();
-    iScreenWidth = (int) gConf.getBounds().getWidth();
-    iScreenHeight = (int) gConf.getBounds().getHeight();
-
-    // check if position/size is correct
+    setMaximizedBounds(gConf.getBounds());
+    setExtendedState(getExtendedState() | Frame.MAXIMIZED_BOTH);
+    setBounds(FRAME_INITIAL_BORDER, FRAME_INITIAL_BORDER,
+        (int) (gConf.getBounds().getWidth() - 2 * FRAME_INITIAL_BORDER), (int) (gConf.getBounds()
+            .getHeight() - 2 * FRAME_INITIAL_BORDER));
+  }
 
-    // if X position is higher than screen width, set default
-    if (iX < iScreenXzero || iX > iScreenXzero + iScreenWidth) {
-      iX = Const.FRAME_INITIAL_BORDER;
+  /**
+   * Check if provided position is correct
+   * @return whether provided position is valid.
+   */
+  private boolean isPositionValid(Rectangle position) {
+    GraphicsConfiguration gConf = UtilGUI.getGraphicsDeviceOfMainFrame().getDefaultConfiguration();
+    if (position.getX() < gConf.getBounds().getX()
+        || position.getX() > gConf.getBounds().getWidth()) {
+      return false;
     }
-
-    // if Y position is higher than screen height, set default
-    if (iY < iScreenYzero || iY > iScreenYzero + iScreenHeight) {
-      iY = Const.FRAME_INITIAL_BORDER;
+    if (position.getY() < gConf.getBounds().getY()
+        || position.getY() > gConf.getBounds().getHeight()) {
+      return false;
     }
-
-    // if zero horiz size or
-    // if height > to screen height (switching from a dual to a single head
-    // for ie),
-    // set max size available (minus some space to deal with task bars)
-    if (iHorizSize <= 0 || iHorizSize > iScreenWidth) {
-      iHorizSize = iScreenWidth - 2 * Const.FRAME_INITIAL_BORDER;
+    if (position.getWidth() <= 0 || position.getWidth() > gConf.getBounds().getWidth()
+        || position.getWidth() < 800) {
+      return false;
     }
-    // Same for width
-    if (iVertSize <= 0 || iVertSize > iScreenHeight) {
-      iVertSize = iScreenHeight - 2 * Const.FRAME_INITIAL_BORDER;
+    if (position.getHeight() <= 0 || position.getHeight() > gConf.getBounds().getHeight()
+        || position.getHeight() < 600) {
+      return false;
     }
+    return true;
+  }
 
-    setLocation(iX, iY);
-    setSize(iHorizSize, iVertSize);
-
-    // was the frame maximized
-    if (Conf.getBoolean(Const.CONF_WINDOW_MAXIMIZED)) {
-      if (Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
-        // are we on the primary display
-        if (gConf.getBounds().equals(
-            GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
-                .getDefaultConfiguration().getBounds())) {
-          // default size, if frame is unmaximized
-          setSize(iScreenWidth - 2 * Const.FRAME_INITIAL_BORDER, iScreenHeight - 2
-              * Const.FRAME_INITIAL_BORDER);
-          if (Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH))
-            setExtendedState(Frame.MAXIMIZED_BOTH);
+  /**
+  * Apply size and position stored as property.
+  * <br>
+  * Note that defaults sizes (for very first startup) are set in
+   {@code Conf.setDefaultProperties()} method ,see {@code CONF_WINDOW_POSITION}
+  */
+  public void applyStoredSize() {
+    try {
+      setMinimumSize(new Dimension(FRAME_MIN_WIDTH_PX, FRAME_MIN_HEIGHT_PX));
+      Rectangle forcedPosition = getForcedPosition();
+      if (forcedPosition != null) {
+        setBounds(forcedPosition);
+      } else {
+        if (isMaximalizationRequired()
+            && Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) {
+          maximalize();
         } else {
-          // setExtendedState not be used on the other displays, because Java
-          // takes always the solution of the primary display...
-          setBounds(gConf.getBounds());
+          Rectangle storedPosition = getStoredPosition();
+          // Note that setBounds handle out of bounds issues like task bar overriding, 
+          // number of screens changes since previous jajuk session...
+          setBounds(storedPosition);
         }
       }
+    } catch (Exception e) {
+      Log.error(e);
+      maximalize();
     }
   }
 
@@ -453,6 +450,16 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
             // detect jajuk frames and extract current track
             setTitle("\\ " + radio.getName() + " /");
           }
+        } else if (subject.equals(JajukEvents.WEBRADIO_INFO_UPDATED)) {
+          Properties webradioInfoUpdatedEvent = ObservationManager
+              .getDetailsLastOccurence(JajukEvents.WEBRADIO_INFO_UPDATED);
+          String currentRadioTrack = (String) webradioInfoUpdatedEvent
+              .get(Const.CURRENT_RADIO_TRACK);
+          if (currentRadioTrack != null) {
+            // We use vertical bar to allow scripting like MSN plugins to
+            // detect jajuk frames and extract current track
+            setTitle("\\ " + currentRadioTrack + " /");
+          }
         }
       }
     });
@@ -466,5 +473,4 @@ public class JajukMainWindow extends JFrame implements IJajukWindow, Observer {
   public JPanel getPerspectivePanel() {
     return perspectivePanel;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/windows/JajukSlimbar.java b/src/main/java/org/jajuk/ui/windows/JajukSlimbar.java
index c9c8c4c..94204f4 100644
--- a/src/main/java/org/jajuk/ui/windows/JajukSlimbar.java
+++ b/src/main/java/org/jajuk/ui/windows/JajukSlimbar.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.windows;
 
@@ -50,7 +50,6 @@ import javax.swing.BorderFactory;
 import javax.swing.Box;
 import javax.swing.JButton;
 import javax.swing.JComponent;
-import javax.swing.JDialog;
 import javax.swing.JFrame;
 import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
@@ -79,6 +78,7 @@ import org.jajuk.ui.widgets.JajukJToolbar;
 import org.jajuk.ui.widgets.PreferenceToolbar;
 import org.jajuk.ui.widgets.SearchBox;
 import org.jajuk.ui.widgets.SizedButton;
+import org.jajuk.ui.widgets.WebRadioButton;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
@@ -98,74 +98,32 @@ import org.jajuk.util.log.Log;
  */
 public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer,
     MouseWheelListener, ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** A queue view to be used by the show queue view slimbar switch button. Don't use it directly, use the getQueueWindow() method instead that lazy-load it. */
   private JWindow queueViewWindow;
-
-  /** DOCUMENT_ME. */
   private JButton jbInfo;
-
-  /** DOCUMENT_ME. */
   private SizedButton jbPrevious;
-
-  /** DOCUMENT_ME. */
   private SizedButton jbNext;
-
-  /** DOCUMENT_ME. */
   private SizedButton jbPlayPause;
-
-  /** DOCUMENT_ME. */
   private SizedButton jbStop;
-
-  /** DOCUMENT_ME. */
   private PreferenceToolbar preferences;
-
-  /** DOCUMENT_ME. */
   private DropDownButton jddbSmart;
-
-  /** DOCUMENT_ME. */
   private JPopupMenu jpmSmart;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jbBestof;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jbNovelties;
-
-  /** DOCUMENT_ME. */
   private JMenuItem jbRandom;
-
-  /** DOCUMENT_ME. */
   private SizedButton jbFinishAlbum;
-
-  /** DOCUMENT_ME. */
   private JButton jbMaximize;
-
-  /** DOCUMENT_ME. */
   private SizedButton jbVolume;
-
-  /** DOCUMENT_ME. */
   private SearchBox sbSearch;
-
-  /** DOCUMENT_ME. */
   private JToolBar slimJajuk;
-
-  /** DOCUMENT_ME. */
   private JToolBar jtbPlay;
-
-  /** DOCUMENT_ME. */
+  private DropDownButton webRadioButton;
   private String title = "";
-
   /** State decorator. */
   private WindowStateDecorator decorator;
-
-  /** DOCUMENT_ME. */
   JajukInformationDialog balloon;
-
-  /** DOCUMENT_ME. */
   private static JajukSlimbar self;
 
   /**
@@ -173,7 +131,7 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
    * 
    * @return single instance of JajukSlimbar
    */
-  public static JajukSlimbar getInstance() {
+  public static synchronized JajukSlimbar getInstance() {
     if (self == null) {
       self = new JajukSlimbar();
       self.decorator = new WindowStateDecorator(self) {
@@ -202,6 +160,22 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
     return self;
   }
 
+  /*
+  * (non-Javadoc)
+  * 
+  * @see org.jajuk.events.Observer#getRegistrationKeys()
+  */
+  @Override
+  public Set<JajukEvents> getRegistrationKeys() {
+    Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
+    eventSubjectSet.add(JajukEvents.FILE_LAUNCHED);
+    eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
+    eventSubjectSet.add(JajukEvents.QUEUE_NEED_REFRESH);
+    eventSubjectSet.add(JajukEvents.PLAYER_STOP);
+    eventSubjectSet.add(JajukEvents.PARAMETERS_CHANGE);
+    return eventSubjectSet;
+  }
+
   /**
    * Sets the display queue.
    * 
@@ -245,7 +219,6 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
   }
 
   /** This mouse motion listener allows the whole slim bar dragging. */
-
   private final MouseMotionAdapter motionAdapter = new MouseMotionAdapter() {
     @Override
     public void mouseDragged(MouseEvent e) {
@@ -262,8 +235,6 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
       Conf.setProperty(Const.CONF_SLIMBAR_POSITION, (int) point.getX() + "," + (int) point.getY());
     }
   };
-
-  /** DOCUMENT_ME. */
   private SizedButton jbQueue;
 
   /**
@@ -272,9 +243,6 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
   private JajukSlimbar() {
     setUndecorated(true);
     setAlwaysOnTop(true);
-    // Set windows decoration to look and feel
-    JFrame.setDefaultLookAndFeelDecorated(true);
-    JDialog.setDefaultLookAndFeelDecorated(true);
   }
 
   /*
@@ -286,11 +254,8 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
   public void initUI() {
     // Instanciate the PlayerStateMediator to listen for player basic controls
     PlayerStateMediator.getInstance();
-
     setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
-
     addWindowListener(new WindowAdapter() {
-
       @Override
       public void windowClosing(WindowEvent e) {
         try {
@@ -300,7 +265,6 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
         }
       }
     });
-
     jbInfo = new JButton(IconLoader.getIcon(JajukIcons.INFO));
     jbInfo.addActionListener(this);
     // Listen for dragging
@@ -313,9 +277,7 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
         showBalloon();
       }
     });
-
     jtbPlay = new JajukJToolbar();
-
     jbPrevious = new SizedButton(ActionManager.getAction(PREVIOUS_TRACK), false);
     jbPrevious.addMouseMotionListener(motionAdapter);
     // Manage right click : replay the track (this not triggers an action so we use a MouseAdapter here)
@@ -331,27 +293,20 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
         }
       }
     });
-
     jbNext = new SizedButton(ActionManager.getAction(NEXT_TRACK), false);
     jbNext.addMouseMotionListener(motionAdapter);
-
     jbPlayPause = new SizedButton(ActionManager.getAction(PAUSE_RESUME_TRACK), false);
     jbPlayPause.addMouseMotionListener(motionAdapter);
-
     jbStop = new SizedButton(ActionManager.getAction(STOP_TRACK), false);
     jbStop.addMouseMotionListener(motionAdapter);
-
     jbQueue = new SizedButton(ActionManager.getAction(QUEUE_TO_SLIM), false);
     jbQueue.addMouseMotionListener(motionAdapter);
-
     jtbPlay.add(jbPrevious);
     jtbPlay.add(jbPlayPause);
     jtbPlay.add(jbStop);
     jtbPlay.add(jbNext);
     jtbPlay.add(jbQueue);
-
     JToolBar jtbSmart = new JajukJToolbar();
-
     jddbSmart = new DropDownButton(IconLoader.getIcon(JajukIcons.INC_RATING)) {
       private static final long serialVersionUID = 1L;
 
@@ -360,26 +315,21 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
         return jpmSmart;
       }
     };
-
     jbBestof = new JMenuItem(ActionManager.getAction(JajukActions.BEST_OF));
     jbBestof.setIcon(IconLoader.getIcon(JajukIcons.BESTOF_16X16));
     jbBestof.addActionListener(this);
-
     jbNovelties = new JMenuItem(ActionManager.getAction(JajukActions.NOVELTIES));
     jbNovelties.setIcon(IconLoader.getIcon(JajukIcons.NOVELTIES_16X16));
     jbNovelties.addActionListener(this);
-
     jbRandom = new JMenuItem(ActionManager.getAction(JajukActions.SHUFFLE_GLOBAL));
     jbRandom.setIcon(IconLoader.getIcon(JajukIcons.SHUFFLE_GLOBAL_16X16));
     jbRandom.addActionListener(this);
-
     jpmSmart = new JPopupMenu();
     jpmSmart.add(jbRandom);
     jpmSmart.add(jbBestof);
     jpmSmart.add(jbNovelties);
     jddbSmart.addToToolBar(jtbSmart);
     jddbSmart.addMouseMotionListener(motionAdapter);
-
     if (JajukActions.SHUFFLE_GLOBAL.toString()
         .equals(Conf.getString(Const.CONF_SLIMBAR_SMART_MODE))) {
       jddbSmart.setAction(ActionManager.getAction(JajukActions.SHUFFLE_GLOBAL));
@@ -393,18 +343,14 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
       jddbSmart.setAction(ActionManager.getAction(JajukActions.NOVELTIES));
       jddbSmart.setIcon(IconLoader.getIcon(JajukIcons.NOVELTIES_16X16));
     }
-
     preferences = new PreferenceToolbar();
     jtbSmart.add(preferences);
-
     JToolBar jtbTools = new JajukJToolbar();
-
     int iVolume = (int) (100 * Conf.getFloat(Const.CONF_VOLUME));
     if (iVolume > 100) { // can occur in some undefined cases
       iVolume = 100;
     }
     jbVolume = new SizedButton(ActionManager.getAction(MUTE_STATE), false);
-
     jbVolume.addMouseMotionListener(motionAdapter);
     jbVolume.addMouseWheelListener(this);
     jbVolume.setText(null);
@@ -418,36 +364,33 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
       }
     });
     MuteAction.setVolumeIcon(iVolume);
-
     jbMaximize = new JajukButton(ActionManager.getAction(JajukActions.SLIM_JAJUK));
     jbMaximize.addMouseMotionListener(motionAdapter);
-
     jtbTools.add(jbVolume);
     jtbTools.addSeparator();
     jtbTools.add(jbMaximize);
     jtbTools.add(new SizedButton(ActionManager.getAction(JajukActions.EXIT), false));
-
     // Continue
     jbFinishAlbum = new SizedButton(ActionManager.getAction(JajukActions.FINISH_ALBUM));
-
     // Search
     sbSearch = new SearchBox();
-
     sbSearch.setPreferredSize(new Dimension(75, 20));
     sbSearch.setMaximumSize(new Dimension(75, 20));
     sbSearch.addMouseMotionListener(motionAdapter);
-
     slimJajuk = new JajukJToolbar();
-
     AmbienceComboBox ambienceCombo = new AmbienceComboBox();
     ambienceCombo.setPreferredSize(new Dimension(42, 20));
     ambienceCombo.addMouseMotionListener(motionAdapter);
-
+    // Webradio button
+    webRadioButton = new WebRadioButton(IconLoader.getIcon(JajukIcons.WEBRADIO_16X16));
+    JToolBar jtbWebRadio = new JajukJToolbar();
+    webRadioButton.addToToolBar(jtbWebRadio);
     slimJajuk.add(Box.createHorizontalStrut(4));
     slimJajuk.add(jbInfo);
     slimJajuk.addSeparator();
     slimJajuk.add(sbSearch);
     slimJajuk.addSeparator();
+    slimJajuk.add(jtbWebRadio);
     slimJajuk.add(jtbSmart);
     slimJajuk.add(jbFinishAlbum);
     slimJajuk.addSeparator();
@@ -457,50 +400,29 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
     slimJajuk.addSeparator();
     slimJajuk.add(jtbTools);
     slimJajuk.add(Box.createHorizontalStrut(2));
-
     slimJajuk.setBorder(BorderFactory.createRaisedBevelBorder());
-
     getRootPane().setToolTipText(getPlayerInfo());
-
     add(slimJajuk);
-
     ObservationManager.register(this);
-
     getRootPane().setWindowDecorationStyle(JRootPane.NONE);
     updateCurrentTitle();
     setVisible(true);
     setAlwaysOnTop(true);
-
     // Set location
     String lastPosition = Conf.getString(Const.CONF_SLIMBAR_POSITION);
-
-    int iScreenWidth = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
-    int iScreenHeight = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
-    int x = iScreenWidth / 2;
-    int y = iScreenHeight / 2;
-
     try {
       StringTokenizer st = new StringTokenizer(lastPosition, ",");
-      x = Integer.parseInt(st.nextToken());
-      y = Integer.parseInt(st.nextToken());
-      // Reset if position are out of bounds (after a resolution changing for
-      // eg)
-      if (x < 0 || x > iScreenWidth) {
-        x = 0;
-      }
-      if (y < 0 || y > iScreenHeight) {
-        y = 0;
-      }
+      int x = Integer.parseInt(st.nextToken());
+      int y = Integer.parseInt(st.nextToken());
       Point point = new Point(x, y);
+      // Note that setLocation handle odd positions and fix them
       setLocation(point);
     } catch (Exception e) {
       Log.debug("Cannot restore slimbar position");
       Log.error(e);
     }
-
     // Force initial message refresh
     UtilFeatures.updateStatus(this);
-
     // Install global keystrokes
     WindowGlobalKeystrokeManager.getInstance();
   }
@@ -528,7 +450,7 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
   }
 
   /**
-   * Update current title. DOCUMENT_ME
+   * Update current title. 
    */
   private void updateCurrentTitle() {
     File file = QueueModel.getPlayingFile();
@@ -539,13 +461,7 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
     } else {
       title = Messages.getString("JajukWindow.18");
     }
-    // Update window title
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        setTitle(title);
-      }
-    });
+    setTitle(title);
   }
 
   /**
@@ -582,13 +498,12 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
    */
   @Override
   public void mouseWheelMoved(MouseWheelEvent e) {
-    if (e.getSource().equals(jbVolume)) {
+    if (e.getSource().equals(jbVolume) && !Conf.getBoolean(Const.CONF_BIT_PERFECT)) {
       int oldVolume = (int) (100 * Player.getCurrentVolume());
       int newVolume = oldVolume - (e.getUnitsToScroll() * 3);
       if (Player.isMuted()) {
         Player.mute(false);
       }
-
       if (newVolume > 100) {
         newVolume = 100;
       } else if (newVolume < 0) {
@@ -607,7 +522,7 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
    * Force tooltip refresh Thanks Santhosh Kumar
    * http://www.jroller.com/santhosh/entry/tooltips_can_say_more
    * 
-   * @param comp DOCUMENT_ME
+   * @param comp 
    */
   public static void postToolTip(JComponent comp) {
     Action action = comp.getActionMap().get("postTip");
@@ -623,7 +538,7 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
    * Remove tooltip Thanks Santhosh Kumar
    * http://www.jroller.com/santhosh/entry/tooltips_can_say_more
    * 
-   * @param comp DOCUMENT_ME
+   * @param comp 
    */
   public static void hideToolTip(JComponent comp) {
     Action action = comp.getActionMap().get("hideTip");
@@ -638,30 +553,25 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
   /*
    * (non-Javadoc)
    * 
-   * @see org.jajuk.events.Observer#getRegistrationKeys()
-   */
-  @Override
-  public Set<JajukEvents> getRegistrationKeys() {
-    Set<JajukEvents> eventSubjectSet = new HashSet<JajukEvents>();
-    eventSubjectSet.add(JajukEvents.FILE_LAUNCHED);
-    eventSubjectSet.add(JajukEvents.WEBRADIO_LAUNCHED);
-    eventSubjectSet.add(JajukEvents.QUEUE_NEED_REFRESH);
-    eventSubjectSet.add(JajukEvents.PLAYER_STOP);
-    return eventSubjectSet;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
    * @see org.jajuk.events.Observer#update(org.jajuk.events.JajukEvent)
    */
   @Override
   public void update(final JajukEvent event) {
-    JajukEvents subject = event.getSubject();
-    if (JajukEvents.FILE_LAUNCHED.equals(subject) || JajukEvents.WEBRADIO_LAUNCHED.equals(subject)
-        || JajukEvents.PLAYER_STOP.equals(subject)) {
-      updateCurrentTitle();
-    }
+    // Update window title
+    SwingUtilities.invokeLater(new Runnable() {
+      @Override
+      public void run() {
+        JajukEvents subject = event.getSubject();
+        if (JajukEvents.FILE_LAUNCHED.equals(subject)
+            || JajukEvents.WEBRADIO_LAUNCHED.equals(subject)
+            || JajukEvents.PLAYER_STOP.equals(subject)) {
+          updateCurrentTitle();
+        } else if (JajukEvents.PARAMETERS_CHANGE.equals(event.getSubject())) {
+          // Disable volume GUI in bit perfect mode
+          jbVolume.setEnabled(!Conf.getBoolean(Const.CONF_BIT_PERFECT));
+        }
+      }
+    });
   }
 
   /*
@@ -697,7 +607,7 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
     if (balloon != null && balloon.isVisible()) {
       return;
     }
-    balloon = new JajukInformationDialog(QueueModel.getCurrentFileTitle(), this);
+    balloon = new JajukInformationDialog(QueueModel.getCurrentFileTitle());
     Point buttonLocation = jbInfo.getLocationOnScreen();
     Point location = null;
     // If slimbar is too height in the screen, display the popup bellow it
@@ -720,7 +630,6 @@ public final class JajukSlimbar extends JFrame implements IJajukWindow, Observer
     // there are some resources to close in the Search-Box that I could not get
     // rid of with any of the default dispose-methods in Swing...
     sbSearch.close();
-
     super.dispose();
   }
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/windows/JajukSystray.java b/src/main/java/org/jajuk/ui/windows/JajukSystray.java
index d29ab81..4433bfe 100644
--- a/src/main/java/org/jajuk/ui/windows/JajukSystray.java
+++ b/src/main/java/org/jajuk/ui/windows/JajukSystray.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.windows;
 
 import ext.JXTrayIcon;
@@ -69,7 +68,6 @@ import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilFeatures;
-import org.jajuk.util.UtilGUI;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
 
@@ -78,64 +76,32 @@ import org.jajuk.util.log.Log;
  * Extends CommandJPanel for volume slider heritage only.
  */
 public class JajukSystray extends CommandJPanel implements IJajukWindow {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** State decorator. */
   private WindowStateDecorator decorator;
-
   // Systray variables
-  /** DOCUMENT_ME. */
   SystemTray stray;
-
-  /** DOCUMENT_ME. */
   JXTrayIcon trayIcon;
-
-  /** DOCUMENT_ME. */
   JPopupMenu jmenu;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiExit;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiMute;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiShuffle;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiBestof;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiDJ;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiNovelties;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiFinishAlbum;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPlayPause;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiStop;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiPrevious;
-
-  /** DOCUMENT_ME. */
   JMenuItem jmiNext;
-
-  /** DOCUMENT_ME. */
   JMenu jmAmbience;
-
   /** Self instance singleton. */
   private static JajukSystray jsystray;
-
   /** HTML Tooltip. */
   JajukInformationDialog balloon;
+  /** Window type the tray has hidden on click if any */
+  private int lastHiddenDisplayMode = Const.DISPLAY_MODE_MAIN_WINDOW;
 
   /**
    * Checks if is loaded.
@@ -151,7 +117,7 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
    * 
    * @return singleton
    */
-  public static JajukSystray getInstance() {
+  public static synchronized JajukSystray getInstance() {
     if (jsystray == null) {
       jsystray = new JajukSystray();
       jsystray.decorator = new WindowStateDecorator(jsystray) {
@@ -214,51 +180,39 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
     PlayerStateMediator.getInstance();
     jmenu = new JPopupMenu(Messages.getString("JajukWindow.3"));
     jmiExit = new JMenuItem(ActionManager.getAction(JajukActions.EXIT));
-
     // force icon to be display in 16x16
     jmiMute = new SizedJMenuItem(ActionManager.getAction(JajukActions.MUTE_STATE));
     jmiMute.addMouseWheelListener(this);
-    
     jmiShuffle = new SizedJMenuItem(ActionManager.getAction(JajukActions.SHUFFLE_GLOBAL));
-
     jmiBestof = new SizedJMenuItem(ActionManager.getAction(JajukActions.BEST_OF));
     jmiDJ = new SizedJMenuItem(ActionManager.getAction(JajukActions.DJ));
     jmiFinishAlbum = new SizedJMenuItem(ActionManager.getAction(JajukActions.FINISH_ALBUM));
     jmiNovelties = new SizedJMenuItem(ActionManager.getAction(JajukActions.NOVELTIES));
-
     jmiPlayPause = new SizedJMenuItem(ActionManager.getAction(JajukActions.PAUSE_RESUME_TRACK));
     jmiStop = new SizedJMenuItem(ActionManager.getAction(JajukActions.STOP_TRACK));
     jmiPrevious = new SizedJMenuItem(ActionManager.getAction(JajukActions.PREVIOUS_TRACK));
     jmiNext = new SizedJMenuItem(ActionManager.getAction(JajukActions.NEXT_TRACK));
-
     JLabel jlTitle = new JLabel("Jajuk");
     jlTitle.addMouseListener(new MouseAdapter() {
       @Override
       public void mouseClicked(MouseEvent e) {
         if (e.getButton() == MouseEvent.BUTTON1) {
-          // show main window if it is not visible and hide it if it is visible
-          WindowState mainWindowState = JajukMainWindow.getInstance().getWindowStateDecorator()
-              .getWindowState();
-          boolean bShouldDisplayMainWindow = !(mainWindowState == WindowState.BUILT_DISPLAYED);
-          JajukMainWindow.getInstance().getWindowStateDecorator().display(bShouldDisplayMainWindow);
+          showMainOrSlimbarWindow(e);
         }
       }
-
     });
     jlTitle.setFont(FontManager.getInstance().getFont(JajukFont.BOLD_TITLE));
     SearchBox searchBox = new SearchBox();
     JPanel jpTitle = new JPanel(new MigLayout("ins 5", "[][grow]"));
     jpTitle.add(jlTitle, "left,gapx 20px");
     jpTitle.add(searchBox, "right,grow");
-
     // Ambiences menu
     Ambience defaultAmbience = AmbienceManager.getInstance().getSelectedAmbience();
     jmAmbience = new JMenu(Messages.getString("JajukWindow.36")
         + " "
-        + ((defaultAmbience == null) ? Messages.getString("DigitalDJWizard.64") : defaultAmbience
-            .getName()));
+        + ((defaultAmbience == null) ? Messages.getString("DigitalDJWizard.64")
+            : defaultAmbience.getName()));
     populateAmbiences();
-
     jmenu.add(jpTitle);
     jmenu.addSeparator();
     jmenu.add(jmAmbience);
@@ -282,14 +236,12 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
     if (UtilSystem.isUnderLinux()) {
       jmenu.add("");
     }
-
     trayIcon = new JXTrayIcon(IconLoader.getIcon(JajukIcons.TRAY).getImage());
     if (!UtilSystem.isUnderLinux()) {
       // auto-resize looks OK under Windows but is ugly under Linux/KDE
       trayIcon.setImageAutoSize(true);
     }
     trayIcon.addMouseMotionListener(new MouseMotionAdapter() {
-
       long dateLastMove = 0;
 
       @Override
@@ -303,13 +255,7 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
         if (balloon != null && balloon.isVisible()) {
           return;
         }
-        // Useful for #1582 ([Linux] Void entry in task bar for information dialog)
-        if (UtilGUI.getActiveWindow() != null //can happen if tray only
-            && UtilGUI.getActiveWindow().equals(JajukMainWindow.getInstance())) {
-          balloon = new JajukInformationDialog(title, null);
-        } else {
-          balloon = new JajukInformationDialog(title, UtilGUI.getActiveWindow());
-        }
+        balloon = new JajukInformationDialog(title);
         Point location = new Point(e.getX() - balloon.getWidth(), e.getY()
             - (20 + balloon.getHeight()));
         balloon.setLocation(location);
@@ -319,10 +265,8 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
     trayIcon.setJPopuMenu(jmenu);
     // Note that under OSX, popup gesture recognition is inverted : a left click return true
     if (UtilSystem.isUnderOSX()) {
-
       // Don't use a JajukMouseAdapter here because tray has specific behavior under OSX
       trayIcon.addMouseListener(new MouseAdapter() {
-
         // Under OSX, the event to consider is PRESSED, not RELEASED, 
         // see http://developer.apple.com/mac/library/documentation/Java/Conceptual/Java14Development/07-NativePlatformIntegration/NativePlatformIntegration.html
         @Override
@@ -331,17 +275,15 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
             // popup gesture recognized, display the jdialog
             trayIcon.showJPopupMenu(e);
           } else {
-            showHideWindow(e);
+            showMainOrSlimbarWindow(e);
           }
         }
       });
-
     } else {
       trayIcon.addMouseListener(new JajukMouseAdapter() {
-
         @Override
         public void handleActionSingleClick(MouseEvent e) {
-          showHideWindow(e);
+          showMainOrSlimbarWindow(e);
         }
 
         @Override
@@ -358,32 +300,58 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
     }
     // Register needed events
     ObservationManager.register(this);
-
   }
 
   /**
    * Invert current window visibility with a left click on the tray icon.
    * 
-   * @param e DOCUMENT_ME
+   * @param e 
+   */
+  private void showMainOrSlimbarWindow(MouseEvent e) {
+    int displayMode = Conf.getInt(Const.CONF_STARTUP_DISPLAY);
+    // We don't want to hide/show the tray itself by only the 
+    if (displayMode == Const.DISPLAY_MODE_TRAY) {
+      displayMode = lastHiddenDisplayMode;
+    } else {
+      lastHiddenDisplayMode = displayMode;
+    }
+    WindowStateDecorator windowDecorator = getWindowStateDecoratorByDisplayMode(displayMode);
+    boolean bShouldDisplay = false;
+    // Check the CONF_TRAY_CLICK_DISPLAY_WINDOW option
+    if (Conf.getBoolean(Const.CONF_TRAY_CLICK_DISPLAY_WINDOW)) {
+      bShouldDisplay = true;
+    } else {
+      // Invert visibility for the current window
+      bShouldDisplay = (windowDecorator.getWindowState() != WindowState.BUILT_DISPLAYED)
+      // force display if the window was minimalized 
+          || windowDecorator.isMinimalized();
+    }
+    windowDecorator.display(bShouldDisplay);
+    //Make sure to bring the window to front
+    if (bShouldDisplay) {
+      windowDecorator.toFront();
+    }
+  }
+
+  /**
+   * Return the window decorator for given mode value or main window decorator if unknown mode
+   * @param display mode
+   * @return the window decorator for given mode value
    */
-  private void showHideWindow(MouseEvent e) {
+  private WindowStateDecorator getWindowStateDecoratorByDisplayMode(int mode) {
     WindowStateDecorator windowDecorator = null;
-    if (Conf.getInt(Const.CONF_STARTUP_DISPLAY) == Const.DISPLAY_MODE_MAIN_WINDOW) {
+    if (mode == Const.DISPLAY_MODE_MAIN_WINDOW) {
       windowDecorator = JajukMainWindow.getInstance().getWindowStateDecorator();
-    } else if (Conf.getInt(Const.CONF_STARTUP_DISPLAY) == Const.DISPLAY_MODE_SLIMBAR_TRAY) {
+    } else if (mode == Const.DISPLAY_MODE_TRAY) {
+      windowDecorator = JajukSystray.getInstance().getWindowStateDecorator();
+    } else if (mode == Const.DISPLAY_MODE_SLIMBAR_TRAY) {
       windowDecorator = JajukSlimbar.getInstance().getWindowStateDecorator();
-    } else if (Conf.getInt(Const.CONF_STARTUP_DISPLAY) == Const.DISPLAY_MODE_FULLSCREEN) {
+    } else if (mode == Const.DISPLAY_MODE_FULLSCREEN) {
       windowDecorator = JajukFullScreenWindow.getInstance().getWindowStateDecorator();
-    }
-
-    // show Main if no other found, i.e. only Systray is displayed
-    if (windowDecorator == null) {
+    } else {
       windowDecorator = JajukMainWindow.getInstance().getWindowStateDecorator();
     }
-
-    // Invert visibility for the current window
-    boolean bShouldDisplay = !(windowDecorator.getWindowState() == WindowState.BUILT_DISPLAYED);
-    windowDecorator.display(bShouldDisplay);
+    return windowDecorator;
   }
 
   /*
@@ -497,7 +465,6 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
     jmiAll.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
     jmiAll.addActionListener(al);
     jmAmbience.add(jmiAll);
-
     // Add available ambiences
     for (Ambience ambience : AmbienceManager.getInstance().getAmbiences()) {
       JMenuItem jmi = new JMenuItem(ambience.getName());
@@ -527,15 +494,15 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
   public TrayIcon getTrayIcon() {
     return this.trayIcon;
   }
-  
-   /*
-   * (non-Javadoc)
-   * 
-   * @seejava.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event. MouseWheelEvent)
-   */
+
+  /*
+  * (non-Javadoc)
+  * 
+  * @seejava.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event. MouseWheelEvent)
+  */
   @Override
   public void mouseWheelMoved(MouseWheelEvent e) {
-    if (e.getSource().equals(jmiMute)) {
+    if (e.getSource().equals(jmiMute) && !Conf.getBoolean(Const.CONF_BIT_PERFECT)) {
       int oldVolume = (int) (100 * Player.getCurrentVolume());
       int newVolume = oldVolume - (e.getUnitsToScroll() * 3);
       if (Player.isMuted()) {
@@ -550,5 +517,4 @@ public class JajukSystray extends CommandJPanel implements IJajukWindow {
       MuteAction.setVolumeIcon(newVolume);
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/windows/WindowGlobalKeystrokeManager.java b/src/main/java/org/jajuk/ui/windows/WindowGlobalKeystrokeManager.java
index f20ef92..3866dd2 100644
--- a/src/main/java/org/jajuk/ui/windows/WindowGlobalKeystrokeManager.java
+++ b/src/main/java/org/jajuk/ui/windows/WindowGlobalKeystrokeManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.windows;
 
@@ -32,11 +32,13 @@ import static org.jajuk.ui.actions.JajukActions.PREVIOUS_ALBUM;
 import static org.jajuk.ui.actions.JajukActions.PREVIOUS_TRACK;
 import static org.jajuk.ui.actions.JajukActions.REPEAT_MODE;
 import static org.jajuk.ui.actions.JajukActions.REWIND_TRACK;
+import static org.jajuk.ui.actions.JajukActions.SHOW_CURRENTLY_PLAYING;
 import static org.jajuk.ui.actions.JajukActions.SHUFFLE_MODE;
 import static org.jajuk.ui.actions.JajukActions.STOP_TRACK;
 
 import java.awt.KeyEventDispatcher;
 import java.awt.KeyboardFocusManager;
+import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 
 import org.jajuk.ui.actions.ActionManager;
@@ -52,14 +54,13 @@ import org.jajuk.util.log.Log;
  * </p>.
  */
 public class WindowGlobalKeystrokeManager {
-
   /** Self instance. */
   private static WindowGlobalKeystrokeManager self;
-
   /** List of actions to enable globaly *. */
   private JajukActions[] globalActions = new JajukActions[] { NEXT_ALBUM, PREVIOUS_ALBUM,
       PREVIOUS_TRACK, NEXT_TRACK, MUTE_STATE, PAUSE_RESUME_TRACK, STOP_TRACK, DECREASE_VOLUME,
-      INCREASE_VOLUME, SHUFFLE_MODE, REPEAT_MODE, REWIND_TRACK, FORWARD_TRACK, HELP_REQUIRED };
+      INCREASE_VOLUME, SHUFFLE_MODE, REPEAT_MODE, REWIND_TRACK, FORWARD_TRACK, HELP_REQUIRED,
+      SHOW_CURRENTLY_PLAYING };
 
   /**
    * Gets the single instance of WindowGlobalKeystrokeManager.
@@ -78,9 +79,13 @@ public class WindowGlobalKeystrokeManager {
    */
   public WindowGlobalKeystrokeManager() {
     KeyEventDispatcher ked = new KeyEventDispatcher() {
-
       @Override
       public boolean dispatchKeyEvent(KeyEvent ke) {
+        //--- Drop disabled keystrokes ---
+        // Disable CTRL-Backspace : it closes the views due to VLDocking keystroke 
+        if (ke.getKeyCode() == KeyEvent.VK_BACK_SPACE && ke.getModifiers() == InputEvent.CTRL_MASK) {
+          return true;
+        }
         // Add all global keys to this dispatcher
         for (JajukActions actionName : globalActions) {
           JajukAction action = ActionManager.getAction(actionName);
@@ -98,7 +103,6 @@ public class WindowGlobalKeystrokeManager {
         return false;
       }
     };
-
     // Attach the event dispatcher
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(ked);
   }
diff --git a/src/main/java/org/jajuk/ui/windows/WindowState.java b/src/main/java/org/jajuk/ui/windows/WindowState.java
index fd14ef1..295b32d 100644
--- a/src/main/java/org/jajuk/ui/windows/WindowState.java
+++ b/src/main/java/org/jajuk/ui/windows/WindowState.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.windows;
 
@@ -24,17 +24,10 @@ package org.jajuk.ui.windows;
  * Possible states for a Jajuk window.
  */
 public enum WindowState {
-
   // Not yet build
-  /** DOCUMENT_ME. */
   NOT_BUILT,
-
   // Build but not yet displayed
-  /** DOCUMENT_ME. */
   BUILT_NOT_DISPLAYED,
-
   // Build and displayed
-  /** DOCUMENT_ME. */
   BUILT_DISPLAYED,
-
 }
diff --git a/src/main/java/org/jajuk/ui/windows/WindowStateDecorator.java b/src/main/java/org/jajuk/ui/windows/WindowStateDecorator.java
index c24022a..764ef35 100644
--- a/src/main/java/org/jajuk/ui/windows/WindowStateDecorator.java
+++ b/src/main/java/org/jajuk/ui/windows/WindowStateDecorator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,12 +16,18 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.windows;
 
 import java.awt.Component;
+import java.awt.Frame;
+import java.awt.Window;
 
+import javax.swing.JFrame;
+
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
 import org.jajuk.util.log.Log;
 
 /**
@@ -29,10 +35,8 @@ import org.jajuk.util.log.Log;
  * fullscreen, tray, slimbar...)
  */
 public abstract class WindowStateDecorator {
-
   /** Current state. */
   private WindowState state = WindowState.NOT_BUILT;
-
   /** Decorated window *. */
   private IJajukWindow window;
 
@@ -64,6 +68,32 @@ public abstract class WindowStateDecorator {
   }
 
   /**
+   * Store window-type configuration.
+   */
+  private void storeWindowState() {
+    WindowStateDecorator sdSlimbar = JajukSlimbar.getInstance().getWindowStateDecorator();
+    WindowStateDecorator sdMainWindow = JajukMainWindow.getInstance().getWindowStateDecorator();
+    WindowStateDecorator sdfullscreen = JajukFullScreenWindow.getInstance()
+        .getWindowStateDecorator();
+    // Set main window display at next startup as a default
+    Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_MAIN_WINDOW));
+    if (sdSlimbar.isDisplayed()) {
+      Conf.setProperty(Const.CONF_STARTUP_DISPLAY,
+          Integer.toString(Const.DISPLAY_MODE_SLIMBAR_TRAY));
+    } else if (sdfullscreen.isDisplayed()) {
+      Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_FULLSCREEN));
+    } else if (sdMainWindow.isDisplayed()) {
+      Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_MAIN_WINDOW));
+    }
+    // None window displayed ? set the tray only (if the show tray option is
+    // set)
+    else if (!sdSlimbar.isDisplayed() && !sdMainWindow.isDisplayed() && !sdfullscreen.isDisplayed()
+        && Conf.getBoolean(Const.CONF_SHOW_SYSTRAY)) {
+      Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_TRAY));
+    }
+  }
+
+  /**
    * Show or hide the frame
    * <p>
    * Must be called within the EDT
@@ -82,7 +112,6 @@ public abstract class WindowStateDecorator {
       if (show && state == WindowState.NOT_BUILT) {
         window.initUI();
       }
-
       // Show or hide specific code before the window is made visible
       if (show) {
         window.getWindowStateDecorator().specificBeforeShown();
@@ -90,28 +119,35 @@ public abstract class WindowStateDecorator {
       } else {
         window.getWindowStateDecorator().specificBeforeHidden();
       }
-
       // Display or hide the window
       ((Component) window).setVisible(show);
-
       // Show or hide specific code after the window is made visible
       if (show) {
         window.getWindowStateDecorator().specificAfterShown();
         ((Component) window).validate();
+        setWindowState(WindowState.BUILT_DISPLAYED);
+        // Store state only when windows appear, not when they close as they can be forced to close at exit for example
+        storeWindowState();
       } else {
         window.getWindowStateDecorator().specificAfterHidden();
-      }
-
-      // store the new state
-      if (show) {
-        state = WindowState.BUILT_DISPLAYED;
-      } else {
-        state = WindowState.BUILT_NOT_DISPLAYED;
+        setWindowState(WindowState.BUILT_NOT_DISPLAYED);
       }
     } catch (Exception e) {
       Log.error(e);
     }
+  }
 
+  /**
+   * Bring window to front if it is a java.awt.Window component or does nothing otherwise.
+   * @throws IllegalStateException if the component has not yet been displayed
+   */
+  public void toFront() {
+    if (state != WindowState.BUILT_DISPLAYED) {
+      throw new IllegalStateException("Can't call toFront() on non-displayed windows");
+    }
+    if (window instanceof Window) {
+      ((Window) window).toFront();
+    }
   }
 
   /**
@@ -125,6 +161,16 @@ public abstract class WindowStateDecorator {
   }
 
   /**
+   * Return whether the managed window is minimalized to the taskbar. 
+   * Returns false if the window doesn't exist or is not a JFrame.
+   * @return whether the managed window is minimalized to the taskbar
+   */
+  public boolean isMinimalized() {
+    return window != null && window instanceof JFrame
+        && ((JFrame) window).getState() == Frame.ICONIFIED;
+  }
+
+  /**
    * convenient method to get visible status of the window.
    * 
    * @return whether the window is displayed
@@ -156,5 +202,4 @@ public abstract class WindowStateDecorator {
    * class WindowDecorator.
    */
   abstract public void specificAfterHidden();
-
 }
diff --git a/src/main/java/org/jajuk/ui/wizard/AboutWindow.java b/src/main/java/org/jajuk/ui/wizard/AboutWindow.java
index cbe4188..e81e320 100644
--- a/src/main/java/org/jajuk/ui/wizard/AboutWindow.java
+++ b/src/main/java/org/jajuk/ui/wizard/AboutWindow.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.BorderLayout;
@@ -34,6 +33,7 @@ import javax.swing.SwingUtilities;
 import net.miginfocom.swing.MigLayout;
 
 import org.jajuk.ui.widgets.JajukJDialog;
+import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
@@ -48,19 +48,14 @@ import org.jfree.ui.about.SystemPropertiesPanel;
  * Help perspective *
  */
 public class AboutWindow extends JajukJDialog {
-  
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** License panel. */
   private JPanel jpLicence;
-
   /** JVM properties panel. */
   private SystemPropertiesPanel spp;
-
   /** Tabbed pane with previous panels. */
   private JTabbedPane jtp;
-
   /** Additional informations. */
   private static final String INFOS = "http://jajuk.info";
 
@@ -68,18 +63,17 @@ public class AboutWindow extends JajukJDialog {
    * Constructor.
    */
   public AboutWindow() {
-    super();
-
     SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        setTitle(Messages.getString("JajukJMenuBar.16"));
-        initUI();
-        setSize(new Dimension(600, 300));
-        UtilGUI.centerWindow(AboutWindow.this);
-        setVisible(true);
-      }
-
+        @Override
+        public void run() {
+            setTitle(Messages.getString("JajukJMenuBar.16"));
+            initUI();
+            //for some reasons, required to avoid blank dialogs
+            pack();
+            setSize(new Dimension(600, 300));
+            UtilGUI.centerWindow(AboutWindow.this);
+            setVisible(true);
+        }
     });
   }
 
@@ -90,7 +84,7 @@ public class AboutWindow extends JajukJDialog {
    */
   /**
    * Inits the ui.
-   * DOCUMENT_ME
+   * 
    */
   public void initUI() {
     // license panel
diff --git a/src/main/java/org/jajuk/ui/wizard/AlarmClockDialog.java b/src/main/java/org/jajuk/ui/wizard/AlarmClockDialog.java
index c313fac..ef0f664 100644
--- a/src/main/java/org/jajuk/ui/wizard/AlarmClockDialog.java
+++ b/src/main/java/org/jajuk/ui/wizard/AlarmClockDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.Dimension;
@@ -63,75 +62,43 @@ import org.jajuk.util.log.Log;
  * TODO : add validation on fields
  */
 public class AlarmClockDialog extends JajukJDialog implements ActionListener, ItemListener, Const {
-
   /** Constant for MigLayout hint. */
   private static final String LEFT_WRAP = "left,wrap";
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private final JLabel jlChoice;
-
-  /** DOCUMENT_ME. */
   private final JCheckBox jcbTime;
-
-  /** DOCUMENT_ME. */
   private final JRadioButton jrbShuffle;
-
-  /** DOCUMENT_ME. */
   private final JRadioButton jrbBestof;
-
-  /** DOCUMENT_ME. */
   private final JRadioButton jrbNovelties;
-
-  /** DOCUMENT_ME. */
   private final JRadioButton jrbFile;
-
-  /** DOCUMENT_ME. */
   private final JTextField jtfHour;
-
-  /** DOCUMENT_ME. */
   private final JTextField jtfMinutes;
-
-  /** DOCUMENT_ME. */
   private final JTextField jtfSeconds;
-
-  /** DOCUMENT_ME. */
   private final JComboBox jcbAlarmAction;
-
-  /** DOCUMENT_ME. */
   private final SearchBox sbSearch;
-
-  /** DOCUMENT_ME. */
   private SearchResult sr;
-
-  /** DOCUMENT_ME. */
   private OKCancelPanel okCancelPanel;
 
   /**
    * Instantiates a new alarm clock dialog.
    */
   public AlarmClockDialog() {
-    super();
-
+    super(JajukMainWindow.getInstance(), true);
     jcbTime = new JCheckBox(Messages.getString("AlarmDialog.0"));
     jcbTime.addActionListener(this);
-
     jtfHour = new JTextField(2);
     jtfHour.setToolTipText(Messages.getString("AlarmDialog.1"));
     jtfMinutes = new JTextField(2);
     jtfMinutes.setToolTipText(Messages.getString("AlarmDialog.2"));
     jtfSeconds = new JTextField(2);
     jtfSeconds.setToolTipText(Messages.getString("AlarmDialog.3"));
-
     final JLabel jlAlarmAction = new JLabel(Messages.getString("AlarmDialog.4"));
     jcbAlarmAction = new JComboBox();
     jcbAlarmAction.addItem(Const.ALARM_START_ACTION);
     jcbAlarmAction.addItem(Const.ALARM_STOP_ACTION);
     jcbAlarmAction.setToolTipText(Messages.getString("AlarmDialog.5"));
     jcbAlarmAction.addActionListener(this);
-
     jlChoice = new JLabel(Messages.getString("ParameterView.9"));
     jrbShuffle = new JRadioButton(Messages.getString("ParameterView.14"));
     jrbShuffle.setToolTipText(Messages.getString("ParameterView.15"));
@@ -165,16 +132,13 @@ public class AlarmClockDialog extends JajukJDialog implements ActionListener, It
     // disabled by default, is enabled only if jrbFile is enabled
     sbSearch.setEnabled(false);
     sbSearch.setToolTipText(Messages.getString("ParameterView.18"));
-
     final ButtonGroup bgChoices = new ButtonGroup();
     bgChoices.add(jrbShuffle);
     bgChoices.add(jrbBestof);
     bgChoices.add(jrbNovelties);
     bgChoices.add(jrbFile);
-
     jrbShuffle.setSelected(true);
     okCancelPanel = new OKCancelPanel(this);
-
     setLayout(new MigLayout("insets 5,gapy 15", "[grow][grow]"));
     add(jcbTime, "right");
     add(jtfHour, "left,split 5,width 30!");
@@ -191,10 +155,8 @@ public class AlarmClockDialog extends JajukJDialog implements ActionListener, It
     add(jrbFile, "left");
     add(sbSearch, "left,wrap,grow");
     add(okCancelPanel, "right,span");
-
     // Reload on GUI saved values
     loadValues();
-
     setTitle(Messages.getString("AlarmClock.0"));
     setMinimumSize(new Dimension(250, 100));
     pack();
@@ -222,7 +184,7 @@ public class AlarmClockDialog extends JajukJDialog implements ActionListener, It
   /**
    * Handle action.
    * 
-   * @param playAction DOCUMENT_ME
+   * @param playAction 
    */
   private void handleAction(boolean playAction) {
     jlChoice.setEnabled(playAction);
@@ -236,7 +198,7 @@ public class AlarmClockDialog extends JajukJDialog implements ActionListener, It
   /**
    * Handle time checkbox.
    * 
-   * @param playAction DOCUMENT_ME
+   * @param playAction 
    */
   private void handleTimeCheckbox(boolean playAction) {
     // Enable/ disable all widgets if user enables or disables the entire
@@ -263,7 +225,6 @@ public class AlarmClockDialog extends JajukJDialog implements ActionListener, It
       sr = sbSearch.getResult();
       sbSearch.setEnabled(jrbFile.isSelected());
     }
-
   }
 
   /**
@@ -301,19 +262,12 @@ public class AlarmClockDialog extends JajukJDialog implements ActionListener, It
           Conf.setProperty(Const.CONF_ALARM_FILE, SearchResultType.WEBRADIO.name() + '/'
               + sr.getWebradio().getName());
         }
-
       }
     } else if (jrbBestof.isSelected()) {
       Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_BESTOF);
     } else if (jrbNovelties.isSelected()) {
       Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_NOVELTIES);
     }
-    // Store properties in case of
-    try {
-      Conf.commit();
-    } catch (Exception e) {
-      Log.error(e);
-    }
     // Close the window
     dispose();
     // Notify the Alarm manager
@@ -372,7 +326,6 @@ public class AlarmClockDialog extends JajukJDialog implements ActionListener, It
   public void dispose() {
     // there are some resources to close in the Search-Box that I could not get rid of with any of the default dispose-methods in Swing...
     sbSearch.close();
-
     super.dispose();
   }
 }
diff --git a/src/main/java/org/jajuk/ui/wizard/AmbienceWizard.java b/src/main/java/org/jajuk/ui/wizard/AmbienceWizard.java
deleted file mode 100644
index cac27ea..0000000
--- a/src/main/java/org/jajuk/ui/wizard/AmbienceWizard.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.jajuk.ui.wizard;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-
-import net.miginfocom.swing.MigLayout;
-
-import org.jajuk.base.Genre;
-import org.jajuk.events.JajukEvent;
-import org.jajuk.events.JajukEvents;
-import org.jajuk.events.ObservationManager;
-import org.jajuk.services.dj.Ambience;
-import org.jajuk.services.dj.AmbienceDigitalDJ;
-import org.jajuk.services.dj.AmbienceManager;
-import org.jajuk.ui.helpers.FontManager;
-import org.jajuk.ui.helpers.FontManager.JajukFont;
-import org.jajuk.ui.windows.JajukMainWindow;
-import org.jajuk.util.Conf;
-import org.jajuk.util.IconLoader;
-import org.jajuk.util.JajukIcons;
-import org.jajuk.util.LocaleManager;
-import org.jajuk.util.Messages;
-import org.jajuk.util.log.Log;
-import org.qdwizard.Screen;
-import org.qdwizard.Wizard;
-
-/**
- * Ambiences management wizard.
- */
-public class AmbienceWizard extends Wizard {
-
-  /**
-   * DOCUMENT_ME.
-   */
-  public static class AmbiencePanel extends Screen implements ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** All dynamic widgets. */
-    private JComponent[][] widgets;
-
-    /** DOCUMENT_ME. */
-    private JButton jbNew;
-
-    /** DOCUMENT_ME. */
-    private JButton jbDelete;
-
-    /** DOCUMENT_ME. */
-    private JButton jbDefaults;
-
-    /** DJ*. */
-    private AmbienceDigitalDJ dj = null;
-
-    /** Selected ambience index. */
-    private int ambienceIndex = 0;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-    @Override
-    public void actionPerformed(final ActionEvent ae) {
-      if (ae.getSource() == jbNew) {
-        // create a void ambience
-        AmbienceWizard.ambiences.add(new Ambience(Long.toString(System.currentTimeMillis()), ""));
-        Collections.sort(AmbienceWizard.ambiences);
-        // refresh screen
-        refreshScreen();
-        // select new row
-        final JRadioButton jrb = (JRadioButton) widgets[AmbienceWizard.ambiences.size() - 1][0];
-        jrb.setSelected(true);
-        ambienceIndex = AmbienceWizard.ambiences.size() - 1;
-        setProblem(Messages.getString("DigitalDJWizard.39"));
-        jbNew.setEnabled(false);
-        jbDelete.setEnabled(true);
-        final JTextField jtf = (JTextField) widgets[ambienceIndex][1];
-        jtf.requestFocusInWindow();
-      } else if (ae.getSource() == jbDelete) {
-        final Ambience ambience = AmbienceWizard.ambiences.get(ambienceIndex);
-        AmbienceWizard.ambiences.remove(ambience);
-        AmbienceManager.getInstance().removeAmbience(ambience.getID());
-        if (AmbienceManager.getInstance().getAmbiences().size() == 0) {
-          jbDelete.setEnabled(false);
-        }
-        if (ambienceIndex > 0) {
-          ambienceIndex--;
-          final JRadioButton jrb = (JRadioButton) widgets[ambienceIndex][0];
-          jrb.setSelected(true);
-        }
-        // refresh screen
-        refreshScreen();
-      } else if (ae.getSource() == jbDefaults) {
-        AmbienceManager.getInstance().createDefaultAmbiences();
-        AmbienceWizard.ambiences = new ArrayList<Ambience>(AmbienceManager.getInstance()
-            .getAmbiences());
-        Collections.sort(AmbienceWizard.ambiences);
-        // refresh screen
-        refreshScreen();
-      }
-      // in all cases, notify command panel
-      ObservationManager.notify(new JajukEvent(JajukEvents.AMBIENCES_CHANGE));
-    }
-
-    /**
-     * Add a genre to a proportion.
-     * 
-     * @param row row
-     */
-    private void addGenre(final int row) {
-      final Ambience ambience = AmbienceWizard.ambiences.get(row);
-      // create list of genres used in current selection
-      final GenresSelectionDialog dialog = new GenresSelectionDialog(null);
-      dialog.setSelection(ambience.getGenres());
-      dialog.setVisible(true);
-      final Set<Genre> genres = dialog.getSelectedGenres();
-      // check if at least one genre has been selected
-      if (genres.size() == 0) {
-        return;
-      }
-      StringBuilder sText = new StringBuilder();
-      // reset old genres
-      ambience.setGenres(new HashSet<Genre>(10));
-      for (final Genre genre : genres) {
-        ambience.addGenre(genre);
-        sText.append(genre.getName2()).append(',');
-      }
-      sText.deleteCharAt(sText.length() - 1);
-      // Set button text
-      ((JButton) widgets[row][2]).setText(sText.toString());
-      // if we have ambience name and some genres, register the
-      // ambience
-      if ((ambience.getName().length() > 0) && (ambience.getGenres().size() > 0)) {
-        // no more error message if at least one ambience
-        setProblem(null);
-        jbNew.setEnabled(true);
-      }
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.47");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.57");
-    }
-
-    /**
-     * Gets the panel.
-     * 
-     * @return a panel containing all items
-     */
-    private JScrollPane getPanel() {
-      widgets = new JComponent[AmbienceWizard.ambiences.size()][3];
-      final JPanel out = new JPanel();
-      // Delete|Genre name|genres list
-      final ButtonGroup group = new ButtonGroup();
-      // now add all ambiences
-      for (int index = 0; index < AmbienceWizard.ambiences.size(); index++) {
-        // Ambience name
-        final JTextField jtfName = new JTextField();
-        jtfName.setText(AmbienceWizard.ambiences.get(index).getName());
-        jtfName.addCaretListener(new CaretListener() {
-          @Override
-          public void caretUpdate(final CaretEvent arg0) {
-            final int index = AmbienceWizard.getWidgetIndex(widgets, (JComponent) arg0.getSource());
-            final String s = jtfName.getText();
-            // Check this name is not already token
-            for (int i = 0; i < widgets.length; i++) {
-              if (i == index) {
-                continue;
-              }
-              final JTextField jtf = (JTextField) widgets[i][1];
-              if (jtf.getText().equals(s)) {
-                setProblem(Messages.getString("DigitalDJWizard.60"));
-                return;
-              }
-            }
-            // reset previous problems
-            if ((s.length() == 0) || (((JButton) widgets[index][2]).getText().length() == 0)) {
-              setProblem(Messages.getString("DigitalDJWizard.39"));
-            } else {
-              setProblem(null);
-            }
-            final JButton jb = (JButton) widgets[index][2];
-            final Ambience ambience = AmbienceWizard.ambiences.get(index);
-            ambience.setName(s);
-            jb.setEnabled(s.length() > 0);
-          }
-        });
-        jtfName.setToolTipText(Messages.getString("DigitalDJWizard.36"));
-        widgets[index][1] = jtfName;
-        // radio button
-        final JRadioButton jrbAmbience = new JRadioButton();
-        group.add(jrbAmbience);
-        jrbAmbience.addActionListener(new ActionListener() {
-          @Override
-          public void actionPerformed(final ActionEvent ae) {
-            ((JTextField) widgets[AmbienceWizard.getWidgetIndex(widgets, jrbAmbience)][1])
-                .getText();
-            ambienceIndex = AmbienceWizard.getWidgetIndex(widgets, jrbAmbience);
-          }
-        });
-        widgets[index][0] = jrbAmbience;
-        if (index == ambienceIndex) {
-          jrbAmbience.setSelected(true);
-        }
-        final Ambience ambience = AmbienceWizard.ambiences.get(index);
-        // genre list
-        final JButton jbGenre = new JButton(IconLoader.getIcon(JajukIcons.GENRE));
-        if (ambience.getName().length() == 0) {
-          jbGenre.setEnabled(false);
-        }
-        if ((ambience.getGenres() != null) && (ambience.getGenres().size() > 0)) {
-          jbGenre.setText(ambience.getGenresDesc());
-          jbGenre.setToolTipText(ambience.getGenresDesc());
-        }
-        jbGenre.addActionListener(new ActionListener() {
-          @Override
-          public void actionPerformed(final ActionEvent ae) {
-            final int row = AmbienceWizard.getWidgetIndex(widgets, (JComponent) ae.getSource());
-            addGenre(row);
-            // refresh ambience (force an action event)
-            final JRadioButton jrb = (JRadioButton) widgets[row][0];
-            jrb.doClick();
-          }
-        });
-        jbGenre.setToolTipText(Messages.getString("DigitalDJWizard.27"));
-        widgets[index][2] = jbGenre;
-      }
-      // Create layout
-      out.setLayout(new MigLayout("insets 5,gapx 5", "[][][grow]"));
-      // Create header
-      final JLabel jlHeader1 = new JLabel(Messages.getString("DigitalDJWizard.37"));
-      jlHeader1.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      final JLabel jlHeader2 = new JLabel(Messages.getString("DigitalDJWizard.27"));
-      jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      out.add(jlHeader1, "center,span 2");
-      out.add(jlHeader2, "center,wrap");
-      // Add widgets
-      for (int i = 0; i < widgets.length; i++) {
-        out.add(widgets[i][0], "grow,center,width 25!");
-        out.add(widgets[i][1], "grow,center,width 120!");
-        out.add(widgets[i][2], "center,grow,wrap,width 270:270");
-      }
-      final JScrollPane jsp = new JScrollPane(out);
-      // select first ambiance found
-      if (AmbienceWizard.ambiences.size() > 0) {
-        final JRadioButton jrb = (JRadioButton) widgets[0][0];
-        jrb.doClick();
-      }
-      return jsp;
-    }
-
-    /**
-     * Create panel UI.
-     */
-    @Override
-    public void initUI() {
-      AmbienceWizard.ambiences = new ArrayList<Ambience>(AmbienceManager.getInstance()
-          .getAmbiences());
-      Collections.sort(AmbienceWizard.ambiences);
-      setCanFinish(true);
-      jbNew = new JButton(Messages.getString("DigitalDJWizard.32"), IconLoader
-          .getIcon(JajukIcons.NEW));
-      jbNew.addActionListener(this);
-      jbNew.setToolTipText(Messages.getString("DigitalDJWizard.33"));
-      jbDelete = new JButton(Messages.getString("DigitalDJWizard.34"), IconLoader
-          .getIcon(JajukIcons.DELETE));
-      jbDelete.addActionListener(this);
-      jbDelete.setToolTipText(Messages.getString("DigitalDJWizard.35"));
-      jbDefaults = new JButton(Messages.getString("DigitalDJWizard.62"), IconLoader
-          .getIcon(JajukIcons.DEFAULTS));
-      jbDefaults.addActionListener(this);
-      jbDefaults.setToolTipText(Messages.getString("DigitalDJWizard.63"));
-
-      // Add items
-      refreshScreen();
-    }
-
-    /**
-     * Refresh panel.
-     */
-    private void refreshScreen() {
-      setLayout(new MigLayout("insets 5,gapy 15", "[center,grow]"));
-      removeAll();
-      // refresh panel
-      add(getPanel(), "grow,wrap");
-      add(jbNew, "split 3");
-      add(jbDelete);
-      add(jbDefaults);
-      revalidate();
-      repaint();
-    }
-  }
-
-  /** Ambiences*. */
-  static List<Ambience> ambiences;
-
-  /**
-   * Gets the widget index.
-   *
-   * @param widgets DOCUMENT_ME
-   * @param widget DOCUMENT_ME
-   * @return index of a given widget row in the widget table
-   */
-  private static int getWidgetIndex(final JComponent[][] widgets, final JComponent widget) {
-    for (int row = 0; row < widgets.length; row++) {
-      for (int col = 0; col < widgets[0].length; col++) {
-        if (widget.equals(widgets[row][col])) {
-          return row;
-        }
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Instantiates a new ambience wizard.
-   */
-  public AmbienceWizard() {
-    super(Messages.getString("DigitalDJWizard.56"), AmbiencePanel.class, null, JajukMainWindow
-        .getInstance(), LocaleManager.getLocale(), 500, 600);
-    setHeaderIcon(IconLoader.getIcon(JajukIcons.AMBIENCE));
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#finish()
-   */
-  @Override
-  public void finish() {
-    for (final Ambience ambience : AmbienceWizard.ambiences) {
-      AmbienceManager.getInstance().registerAmbience(ambience);
-    }
-    // commit it to avoid it is lost before the app close
-    AmbienceManager.getInstance().commit();
-    try {
-      Conf.commit();
-    } catch (final Exception e) {
-      Log.error(113, e);
-      Messages.showErrorMessage(113);
-    }
-    // Refresh UI
-    ObservationManager.notify(new JajukEvent(JajukEvents.AMBIENCES_CHANGE));
-
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#getNextScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends org.qdwizard.Screen> getNextScreen(
-      final Class<? extends org.qdwizard.Screen> screen) {
-    return null;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#getPreviousScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends org.qdwizard.Screen> getPreviousScreen(
-      final Class<? extends org.qdwizard.Screen> screen) {
-    return null;
-  }
-
-}
diff --git a/src/main/java/org/jajuk/ui/wizard/CDDBWizard.java b/src/main/java/org/jajuk/ui/wizard/CDDBWizard.java
index 91f1b2e..91bf00b 100644
--- a/src/main/java/org/jajuk/ui/wizard/CDDBWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/CDDBWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.wizard;
 
@@ -60,55 +60,36 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class CDDBWizard extends JajukJDialog implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private SteppedComboBox jcbAlbum;
-
-  /** DOCUMENT_ME. */
   private JajukTable jtable;
-
-  /** DOCUMENT_ME. */
   private CDDBTableModel model;
-
   /** OK/Cancel panel. */
   private OKCancelPanel okc;
-
   /** Items to be retagged. */
   private List<CDDBTrack> alCddbTracks;
-
   /** Freedb Items. */
   private Freedb fdb;
-
-  /** DOCUMENT_ME. */
   private FreedbQueryResult[] foundAlbums;
-
-  /** DOCUMENT_ME. */
   private FreedbReadResult fdbReader;
-
-  /** DOCUMENT_ME. */
   private List<String> jcbFoundAlbums;
 
   /**
    * CDDB wizard.
    * 
-   * @param tracks DOCUMENT_ME
+   * @param tracks 
    */
   public CDDBWizard(final List<Track> tracks) {
-    super();
-
+    super(JajukMainWindow.getInstance(), false);
     UtilGUI.waiting();
-
     // windows title: absolute path name of the given directory
     setTitle(Messages.getString("CDDBWizard.19"));
     setModal(true);
     SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
-
       @Override
       public Void doInBackground() {
         try {
@@ -166,7 +147,7 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
   }
 
   /**
-   * Populate model. DOCUMENT_ME
+   * Populate model. 
    * 
    * @return the cDDB table model
    */
@@ -197,14 +178,13 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
   }
 
   /**
-   * Inits the ui. DOCUMENT_ME
+   * Inits the ui. 
    */
   public void initUI() {
     okc = new OKCancelPanel(CDDBWizard.this, Messages.getString("Apply"),
         Messages.getString("Close"));
     // Albums List
     jcbAlbum = new SteppedComboBox();
-
     // add all matches
     jcbAlbum.setModel(new DefaultComboBoxModel(jcbFoundAlbums.toArray()));
     jcbAlbum.setSelectedIndex(jcbAlbum.getSelectedIndex());
@@ -217,10 +197,8 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
         jtable.selectAll();
       }
     });
-
     // Show the number of matches found
     JLabel jlCurrent = new JLabel(foundAlbums.length + " " + Messages.getString("CDDBWizard.18"));
-
     // Add items
     setLayout(new MigLayout("insets 10,gapx 15,gapy 15", "[grow,800:800:]"));
     add(new JLabel(Messages.getString("CDDBWizard.5")), "split 3");
@@ -228,7 +206,6 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
     add(jlCurrent, "wrap");
     add(new JScrollPane(jtable), "grow,wrap");
     add(okc, "span,right");
-
     getRootPane().setDefaultButton(okc.getOKButton());
     pack();
     setLocationRelativeTo(JajukMainWindow.getInstance());
@@ -238,7 +215,7 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
   /**
    * Perform the actual freedb query.
    * 
-   * @param cddbtracks DOCUMENT_ME
+   * @param cddbtracks 
    * 
    * @return number of results (0 if no result). -1 if a technical problem
    * occurred.
@@ -278,7 +255,7 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
   }
 
   /**
-   * Retag files. DOCUMENT_ME
+   * Retag files. 
    */
   public void retagFiles() {
     int[] aIdxToTag = jtable.getSelectedRows();
@@ -322,8 +299,8 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
   /**
    * Retag internal.
    * 
-   * @param iRow DOCUMENT_ME
-   * @param trackin DOCUMENT_ME
+   * @param iRow 
+   * @param trackin 
    * 
    * @return the track
    * 
@@ -389,5 +366,4 @@ public class CDDBWizard extends JajukJDialog implements ActionListener {
       }.start();
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/wizard/CustomPropertyWizard.java b/src/main/java/org/jajuk/ui/wizard/CustomPropertyWizard.java
index 148bf0c..63fde60 100644
--- a/src/main/java/org/jajuk/ui/wizard/CustomPropertyWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/CustomPropertyWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.event.ActionListener;
@@ -47,35 +46,28 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public abstract class CustomPropertyWizard extends JajukJDialog implements ActionListener,
     ItemListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -5148687837661745898L;
-
-  /** DOCUMENT_ME. */
   JLabel jlItemChoice;
-
-  /** DOCUMENT_ME. */
   JComboBox jcbItemChoice;
-
-  /** DOCUMENT_ME. */
   OKCancelPanel okp;
-
-  /** DOCUMENT_ME. */
   JLabel jlName;
 
   /**
    * Constuctor.
    * 
-   * @param sTitle DOCUMENT_ME
+   * @param sTitle 
    */
   CustomPropertyWizard(String sTitle) {
+    super(JajukMainWindow.getInstance(), true);
     setTitle(sTitle);
     setModal(true);
     setLocationRelativeTo(JajukMainWindow.getInstance());
+    pack();
   }
 
   /**
@@ -147,5 +139,4 @@ public abstract class CustomPropertyWizard extends JajukJDialog implements Actio
     }
     return im;
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/wizard/DeviceWizard.java b/src/main/java/org/jajuk/ui/wizard/DeviceWizard.java
index 7a1f988..71ce054 100644
--- a/src/main/java/org/jajuk/ui/wizard/DeviceWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/DeviceWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.HeadlessException;
@@ -29,7 +28,6 @@ import java.awt.event.WindowEvent;
 import java.io.File;
 import java.text.NumberFormat;
 import java.text.ParseException;
-import java.util.Iterator;
 import java.util.List;
 
 import javax.swing.BorderFactory;
@@ -60,87 +58,62 @@ import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukFileFilter;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
+import org.jajuk.util.UtilString;
+import org.jajuk.util.error.JajukException;
 import org.jajuk.util.filters.DirectoryFilter;
 import org.jajuk.util.log.Log;
-import org.netbeans.validation.api.Problem;
-import org.netbeans.validation.api.Problems;
-import org.netbeans.validation.api.Severity;
-import org.netbeans.validation.api.Validator;
-import org.netbeans.validation.api.builtin.Validators;
-import org.netbeans.validation.api.ui.ValidationGroup;
-import org.netbeans.validation.api.ui.ValidationPanel;
 
 /**
  * Device creation wizard.
  */
 public class DeviceWizard extends JajukJDialog implements ActionListener, Const {
-
   /** The Constant WRAP. */
   private static final String WRAP = "wrap";
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Device type combo. */
+  @SuppressWarnings("rawtypes")
   private final JComboBox jcbType;
-
   /** Device name text field. */
   private final JTextField jtfName;
-
   /** Device url text field. */
   private final JTextField jtfUrl;
-
   /** Device url path selector button. */
   private final JButton jbUrl;
-
   /** Auto-refresh device checkbox. */
   private final JCheckBox jcbRefresh;
-
   /** Auto-mount checkbox. */
   private final JCheckBox jcbAutoMount;
-
   /** Auto-refresh interval. */
   private final JTextField jtfAutoRefresh;
-
   /** Device sync checkbox. */
   private final JCheckBox jcboxSynchronized;
-
   /** Other device combo. */
+  @SuppressWarnings("rawtypes")
   private final JComboBox jcbSynchronized;
-
   /** Bidi sync choice. */
   private final JRadioButton jrbBidirSynchro;
-
   /** Unidir sync choice. */
   private final JRadioButton jrbUnidirSynchro;
-
   /** Ok Cancel panel. */
   private final OKCancelPanel okp;
-
   /** New device flag. */
   private boolean bNew = true;
-
   /** Current device. */
   private Device device;
-
   /** All devices expect itself. */
   private final List<Device> devices;
-
   /** Initial URL*. */
   private String sInitialURL;
-
   /** A convenient NumberFormat instance. */
   private NumberFormat nformat = NumberFormat.getInstance();
 
-  /** Validation group. */
-  private ValidationGroup vg;
-
   /**
    * Device wizard by default, is used for void configuration.
    */
+  @SuppressWarnings({ "rawtypes", "unchecked" })
   public DeviceWizard() {
-    super();
-
+    super(JajukMainWindow.getInstance(), true);
     devices = DeviceManager.getInstance().getDevices();
     addWindowListener(new WindowAdapter() {
       @Override
@@ -154,10 +127,8 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
         JajukMainWindow.getInstance().getY() + 100);
     JLabel jlType = new JLabel(Messages.getString("DeviceWizard.1"));
     jcbType = new JComboBox();
-
-    final Iterator<String> itDevicesTypes = DeviceManager.getInstance().getDeviceTypes();
-    while (itDevicesTypes.hasNext()) {
-      jcbType.addItem(itDevicesTypes.next());
+    for (Device.Type type : Device.Type.values()) {
+      jcbType.addItem(Device.getTypeLabel(type));
     }
     JLabel jlName = new JLabel(Messages.getString("DeviceWizard.2"));
     jtfName = new JTextField();
@@ -210,17 +181,8 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
     jrbBidirSynchro.addActionListener(this);
     bgSynchro.add(jrbBidirSynchro);
     bgSynchro.add(jrbUnidirSynchro);
-
-    // Validation
-    ValidationPanel vp = new ValidationPanel();
-    vg = vp.getValidationGroup();
-
-    installValidators();
-
     // buttons
     okp = new OKCancelPanel(this);
-    okp.getOKButton().setEnabled(false);
-
     // Add items
     setLayout(new MigLayout("insets 10,gapx 10, gapy 15", "[][grow]"));
     add(jlType);
@@ -239,9 +201,7 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
     add(jcbSynchronized, "grow,wrap");
     add(jrbUnidirSynchro, "left,gap left 20,span,wrap");
     add(jrbBidirSynchro, "left,gap left 20,span,wrap");
-    add(vp, "height 50!,span,wrap");
     add(okp, "span,right");
-
     // Set default behaviors
     if (jcbSynchronized.getItemCount() == 0) {
       jcboxSynchronized.setEnabled(false);
@@ -253,59 +213,43 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
     okp.getOKButton().requestFocusInWindow();
   }
 
-  /**
-   * Install validators.
-   */
-  @SuppressWarnings("unchecked")
-  private void installValidators() {
+  private void validateAutoRefreshDelay() throws JajukException {
     // Auto-refresh interval validation : should be 0 or a double >= 0.5
-    vg.add(jtfAutoRefresh, Validators.REQUIRE_NON_NEGATIVE_NUMBER, Validators.NO_WHITESPACE,
-        Validators.REQUIRE_VALID_NUMBER, new Validator<String>() {
-          @Override
-          public boolean validate(Problems problems, String compName, String model) {
-            try {
-              double value = nformat.parse(model).doubleValue();
-              // If value is zero, validate the user input
-              boolean resu = (value == 0 || value >= 0.5d);
-              // If a problem occurred, add this problem to the problem stack
-              if (!resu) {
-                Problem problem = new Problem(Messages.getString("DeviceWizard.55"), Severity.FATAL);
-                problems.add(problem);
-              }
-              // Disable the wizard OK button if user selection is not in the
-              // right interval or if previous validators thrown an error
-              // already
-              okp.getOKButton().setEnabled(resu && problems.isEmpty());
-              return resu;
-            } catch (Exception e) {
-              // This happen when the text field is not yet populated (model is
-              // void). Note that wrong number format issues are already handled
-              // by the previous Validators
-              okp.getOKButton().setEnabled(false);
-              return true;
-            }
-          }
-        });
+    String autoRefreshDelay = jtfAutoRefresh.getText();
+    double value;
+    try {
+      value = nformat.parse(autoRefreshDelay).doubleValue();
+    } catch (Exception ex) {
+      throw new JajukException(137);
+    }
+    // If value is zero, validate the user input
+    if (value != 0 && value < 0.5d) {
+      throw new JajukException(184);
+    }
+  }
 
-    // Validate device name
-    vg.add(jtfName, Validators.REQUIRE_NON_EMPTY_STRING);
-    vg.add(jtfName, new Validator<String>() {
-      @Override
-      public boolean validate(Problems problems, String compName, String model) {
-        // By default, we disable the OK button, we re-enable it only if the
-        // name is OK
-        okp.getOKButton().setEnabled(false);
-        for (Device deviceToCheck : DeviceManager.getInstance().getDevices()) {
-          // check for a new device with an existing name
-          if (bNew && (jtfName.getText().equalsIgnoreCase(deviceToCheck.getName()))) {
-            problems.add(new Problem(Messages.getErrorMessage(19), Severity.FATAL));
-            return false;
-          }
-        }
-        okp.getOKButton().setEnabled(problems.isEmpty());
-        return true;
+  private void validateDeviceName() throws JajukException {
+    // Validate device name : not void and not an existing name
+    if (UtilString.isEmpty(jtfName.getText())) {
+      throw new JajukException(183);
+    }
+    for (Device deviceToCheck : DeviceManager.getInstance().getDevices()) {
+      // check for a new device with an existing name
+      if (bNew && jtfName.getText().equalsIgnoreCase(deviceToCheck.getName())) {
+        throw new JajukException(19);
       }
-    });
+    }
+  }
+
+  private void validateDeviceLocation() throws JajukException {
+    // Validate device url : not void and maps an existing device
+    if (UtilString.isEmpty(jtfUrl.getText())) {
+      throw new JajukException(183);
+    }
+    String url = jtfUrl.getText();
+    if (!new File(url).exists()) {
+      throw new JajukException(143);
+    }
   }
 
   /*
@@ -329,7 +273,7 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
   }
 
   /**
-   * Handle type. DOCUMENT_ME
+   * Handle type. 
    */
   private void handleType() {
     switch (jcbType.getSelectedIndex()) {
@@ -373,8 +317,8 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
    * @throws HeadlessException the headless exception
    */
   private void handleUrl() throws HeadlessException {
-    final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(DirectoryFilter
-        .getInstance()));
+    final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(
+        DirectoryFilter.getInstance()));
     jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
     jfc.setDialogTitle(Messages.getString("DeviceWizard.43"));
     jfc.setMultiSelectionEnabled(false);
@@ -391,15 +335,26 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
   }
 
   /**
-   * Handle ok. DOCUMENT_ME
+   * Handle ok. 
    */
   private void handleOk() {
+    // validate fields
+    try {
+      validateAutoRefreshDelay();
+      validateDeviceName();
+      validateDeviceLocation();
+    } catch (JajukException je) {
+      Messages.showErrorMessage(je.getCode());
+      return;
+    }
     new Thread("Device Wizard Action Thread") {
       @Override
       public void run() {
         if (bNew) {
-          device = DeviceManager.getInstance().registerDevice(jtfName.getText(),
-              jcbType.getSelectedIndex(), jtfUrl.getText());
+          int indexType = jcbType.getSelectedIndex();
+          Device.Type type = Device.Type.values()[indexType];
+          device = DeviceManager.getInstance().registerDevice(jtfName.getText(), type,
+              jtfUrl.getText());
         }
         device.setProperty(Const.XML_DEVICE_AUTO_MOUNT, jcbAutoMount.isSelected());
         try {
@@ -449,7 +404,6 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
             }
             // Keep previous references when changing device url
             device.refresh(true, false, true, null);
-            ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
           } catch (final Exception e2) {
             Log.error(112, device.getName(), e2);
             Messages.showErrorMessage(112, device.getName());
@@ -466,7 +420,7 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
   }
 
   /**
-   * Handle synchronized. DOCUMENT_ME
+   * Handle synchronized. 
    */
   private void handleSynchronized() {
     if (jcboxSynchronized.isSelected()) {
@@ -483,8 +437,9 @@ public class DeviceWizard extends JajukJDialog implements ActionListener, Const
   /**
    * Update widgets for device property state.
    *
-   * @param device1 DOCUMENT_ME
+   * @param device1 
    */
+  @SuppressWarnings("unchecked")
   public void updateWidgets(final Device device1) {
     bNew = false;
     setTitle(Messages.getString("DeviceWizard.0") + " : " + device1.getName());
diff --git a/src/main/java/org/jajuk/ui/wizard/DigitalDJWizard.java b/src/main/java/org/jajuk/ui/wizard/DigitalDJWizard.java
deleted file mode 100644
index de013d5..0000000
--- a/src/main/java/org/jajuk/ui/wizard/DigitalDJWizard.java
+++ /dev/null
@@ -1,1556 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.jajuk.ui.wizard;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JSlider;
-import javax.swing.JSpinner;
-import javax.swing.JTextField;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.border.BevelBorder;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import net.miginfocom.swing.MigLayout;
-
-import org.jajuk.base.Genre;
-import org.jajuk.base.GenreManager;
-import org.jajuk.events.JajukEvent;
-import org.jajuk.events.JajukEvents;
-import org.jajuk.events.ObservationManager;
-import org.jajuk.services.dj.Ambience;
-import org.jajuk.services.dj.AmbienceDigitalDJ;
-import org.jajuk.services.dj.AmbienceManager;
-import org.jajuk.services.dj.DigitalDJ;
-import org.jajuk.services.dj.DigitalDJManager;
-import org.jajuk.services.dj.Proportion;
-import org.jajuk.services.dj.ProportionDigitalDJ;
-import org.jajuk.services.dj.Transition;
-import org.jajuk.services.dj.TransitionDigitalDJ;
-import org.jajuk.ui.helpers.DefaultMouseWheelListener;
-import org.jajuk.ui.helpers.FontManager;
-import org.jajuk.ui.helpers.FontManager.JajukFont;
-import org.jajuk.ui.windows.JajukMainWindow;
-import org.jajuk.util.Conf;
-import org.jajuk.util.Const;
-import org.jajuk.util.IconLoader;
-import org.jajuk.util.JajukIcons;
-import org.jajuk.util.LocaleManager;
-import org.jajuk.util.Messages;
-import org.jajuk.util.log.Log;
-import org.qdwizard.ClearPoint;
-import org.qdwizard.Screen;
-import org.qdwizard.Wizard;
-
-/**
- * DJ creation wizard.
- */
-public class DigitalDJWizard extends Wizard {
-
-  /** Wizard action. */
-  private static final String KEY_ACTION = "ACTION";
-
-  /** DJ type variable name. */
-  private static final String KEY_DJ_TYPE = "TYPE";
-
-  /** DJ name variable name. */
-  private static final String KEY_DJ_NAME = "NAME";
-
-  /** Track unicity. */
-  private static final String KEY_UNICITY = "UNICITY";
-
-  /** Ratings level. */
-  private static final String KEY_RATINGS_LEVEL = "RATING_LEVEL";
-
-  /** Fade duration. */
-  private static final String KEY_FADE_DURATION = "FADE_DURATION";
-
-  /** Transitions. */
-  private static final String KEY_TRANSITIONS = "TRANSITIONS";
-
-  /** Proportions. */
-  private static final String KEY_PROPORTIONS = "PROPORTIONS";
-
-  /** Ambience. */
-  private static final String KEY_AMBIENCE = "AMBIENCE";
-
-  /** DJ to remove. */
-  private static final String KEY_REMOVE = "REMOVE";
-
-  /** DJ to change. */
-  private static final String KEY_CHANGE = "CHANGE";
-
-  /** Max number of tracks to queue. */
-  private static final String KEY_MAX_TRACKS = "MAXTRACKS";
-
-  /**
-   * DJ type choice.
-   */
-  public static class TypeSelectionPanel extends Screen implements ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** Transition DJ code. */
-    private static final String DJ_TYPE_TRANSITION = "0";
-
-    /** Proportions DJ code. */
-    private static final String DJ_TYPE_PROPORTION = "1";
-
-    /** Ambience DJ code. */
-    private static final String DJ_TYPE_AMBIENCE = "2";
-
-    /** DOCUMENT_ME. */
-    ButtonGroup bgTypes;
-
-    /** DOCUMENT_ME. */
-    JRadioButton jrbTransitions;
-
-    /** DOCUMENT_ME. */
-    JRadioButton jrbProp;
-
-    /** DOCUMENT_ME. */
-    JRadioButton jrbAmbiance;
-
-    /**
-     * Create panel UI.
-     */
-    @Override
-    public void initUI() {
-      setLayout(new MigLayout("insets 10,gapx 10,gapy 15"));
-      bgTypes = new ButtonGroup();
-      jrbTransitions = new JRadioButton(Messages.getString("DigitalDJWizard.1"));
-      jrbTransitions.addActionListener(this);
-      jrbTransitions.doClick(); // default selection
-      jrbProp = new JRadioButton(Messages.getString("DigitalDJWizard.2"));
-      jrbProp.addActionListener(this);
-      jrbAmbiance = new JRadioButton(Messages.getString("DigitalDJWizard.3"));
-      jrbAmbiance.addActionListener(this);
-      // can select ambience DJ only if at least one ambience defined
-      jrbAmbiance.setEnabled(AmbienceManager.getInstance().getAmbiences().size() > 0);
-      bgTypes.add(jrbProp);
-      bgTypes.add(jrbTransitions);
-      bgTypes.add(jrbAmbiance);
-      add(jrbTransitions, "left,wrap");
-      add(jrbProp, "left,wrap");
-      add(jrbAmbiance, "left,wrap");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-
-    public void actionPerformed(ActionEvent e) {
-      if (e.getSource() == jrbTransitions) {
-        data.put(KEY_DJ_TYPE, DJ_TYPE_TRANSITION);
-      } else if (e.getSource() == jrbProp) {
-        data.put(KEY_DJ_TYPE, DJ_TYPE_PROPORTION);
-      } else if (e.getSource() == jrbAmbiance) {
-        data.put(KEY_DJ_TYPE, DJ_TYPE_AMBIENCE);
-      }
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.0");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.46");
-    }
-  }
-
-  /**
-   * DJ removal.
-   */
-  public static class RemovePanel extends Screen implements ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** DOCUMENT_ME. */
-    JComponent[][] widgets;
-
-    /** DOCUMENT_ME. */
-    ButtonGroup bgDJS;
-
-    /** DOCUMENT_ME. */
-    List<DigitalDJ> djs;
-
-    /**
-     * Create panel UI.
-     */
-
-    @Override
-    public void initUI() {
-      djs = new ArrayList<DigitalDJ>(DigitalDJManager.getInstance().getDJs());
-      Collections.sort(djs);
-      widgets = new JComponent[djs.size()][1];
-      // We use an inner panel for scrolling purpose
-      JPanel jp = new JPanel();
-      jp.setLayout(new MigLayout("insets 0,gapx 0,gapy 10"));
-      bgDJS = new ButtonGroup();
-      setCanFinish(true);
-      int index = 0;
-      for (DigitalDJ dj : djs) {
-        JRadioButton jrb = new JRadioButton(dj.getName());
-        jrb.addActionListener(this);
-        bgDJS.add(jrb);
-        widgets[index][0] = jrb;
-        jp.add(jrb, "left gap 5,wrap");
-        index++;
-      }
-      setProblem(Messages.getString("DigitalDJWizard.40"));
-      // select first ambience found
-      JRadioButton jrb = (JRadioButton) widgets[0][0];
-      jrb.doClick();
-      setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
-      JScrollPane jsp = new JScrollPane(jp);
-      jsp.setBorder(null);
-      add(jsp, "grow");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-
-    public void actionPerformed(ActionEvent e) {
-      int row = getWidgetIndex(widgets, (JComponent) e.getSource());
-      data.put(KEY_REMOVE, djs.get(row));
-      setProblem(null);
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.40");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.51");
-    }
-  }
-
-  /**
-   * DJ Selection for change.
-   */
-  public static class ChangePanel extends Screen implements ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** DOCUMENT_ME. */
-    JComponent[][] widgets;
-
-    /** DOCUMENT_ME. */
-    ButtonGroup bgDJS;
-
-    /** DOCUMENT_ME. */
-    List<DigitalDJ> djs;
-
-    /**
-     * Create panel UI.
-     */
-
-    @Override
-    public void initUI() {
-      djs = DigitalDJManager.getInstance().getDJsSorted();
-      // We use an inner panel for scrolling purpose
-      JPanel jp = new JPanel();
-      jp.setLayout(new MigLayout("insets 0,gapx 0,gapy 10"));
-      widgets = new JComponent[djs.size()][1];
-      setLayout(new MigLayout("insets 10,gapx 10,gapy 15"));
-      bgDJS = new ButtonGroup();
-      int index = 0;
-      for (DigitalDJ dj : djs) {
-        JRadioButton jrb = new JRadioButton(dj.getName());
-        jrb.addActionListener(this);
-        bgDJS.add(jrb);
-        widgets[index][0] = jrb;
-        jp.add(jrb, "left gap 5,wrap");
-        index++;
-      }
-      // If more than one DJ, select first
-      if (djs.size() > 0) {
-        JRadioButton jrb = (JRadioButton) widgets[0][0];
-        jrb.doClick();
-      } else {
-        setProblem(Messages.getString("DigitalDJWizard.40"));
-      }
-      setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
-      JScrollPane jsp = new JScrollPane(jp);
-      jsp.setBorder(null);
-      add(jsp, "grow");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-
-    public void actionPerformed(ActionEvent e) {
-      int row = getWidgetIndex(widgets, (JComponent) e.getSource());
-      // set DJ type useful for screen choice
-      DigitalDJ dj = djs.get(row);
-      data.put(KEY_CHANGE, dj);
-      if (dj instanceof AmbienceDigitalDJ) {
-        data.put(KEY_DJ_TYPE, TypeSelectionPanel.DJ_TYPE_AMBIENCE);
-      }
-      if (dj instanceof ProportionDigitalDJ) {
-        data.put(KEY_DJ_TYPE, TypeSelectionPanel.DJ_TYPE_PROPORTION);
-      }
-      if (dj instanceof TransitionDigitalDJ) {
-        data.put(KEY_DJ_TYPE, TypeSelectionPanel.DJ_TYPE_TRANSITION);
-      }
-      setProblem(null);
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.44");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.43");
-    }
-  }
-
-  /**
-   * Action type (new or alter).
-   */
-  public static class ActionSelectionPanel extends Screen implements ClearPoint, ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** NEW code. */
-    public static final String ACTION_CREATION = "0";
-
-    /** CHANGE code. */
-    public static final String ACTION_CHANGE = "1";
-
-    /** DELETE code. */
-    public static final String ACTION_DELETE = "2";
-
-    /** DOCUMENT_ME. */
-    ButtonGroup bgActions;
-
-    /** DOCUMENT_ME. */
-    JRadioButton jrbNew;
-
-    /** DOCUMENT_ME. */
-    JRadioButton jrbChange;
-
-    /** DOCUMENT_ME. */
-    JRadioButton jrbDelete;
-
-    /**
-     * Create panel UI.
-     */
-    @Override
-    public void initUI() {
-      setLayout(new MigLayout("insets 10,gapx 10,gapy 15"));
-      bgActions = new ButtonGroup();
-      jrbNew = new JRadioButton(Messages.getString("DigitalDJWizard.17"));
-      jrbNew.addActionListener(this);
-      jrbNew.doClick();
-      jrbChange = new JRadioButton(Messages.getString("DigitalDJWizard.18"));
-      jrbChange.addActionListener(this);
-      jrbDelete = new JRadioButton(Messages.getString("DigitalDJWizard.19"));
-      jrbDelete.addActionListener(this);
-      // disabled change and remove if none dj
-      if (DigitalDJManager.getInstance().getDJs().size() == 0) {
-        jrbChange.setEnabled(false);
-        jrbDelete.setEnabled(false);
-      }
-      bgActions.add(jrbNew);
-      bgActions.add(jrbChange);
-      bgActions.add(jrbDelete);
-      add(jrbNew, "left,wrap");
-      add(jrbChange, "left,wrap");
-      add(jrbDelete, "left,wrap");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-
-    public void actionPerformed(ActionEvent e) {
-      if (e.getSource() == jrbNew) {
-        data.put(KEY_ACTION, ACTION_CREATION);
-      } else if (e.getSource() == jrbChange) {
-        data.put(KEY_ACTION, ACTION_CHANGE);
-      } else if (e.getSource() == jrbDelete) {
-        data.put(KEY_ACTION, ACTION_DELETE);
-      }
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.16");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.45");
-    }
-  }
-
-  /**
-   * General options panel.
-   */
-  public static class GeneralOptionsPanel extends Screen implements ActionListener, CaretListener,
-      ChangeListener {
-
-    /** The Constant NO_MAX_TRACKS.  DOCUMENT_ME */
-    private static final String NO_MAX_TRACKS = "  ";
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** DOCUMENT_ME. */
-    JLabel jlName;
-
-    /** DOCUMENT_ME. */
-    JTextField jtfName;
-
-    /** DOCUMENT_ME. */
-    JLabel jlRatingLevel;
-
-    /** DOCUMENT_ME. */
-    JSlider jsRatingLevel;
-
-    /** DOCUMENT_ME. */
-    JLabel jlFadeDuration;
-
-    /** DOCUMENT_ME. */
-    JSlider jsFadeDuration;
-
-    /** DOCUMENT_ME. */
-    JCheckBox jcbMaxTracks;
-
-    /** DOCUMENT_ME. */
-    JSlider jsMaxTracks;
-
-    /** DOCUMENT_ME. */
-    JLabel jnMaxTracks;
-
-    /** DOCUMENT_ME. */
-    JCheckBox jcbUnicity;
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.49");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.48");
-    }
-
-    /**
-     * Create panel UI.
-     */
-
-    @Override
-    public void initUI() {
-      if (ActionSelectionPanel.ACTION_CREATION.equals(data.get(KEY_ACTION))) {
-        // default values
-        data.put(KEY_FADE_DURATION, 10);
-        data.put(KEY_RATINGS_LEVEL, 0); // all tracks by default
-        data.put(KEY_UNICITY, false);
-        data.put(KEY_MAX_TRACKS, -1);
-      } else if (ActionSelectionPanel.ACTION_CHANGE.equals(data.get(KEY_ACTION))) {
-        // keep existing DJ values
-        DigitalDJ dj = (DigitalDJ) data.get(KEY_CHANGE);
-        data.put(KEY_FADE_DURATION, dj.getFadingDuration());
-        data.put(KEY_RATINGS_LEVEL, dj.getRatingLevel());
-        data.put(KEY_UNICITY, dj.isTrackUnicity());
-        data.put(KEY_MAX_TRACKS, dj.getMaxTracks());
-      }
-      jlName = new JLabel(Messages.getString("DigitalDJWizard.6"));
-      jtfName = new JTextField();
-      jtfName.setToolTipText(Messages.getString("DigitalDJWizard.6"));
-      jtfName.addCaretListener(this);
-      jtfName.requestFocusInWindow();
-
-      jlRatingLevel = new JLabel(Messages.getString("DigitalDJWizard.8"));
-      jlRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
-      jsRatingLevel = new JSlider(0, 4, (Integer) data.get(KEY_RATINGS_LEVEL));
-      jsRatingLevel.setMajorTickSpacing(1);
-      jsRatingLevel.setMinorTickSpacing(1);
-      jsRatingLevel.setPaintTicks(true);
-      jsRatingLevel.setSnapToTicks(true);
-      jsRatingLevel.setPaintLabels(true);
-      jsRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
-      jsRatingLevel.addMouseWheelListener(new DefaultMouseWheelListener(jsRatingLevel));
-      jsRatingLevel.addChangeListener(this);
-
-      jlFadeDuration = new JLabel(Messages.getString("DigitalDJWizard.9"));
-      jlFadeDuration.setToolTipText(Messages.getString("DigitalDJWizard.54"));
-      jsFadeDuration = new JSlider(0, 30, (Integer) data.get(KEY_FADE_DURATION));
-      jsFadeDuration.addMouseWheelListener(new DefaultMouseWheelListener(jsFadeDuration));
-      jsFadeDuration.addChangeListener(this);
-      jsFadeDuration.setMajorTickSpacing(10);
-      jsFadeDuration.setMinorTickSpacing(1);
-      jsFadeDuration.setPaintTicks(true);
-      jsFadeDuration.setPaintLabels(true);
-      jsFadeDuration.setToolTipText(Messages.getString("DigitalDJWizard.54"));
-
-      // CheckBox for enabling/disabling slider, jsMaxTrack
-      int nMaxTracks = (Integer) data.get(KEY_MAX_TRACKS);
-      jcbMaxTracks = new JCheckBox(Messages.getString("DigitalDJWizard.67"), nMaxTracks != -1);
-      jcbMaxTracks.setToolTipText(Messages.getString("DigitalDJWizard.68"));
-
-      // initialize the slider based if max track is enabled or not
-      if (nMaxTracks != -1) {
-        jsMaxTracks = new JSlider(0, 5000, nMaxTracks);
-        jsMaxTracks.setEnabled(true);
-        jnMaxTracks = new JLabel(Integer.toString(nMaxTracks));
-      } else {
-        jsMaxTracks = new JSlider(0, 5000, 100);
-        jsMaxTracks.setEnabled(false);
-        jnMaxTracks = new JLabel(NO_MAX_TRACKS);
-      }
-      jnMaxTracks.setBorder(new BevelBorder(BevelBorder.LOWERED));
-      jsMaxTracks.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxTracks));
-      jsMaxTracks.addChangeListener(this);
-      jsMaxTracks.setMajorTickSpacing(100);
-      jsMaxTracks.setMinorTickSpacing(10);
-      jsMaxTracks.setPaintTicks(false);
-      jsMaxTracks.setPaintLabels(false);
-      jsMaxTracks.setToolTipText(Messages.getString("DigitalDJWizard.68"));
-
-      // enable/disable slider depending on checkbox
-      jcbMaxTracks.addActionListener(this);
-
-      jcbUnicity = new JCheckBox(Messages.getString("DigitalDJWizard.10"), (Boolean) data
-          .get(KEY_UNICITY));
-      jcbUnicity.setToolTipText(Messages.getString("DigitalDJWizard.55"));
-      jcbUnicity.addActionListener(new ActionListener() {
-        public void actionPerformed(ActionEvent arg0) {
-          data.put(KEY_UNICITY, jcbUnicity.isSelected());
-        }
-      });
-
-      // DJ change, set default values
-      if (ActionSelectionPanel.ACTION_CHANGE.equals(data.get(KEY_ACTION))) {
-        DigitalDJ dj = (DigitalDJ) data.get(KEY_CHANGE);
-        jtfName.setText(dj.getName());
-        jsFadeDuration.setValue((Integer) data.get(KEY_FADE_DURATION));
-        jsRatingLevel.setValue((Integer) data.get(KEY_RATINGS_LEVEL));
-        jcbUnicity.setSelected((Boolean) data.get(KEY_UNICITY));
-        if (((Integer) data.get(KEY_MAX_TRACKS)) != -1) {
-          jsMaxTracks.setValue((Integer) data.get(KEY_MAX_TRACKS));
-        } else {
-          jsMaxTracks.setValue(100);
-        }
-      } else { // new dj, dj name is required
-        setProblem(Messages.getString("DigitalDJWizard.41"));
-      }
-
-      setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
-      add(jlName);
-      add(jtfName, "grow,wrap");
-      add(jlRatingLevel);
-      add(jsRatingLevel, "grow,wrap");
-      add(jlFadeDuration);
-      add(jsFadeDuration, "grow,wrap");
-      add(jcbMaxTracks);
-      {
-        JPanel panel = new JPanel();
-        panel.setLayout(new MigLayout("", "[grow][]"));
-        panel.add(jsMaxTracks, "grow");
-        panel.add(jnMaxTracks);
-        add(panel, "grow,wrap");
-      }
-      add(jcbUnicity, "wrap");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-
-    public void actionPerformed(ActionEvent ae) {
-      if (ae.getSource() == jcbUnicity) {
-        data.put(KEY_UNICITY, jcbUnicity.isSelected());
-      } else if (ae.getSource() == jcbMaxTracks) {
-        jsMaxTracks.setEnabled(jcbMaxTracks.isSelected());
-        updateMaxTracks();
-      }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * javax.swing.event.CaretListener#caretUpdate(javax.swing.event.CaretEvent)
-     */
-
-    public void caretUpdate(CaretEvent ce) {
-      if (ce.getSource() == jtfName) {
-        data.put(KEY_DJ_NAME, jtfName.getText());
-        String sName = jtfName.getText();
-        // string length = 0
-        if (sName.length() == 0) {
-          setProblem(Messages.getString("DigitalDJWizard.41"));
-        }
-        // display an error message if the dj already exists and not in
-        // "change" mode
-        else if (DigitalDJManager.getInstance().getDJNames().contains(sName)) {
-          // if we are in change mode and the name is still the
-          // same, no error
-          if (ActionSelectionPanel.ACTION_CHANGE.equals(data.get(KEY_ACTION))
-              && ((DigitalDJ) data.get(KEY_CHANGE)).getName().equals(sName)) {
-            setProblem(null);
-            return;
-          }
-          setProblem(Messages.getString("DigitalDJWizard.42"));
-        } else {
-          setProblem(null); // no more problem
-        }
-      }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent
-     * )
-     */
-
-    public void stateChanged(ChangeEvent ie) {
-      if (ie.getSource() == jsFadeDuration && !jsFadeDuration.getValueIsAdjusting()) {
-        data.put(KEY_FADE_DURATION, jsFadeDuration.getValue());
-      } else if (ie.getSource() == jsRatingLevel && !jsRatingLevel.getValueIsAdjusting()) {
-        data.put(KEY_RATINGS_LEVEL, jsRatingLevel.getValue());
-      } else if (ie.getSource() == jsMaxTracks) {
-        updateMaxTracks();
-      }
-
-    }
-
-    /**
-     * Update all items related to the Max Track feature.
-     */
-    private void updateMaxTracks() {
-      // store -1 if checkbox is not enabled and update the label accordingly
-      if (jcbMaxTracks.isSelected()) {
-        if (!jsMaxTracks.getValueIsAdjusting()) {
-          data.put(KEY_MAX_TRACKS, jsMaxTracks.getValue());
-        }
-        jnMaxTracks.setText(Integer.toString(jsMaxTracks.getValue()));
-      } else {
-        if (!jsMaxTracks.getValueIsAdjusting()) {
-          data.put(KEY_MAX_TRACKS, -1);
-        }
-        jnMaxTracks.setText(NO_MAX_TRACKS);
-      }
-    }
-  }
-
-  /**
-   * Transitions panel.
-   */
-  public static class TransitionsPanel extends Screen {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** All dynamic widgets. */
-    JComponent[][] widgets;
-
-    /** Transitions*. */
-    List<Transition> alTransitions;
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.52");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.20");
-    }
-
-    /**
-     * Gets the cleaned transitions.
-     * 
-     * @return Filled transitions only
-     */
-    private List<Transition> getCleanedTransitions() {
-      List<Transition> out = new ArrayList<Transition>(alTransitions.size());
-      for (Transition transition : alTransitions) {
-        if (transition.getFrom() != null && transition.getTo() != null
-            && transition.getFrom().getGenres().size() > 0
-            && transition.getTo().getGenres().size() > 0) {
-          out.add(transition);
-        }
-      }
-      return out;
-    }
-
-    /**
-     * Create panel UI.
-     */
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void initUI() {
-      if (ActionSelectionPanel.ACTION_CHANGE.equals(data.get(KEY_ACTION))) {
-        TransitionDigitalDJ dj = (TransitionDigitalDJ) data.get(KEY_CHANGE);
-        alTransitions = (List<Transition>) ((ArrayList<Transition>) dj.getTransitions()).clone();
-        data.put(KEY_TRANSITIONS, getCleanedTransitions());
-        // add a void transition
-        alTransitions.add(new Transition(Const.DEFAULT_TRANSITION_TRACK_NUMBER));
-      } else { // DJ creation
-        alTransitions = new ArrayList<Transition>(10);
-        // add a void transition
-        alTransitions.add(new Transition(Const.DEFAULT_TRANSITION_TRACK_NUMBER));
-        setProblem(Messages.getString("DigitalDJWizard.26"));
-      }
-      setCanFinish(true);
-      // set layout
-      setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
-      add(getTransitionsPanel(), "grow");
-    }
-
-    /**
-     * Gets the transitions panel.
-     * 
-     * @return a panel containing all transitions
-     */
-    private JScrollPane getTransitionsPanel() {
-      widgets = new JComponent[alTransitions.size()][4];
-      JPanel out = new JPanel();
-      // Delete|FROM list| To list|nb tracks
-      // now add all known transitions
-      for (int index = 0; index < alTransitions.size(); index++) {
-        // Delete button
-        JButton jbDelete = new JButton(IconLoader.getIcon(JajukIcons.DELETE));
-        jbDelete.addActionListener(new ActionListener() {
-
-          public void actionPerformed(ActionEvent ae) {
-            alTransitions.remove(getWidgetIndex(widgets, (JComponent) ae.getSource()));
-            refreshScreen();
-            data.put(KEY_TRANSITIONS, getCleanedTransitions());
-          }
-        });
-        // cannot delete if void selection
-        if (alTransitions.size() == 1) {
-          jbDelete.setEnabled(false);
-        }
-        jbDelete.setToolTipText(Messages.getString("DigitalDJWizard.21"));
-        widgets[index][0] = jbDelete;
-        // From genre list
-        JButton jbFrom = new JButton(IconLoader.getIcon(JajukIcons.LIST));
-        Transition transition = alTransitions.get(index);
-        if (transition.getFrom().getGenres().size() > 0) {
-          jbFrom.setText(transition.getFromString());
-          jbFrom.setToolTipText(transition.getFromString());
-        }
-        jbFrom.addActionListener(new ActionListener() {
-          public void actionPerformed(ActionEvent ae) {
-            int row = getWidgetIndex(widgets, (JComponent) ae.getSource());
-            addGenre(row, true);
-          }
-        });
-        jbFrom.setToolTipText(Messages.getString("DigitalDJWizard.22"));
-        widgets[index][1] = jbFrom;
-        // To genre list
-        JButton jbTo = new JButton(IconLoader.getIcon(JajukIcons.LIST));
-        if (transition.getTo().getGenres().size() > 0) {
-          jbTo.setText(transition.getToString());
-          jbTo.setToolTipText(transition.getToString());
-        }
-        jbTo.addActionListener(new ActionListener() {
-          public void actionPerformed(ActionEvent ae) {
-            int row = getWidgetIndex(widgets, (JComponent) ae.getSource());
-            addGenre(row, false);
-          }
-        });
-        jbTo.setToolTipText(Messages.getString("DigitalDJWizard.23"));
-        widgets[index][2] = jbTo;
-        // Nb of tracks
-        JSpinner jsNb = new JSpinner(new SpinnerNumberModel(transition.getNbTracks(), 1, 10, 1));
-        jsNb.addChangeListener(new ChangeListener() {
-          public void stateChanged(ChangeEvent ce) {
-            int row = getWidgetIndex(widgets, (JComponent) ce.getSource());
-            int nb = Integer.parseInt(((JSpinner) ce.getSource()).getValue().toString());
-            Transition transition = alTransitions.get(row);
-            transition.setNb(nb);
-          }
-        });
-        jsNb.setToolTipText(Messages.getString("DigitalDJWizard.24"));
-        widgets[index][3] = jsNb;
-      }
-      // Create layout
-      out.setLayout(new MigLayout("insets 5,gapx 10,gapy 10", "[][270!][270!][]"));
-      // Create header
-      JLabel jlHeader2 = new JLabel(Messages.getString("DigitalDJWizard.22"));
-      jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      JLabel jlHeader3 = new JLabel(Messages.getString("DigitalDJWizard.23"));
-      jlHeader3.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      JLabel jlHeader4 = new JLabel(Messages.getString("DigitalDJWizard.24"));
-      jlHeader4.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      out.add(jlHeader2, "cell 1 0, center");
-      out.add(jlHeader3, "cell 2 0,center");
-      out.add(jlHeader4, "cell 3 0,center,wrap");
-      // Add widgets
-      for (int i = 0; i < widgets.length; i++) {
-        out.add(widgets[i][0]);
-        out.add(widgets[i][1], "grow,width ::270");
-        out.add(widgets[i][2], "grow,width ::270");
-        out.add(widgets[i][3], "grow,center,wrap");
-      }
-      JScrollPane jsp = new JScrollPane(out);
-      jsp.setBorder(null);
-      return jsp;
-    }
-
-    /**
-     * Add a genre to a transition.
-     * 
-     * @param row row
-     * @param bFrom is it a from button ?
-     */
-    private void addGenre(int row, boolean bFrom) {
-      synchronized (GenreManager.getInstance()) {
-        Transition transition = alTransitions.get(row);
-        // create list of genres used in existing transitions
-        Set<Genre> disabledGenres = new HashSet<Genre>();
-        for (int i = 0; i < alTransitions.size(); i++) {
-          Transition t = alTransitions.get(i);
-          // ignore all genres expect those from current button
-          if (bFrom && i != row) {
-            disabledGenres.addAll(t.getFrom().getGenres());
-          }
-        }
-        GenresSelectionDialog dialog = new GenresSelectionDialog(disabledGenres);
-        if (bFrom) {
-          dialog.setSelection(transition.getFrom().getGenres());
-        } else {
-          dialog.setSelection(transition.getTo().getGenres());
-        }
-        dialog.setVisible(true);
-        Set<Genre> genres = dialog.getSelectedGenres();
-        // check if at least one genre has been selected
-        if (genres.size() == 0) {
-          return;
-        }
-        String sText = "";
-        for (Genre genre : genres) {
-          sText += genre.getName2() + ',';
-        }
-        sText = sText.substring(0, sText.length() - 1);
-        int nb = Integer.parseInt(((JSpinner) widgets[row][3]).getValue().toString());
-        // Set button text
-        if (bFrom) {
-          ((JButton) widgets[row][1]).setText(sText);
-        } else {
-          ((JButton) widgets[row][2]).setText(sText);
-        }
-        // set selected genre in transition object
-        if (bFrom) {
-          transition.setFrom(new Ambience(Long.toString(System.currentTimeMillis()), "", genres));
-        } else {
-          transition.setTo(new Ambience(Long.toString(System.currentTimeMillis()), "", genres));
-        }
-        // check if the transaction is fully selected now
-        if (transition.getFrom().getGenres().size() > 0
-            && transition.getTo().getGenres().size() > 0) {
-          // Make sure current delete button is now enabled
-          ((JButton) widgets[row][0]).setEnabled(true);
-
-          // Reset wizard error message
-          setProblem(null);
-
-          // Fill wizard data
-          data.put(KEY_TRANSITIONS, getCleanedTransitions());
-
-          // create a new void proportion if needed
-          if (!containsVoidItem()) {
-            // we duplicate the nb for new row
-            alTransitions.add(new Transition(nb));
-          }
-
-          // Refresh screen to add a new void row
-          refreshScreen();
-        }
-      }
-    }
-
-    /**
-     * Contains void item.
-     * 
-     * @return whether a void item already exist (used to avoid creating several
-     * void items)
-     */
-    private boolean containsVoidItem() {
-      for (JComponent[] element : widgets) {
-        JButton jbFrom = (JButton) element[1];
-        JButton jbTo = (JButton) element[2];
-        if (jbFrom.getText().equals("") || jbTo.getText().equals("")) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    /**
-     * Refresh panel.
-     */
-    private void refreshScreen() {
-      removeAll();
-      // refresh panel
-      add(getTransitionsPanel(), "grow");
-      revalidate();
-      repaint();
-    }
-
-  }
-
-  /**
-   * Proportion panel.
-   */
-  public static class ProportionsPanel extends Screen {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** All dynamic widgets. */
-    JComponent[][] widgets;
-
-    /** Proportions*. */
-    List<Proportion> proportions;
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.50");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.29");
-    }
-
-    /**
-     * Create panel UI.
-     */
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public void initUI() {
-      if (ActionSelectionPanel.ACTION_CHANGE.equals(data.get(KEY_ACTION))) {
-        DigitalDJ dj = (DigitalDJ) data.get(KEY_CHANGE);
-        proportions = (List<Proportion>) ((ArrayList<Proportion>) ((ProportionDigitalDJ) dj)
-            .getProportions()).clone();
-        data.put(KEY_PROPORTIONS, getCleanedProportions());
-        proportions.add(new Proportion()); // add a void item
-      } else {
-        proportions = new ArrayList<Proportion>(10);
-        proportions.add(new Proportion()); // add a void item
-        setProblem(Messages.getString("DigitalDJWizard.30"));
-      }
-      setCanFinish(true);
-
-      // set layout
-      setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
-      add(getProportionsPanel(), "grow");
-    }
-
-    /**
-     * Gets the cleaned proportions.
-     * 
-     * @return Filled proportions only
-     */
-    private List<Proportion> getCleanedProportions() {
-      List<Proportion> out = new ArrayList<Proportion>(proportions.size());
-      for (Proportion proportion : proportions) {
-        if (proportion.getGenres() != null && proportion.getGenres().size() > 0) {
-          out.add(proportion);
-        }
-      }
-      return out;
-    }
-
-    /**
-     * Gets the proportions panel.
-     * 
-     * @return a panel containing all proportions
-     */
-    private JScrollPane getProportionsPanel() {
-      widgets = new JComponent[proportions.size()][3];
-      JPanel out = new JPanel();
-      // Delete|Genre list|proportion in %
-      // now add all known proportions
-      for (int index = 0; index < proportions.size(); index++) {
-        // Delete button
-        JButton jbDelete = new JButton(IconLoader.getIcon(JajukIcons.DELETE));
-        jbDelete.addActionListener(new ActionListener() {
-
-          public void actionPerformed(ActionEvent ae) {
-            proportions.remove(getWidgetIndex(widgets, (JComponent) ae.getSource()));
-            data.put(KEY_PROPORTIONS, getCleanedProportions());
-            refreshScreen();
-          }
-        });
-        // cannot delete if void selection
-        if (proportions.size() == 1) {
-          jbDelete.setEnabled(false);
-        }
-        jbDelete.setToolTipText(Messages.getString("DigitalDJWizard.21"));
-        widgets[index][0] = jbDelete;
-        // genre list
-        JButton jbGenre = new JButton(IconLoader.getIcon(JajukIcons.LIST));
-        Proportion proportion = proportions.get(index);
-        if (proportion.getGenres() != null) {
-          jbGenre.setText(proportion.getGenresDesc());
-          jbGenre.setToolTipText(proportion.getGenresDesc());
-        }
-        jbGenre.addActionListener(new ActionListener() {
-          public void actionPerformed(ActionEvent ae) {
-            int row = getWidgetIndex(widgets, (JComponent) ae.getSource());
-            addGenre(row);
-          }
-        });
-        jbGenre.setToolTipText(Messages.getString("DigitalDJWizard.27"));
-        widgets[index][1] = jbGenre;
-        // Proportion
-        JSpinner jsNb = new JSpinner(new SpinnerNumberModel(
-            (int) (proportion.getProportion() * 100), 1, 100, 1));
-        jsNb.addChangeListener(new ChangeListener() {
-          public void stateChanged(ChangeEvent ce) {
-            if (getTotalValue() > 100) {
-              setProblem(Messages.getString("DigitalDJWizard.59"));
-              return;
-            } else {
-              setProblem(null);
-            }
-            int row = getWidgetIndex(widgets, (JComponent) ce.getSource());
-            int nb = Integer.parseInt(((JSpinner) ce.getSource()).getValue().toString());
-            Proportion proportion = proportions.get(row);
-            proportion.setProportion(((float) nb) / 100);
-          }
-        });
-        jsNb.setToolTipText(Messages.getString("DigitalDJWizard.28"));
-        widgets[index][2] = jsNb;
-      }
-      // Create layout
-      out.setLayout(new MigLayout("insets 5,gapx 10,gapy 10", "[][530!][]"));
-      // Create header
-      JLabel jlHeader1 = new JLabel(Messages.getString("DigitalDJWizard.27"));
-      jlHeader1.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      JLabel jlHeader2 = new JLabel(Messages.getString("DigitalDJWizard.28"));
-      jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      out.add(jlHeader1, "cell 1 0, center");
-      out.add(jlHeader2, "cell 2 0, center,wrap");
-      // Add widgets
-      for (int i = 0; i < widgets.length; i++) {
-        out.add(widgets[i][0], "left");
-        out.add(widgets[i][1], "grow,width ::530");
-        out.add(widgets[i][2], "wrap");
-      }
-      // Display an error message if sum of proportion is > 100%
-      if (getTotalValue() > 100) {
-        setProblem(Messages.getString("DigitalDJWizard.59"));
-      }
-      JScrollPane jsp = new JScrollPane(out);
-      jsp.setBorder(null);
-      return jsp;
-    }
-
-    /**
-     * Gets the total value.
-     * 
-     * @return Sum of all proportions
-     */
-    private int getTotalValue() {
-      int total = 0;
-      for (JComponent[] element : widgets) {
-        JSpinner jsp = (JSpinner) element[2];
-        // Only filled proportions are token into account
-        JButton jb = (JButton) element[1];
-        if (jb.getText() == null || jb.getText().equals("")) {
-          continue;
-        }
-        total += Integer.parseInt(jsp.getValue().toString());
-      }
-      return total;
-    }
-
-    /**
-     * Add a genre to a proportion.
-     * 
-     * @param row row
-     */
-    private void addGenre(int row) {
-      synchronized (GenreManager.getInstance()) {
-        Proportion proportion = proportions.get(row);
-        // create list of genres used in existing transitions
-        Set<Genre> disabledGenres = new HashSet<Genre>();
-        for (int i = 0; i < proportions.size(); i++) {
-          if (i != row) { // do not exclude current proportion that
-            // will be selected
-            disabledGenres.addAll(proportions.get(i).getGenres());
-          }
-        }
-        GenresSelectionDialog dialog = new GenresSelectionDialog(disabledGenres);
-        dialog.setSelection(proportion.getGenres());
-        dialog.setVisible(true);
-        Set<Genre> genres = dialog.getSelectedGenres();
-        // check if at least one genre has been selected
-        if (genres.size() == 0) {
-          return;
-        }
-        // reset genres
-        proportion.setGenre(new Ambience());
-        String sText = "";
-        for (Genre genre : genres) {
-          // handle null
-          if (genre == null) {
-            Log.warn("Could not add genre, got an empty genre from the Wizard Dialog!");
-            continue;
-          }
-
-          proportion.addGenre(genre);
-          sText += genre.getName2() + ',';
-        }
-        sText = sText.substring(0, sText.length() - 1);
-        // Set button text
-        ((JButton) widgets[row][1]).setText(sText);
-        // check if the proportion is fully selected now
-        if (proportion.getGenres().size() > 0) {
-          // Make sure current delete button is now enabled
-          ((JButton) widgets[row][0]).setEnabled(true);
-
-          // Reset wizard error message
-          setProblem(null);
-
-          // Fill wizard data
-          data.put(KEY_PROPORTIONS, getCleanedProportions());
-
-          // create a new void proportion if needed
-          if (!containsVoidItem()) {
-            proportions.add(new Proportion());
-          }
-
-          // Refresh screen to add a new void row
-          refreshScreen();
-        }
-      }
-    }
-
-    /**
-     * Contains void item.
-     * 
-     * @return whether a void item already exist (used to avoid creating several
-     * void items)
-     */
-    private boolean containsVoidItem() {
-      for (JComponent[] element : widgets) {
-        JButton jb = (JButton) element[1];
-        if (jb.getText().equals("")) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    /**
-     * Refresh panel.
-     */
-    private void refreshScreen() {
-      removeAll();
-      // refresh panel
-      add(getProportionsPanel(), "grow");
-      revalidate();
-      repaint();
-    }
-  }
-
-  /**
-   * Ambience based.
-   */
-  public static class AmbiencePanel extends Screen implements ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** All dynamic widgets. */
-    JComponent[][] widgets;
-
-    /** Ambiences*. */
-    List<Ambience> ambiences;
-
-    /** DJ*. */
-    AmbienceDigitalDJ dj = null;
-
-    /** Selected ambience index. */
-    int ambienceIndex = 0;
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("DigitalDJWizard.47");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("DigitalDJWizard.31");
-    }
-
-    /**
-     * Create panel UI.
-     */
-    @Override
-    public void initUI() {
-      // the returned list is sorted by name
-      ambiences = AmbienceManager.getInstance().getAmbiences();
-
-      // We need at least one ambience
-      if (ambiences.size() == 0) {
-        setProblem(Messages.getString("DigitalDJWizard.38"));
-      }
-      setCanFinish(true);
-      // Get DJ
-      dj = (AmbienceDigitalDJ) DigitalDJManager.getInstance().getDJByName(
-          (String) data.get(KEY_DJ_NAME));
-
-      setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
-      add(getAmbiencesPanel(), "grow");
-    }
-
-    /**
-     * Gets the ambiences panel.
-     * 
-     * @return a panel containing all ambiences
-     */
-    private JScrollPane getAmbiencesPanel() {
-      ButtonGroup bg = new ButtonGroup();
-      widgets = new JComponent[ambiences.size()][3];
-      JPanel out = new JPanel();
-      out.setLayout(new MigLayout("insets 0,gapx 10,gapy 10", "[grow]"));
-      int index = 0;
-      for (Ambience ambience : ambiences) {
-        JRadioButton jrb = new JRadioButton(ambience.getName());
-        jrb.addActionListener(this);
-        bg.add(jrb);
-        widgets[index][0] = jrb;
-        out.add(jrb, "left gap 5,wrap");
-        index++;
-      }
-      // DJ change, set right ambience
-      if (ActionSelectionPanel.ACTION_CHANGE.equals(data.get(KEY_ACTION))) {
-        DigitalDJ lDJ = (DigitalDJ) data.get(KEY_CHANGE);
-        Ambience ambience = ((AmbienceDigitalDJ) lDJ).getAmbience();
-        index = 0;
-        for (Ambience a : ambiences) {
-          if (a.equals(ambience)) {
-            JRadioButton jrb = (JRadioButton) widgets[index][0];
-            jrb.doClick();// select right ambience, it will set
-            // right value into data
-            break;
-          }
-          index++;
-        }
-      } else {
-        // select first ambience found
-        JRadioButton jrb = (JRadioButton) widgets[0][0];
-        jrb.doClick();
-      }
-      JScrollPane jsp = new JScrollPane(out);
-      jsp.setBorder(null);
-      return jsp;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-    public void actionPerformed(ActionEvent e) {
-      int row = getWidgetIndex(widgets, (JComponent) e.getSource());
-      data.put(KEY_AMBIENCE, ambiences.get(row));
-      setProblem(null);
-    }
-
-  }
-
-  /**
-   * Gets the widget index.
-   *
-   * @param widgets DOCUMENT_ME
-   * @param widget DOCUMENT_ME
-   * @return index of a given widget row in the widget table
-   */
-  private static int getWidgetIndex(JComponent[][] widgets, JComponent widget) {
-    for (int row = 0; row < widgets.length; row++) {
-      for (int col = 0; col < widgets[0].length; col++) {
-        if (widget.equals(widgets[row][col])) {
-          return row;
-        }
-      }
-    }
-    return -1;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#getPreviousScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends org.qdwizard.Screen> getPreviousScreen(
-      Class<? extends org.qdwizard.Screen> screen) {
-    if (ActionSelectionPanel.class.equals(getCurrentScreen())) {
-      return null;
-    } else if (TypeSelectionPanel.class.equals(getCurrentScreen())) {
-      return ActionSelectionPanel.class;
-    } else if (GeneralOptionsPanel.class.equals(getCurrentScreen())) {
-      if (ActionSelectionPanel.ACTION_CREATION.equals(data.get(KEY_ACTION))) {
-        return TypeSelectionPanel.class;
-      } else {
-        return ChangePanel.class;
-      }
-    } else if (TransitionsPanel.class.equals(getCurrentScreen())
-        || ProportionsPanel.class.equals(getCurrentScreen())
-        || AmbiencePanel.class.equals(getCurrentScreen())) {
-      return GeneralOptionsPanel.class;
-    } else if (RemovePanel.class.equals(getCurrentScreen())) {
-      return ActionSelectionPanel.class;
-    } else if (ChangePanel.class.equals(getCurrentScreen())) {
-      return ActionSelectionPanel.class;
-    }
-    return null;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#getNextScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends org.qdwizard.Screen> getNextScreen(
-      Class<? extends org.qdwizard.Screen> screen) {
-    if (ActionSelectionPanel.class.equals(getCurrentScreen())) {
-      String sAction = (String) data.get(KEY_ACTION);
-      if (ActionSelectionPanel.ACTION_CREATION.equals(sAction)) {
-        return TypeSelectionPanel.class;
-      } else if (ActionSelectionPanel.ACTION_CHANGE.equals(sAction)) {
-        return ChangePanel.class;
-      } else if (ActionSelectionPanel.ACTION_DELETE.equals(sAction)) {
-        return RemovePanel.class;
-      }
-    } else if (TypeSelectionPanel.class.equals(getCurrentScreen())) {
-      return GeneralOptionsPanel.class;
-    } else if (GeneralOptionsPanel.class.equals(getCurrentScreen())) {
-      String sType = (String) data.get(KEY_DJ_TYPE);
-      if (TypeSelectionPanel.DJ_TYPE_AMBIENCE.equals(sType)) {
-        return AmbiencePanel.class;
-      } else if (TypeSelectionPanel.DJ_TYPE_PROPORTION.equals(sType)) {
-        return ProportionsPanel.class;
-      } else if (TypeSelectionPanel.DJ_TYPE_TRANSITION.equals(sType)) {
-        return TransitionsPanel.class;
-      }
-    } else if (RemovePanel.class.equals(getCurrentScreen())) {
-      return null;
-    } else if (ChangePanel.class.equals(getCurrentScreen())) {
-      return GeneralOptionsPanel.class;
-    }
-    return null;
-  }
-
-  /**
-   * Instantiates a new digital dj wizard.
-   */
-  public DigitalDJWizard() {
-    super(Messages.getString("DigitalDJWizard.4"), ActionSelectionPanel.class, null,
-        JajukMainWindow.getInstance(), LocaleManager.getLocale());
-    super.setHeaderIcon(IconLoader.getIcon(JajukIcons.DIGITAL_DJ));
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#finish()
-   */
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public void finish() {
-    DigitalDJ dj = null;
-    String sAction = (String) data.get(KEY_ACTION);
-    if (ActionSelectionPanel.ACTION_DELETE.equals(sAction)) {
-      try {
-        DigitalDJManager.getInstance().remove((DigitalDJ) data.get(KEY_REMOVE));
-      } catch (IOException e) {
-        Log.error(e);
-      }
-    } else if (ActionSelectionPanel.ACTION_CREATION.equals(sAction)) {
-      String sType = (String) data.get(KEY_DJ_TYPE);
-      // create a unique ID for this DJ, simply use current time in ms
-      String sID = Long.toString(System.currentTimeMillis());
-      if (TypeSelectionPanel.DJ_TYPE_AMBIENCE.equals(sType)) {
-        Ambience ambience = (Ambience) data.get(KEY_AMBIENCE);
-        dj = new AmbienceDigitalDJ(sID);
-        ((AmbienceDigitalDJ) dj).setAmbience(ambience);
-      } else if (TypeSelectionPanel.DJ_TYPE_PROPORTION.equals(sType)) {
-        dj = new ProportionDigitalDJ(sID);
-        List<Proportion> proportions = (List<Proportion>) data.get(KEY_PROPORTIONS);
-        ((ProportionDigitalDJ) dj).setProportions(proportions);
-      } else if (TypeSelectionPanel.DJ_TYPE_TRANSITION.equals(sType)) {
-        List<Transition> transitions = (List<Transition>) data.get(KEY_TRANSITIONS);
-        dj = new TransitionDigitalDJ(sID);
-        ((TransitionDigitalDJ) dj).setTransitions(transitions);
-      } else {
-        throw new IllegalArgumentException("Unknown type of DJ: " + sType);
-      }
-      setProperties(dj);
-      DigitalDJManager.getInstance().register(dj);
-      // commit the DJ right now
-      DigitalDJManager.commit(dj);
-      // If first DJ, select it as default
-      if (DigitalDJManager.getInstance().getDJs().size() == 1) {
-        Conf.setProperty(Const.CONF_DEFAULT_DJ, dj.getID());
-      }
-    } else if (ActionSelectionPanel.ACTION_CHANGE.equals(sAction)) {
-      String sType = (String) data.get(KEY_DJ_TYPE);
-      dj = (DigitalDJ) data.get(KEY_CHANGE);
-      if (TypeSelectionPanel.DJ_TYPE_AMBIENCE.equals(sType)) {
-        Ambience ambience = (Ambience) data.get(KEY_AMBIENCE);
-        ((AmbienceDigitalDJ) dj).setAmbience(ambience);
-      } else if (TypeSelectionPanel.DJ_TYPE_PROPORTION.equals(sType)) {
-        List<Proportion> proportions = (List) data.get(KEY_PROPORTIONS);
-        ((ProportionDigitalDJ) dj).setProportions(proportions);
-      } else if (TypeSelectionPanel.DJ_TYPE_TRANSITION.equals(sType)) {
-        List<Transition> transitions = (List) data.get(KEY_TRANSITIONS);
-        ((TransitionDigitalDJ) dj).setTransitions(transitions);
-      }
-      setProperties(dj);
-      // commit the DJ right now
-      DigitalDJManager.commit(dj);
-    }
-    // Refresh command panel (useful for ie if DJ names changed)
-    ObservationManager.notify(new JajukEvent(JajukEvents.DJS_CHANGE));
-  }
-
-  /**
-   * Store the properties from the Wizard to the specified DJ.
-   * 
-   * @param dj The DJ to populate.
-   */
-  private void setProperties(DigitalDJ dj) {
-    String sName = (String) data.get(KEY_DJ_NAME);
-    int iFadeDuration = (Integer) data.get(KEY_FADE_DURATION);
-    int iRateLevel = (Integer) data.get(KEY_RATINGS_LEVEL);
-    boolean bUnicity = (Boolean) data.get(KEY_UNICITY);
-    int iMaxTracks = (Integer) data.get(KEY_MAX_TRACKS);
-    dj.setName(sName);
-    dj.setFadingDuration(iFadeDuration);
-    dj.setRatingLevel(iRateLevel);
-    dj.setTrackUnicity(bUnicity);
-    dj.setMaxTracks(iMaxTracks);
-  }
-}
diff --git a/src/main/java/org/jajuk/ui/wizard/DonateWindow.java b/src/main/java/org/jajuk/ui/wizard/DonateWindow.java
index b9de708..b1346a6 100644
--- a/src/main/java/org/jajuk/ui/wizard/DonateWindow.java
+++ b/src/main/java/org/jajuk/ui/wizard/DonateWindow.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.Container;
@@ -30,7 +29,6 @@ import java.net.URI;
 import java.net.URISyntaxException;
 
 import javax.swing.JButton;
-import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.SwingUtilities;
 import javax.swing.WindowConstants;
@@ -38,6 +36,7 @@ import javax.swing.WindowConstants;
 import net.miginfocom.swing.MigLayout;
 
 import org.jajuk.ui.widgets.JajukJDialog;
+import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
@@ -50,22 +49,16 @@ import org.jajuk.util.log.Log;
  * Help perspective *
  */
 public class DonateWindow extends JajukJDialog {
-  
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant BUDGET_LINK.  DOCUMENT_ME */
-  private static final String BUDGET_LINK = "http://jajuk.info/index.php/Project_budget";
-  
-  /** The Constant DONATE_LINK.  DOCUMENT_ME */
-  private static final String DONATE_LINK = "http://jajuk.info/index.php/Donate";
+  /** The Constant DONATE_LINK.   */
+  private static final String DONATE_LINK = "http://www.jajuk.info/donation.html";
 
   /**
    * Constructor.
    */
   public DonateWindow() {
-    super();
-
+    super(JajukMainWindow.getInstance(), true);
     SwingUtilities.invokeLater(new Runnable() {
       @Override
       public void run() {
@@ -77,7 +70,6 @@ public class DonateWindow extends JajukJDialog {
         setResizable(false);
         setVisible(true);
       }
-
     });
   }
 
@@ -88,34 +80,15 @@ public class DonateWindow extends JajukJDialog {
    */
   /**
    * Inits the ui.
-   * DOCUMENT_ME
+   * 
    */
   public void initUI() {
     Container cp = this.getContentPane();
-    cp.setLayout(new MigLayout("", "center", "center"));
+    cp.setLayout(new MigLayout("", "center"));
     cp.add(new JLabel(IconLoader.getIcon(JajukIcons.LOGO)), "wrap");
-    cp.add(new JLabel(Messages.getString("JajukDonate.2")), "wrap");
-    JButton jbBudget = new JButton(Messages.getString("JajukDonate.3"));
-    jbBudget.addActionListener(new ActionListener() {
-
-      @Override
-      public void actionPerformed(ActionEvent e) {
-        try {
-          Desktop.getDesktop().browse(new URI(BUDGET_LINK));
-          dispose();
-        } catch (IOException e1) {
-          Log.error(e1);
-        } catch (URISyntaxException e1) {
-          Log.error(e1);
-        }
-
-      }
-    });
-    cp.add(jbBudget, "wrap");
     cp.add(new JLabel(Messages.getString("JajukDonate.4")), "wrap");
     JButton jbDonation = new JButton(Messages.getString("JajukDonate.1"));
     jbDonation.addActionListener(new ActionListener() {
-
       @Override
       public void actionPerformed(ActionEvent e) {
         try {
@@ -126,7 +99,6 @@ public class DonateWindow extends JajukJDialog {
         } catch (URISyntaxException e1) {
           Log.error(e1);
         }
-
       }
     });
     cp.add(jbDonation, "wrap");
diff --git a/src/main/java/org/jajuk/ui/wizard/DuplicateTracksDialog.java b/src/main/java/org/jajuk/ui/wizard/DuplicateTracksDialog.java
index f7ba80f..36d8157 100644
--- a/src/main/java/org/jajuk/ui/wizard/DuplicateTracksDialog.java
+++ b/src/main/java/org/jajuk/ui/wizard/DuplicateTracksDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.BorderLayout;
@@ -44,83 +43,60 @@ import org.jajuk.base.FileManager;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
+import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * Tracks Duplicate dialog.
  */
 public class DuplicateTracksDialog extends JPanel implements ListSelectionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private final JList list;
-
-  /** DOCUMENT_ME. */
   private final JScrollPane listScrollPane;
-
-  /** DOCUMENT_ME. */
   private final DefaultListModel listModel = new DefaultListModel();
-
-  /** DOCUMENT_ME. */
   private final List<List<File>> allFiles;
-
-  /** DOCUMENT_ME. */
   private List<File> flatFilesList;
-
-  /** DOCUMENT_ME. */
   private final JButton deleteButton;
-
-  /** DOCUMENT_ME. */
   private final JButton selectAllButton;
-
-  /** DOCUMENT_ME. */
   private final JButton closeButton;
 
   /**
    * Instantiates a new duplicate tracks list.
    * 
-   * @param files DOCUMENT_ME
-   * @param jbClose DOCUMENT_ME
+   * @param files 
+   * @param jbClose 
    */
   public DuplicateTracksDialog(List<List<File>> files, JButton jbClose) {
     super(new BorderLayout());
     allFiles = files;
     closeButton = jbClose;
     populateList(files);
-
     list = new JList(listModel);
     list.setVisibleRowCount(20);
     listScrollPane = new JScrollPane(list);
-
     deleteButton = new JButton(Messages.getString("Delete"));
     deleteButton.setActionCommand(Messages.getString("Delete"));
     deleteButton.addActionListener(new DeleteListener());
-
     selectAllButton = new JButton(Messages.getString("FindDuplicateTracksAction.4"));
     selectAllButton.setActionCommand(Messages.getString("FindDuplicateTracksAction.4"));
     selectAllButton.addActionListener(new SelectAllListener());
-
     JPanel buttonPane = new JPanel(new MigLayout("ins 5,right"));
-
     buttonPane.add(deleteButton, "sg buttons,center");
     buttonPane.add(selectAllButton, "sg buttons,center");
     buttonPane.add(closeButton, "sg buttons,center");
-
     buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
-
     add(listScrollPane, BorderLayout.CENTER);
     add(buttonPane, BorderLayout.PAGE_END);
   }
 
   /**
    * Populate list.
-   * DOCUMENT_ME
    * 
-   * @param allFiles DOCUMENT_ME
+   * 
+   * @param allFiles 
    */
   public final void populateList(List<List<File>> allFiles) {
     flatFilesList = new ArrayList<File>();
@@ -129,24 +105,31 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
         flatFilesList.add(f);
       }
     }
-
     listModel.removeAllElements();
     for (List<File> dups : allFiles) {
       // dups's size can be 0 if dups are found among unmounted devices
-      listModel.addElement(dups.get(0).getName() + " ( "
-          + dups.get(0).getDirectory().getAbsolutePath() + " ) ");
+      File ref = dups.get(0);
+      String label = ref.getName() + getQualityLabel(ref) + "("
+          + ref.getDirectory().getAbsolutePath() + ")";
+      listModel.addElement(label);
       for (int i = 1; i < dups.size(); i++) {
-        listModel.addElement("  + " + dups.get(i).getName() + " ( "
-            + dups.get(i).getDirectory().getAbsolutePath() + " ) ");
+        File dup = dups.get(i);
+        listModel.addElement("  + " + dup.getName() + getQualityLabel(dup) + "( "
+            + dup.getDirectory().getAbsolutePath() + " )");
       }
     }
   }
 
-  /**
-   * DOCUMENT_ME.
-   */
-  class DeleteListener implements ActionListener {
+  private String getQualityLabel(File file) {
+    long quality = file.getLongValue(Const.XML_QUALITY);
+    if (quality != 0) {
+      return " [" + quality + Messages.getString("FIFO.13") + "] ";
+    } else {
+      return " [? " + Messages.getString("FIFO.13") + "] ";
+    }
+  }
 
+  class DeleteListener implements ActionListener {
     /* (non-Javadoc)
      * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
      */
@@ -154,14 +137,12 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
     public void actionPerformed(ActionEvent e) {
       int indices[] = list.getSelectedIndices();
       String sFiles = getSelectedFiles(indices);
-
       int iResu = Messages.getChoice(Messages.getString("Confirmation_delete_files") + " : \n\n"
           + sFiles + "\n" + indices.length + " " + Messages.getString("Confirmation_file_number"),
           JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
       if (iResu != JOptionPane.YES_OPTION) {
         return;
       }
-
       // Delete physically files from disk and from collection
       for (int i : indices) {
         try {
@@ -171,7 +152,6 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
           Log.error(131, ioe);
         }
       }
-
       // Remove table rows
       int deletedRows = 0;
       for (int i : indices) {
@@ -180,17 +160,10 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
         deleteFilefromList(i - deletedRows);
         deletedRows++;
       }
-
       populateList(allFiles);
       ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
     }
 
-    /**
-     * Delete filefrom list.
-     * DOCUMENT_ME
-     * 
-     * @param index DOCUMENT_ME
-     */
     private void deleteFilefromList(int index) {
       // first iterate over all Lists of files, counting the overall index
       int count = 0;
@@ -202,13 +175,11 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
             if (allFiles.get(r).size() <= 2) {
               // if only one file is left now, remove the whole element
               allFiles.remove(r);
-
               // done, the required index was removed 
               return;
             } else {
               // remove the file that is removed
               allFiles.get(r).remove(c);
-
               // done, the required index was removed
               return;
             }
@@ -218,13 +189,6 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
       }
     }
 
-    /**
-     * Gets the selected files.
-     * 
-     * @param indices DOCUMENT_ME
-     * 
-     * @return the selected files
-     */
     private String getSelectedFiles(int indices[]) {
       String sFiles = "";
       for (int k : indices) {
@@ -234,11 +198,7 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
     }
   }
 
-  /**
-   * DOCUMENT_ME.
-   */
   class SelectAllListener implements ActionListener {
-
     /* (non-Javadoc)
      * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
      */
@@ -266,11 +226,9 @@ public class DuplicateTracksDialog extends JPanel implements ListSelectionListen
   @Override
   public void valueChanged(ListSelectionEvent e) {
     if (!e.getValueIsAdjusting()) {
-
       if (list.getSelectedIndex() == -1) {
         // No selection, disable delete button.
         deleteButton.setEnabled(false);
-
       } else {
         // Selection, enable the delete button.
         deleteButton.setEnabled(true);
diff --git a/src/main/java/org/jajuk/ui/wizard/ExtraTagsConfigurationWizard.java b/src/main/java/org/jajuk/ui/wizard/ExtraTagsConfigurationWizard.java
index 8a1b30d..a7c7581 100644
--- a/src/main/java/org/jajuk/ui/wizard/ExtraTagsConfigurationWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/ExtraTagsConfigurationWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.wizard;
 
@@ -32,7 +32,6 @@ import java.util.Properties;
 import javax.swing.BorderFactory;
 import javax.swing.DefaultListModel;
 import javax.swing.JButton;
-import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JPanel;
@@ -63,23 +62,13 @@ import org.jdesktop.swingx.VerticalLayout;
  * Wizard allowing user to select the extra tags to be displayed by jajuk.
  */
 public class ExtraTagsConfigurationWizard extends JajukJDialog {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-  
-  /** DOCUMENT_ME. */
   private JList availableTagsJList;
-  
-  /** DOCUMENT_ME. */
   private JList activatedTagsJList;
-
   /** OK/Cancel buttons. */
   private OKCancelPanel okp;
-
-  /** DOCUMENT_ME. */
   private List<String> availableList = new ArrayList<String>();
-  
-  /** DOCUMENT_ME. */
   private List<String> activatedList = new ArrayList<String>();
 
   /**
@@ -100,7 +89,7 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
 
   /**
    * Refresh list.
-   * DOCUMENT_ME
+   * 
    */
   private void refreshList() {
     availableList.clear();
@@ -109,7 +98,6 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
         availableList.add(s);
       }
     }
-
     activatedList.clear();
     for (String s : Tag.getActivatedExtraTags()) {
       activatedList.add(s);
@@ -118,7 +106,7 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
 
   /**
    * Populate.
-   * DOCUMENT_ME
+   * 
    */
   private void populate() {
     availableTagsJList.clearSelection();
@@ -128,7 +116,6 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
       model.addElement(s);
     }
     availableTagsJList.setModel(model);
-
     activatedTagsJList.clearSelection();
     model = (DefaultListModel) activatedTagsJList.getModel();
     model.clear();
@@ -140,7 +127,7 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
 
   /**
    * Inits the ui.
-   * DOCUMENT_ME
+   * 
    */
   private void initUI() {
     JTextArea jta = new JTextArea() {
@@ -150,7 +137,7 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
        * Display an info label in the text area
        *
        * @param g
-       *          DOCUMENT_ME
+       *          
        */
       @Override
       public void paint(Graphics g) {
@@ -164,10 +151,8 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
     jta.setEditable(false);
     jta.setWrapStyleWord(true);
     jta.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
-
     // available tags
     availableTagsJList = new JList(new DefaultListModel());
-
     // control buttons
     JButton addButton = new JButton(IconLoader.getIcon(JajukIcons.PLAYER_NEXT));
     addButton.addActionListener(new ActionListener() {
@@ -181,7 +166,6 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
     });
     JButton removeButton = new JButton(IconLoader.getIcon(JajukIcons.PLAYER_PREVIOUS));
     removeButton.addActionListener(new ActionListener() {
-
       @Override
       public void actionPerformed(ActionEvent e) {
         for (Object o : activatedTagsJList.getSelectedValues()) {
@@ -190,11 +174,9 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
         populate();
       }
     });
-
     // activated tags
     activatedTagsJList = new JList();
     activatedTagsJList.setModel(new DefaultListModel());
-
     // confirm buttons
     okp = new OKCancelPanel(new ActionListener() {
       @Override
@@ -210,10 +192,8 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
     JPanel jpButtons = new JPanel(new VerticalLayout(5));
     jpButtons.add(addButton);
     jpButtons.add(removeButton);
-
     // Add items
     setLayout(new MigLayout("ins 5,gapx 5,gapy 5", "[grow][20][grow]", "[grow 5][][grow 95][]"));
-
     // Keep the pad : it fixes a known "issue/feature" with some text component. MigLayout manual
     // (see http://migcalendar.com/miglayout/whitepaper.html) says "Note! Padding multi-line
     // components derived from JTextComponent (such as JTextArea) without setting a explicit minimum
@@ -230,7 +210,7 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
 
   /**
    * Ok action.
-   * DOCUMENT_ME
+   * 
    */
   private void okAction() {
     TrackManager tm = TrackManager.getInstance();
@@ -244,7 +224,6 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
         ObservationManager.notify(event);
       }
     }
-
     boolean deepScanNeeded = false;
     for (String s : activatedList) {
       // check if it is already active
@@ -257,7 +236,6 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
       }
       if (skip)
         continue;
-
       deepScanNeeded = true;
       // activate new tag
       tm.registerProperty(new PropertyMetaInformation(s, true, false, true, false, false,
@@ -267,11 +245,9 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
       JajukEvent event = new JajukEvent(JajukEvents.CUSTOM_PROPERTIES_ADD, properties);
       ObservationManager.notify(event);
     }
-
     if (deepScanNeeded) {
       // we are inside the EDT
       new Thread(new Runnable() {
-
         @Override
         public void run() {
           for (Device d : DeviceManager.getInstance().getDevices()) {
@@ -282,7 +258,6 @@ public class ExtraTagsConfigurationWizard extends JajukJDialog {
         }
       }).start();
     }
-
     setVisible(false);
     dispose();
   }
diff --git a/src/main/java/org/jajuk/ui/wizard/FirstTimeWizard.java b/src/main/java/org/jajuk/ui/wizard/FirstTimeWizard.java
index 16acc92..5be90ae 100644
--- a/src/main/java/org/jajuk/ui/wizard/FirstTimeWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/FirstTimeWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.Dimension;
@@ -30,9 +29,8 @@ import java.beans.PropertyChangeListener;
 import java.io.File;
 
 import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JDialog;
 import javax.swing.JFileChooser;
+import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
@@ -45,9 +43,6 @@ import net.miginfocom.swing.MigLayout;
 import org.jajuk.base.Device;
 import org.jajuk.base.DeviceManager;
 import org.jajuk.services.core.SessionService;
-import org.jajuk.services.startup.StartupCollectionService;
-import org.jajuk.ui.actions.ActionManager;
-import org.jajuk.ui.actions.JajukActions;
 import org.jajuk.ui.widgets.JajukFileChooser;
 import org.jajuk.ui.widgets.OKCancelPanel;
 import org.jajuk.ui.widgets.PathSelector;
@@ -59,64 +54,36 @@ import org.jajuk.util.JajukIcons;
 import org.jajuk.util.Messages;
 import org.jajuk.util.UtilGUI;
 import org.jajuk.util.filters.DirectoryFilter;
-import org.jajuk.util.log.Log;
 import org.jdesktop.swingx.JXCollapsiblePane;
 import org.jdesktop.swingx.VerticalLayout;
 
 /**
  * First time Wizard.
  */
-public class FirstTimeWizard extends JDialog implements ActionListener, PropertyChangeListener {
-  // Do not extend JajukJDialog because it requires main window to be instanciated and it comes with
+public class FirstTimeWizard extends JFrame implements ActionListener, PropertyChangeListener {
+  // Do not extend JajukJDialog because it requires main window to be instantiated and it comes with
   // many trouble (like Global keystrokes issues in file path selection) in this low-level dialog
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private JLabel jlLeftIcon;
-
-  /** DOCUMENT_ME. */
   private JPanel jpRightPanel;
-
-  /** DOCUMENT_ME. */
   private JButton jbFileSelection;
-
-  /** DOCUMENT_ME. */
   private JLabel jlSelectedFile;
-
-  /** DOCUMENT_ME. */
   private PathSelector workspacePath;
-
-  /** DOCUMENT_ME. */
   private JLabel jlRefreshTime;
-
-  /** DOCUMENT_ME. */
   private JTextField jtfRefreshTime;
-
-  /** DOCUMENT_ME. */
-  private JCheckBox jcbHelp;
-
-  /** DOCUMENT_ME. */
   private JXCollapsiblePane advanced;
-
-  /** DOCUMENT_ME. */
   private JButton jbOk;
-
-  /** DOCUMENT_ME. */
   private JButton jbCancel;
-
-  /** DOCUMENT_ME. */
   private JPanel jpMain;
-
   /** Selected directory. */
   private File fDir;
-
   /** Default workspace location. */
   private String defaultWorkspacePath;
-
   /** User chosen workspace location. */
   private String userWorkspacePath;
+  /** Any new device we created using this wizard. */
+  private static Device newDevice;
 
   /**
    * Gets the user workspace path.
@@ -128,6 +95,15 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
   }
 
   /**
+   * Gets any new device created through this wizard.
+   *
+   * @return any new device created through this wizard
+   */
+  public static Device getNewDevice() {
+    return newDevice;
+  }
+
+  /**
    * First time wizard.
    * 
    * @param defaultWorkspacePath the default workspace path set in the textfield
@@ -149,8 +125,8 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
       // alert SessionService to continue startup
       SessionService.notifyFirstTimeWizardClosed();
     } else if (e.getSource() == jbFileSelection) {
-      final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(DirectoryFilter
-          .getInstance()));
+      final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(
+          DirectoryFilter.getInstance()));
       jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
       jfc.setDialogTitle(Messages.getString("FirstTimeWizard.5"));
       jfc.setMultiSelectionEnabled(false);
@@ -158,8 +134,8 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
       if (returnVal == JFileChooser.APPROVE_OPTION) {
         fDir = jfc.getSelectedFile();
         // First, check device availability
-        int code = DeviceManager.getInstance().checkDeviceAvailablity(fDir.getName(), 0,
-            fDir.getAbsolutePath(), true);
+        int code = DeviceManager.getInstance().checkDeviceAvailablity(fDir.getName(),
+            Device.Type.DIRECTORY, fDir.getAbsolutePath(), true);
         if (code != 0) {
           Messages.showErrorMessage(code);
           jbOk.setEnabled(false);
@@ -167,12 +143,10 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
         }
         jbOk.setEnabled(true);
         jbOk.grabFocus();
-
         jlSelectedFile.setText(fDir.getAbsolutePath());
         pack(); // repack as size of dialog can be exceeded now
       }
     } else if (e.getSource() == jbOk) {
-      final boolean bShowHelp = jcbHelp.isSelected();
       String sPATH = workspacePath.getUrl().trim();
       // Check workspace directory
       if ((!sPATH.isEmpty()) && (!new File(sPATH).canRead())) {
@@ -181,51 +155,25 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
       }
       // Close window
       dispose();
-
       // update the user chosen workspace path (read afterward by the SessionService)
       userWorkspacePath = workspacePath.getUrl().trim();
-
       // Notify Main to continue startup
       SessionService.notifyFirstTimeWizardClosed();
-      new Thread("First Time Wizard Action Thread") {
-        @Override
-        public void run() {
-          // Wait for context loading (default configuration...)
-          StartupCollectionService.waitForLaunchRefresh();
-
-          // Create a directory device
-          final Device device = DeviceManager.getInstance().registerDevice(fDir.getName(), 0,
-              fDir.getAbsolutePath());
-          device.setProperty(Const.XML_DEVICE_AUTO_MOUNT, true);
-          // Set refresh time
-          double dRefreshTime = 5d;
-          try {
-            dRefreshTime = Double.parseDouble(jtfRefreshTime.getText());
-            if (dRefreshTime < 0) {
-              dRefreshTime = 0;
-            }
-          } catch (final NumberFormatException e1) {
-            dRefreshTime = 0;
-          }
-          device.setProperty(Const.XML_DEVICE_AUTO_REFRESH, dRefreshTime);
-          try {
-            // Refresh device synchronously
-            device.refresh(false, false, false, null);
-          } catch (final Exception e2) {
-            Log.error(112, device.getName(), e2);
-            Messages.showErrorMessage(112, device.getName());
-          }
-          // Show Help window if required
-          if (bShowHelp) {
-            // Display help window
-            try {
-              ActionManager.getAction(JajukActions.HELP_REQUIRED).perform(null);
-            } catch (Exception e1) {
-              Log.error(e1);
-            }
-          }
+      // Create the new device
+      newDevice = DeviceManager.getInstance().registerDevice(fDir.getName(), Device.Type.DIRECTORY,
+          fDir.getAbsolutePath());
+      newDevice.setProperty(Const.XML_DEVICE_AUTO_MOUNT, true);
+      // Set refresh time
+      double dRefreshTime = 5d;
+      try {
+        dRefreshTime = Double.parseDouble(jtfRefreshTime.getText());
+        if (dRefreshTime < 0) {
+          dRefreshTime = 0;
         }
-      }.start();
+      } catch (final NumberFormatException e1) {
+        dRefreshTime = 0;
+      }
+      newDevice.setProperty(Const.XML_DEVICE_AUTO_REFRESH, dRefreshTime);
     }
   }
 
@@ -242,11 +190,9 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
     JLabel jlFileSelection = new JLabel(Messages.getString("FirstTimeWizard.2"));
     jbFileSelection = new JButton(IconLoader.getIcon(JajukIcons.OPEN_DIR));
     jbFileSelection.addActionListener(this);
-
     JLabel jlSelectedFileText = new JLabel(Messages.getString("FirstTimeWizard.8"));
     jlSelectedFile = new JLabel(Messages.getString("FirstTimeWizard.9"));
     jlSelectedFile.setBorder(new BevelBorder(BevelBorder.LOWERED));
-
     final JLabel jlWorkspace = new JLabel(Messages.getString("FirstTimeWizard.7"));
     jlWorkspace.setToolTipText(Messages.getString("FirstTimeWizard.7"));
     workspacePath = new PathSelector(defaultWorkspacePath);
@@ -256,13 +202,10 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
       jlWorkspace.setEnabled(false);
       workspacePath.setEnabled(false);
     }
-
-    jcbHelp = new JCheckBox(Messages.getString("FirstTimeWizard.4"));
     // Refresh time
     jlRefreshTime = new JLabel(Messages.getString("DeviceWizard.53"));
     jtfRefreshTime = new JTextField("5");// 5 mins by default
     JLabel jlMins = new JLabel(Messages.getString("DeviceWizard.54"));
-
     // buttons
     OKCancelPanel okp = new OKCancelPanel(this);
     jbOk = okp.getOKButton();
@@ -270,24 +213,19 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
     jbCancel.setText(Messages.getString("Later"));
     jbOk.setEnabled(false);
     advanced = new JXCollapsiblePane();
-
     // we need to listen for the animation state property in order to allow to
     // resize the dialog after the advanced-panel is expanded/collapsed
     // see http://forums.java.net/jive/thread.jspa?threadID=67800&tstart=0 for some related
     // discussion
     // why we need to listen on "animationState" to know when the expanding/collapsing is finished
     advanced.addPropertyChangeListener("animationState", this);
-
     // Build the toggle link used to expand / collapse the panel
     final ToggleLink toggle = new ToggleLink(Messages.getString("FirstTimeWizard.6"), advanced);
-
     // Advanced collapsible panel
     advanced.setLayout(new VerticalLayout(10));
     advanced.setCollapsed(true);
     advanced.add(jlWorkspace);
     advanced.add(workspacePath);
-    advanced.add(jcbHelp);
-
     // Add items
     setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]", "[][][][][][]"));
     add(jlLeftIcon, "cell 0 0 1 6,top");
@@ -302,9 +240,7 @@ public class FirstTimeWizard extends JDialog implements ActionListener, Property
     add(toggle, "cell 1 4,grow");
     add(advanced, "cell 1 5,grow");
     add(okp, "right,span,cell 1 6");
-
     getRootPane().setDefaultButton(jbOk);
-
     pack();
     final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
     setLocation(((int) dim.getWidth() / 3), ((int) dim.getHeight() / 3));
diff --git a/src/main/java/org/jajuk/ui/wizard/GenresSelectionDialog.java b/src/main/java/org/jajuk/ui/wizard/GenresSelectionDialog.java
index cf82d08..a4611cf 100644
--- a/src/main/java/org/jajuk/ui/wizard/GenresSelectionDialog.java
+++ b/src/main/java/org/jajuk/ui/wizard/GenresSelectionDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.Dimension;
@@ -44,6 +43,7 @@ import org.jajuk.services.dj.Ambience;
 import org.jajuk.services.dj.AmbienceManager;
 import org.jajuk.ui.widgets.JajukJDialog;
 import org.jajuk.ui.widgets.OKCancelPanel;
+import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 import org.jajuk.util.log.Log;
@@ -52,36 +52,24 @@ import org.jajuk.util.log.Log;
  * Allow a user to select a list of genres.
  */
 public class GenresSelectionDialog extends JajukJDialog implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
+  @SuppressWarnings("rawtypes")
   JComboBox jcbAmbiences;
-
-  /** DOCUMENT_ME. */
+  @SuppressWarnings("rawtypes")
   JList jlist;
-
-  /** DOCUMENT_ME. */
   OKCancelPanel okc;
-
-  /** DOCUMENT_ME. */
   Set<Genre> selectedGenres;
-
-  /** DOCUMENT_ME. */
   Set<Genre> disabledGenres;
-
-  /** DOCUMENT_ME. */
   List<String> list;
 
   /**
    * The Constructor.
    * 
-   * @param disabledGenres DOCUMENT_ME
+   * @param disabledGenres 
    */
-  @SuppressWarnings("unchecked")
-  public GenresSelectionDialog(Set disabledGenres) {
-    super();
+  public GenresSelectionDialog(Set<Genre> disabledGenres) {
+    super(JajukMainWindow.getInstance(), true);
     this.selectedGenres = new HashSet<Genre>();
     this.disabledGenres = disabledGenres;
     setLocationByPlatform(true);
@@ -131,16 +119,16 @@ public class GenresSelectionDialog extends JajukJDialog implements ActionListene
 
   /**
    * Inits the ui.
-   * DOCUMENT_ME
+   * 
    */
-  @SuppressWarnings("unchecked")
+  @SuppressWarnings({ "unchecked", "rawtypes" })
   private void initUI() {
-    list = (List) (GenreManager.getInstance().getGenresList()).clone();
+    list = (List<String>) (GenreManager.getInstance().getGenresList()).clone();
     // remove disabled items
     if (disabledGenres != null) {
-      Iterator it = list.iterator();
+      Iterator<String> it = list.iterator();
       while (it.hasNext()) {
-        String testedGenre = (String) it.next();
+        String testedGenre = it.next();
         for (Genre disabledGenre : disabledGenres) {
           if (disabledGenre.getName2().equals(testedGenre)) {
             it.remove();
diff --git a/src/main/java/org/jajuk/ui/wizard/NewPropertyWizard.java b/src/main/java/org/jajuk/ui/wizard/NewPropertyWizard.java
index 105b8a4..fd85929 100644
--- a/src/main/java/org/jajuk/ui/wizard/NewPropertyWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/NewPropertyWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.event.ActionEvent;
@@ -51,39 +50,23 @@ import org.jdesktop.swingx.JXDatePicker;
  * New property wizard.
  */
 public class NewPropertyWizard extends CustomPropertyWizard implements KeyListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   private final JTextField jtfName;
-
-  /** DOCUMENT_ME. */
   private final JComboBox jcbClass;
-
-  /** DOCUMENT_ME. */
   private final JTextField jtfDefault;
-
-  /** DOCUMENT_ME. */
   private final JCheckBox jcbDefault;
-
-  /** DOCUMENT_ME. */
   private final JXDatePicker jdpDefault;
-
   // Types
-  /** The Constant STRING.  DOCUMENT_ME */
+  /** The Constant STRING.   */
   private static final int STRING = 0;
-
-  /** The Constant LONG.  DOCUMENT_ME */
+  /** The Constant LONG.   */
   private static final int LONG = 1;
-
-  /** The Constant DOUBLE.  DOCUMENT_ME */
+  /** The Constant DOUBLE.   */
   private static final int DOUBLE = 2;
-
-  /** The Constant BOOLEAN.  DOCUMENT_ME */
+  /** The Constant BOOLEAN.   */
   private static final int BOOLEAN = 3;
-
-  /** The Constant DATE.  DOCUMENT_ME */
+  /** The Constant DATE.   */
   private static final int DATE = 4;
 
   /**
@@ -111,7 +94,6 @@ public class NewPropertyWizard extends CustomPropertyWizard implements KeyListen
     jcbDefault.setEnabled(false);
     jdpDefault = new JXDatePicker();
     jdpDefault.setEnabled(false);
-
     // Add items
     setLayout(new MigLayout("insets 15,gapx 10,gapy 15", "[][grow]"));
     add(jlItemChoice);
diff --git a/src/main/java/org/jajuk/ui/wizard/PreparePartyWizard.java b/src/main/java/org/jajuk/ui/wizard/PreparePartyWizard.java
deleted file mode 100644
index 96f6730..0000000
--- a/src/main/java/org/jajuk/ui/wizard/PreparePartyWizard.java
+++ /dev/null
@@ -1,1510 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.jajuk.ui.wizard;
-
-import java.awt.Desktop;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JSlider;
-import javax.swing.SwingConstants;
-import javax.swing.border.BevelBorder;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import net.miginfocom.swing.MigLayout;
-
-import org.apache.commons.lang.StringUtils;
-import org.jajuk.base.Playlist;
-import org.jajuk.base.PlaylistManager;
-import org.jajuk.base.Type;
-import org.jajuk.base.TypeManager;
-import org.jajuk.services.bookmark.Bookmarks;
-import org.jajuk.services.dj.Ambience;
-import org.jajuk.services.dj.AmbienceManager;
-import org.jajuk.services.dj.DigitalDJ;
-import org.jajuk.services.dj.DigitalDJManager;
-import org.jajuk.services.players.QueueModel;
-import org.jajuk.ui.helpers.DefaultMouseWheelListener;
-import org.jajuk.ui.widgets.JajukFileChooser;
-import org.jajuk.ui.windows.JajukMainWindow;
-import org.jajuk.util.Conf;
-import org.jajuk.util.Const;
-import org.jajuk.util.IconLoader;
-import org.jajuk.util.JajukFileFilter;
-import org.jajuk.util.JajukIcons;
-import org.jajuk.util.LocaleManager;
-import org.jajuk.util.Messages;
-import org.jajuk.util.UtilPrepareParty;
-import org.jajuk.util.error.JajukException;
-import org.jajuk.util.filters.DirectoryFilter;
-import org.jajuk.util.log.Log;
-import org.qdwizard.ClearPoint;
-import org.qdwizard.Screen;
-import org.qdwizard.Wizard;
-
-/**
- * Wizard to select a set of files and write them to a separate directory
- * outside of the collection in order to use them in a MP3 device or any other
- * media player.
- * 
- * TODO: progress bar is not done yet
- * 
- * TODO: a "cancel" button in the progress bar would be nice to let the user
- * cancel if he finds out that too many were selected
- */
-public class PreparePartyWizard extends Wizard {
-
-  /** For MigLayout. */
-  private static final String GROW_WRAP = "grow,wrap";
-
-  /** For MigLayout. */
-  private static final String LEFT_WRAP = "left,wrap";
-
-  /** For MigLayout. */
-  private static final String LEFT = "left";
-
-  /** Which source to use for the tracks. */
-  private static final String KEY_MODE = "MODE";
-
-  /** Which item was selected in the first page of the wizard. */
-  private static final String KEY_ITEM = "ITEM";
-
-  /** Where to put the files. */
-  private static final String KEY_DEST_PATH = "DEST_PATH";
-
-  /** Max number of tracks to use. */
-  private static final String KEY_MAX_TRACKS_ON = "MAXTRACKS_ENABLED";
-
-  /** Key for max. number of track */
-  private static final String KEY_MAX_TRACKS = "MAXTRACKS";
-
-  /** Max size to use. */
-  private static final String KEY_MAX_SIZE_ON = "MAXSIZE_ENABLED";
-
-  /** Key for max. size of party */
-  private static final String KEY_MAX_SIZE = "MAXSIZE";
-
-  /** Max playing length of tracks to use. */
-  private static final String KEY_MAX_LENGTH_ON = "MAXLENGTH_ENABLED";
-
-  /** Key for max length of party. */
-  private static final String KEY_MAX_LENGTH = "MAXLENGTH";
-
-  /** Max number of tracks to queue. */
-  private static final String KEY_ONE_MEDIA_ON = "ONE_MEDIA_ENABLED";
-
-  /** Key for limit to one audio type. */
-  private static final String KEY_MEDIA = "ONE_MEDIA";
-
-  /** Key for audio type conversion. */
-  private static final String KEY_CONVERT_MEDIA = "CONVERT_MEDIA";
-
-  /** Key for the command to use for audio conversion. */
-  private static final String KEY_CONVERT_COMMAND = "CONVERT_COMMAND";
-
-  /** Used to enable replacing characters outside the normal range. */
-  private static final String KEY_NORMALIZE_FILENAME_ON = "NORMALIZE_FILENAME";
-
-  /** Ratings level. */
-  private static final String KEY_RATINGS_LEVEL = "RATING_LEVEL";
-
-  /** store a temporary playlist that is provided by the PlaylistView without storing it in the PlaylistManager we keep it here to be able to re-display it in the Pages later on  We need to keep it outside the ActionSelectionPanel because the panel is re-created during back-forward operations. */
-  private static Playlist tempPlaylist;
-
-  /** Indicator to only restore properties once and not overwrite them again later. */
-  private static boolean bPropertiesRestored = false;
-
-  /** Indicates if the PACPL tool for audio conversion is available. */
-  private static boolean bPACPLAvailable = false;
-
-  /**
-   * The source of the Party.
-   */
-  private enum Mode {
-
-    /** Use one of the available DJs. */
-    DJ,
-    
-    /** Use one of hte available Ambiences. */
-    Ambience,
-    
-    /** Use random tracks from all available track. */
-    Shuffle,
-    
-    /** Use a playlist. */
-    Playlist,
-    
-    /** Use songs from the BestOf list. */
-    BestOf,
-    
-    /** Use songs from the Novelties list. */
-    Novelties,
-    
-    /** Use songs from the current play queue. */
-    Queue,
-    
-    /** Use the available bookmarks. */
-    Bookmarks,
-    
-    /** Special mode for when the dialog is invoked with a newly created playlist. */
-    ProvidedPlaylist
-  }
-
-  /**
-   * Default constructor that lets the user choose where the tracks are taken
-   * from.
-   * 
-   * @param bProvidedPlaylist Indicates that a playlist was provided to the dialog and thus the
-   * first page is not displayed
-   */
-  public PreparePartyWizard(boolean bProvidedPlaylist) {
-    super(Messages.getString("PreparePartyWizard.1"), bProvidedPlaylist ? GeneralOptionsPanel.class
-        : ActionSelectionPanel.class, null, JajukMainWindow.getInstance(), LocaleManager
-        .getLocale(), 800, 550);
-    super.setHeaderIcon(IconLoader.getIcon(JajukIcons.PREPARE_PARTY_32X32));
-
-    // check if pacpl can be used, do it every time the dialog starts as the
-    // user might have installed it by now
-    bPACPLAvailable = UtilPrepareParty.checkPACPL((String) data.get(KEY_CONVERT_COMMAND));
-  }
-
-  /**
-   * Set the provided playlist so that the first page can be skipped if wanted.
-   * 
-   * This needs to be done as static method as the Wizard-constructor already
-   * needs to have this data available!
-   * 
-   * @param playlist The playlist to use for the party
-   */
-  public static void setPlaylist(Playlist playlist) {
-    // store playlist and the mode that we are now having
-    tempPlaylist = playlist;
-
-    // store the mode and the playlist in the data as well
-    data.put(KEY_MODE, Mode.ProvidedPlaylist);
-    data.put(KEY_ITEM, playlist.getName());
-  }
-
-  /**
-   * Return if the specified element is true in the data-map.
-   * 
-   * @param key The key to look up in the data-object.
-   * 
-   * @return true if the value was stored as boolean true, false otherwise.
-   */
-  private static final boolean isTrue(final String key) {
-    return data.containsKey(key) && Boolean.TRUE.equals(data.get(key));
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.qdwizard.Wizard#finish()
-   */
-  @Override
-  public void finish() {
-
-    // write properties to keep the selected directory
-    try {
-      storeProperties();
-      Conf.commit();
-    } catch (IOException e1) {
-      Log.error(e1);
-    }
-
-    // retrieve the full list of files according to the selected mode
-    List<org.jajuk.base.File> files = getFiles();
-    if (files == null) {
-      return;
-    }
-
-    // define the target directory
-    final Date curDate = new Date();
-    // Do not use ':' character in destination directory, it's
-    // forbidden under Windows
-    final SimpleDateFormat stamp = new SimpleDateFormat("yyyyMMdd-HHmm", Locale.getDefault());
-    final String dirName = "Party-" + stamp.format(curDate);
-    final java.io.File destDir = new java.io.File(((String) data.get(KEY_DEST_PATH)), dirName);
-    if (!destDir.mkdir()) {
-      Log.warn("Could not create destination directory " + destDir);
-    }
-
-    Log.debug("Going to copy " + files.size() + " files to directory {{"
-        + destDir.getAbsolutePath() + "}}");
-
-    // perform the actual copying
-    UtilPrepareParty.copyFiles(files, destDir, isTrue(KEY_NORMALIZE_FILENAME_ON),
-        isTrue(KEY_ONE_MEDIA_ON) && isTrue(KEY_CONVERT_MEDIA), (String) data.get(KEY_MEDIA),
-        (String) data.get(KEY_CONVERT_COMMAND));
-
-  }
-
-  /**
-   * Gets the list of files to copy depending on the current mode.
-   * 
-   * @return the files
-   */
-  private List<org.jajuk.base.File> getFiles() {
-    List<org.jajuk.base.File> files;
-    if (Mode.DJ.equals(data.get(KEY_MODE))) {
-      files = UtilPrepareParty.getDJFiles((String) data.get(KEY_ITEM));
-    } else if (Mode.Ambience.equals(data.get(KEY_MODE))) {
-      files = UtilPrepareParty.getAmbienceFiles((String) data.get(KEY_ITEM));
-    } else if (Mode.Playlist.equals(data.get(KEY_MODE))
-        || Mode.ProvidedPlaylist.equals(data.get(KEY_MODE))) {
-      try {
-        files = UtilPrepareParty.getPlaylistFiles((String) data.get(KEY_ITEM), tempPlaylist);
-      } catch (JajukException e1) {
-        Log.error(e1);
-        return null;
-      }
-    } else if (Mode.Shuffle.equals(data.get(KEY_MODE))) {
-      files = UtilPrepareParty.getShuffleFiles();
-    } else if (Mode.BestOf.equals(data.get(KEY_MODE))) {
-      try {
-        files = UtilPrepareParty.getBestOfFiles();
-      } catch (JajukException e1) {
-        Log.error(e1);
-        return null;
-      }
-    } else if (Mode.Queue.equals(data.get(KEY_MODE))) {
-      try {
-        files = UtilPrepareParty.getQueueFiles();
-      } catch (JajukException e1) {
-        Log.error(e1);
-        return null;
-      }
-    } else if (Mode.Bookmarks.equals(data.get(KEY_MODE))) {
-      try {
-        files = UtilPrepareParty.getBookmarkFiles();
-      } catch (JajukException e1) {
-        Log.error(e1);
-        return null;
-      }
-    } else if (Mode.Novelties.equals(data.get(KEY_MODE))) {
-      try {
-        files = UtilPrepareParty.getNoveltiesFiles();
-      } catch (JajukException e1) {
-        Log.error(e1);
-        return null;
-      }
-    } else {
-      throw new IllegalArgumentException("Unknown mode in PreparePartyWizard: "
-          + data.get(KEY_MODE));
-    }
-
-    // filter by media first
-    if (isTrue(KEY_ONE_MEDIA_ON) && !isTrue(KEY_CONVERT_MEDIA)) {
-      files = UtilPrepareParty.filterMedia(files, (String) data.get(KEY_MEDIA));
-    }
-
-    // then filter out by rating
-    if (data.containsKey(KEY_RATINGS_LEVEL)) {
-      files = UtilPrepareParty.filterRating(files, (Integer) data.get(KEY_RATINGS_LEVEL));
-    }
-
-    // filter max length
-    if (isTrue(KEY_MAX_LENGTH_ON)) {
-      files = UtilPrepareParty.filterMaxLength(files, (Integer) data.get(KEY_MAX_LENGTH));
-    }
-
-    // filter max size
-    if (isTrue(KEY_MAX_SIZE_ON)) {
-      files = UtilPrepareParty.filterMaxSize(files, (Integer) data.get(KEY_MAX_SIZE));
-    }
-
-    // filter max tracks
-    if (isTrue(KEY_MAX_TRACKS_ON)) {
-      files = UtilPrepareParty.filterMaxTracks(files, (Integer) data.get(KEY_MAX_TRACKS));
-    }
-
-    return files;
-  }
-
-  /**
-   * Stores all the values that are stored in the data-map to the Conf-system.
-   */
-  private static void storeProperties() {
-    storeValue(KEY_MODE);
-    storeValue(KEY_ITEM);
-    storeValue(KEY_DEST_PATH);
-    storeValue(KEY_MAX_TRACKS_ON);
-    storeValue(KEY_MAX_TRACKS);
-    storeValue(KEY_MAX_SIZE_ON);
-    storeValue(KEY_MAX_SIZE);
-    storeValue(KEY_MAX_LENGTH_ON);
-    storeValue(KEY_MAX_LENGTH);
-    storeValue(KEY_ONE_MEDIA_ON);
-    storeValue(KEY_MEDIA);
-    storeValue(KEY_CONVERT_MEDIA);
-    storeValue(KEY_CONVERT_COMMAND);
-    storeValue(KEY_NORMALIZE_FILENAME_ON);
-    storeValue(KEY_RATINGS_LEVEL);
-  }
-
-  /**
-   * Store one value as String.
-   * 
-   * @param key The name of the property to store in the overall configuration
-   */
-  private static void storeValue(final String key) {
-    // nothing to do?
-    if (data.get(key) == null) {
-      return;
-    }
-
-    Conf.setProperty(Const.CONF_PREPARE_PARTY + key, data.get(key).toString());
-  }
-
-  /**
-   * Restore all the values that are potentially stored in the configuration
-   * system.
-   */
-  private static void restoreProperties() {
-    // only restore once to not overwrite, due to the Wizard implementation we
-    // don't know for sure when this is called;
-    if (bPropertiesRestored) {
-      return;
-    }
-
-    bPropertiesRestored = true;
-
-    restoreModeAndItemValue();
-    restoreStringValue(KEY_DEST_PATH);
-    restoreBooleanValue(KEY_MAX_TRACKS_ON);
-    restoreIntValue(KEY_MAX_TRACKS);
-    restoreBooleanValue(KEY_MAX_SIZE_ON);
-    restoreIntValue(KEY_MAX_SIZE);
-    restoreBooleanValue(KEY_MAX_LENGTH_ON);
-    restoreIntValue(KEY_MAX_LENGTH);
-    restoreBooleanValue(KEY_ONE_MEDIA_ON);
-    restoreStringValue(KEY_MEDIA);
-    restoreBooleanValue(KEY_CONVERT_MEDIA);
-    restoreStringValue(KEY_CONVERT_COMMAND);
-    if (StringUtils.isBlank((String) data.get(KEY_CONVERT_COMMAND))) {
-      data.put(KEY_CONVERT_COMMAND, "pacpl"); // use default value if none set
-      // yet
-    }
-    restoreBooleanValue(KEY_NORMALIZE_FILENAME_ON);
-    restoreIntValue(KEY_RATINGS_LEVEL);
-  }
-
-  /**
-   * Restore one string value from the configuration.
-   * 
-   * @param key The key to restore.
-   */
-  private static void restoreStringValue(final String key) {
-    String sValue = Conf.getString(Const.CONF_PREPARE_PARTY + key);
-
-    // nothing to do if not set
-    if (sValue == null) {
-      return;
-    }
-
-    data.put(key, sValue);
-  }
-
-  /**
-   * Restore one integer value from the configuration.
-   * 
-   * @param key The key to restore.
-   */
-  private static void restoreIntValue(final String key) {
-    // do nothing if not available yet
-    if (Conf.getString(Const.CONF_PREPARE_PARTY + key) == null) {
-      return;
-    }
-
-    data.put(key, Conf.getInt(Const.CONF_PREPARE_PARTY + key));
-  }
-
-  /**
-   * Restore one boolean value from the configuration.
-   * 
-   * @param key The key to restore.
-   */
-  private static void restoreBooleanValue(final String key) {
-    // do nothing if not available yet
-    if (Conf.getString(Const.CONF_PREPARE_PARTY + key) == null) {
-      return;
-    }
-
-    data.put(key, Conf.getBoolean(Const.CONF_PREPARE_PARTY + key));
-  }
-
-  /**
-   * Restore mode and item values, they may require some special handling.
-   */
-  private static void restoreModeAndItemValue() {
-    String sMode = Conf.getString(Const.CONF_PREPARE_PARTY + KEY_MODE);
-
-    // nothing to do if not set
-    if (sMode == null) {
-      return;
-    }
-
-    data.put(KEY_MODE, Mode.valueOf(sMode));
-    switch ((Mode) data.get(KEY_MODE)) {
-    // restore the value for the ones where we have a selection
-    case Ambience:
-    case DJ:
-    case Playlist:
-      data.put(KEY_ITEM, Conf.getString(Const.CONF_PREPARE_PARTY + KEY_ITEM));
-      break;
-
-    // nothing to do
-    case BestOf:
-    case Bookmarks:
-    case Shuffle:
-    case Novelties:
-    case Queue:
-
-      // we usually are not able to restore this, therefore don't do anything
-    case ProvidedPlaylist:
-
-    default:
-      break;
-    }
-
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.qdwizard.Wizard#getNextScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends Screen> getNextScreen(Class<? extends Screen> screen) {
-    if (ActionSelectionPanel.class.equals(getCurrentScreen())) {
-      return GeneralOptionsPanel.class;
-    } else if (GeneralOptionsPanel.class.equals(getCurrentScreen())) {
-      return PathSelectionPanel.class;
-    }
-
-    return null;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.qdwizard.Wizard#getPreviousScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends Screen> getPreviousScreen(Class<? extends Screen> screen) {
-    // there is no "back" if we got a playlist passed in
-    if (GeneralOptionsPanel.class.equals(getCurrentScreen())
-        && !Mode.ProvidedPlaylist.equals(data.get(KEY_MODE))) {
-      return ActionSelectionPanel.class;
-    } else if (PathSelectionPanel.class.equals(getCurrentScreen())) {
-      return GeneralOptionsPanel.class;
-    }
-
-    return null;
-  }
-
-  /* (non-Javadoc)
-   * @see org.qdwizard.Wizard#onCancel()
-   */
-  @Override
-  public boolean onCancel() {
-    // this also clears "data", so we need to reset the restore-state
-    bPropertiesRestored = false;
-
-    return super.onCancel();
-  }
-
-  /**
-   * First Panel of the Wizard, it shows a selection of sources where the user can choose one, e.g. DJs, Ambiences, ...
-   */
-  public static class ActionSelectionPanel extends Screen implements ActionListener, ClearPoint {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = -6981770030816500259L;
-
-    /** The group for the various sources. */
-    private ButtonGroup bgActions;
-
-    /** DJ. */
-    private JRadioButton jrbDJ;
-
-    /** DJ. */
-    private JComboBox jcbDJ;
-
-    /** Ambience. */
-    private JRadioButton jrbAmbience;
-
-    /** Ambience. */
-    private JComboBox jcbAmbience;
-
-    /** Playlist. */
-    private JRadioButton jrbPlaylist;
-
-    /** Playlist. */
-    private JComboBox jcbPlaylist;
-
-    /** Shuffle. */
-    private JRadioButton jrbShuffle;
-
-    /** Shuffle. */
-    private JRadioButton jrbBestOf;
-
-    /** Novelties. */
-    private JRadioButton jrbNovelties;
-
-    /** Queue. */
-    private JRadioButton jrbQueue;
-
-    /** Bookmarks. */
-    private JRadioButton jrbBookmark;
-
-    /**
-     * Create panel UI.
-     */
-    @Override
-    public void initUI() {
-      // workaround as the dialog is initialized before the constructor of
-      // PreparePartyWizard fully executes
-      restoreProperties();
-
-      bgActions = new ButtonGroup();
-
-      jrbDJ = new JRadioButton(Messages.getString("PreparePartyWizard.6"));
-      jrbDJ.addActionListener(this);
-
-      // populate DJs
-      List<DigitalDJ> djs = DigitalDJManager.getInstance().getDJsSorted();
-      jcbDJ = new JComboBox();
-      for (DigitalDJ dj : djs) {
-        jcbDJ.addItem(dj.getName());
-      }
-      jcbDJ.addActionListener(this);
-
-      jrbAmbience = new JRadioButton(Messages.getString("PreparePartyWizard.7"));
-      jrbAmbience.addActionListener(this);
-
-      List<Ambience> ambiences = AmbienceManager.getInstance().getAmbiences();
-      jcbAmbience = new JComboBox();
-      for (Ambience amb : ambiences) {
-        jcbAmbience.addItem(amb.getName());
-      }
-      jcbAmbience.addActionListener(this);
-
-      jrbPlaylist = new JRadioButton(Messages.getString("PreparePartyWizard.8"));
-      jrbPlaylist.addActionListener(this);
-
-      jcbPlaylist = new JComboBox();
-
-      if (tempPlaylist != null) {
-        // check if this is a "temporary" playlist that is provided by the
-        // PlaylistView (i.e. not yet stored in PlaylistManager)
-        jcbPlaylist.addItem(tempPlaylist.getName());
-      }
-
-      List<Playlist> playlists = PlaylistManager.getInstance().getPlaylists();
-      for (Playlist pl : playlists) {
-        jcbPlaylist.addItem(pl.getName());
-      }
-      jcbPlaylist.addActionListener(this);
-
-      jrbShuffle = new JRadioButton(Messages.getString("PreparePartyWizard.9"));
-      jrbShuffle.addActionListener(this);
-
-      jrbBestOf = new JRadioButton(Messages.getString("PreparePartyWizard.24"));
-      jrbBestOf.addActionListener(this);
-
-      jrbNovelties = new JRadioButton(Messages.getString("PreparePartyWizard.25"));
-      jrbNovelties.addActionListener(this);
-
-      jrbQueue = new JRadioButton(Messages.getString("PreparePartyWizard.32"));
-      jrbQueue.addActionListener(this);
-
-      jrbBookmark = new JRadioButton(Messages.getString("PreparePartyWizard.33"));
-      jrbBookmark.addActionListener(this);
-
-      bgActions.add(jrbDJ);
-      bgActions.add(jrbAmbience);
-      bgActions.add(jrbPlaylist);
-      bgActions.add(jrbBestOf);
-      bgActions.add(jrbNovelties);
-      bgActions.add(jrbQueue);
-      bgActions.add(jrbBookmark);
-      bgActions.add(jrbShuffle);
-
-      // populate items from the stored static data
-      readData();
-
-      // populate the screen
-      setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
-      add(jrbDJ, LEFT);
-      add(jcbDJ, GROW_WRAP);
-      add(jrbAmbience, LEFT);
-      add(jcbAmbience, GROW_WRAP);
-      add(jrbPlaylist, LEFT);
-      add(jcbPlaylist, GROW_WRAP);
-      add(jrbBestOf, LEFT_WRAP);
-      add(jrbNovelties, LEFT_WRAP);
-      add(jrbQueue, LEFT_WRAP);
-      add(jrbBookmark, LEFT_WRAP);
-      add(jrbShuffle, LEFT_WRAP);
-
-      // store initial values, done here as well to have them stored if "next"
-      // is pressed immediately
-      // and there was no data stored before (an hence nothing was read in
-      // readData())
-      updateData();
-    }
-
-    /**
-     * Initialize the UI items of the panel with values from the static data
-     * object.
-     */
-    private void readData() {
-      if (data.containsKey(KEY_MODE)) {
-        // read values set before
-        switch ((Mode) data.get(KEY_MODE)) {
-        case DJ:
-          bgActions.setSelected(jrbDJ.getModel(), true);
-          jcbDJ.setSelectedItem(data.get(KEY_ITEM));
-          break;
-
-        case Ambience:
-          bgActions.setSelected(jrbAmbience.getModel(), true);
-          jcbAmbience.setSelectedItem(data.get(KEY_ITEM));
-          break;
-
-        case Playlist:
-        case ProvidedPlaylist: // we did a "PrepareParty" from a Playlist
-          // before, in this case show the Playlist again
-          // here
-          bgActions.setSelected(jrbPlaylist.getModel(), true);
-          jcbPlaylist.setSelectedItem(data.get(KEY_ITEM));
-          break;
-
-        case Shuffle:
-          bgActions.setSelected(jrbShuffle.getModel(), true);
-          // no combo box for shuffle...
-          break;
-
-        case BestOf:
-          bgActions.setSelected(jrbBestOf.getModel(), true);
-          // no combo box for bestof...
-          break;
-
-        case Novelties:
-          bgActions.setSelected(jrbNovelties.getModel(), true);
-          // no combo box for novelties...
-          break;
-
-        case Queue:
-          bgActions.setSelected(jrbQueue.getModel(), true);
-          // no combo box for queue...
-          break;
-
-        case Bookmarks:
-          bgActions.setSelected(jrbBookmark.getModel(), true);
-          // no combo box for bookmarks...
-          break;
-
-        default:
-          throw new IllegalArgumentException("Unexpected value in switch!");
-        }
-      } else {
-        // no values set yet, select a useful radio button at least
-
-        // select Ambience as default selection if there is no DJ available
-        if (jcbDJ.getItemCount() == 0) {
-          bgActions.setSelected(jrbAmbience.getModel(), true);
-        } else {
-          // otherwise select DJ as default option
-          bgActions.setSelected(jrbDJ.getModel(), true);
-        }
-      }
-
-      // finally disable some items if there is nothing in there
-      if (jcbDJ.getItemCount() == 0) {
-        jrbDJ.setEnabled(false);
-        jcbDJ.setEnabled(false);
-      }
-
-      // disable Playlist UI if there is no Playlist-Mode already selected by
-      // the incoming data...
-      if (jcbPlaylist.getItemCount() == 0
-          && !(Mode.Playlist.equals(data.get(KEY_MODE)) || Mode.ProvidedPlaylist.equals(data
-              .get(KEY_MODE)))) {
-        jrbPlaylist.setEnabled(false);
-        jcbPlaylist.setEnabled(false);
-      }
-
-      // check if we have queue-entries or bookmarks
-      if (QueueModel.getQueue().isEmpty()) {
-        jrbQueue.setEnabled(false);
-      }
-      if (Bookmarks.getInstance().getFiles().isEmpty()) {
-        jrbBookmark.setEnabled(false);
-      }
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-    @Override
-    public void actionPerformed(ActionEvent e) {
-      // Update all the values that are needed later
-      updateData();
-    }
-
-    /**
-     * Store the current values from the UI items into the static data object.
-     */
-    private void updateData() {
-      // depending on the selected radio button read the combo box value and set
-      // the selected MODE
-      if (jrbDJ.isSelected()) {
-        data.put(KEY_MODE, Mode.DJ);
-        data.put(KEY_ITEM, jcbDJ.getSelectedItem());
-      } else if (jrbAmbience.isSelected()) {
-        data.put(KEY_MODE, Mode.Ambience);
-        data.put(KEY_ITEM, jcbAmbience.getSelectedItem());
-      } else if (jrbPlaylist.isSelected()) {
-        data.put(KEY_MODE, Mode.Playlist);
-        data.put(KEY_ITEM, jcbPlaylist.getSelectedItem());
-      } else if (jrbShuffle.isSelected()) {
-        data.put(KEY_MODE, Mode.Shuffle);
-        data.remove(KEY_ITEM);
-      } else if (jrbBestOf.isSelected()) {
-        data.put(KEY_MODE, Mode.BestOf);
-        data.remove(KEY_ITEM);
-      } else if (jrbNovelties.isSelected()) {
-        data.put(KEY_MODE, Mode.Novelties);
-        data.remove(KEY_ITEM);
-      } else if (jrbQueue.isSelected()) {
-        data.put(KEY_MODE, Mode.Queue);
-        data.remove(KEY_ITEM);
-      } else if (jrbBookmark.isSelected()) {
-        data.put(KEY_MODE, Mode.Bookmarks);
-        data.remove(KEY_ITEM);
-      }
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("PreparePartyWizard.3");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("PreparePartyWizard.2");
-    }
-
-  }
-
-  /**
-   * General options panel.
-   */
-  public static class GeneralOptionsPanel extends Screen implements ActionListener, ChangeListener,
-      ClearPoint, MouseListener {
-
-    /** Constant for MigLayout. */
-    private static final String GROW = "grow";
-
-    /** Constant for MigLayout. */
-    private static final String GROW_TWO_COL = "[grow][]";
-
-    /** Constant for MigLayout. */
-    private static final String LABEL_WIDTH = "width 40:40:";
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** Empty value. */
-    private static final String NO_VALUE = " ";
-
-    /** Enable limit on number of tracks. */
-    private JCheckBox jcbMaxTracks;
-
-    /** The max. number of tracks */
-    private JSlider jsMaxTracks;
-
-    /** The max. number of tracks */
-    private JLabel jnMaxTracks;
-
-    /** Enable limit on max size. */
-    private JCheckBox jcbMaxSize;
-
-    /** Max size (in MB) of party. */
-    private JSlider jsMaxSize;
-
-    /** Max size (in MB) of party. */
-    private JLabel jnMaxSize;
-
-    /** Enable limit on max playing length. */
-    private JCheckBox jcbMaxLength;
-
-    /** Max playing length of party (in minutes). */
-    private JSlider jsMaxLength;
-
-    /** Max playing length of party (in minutes). */
-    private JLabel jnMaxLength;
-
-    /** Enable limit on specific audio type. */
-    private JCheckBox jcbOneMedia;
-
-    /** Limit to one type of audo file. */
-    private JComboBox jcbMedia;
-
-    /** Enable conversion to the selected audio type. */
-    private JCheckBox jcbConvertMedia;
-
-    /** Audio conversion. */
-    private JLabel jlConvertMedia;
-
-    /** Button to configure audio conversion. */
-    private JButton jbConvertConfig;
-
-    /** Limit on rate of tracks. */
-    private JLabel jlRatingLevel;
-
-    /** The min. number of stars a track needs to have */
-    private JSlider jsRatingLevel;
-
-    /** Enable normalizing filenames so they can be stored on windows fileshares. */
-    private JCheckBox jcbNormalizeFilename;
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("PreparePartyWizard.5");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("PreparePartyWizard.4");
-    }
-
-    /**
-     * Create panel UI.
-     */
-    @Override
-    public void initUI() {
-      // workaround as the dialog is initialized before the constructor of
-      // PreparePartyWizard fully executes
-      restoreProperties();
-
-      { // Max Tracks
-        jcbMaxTracks = new JCheckBox(Messages.getString("PreparePartyWizard.10"));
-        jcbMaxTracks.setToolTipText(Messages.getString("PreparePartyWizard.11"));
-
-        jsMaxTracks = new JSlider(0, 5000, 100);
-        jnMaxTracks = new JLabel(NO_VALUE);
-        jnMaxTracks.setBorder(new BevelBorder(BevelBorder.LOWERED));
-        jnMaxTracks.setHorizontalAlignment(SwingConstants.RIGHT);
-        jsMaxTracks.setMajorTickSpacing(100);
-        jsMaxTracks.setMinorTickSpacing(10);
-        jsMaxTracks.setPaintTicks(false);
-        jsMaxTracks.setPaintLabels(false);
-        jsMaxTracks.setToolTipText(Messages.getString("PreparePartyWizard.11"));
-      }
-
-      { // Max Size
-        jcbMaxSize = new JCheckBox(Messages.getString("PreparePartyWizard.12"));
-        jcbMaxSize.setToolTipText(Messages.getString("PreparePartyWizard.13"));
-
-        jsMaxSize = new JSlider(0, 5000, 100);
-        jnMaxSize = new JLabel(NO_VALUE);
-        jnMaxSize.setBorder(new BevelBorder(BevelBorder.LOWERED));
-        jnMaxSize.setHorizontalAlignment(SwingConstants.RIGHT);
-        jsMaxSize.setMajorTickSpacing(100);
-        jsMaxSize.setMinorTickSpacing(10);
-        jsMaxSize.setPaintTicks(false);
-        jsMaxSize.setPaintLabels(false);
-        jsMaxSize.setToolTipText(Messages.getString("PreparePartyWizard.13"));
-      }
-
-      { // Max Length
-        jcbMaxLength = new JCheckBox(Messages.getString("PreparePartyWizard.14"));
-        jcbMaxLength.setToolTipText(Messages.getString("PreparePartyWizard.15"));
-
-        jsMaxLength = new JSlider(0, 5000, 100);
-        jnMaxLength = new JLabel(NO_VALUE);
-        jnMaxLength.setBorder(new BevelBorder(BevelBorder.LOWERED));
-        jnMaxLength.setHorizontalAlignment(JLabel.RIGHT);
-        jsMaxLength.setMajorTickSpacing(100);
-        jsMaxLength.setMinorTickSpacing(10);
-        jsMaxLength.setPaintTicks(false);
-        jsMaxLength.setPaintLabels(false);
-        jsMaxLength.setToolTipText(Messages.getString("PreparePartyWizard.15"));
-      }
-
-      { // Choose Media
-        jcbOneMedia = new JCheckBox(Messages.getString("PreparePartyWizard.16"));
-        jcbOneMedia.setToolTipText(Messages.getString("PreparePartyWizard.17"));
-
-        jcbMedia = new JComboBox();
-        List<Type> types = TypeManager.getInstance().getTypes();
-        // sort the list on extension here
-        Collections.sort(types, new TypeComparator());
-        for (Type type : types) {
-          // exclude playlists and web-radios from selection as we cannot copy
-          // those.
-          if (!type.getExtension().equals(Const.EXT_PLAYLIST)
-              && !type.getExtension().equals(Const.EXT_RADIO)) {
-            jcbMedia.addItem(type.getExtension());
-          }
-        }
-        jcbMedia.setToolTipText(Messages.getString("PreparePartyWizard.17"));
-
-        jcbConvertMedia = new JCheckBox(Messages.getString("PreparePartyWizard.34"));
-        jcbConvertMedia.setToolTipText(Messages.getString("PreparePartyWizard.35"));
-
-        // to show help and allow clicking for viewing the related web-page
-        jlConvertMedia = new JLabel(Messages.getString("PreparePartyWizard.37"));
-        jbConvertConfig = new JButton(Messages.getString("PreparePartyWizard.40"));
-      }
-
-      { // Rating Level
-        jlRatingLevel = new JLabel(Messages.getString("DigitalDJWizard.8"));
-        jlRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
-        jsRatingLevel = new JSlider(0, 4, 0);
-        jsRatingLevel.setMajorTickSpacing(1);
-        jsRatingLevel.setMinorTickSpacing(1);
-        jsRatingLevel.setPaintTicks(true);
-        jsRatingLevel.setSnapToTicks(true);
-        jsRatingLevel.setPaintLabels(true);
-        jsRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
-      }
-
-      jcbNormalizeFilename = new JCheckBox(Messages.getString("PreparePartyWizard.26"));
-      jcbNormalizeFilename.setToolTipText(Messages.getString("PreparePartyWizard.27"));
-
-      // populate the UI items with values from the static data object
-      readData();
-
-      // add listeners after reading initial data to not overwrite them with
-      // init-state-change actions
-
-      // enable/disable slider depending on checkbox
-      jcbMaxTracks.addActionListener(this);
-      jsMaxTracks.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxTracks));
-      jsMaxTracks.addChangeListener(this);
-
-      // enable/disable slider depending on checkbox
-      jcbMaxSize.addActionListener(this);
-      jsMaxSize.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxSize));
-      jsMaxSize.addChangeListener(this);
-
-      // enable/disable slider depending on checkbox
-      jcbMaxLength.addActionListener(this);
-      jsMaxLength.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxLength));
-      jsMaxLength.addChangeListener(this);
-
-      // enable/disable combobox depending on checkbox
-      jcbOneMedia.addActionListener(this);
-      jcbMedia.addActionListener(this);
-      jcbConvertMedia.addActionListener(this);
-      jlConvertMedia.addMouseListener(this);
-      jbConvertConfig.addActionListener(this);
-
-      // get informed about rating level slider changes
-      jsRatingLevel.addMouseWheelListener(new DefaultMouseWheelListener(jsRatingLevel));
-      jsRatingLevel.addChangeListener(this);
-
-      jcbNormalizeFilename.addActionListener(this);
-
-      setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
-      add(jcbMaxTracks);
-      {
-        JPanel panel = new JPanel();
-        panel.setLayout(new MigLayout("", GROW_TWO_COL));
-        panel.add(jsMaxTracks, GROW);
-        panel.add(jnMaxTracks, LABEL_WIDTH);
-        add(panel, GROW_WRAP);
-      }
-      add(jcbMaxSize);
-      {
-        JPanel panel = new JPanel();
-        panel.setLayout(new MigLayout("", GROW_TWO_COL));
-        panel.add(jsMaxSize, GROW);
-        panel.add(jnMaxSize, LABEL_WIDTH);
-        add(panel, GROW_WRAP);
-      }
-      add(jcbMaxLength);
-      {
-        JPanel panel = new JPanel();
-        panel.setLayout(new MigLayout("", GROW_TWO_COL));
-        panel.add(jsMaxLength, GROW);
-        panel.add(jnMaxLength, LABEL_WIDTH);
-        add(panel, GROW_WRAP);
-      }
-      add(jcbOneMedia);
-      add(jcbMedia, GROW_WRAP);
-      // dummy-Label to get the CheckBox for "convert" into the second column
-      add(new JLabel());
-      add(jcbConvertMedia, GROW_WRAP);
-      add(new JLabel());
-      {
-        JPanel panel = new JPanel();
-        panel.setLayout(new MigLayout("", GROW_TWO_COL));
-        panel.add(jlConvertMedia, GROW);
-        panel.add(jbConvertConfig);
-        add(panel, GROW_WRAP);
-      }
-
-      add(jcbNormalizeFilename, GROW_WRAP);
-      add(jlRatingLevel);
-      add(jsRatingLevel, GROW_WRAP);
-
-      // store initial values and adjust values
-      updateData();
-    }
-
-    /**
-     * Populate the UI items with values from the static data object.
-     */
-    private void readData() {
-      // set the values from the stored data
-      // initially these are not set, so we need to query for "containsKey"...
-
-      if (isTrue(KEY_MAX_TRACKS_ON)) {
-        jsMaxTracks.setEnabled(true);
-        jcbMaxTracks.setSelected(true);
-      } else {
-        jsMaxTracks.setEnabled(false);
-        jcbMaxTracks.setSelected(false);
-      }
-      if (data.containsKey(KEY_MAX_TRACKS)) {
-        jsMaxTracks.setValue((Integer) data.get(KEY_MAX_TRACKS));
-      }
-
-      if (isTrue(KEY_MAX_SIZE_ON)) {
-        jsMaxSize.setEnabled(true);
-        jcbMaxSize.setSelected(true);
-      } else {
-        jsMaxSize.setEnabled(false);
-        jcbMaxSize.setSelected(false);
-      }
-      if (data.containsKey(KEY_MAX_SIZE)) {
-        jsMaxSize.setValue((Integer) data.get(KEY_MAX_SIZE));
-      }
-
-      if (isTrue(KEY_MAX_LENGTH_ON)) {
-        jsMaxLength.setEnabled(true);
-        jcbMaxLength.setSelected(true);
-      } else {
-        jsMaxLength.setEnabled(false);
-        jcbMaxLength.setSelected(false);
-      }
-      if (data.containsKey(KEY_MAX_LENGTH)) {
-        jsMaxLength.setValue((Integer) data.get(KEY_MAX_LENGTH));
-      }
-
-      if (isTrue(KEY_ONE_MEDIA_ON)) {
-        jcbMedia.setEnabled(true);
-        jcbOneMedia.setSelected(true);
-        jcbConvertMedia.setEnabled(true);
-      } else {
-        jcbMedia.setEnabled(false);
-        jcbOneMedia.setSelected(false);
-        jcbConvertMedia.setEnabled(false);
-      }
-      // disable media conversion if pacpl is not found
-      if (!bPACPLAvailable) {
-        jcbConvertMedia.setEnabled(false);
-      }
-
-      // don't set Convert to on from data if PACPL became unavailable
-      if (isTrue(KEY_CONVERT_MEDIA) && bPACPLAvailable) {
-        jcbConvertMedia.setSelected(true);
-      } else {
-        jcbConvertMedia.setSelected(false);
-      }
-
-      if (data.containsKey(KEY_MEDIA)) {
-        jcbMedia.setSelectedItem(data.get(KEY_MEDIA));
-      } else {
-        // default to MP3 initially
-        jcbMedia.setSelectedItem("mp3");
-      }
-
-      if (data.containsKey(KEY_RATINGS_LEVEL)) {
-        jsRatingLevel.setValue((Integer) data.get(KEY_RATINGS_LEVEL));
-      }
-
-      if (isTrue(KEY_NORMALIZE_FILENAME_ON)) {
-        jcbNormalizeFilename.setSelected(true);
-      } else {
-        jcbNormalizeFilename.setSelected(false);
-      }
-    }
-
-    /**
-     * Write the data from the UI items to the static data object.
-     */
-    private void updateData() {
-      // store if checkbox is enabled and update the label accordingly
-      updateOneItem(jcbMaxTracks, jsMaxTracks, jnMaxTracks, KEY_MAX_TRACKS, KEY_MAX_TRACKS_ON);
-      updateOneItem(jcbMaxSize, jsMaxSize, jnMaxSize, KEY_MAX_SIZE, KEY_MAX_SIZE_ON);
-      updateOneItem(jcbMaxLength, jsMaxLength, jnMaxLength, KEY_MAX_LENGTH, KEY_MAX_LENGTH_ON);
-
-      if (jcbOneMedia.isSelected()) {
-        data.put(KEY_MEDIA, jcbMedia.getSelectedItem());
-        data.put(KEY_ONE_MEDIA_ON, Boolean.TRUE);
-      } else {
-        // keep old value... data.remove(KEY_MEDIA);
-        data.put(KEY_ONE_MEDIA_ON, Boolean.FALSE);
-      }
-      data.put(KEY_CONVERT_MEDIA, jcbConvertMedia.isSelected());
-
-      data.put(KEY_RATINGS_LEVEL, jsRatingLevel.getValue());
-      data.put(KEY_NORMALIZE_FILENAME_ON, jcbNormalizeFilename.isSelected());
-    }
-
-    /**
-     * Helper to handle a checkbox/slider combination. It also updates an
-     * associated Label with the value from the Slider.
-     * 
-     * @param cb The checkbox to check for selected/deselected state
-     * @param slider The slider to get the value from
-     * @param label The Label to populate with the current value from the Slider.
-     * @param key The key in the static data object for the value of the Slider.
-     * @param keyOn The key in the static data object to store the enabled/disabled
-     * state.
-     */
-    private void updateOneItem(JCheckBox cb, JSlider slider, JLabel label, String key, String keyOn) {
-      if (cb.isSelected()) {
-        if (!slider.getValueIsAdjusting()) {
-          data.put(key, slider.getValue());
-          data.put(keyOn, Boolean.TRUE);
-        }
-        label.setText(Integer.toString(slider.getValue()));
-      } else {
-        if (!slider.getValueIsAdjusting()) {
-          // keep value... data.remove(key);
-          data.put(keyOn, Boolean.FALSE);
-        }
-        label.setText(NO_VALUE);
-      }
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-    public void actionPerformed(ActionEvent ae) {
-      // if a checkbox is selected/deselected, enable/disable the
-      // sliders/comboboxes accordingly
-
-      if (ae.getSource() == jcbMaxTracks) {
-        jsMaxTracks.setEnabled(jcbMaxTracks.isSelected());
-      } else if (ae.getSource() == jcbMaxSize) {
-        jsMaxSize.setEnabled(jcbMaxSize.isSelected());
-      } else if (ae.getSource() == jcbMaxLength) {
-        jsMaxLength.setEnabled(jcbMaxLength.isSelected());
-      } else if (ae.getSource() == jcbOneMedia) {
-        jcbMedia.setEnabled(jcbOneMedia.isSelected());
-        jcbConvertMedia.setEnabled(jcbOneMedia.isSelected());
-      } else if (ae.getSource() == jbConvertConfig) {
-        // create the settings dialog, it will display itself and inform us when
-        // the value is changed with "Ok"
-        new PreparePartyConvertSettings(new ChangeListener() {
-
-          @Override
-          public void stateChanged(ChangeEvent e) {
-            // no need for re-checking if the same command is chosen as before
-            if (e.getSource().toString().equals(data.get(KEY_CONVERT_COMMAND))) {
-              Log.debug("Same pacpl-command as before: " + e.getSource().toString());
-              return;
-            }
-
-            Log.debug("New pacpl-command: " + e.getSource().toString());
-            data.put(KEY_CONVERT_COMMAND, e.getSource().toString());
-
-            // re-check if pacpl can be called now
-            bPACPLAvailable = UtilPrepareParty.checkPACPL((String) data.get(KEY_CONVERT_COMMAND));
-
-            // disable media conversion if pacpl is not found
-            if (bPACPLAvailable) {
-              Log.debug("Updated settings for media conversion allow pacpl to be used.");
-              jcbConvertMedia.setEnabled(true);
-            } else {
-              Log.warn("Updated settings for media conversion do not allow pacpl to be used!");
-              jcbConvertMedia.setEnabled(false);
-              jcbConvertMedia.setSelected(false);
-            }
-          }
-        }, (String) data.get(KEY_CONVERT_COMMAND), JajukMainWindow.getInstance());
-      }
-
-      updateData();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent
-     * )
-     */
-    public void stateChanged(ChangeEvent ie) {
-      // just update the stored static data whenever we receive an interesting
-      // event
-      if (ie.getSource() == jsMaxTracks) {
-        updateData();
-      } else if (ie.getSource() == jsMaxSize) {
-        updateData();
-      } else if (ie.getSource() == jsMaxLength) {
-        updateData();
-      } else if (ie.getSource() == jcbMedia) {
-        updateData();
-      } else if (ie.getSource() == jsRatingLevel) {
-        updateData();
-      }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
-     */
-    @Override
-    public void mouseClicked(MouseEvent e) {
-      if (e.getSource() == jlConvertMedia) {
-        try {
-          Desktop.getDesktop().browse(
-              new URI("http://jajuk.info/index.php/Installing_Perl_Audio_Converter"));
-        } catch (IOException ex) {
-          Log.error(ex);
-        } catch (URISyntaxException ex) {
-          Log.error(ex);
-        }
-      }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
-     */
-    @Override
-    public void mouseEntered(MouseEvent e) {
-      // nothing to do here...
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
-     */
-    @Override
-    public void mouseExited(MouseEvent e) {
-      // nothing to do here...
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
-     */
-    @Override
-    public void mousePressed(MouseEvent e) {
-      // nothing to do here...
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
-     */
-    @Override
-    public void mouseReleased(MouseEvent e) {
-      // nothing to do here...
-
-    }
-  }
-
-  /**
-   * Panel for selecting the location in the filesystem.
-   */
-  public static class PathSelectionPanel extends Screen implements ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = -236180699495019177L;
-
-    /** Button for file chooser dialog. */
-    JButton jbFileSelection;
-
-    /** The selected file. */
-    JLabel jlSelectedFile;
-
-    /** Selected directory. */
-    private File fDir;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.qdwizard.Screen#initUI()
-     */
-    @Override
-    public void initUI() {
-      JLabel jlFileSelection = new JLabel(Messages.getString("PreparePartyWizard.20"));
-      jbFileSelection = new JButton(IconLoader.getIcon(JajukIcons.OPEN_DIR));
-      jbFileSelection.addActionListener(this);
-
-      JLabel jlSelectedFileText = new JLabel(Messages.getString("PreparePartyWizard.21"));
-      jlSelectedFile = new JLabel(Messages.getString("FirstTimeWizard.9"));
-      jlSelectedFile.setBorder(new BevelBorder(BevelBorder.LOWERED));
-
-      // previous value if available
-      if (data.containsKey(KEY_DEST_PATH)) {
-        jlSelectedFile.setText((String) data.get(KEY_DEST_PATH));
-
-        // we also can finish the dialog
-        setCanFinish(true);
-      } else {
-        setProblem(Messages.getString("PreparePartyWizard.22"));
-
-        // now we can not finish the dialog
-        setCanFinish(false);
-      }
-
-      // Add items
-      setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
-      add(jlFileSelection);
-      add(jbFileSelection, "wrap,center");
-      add(jlSelectedFileText);
-      add(jlSelectedFile, "grow,wrap");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-    @Override
-    public void actionPerformed(ActionEvent e) {
-      // display a FileChooser
-      if (e.getSource() == jbFileSelection) {
-        // TODO: for some reason the passing of the existing directory does not
-        // work here, seems the implementation in JajukFileChooser does not do
-        // this correctly
-        final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(DirectoryFilter
-            .getInstance()), fDir);
-        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
-        jfc.setDialogTitle(Messages.getString("PreparePartyWizard.22"));
-        jfc.setMultiSelectionEnabled(false);
-        final int returnVal = jfc.showOpenDialog(this);
-
-        if (returnVal == JFileChooser.APPROVE_OPTION) {
-          // retrieve selected directory and update it in all necessary places
-          fDir = jfc.getSelectedFile();
-          jlSelectedFile.setText(fDir.getAbsolutePath());
-          data.put(KEY_DEST_PATH, fDir.getAbsolutePath());
-
-          // we can finish the wizard now
-          setProblem(null);
-
-          // now we can finish the dialog
-          setCanFinish(true);
-        }
-      }
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("PreparePartyWizard.19");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("PreparePartyWizard.18");
-    }
-  }
-
-  /**
-   * Compare two types.
-   */
-  private static final class TypeComparator implements Comparator<Type> {
-
-    /* (non-Javadoc)
-     * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-     */
-    @Override
-    public int compare(Type o1, Type o2) {
-      // handle null, always equal
-      if (o1 == null || o2 == null) {
-        return 0;
-      }
-
-      // otherwise sort on extension here
-      return o1.getExtension().compareTo(o2.getExtension());
-    }
-  }
-}
diff --git a/src/main/java/org/jajuk/ui/wizard/PropertiesDialog.java b/src/main/java/org/jajuk/ui/wizard/PropertiesDialog.java
index a050e10..39cdef7 100644
--- a/src/main/java/org/jajuk/ui/wizard/PropertiesDialog.java
+++ b/src/main/java/org/jajuk/ui/wizard/PropertiesDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,14 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import ext.AutoCompleteDecorator;
 
 import java.awt.Color;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyAdapter;
@@ -48,6 +50,7 @@ import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
 import javax.swing.SwingUtilities;
+import javax.swing.text.JTextComponent;
 
 import net.miginfocom.swing.MigLayout;
 
@@ -68,6 +71,7 @@ import org.jajuk.base.TrackManager;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
+import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.widgets.CopyableLabel;
 import org.jajuk.ui.widgets.InformationJPanel;
 import org.jajuk.ui.widgets.JajukJDialog;
@@ -90,54 +94,39 @@ import org.jdesktop.swingx.VerticalLayout;
  * ItemManager properties dialog for any jajuk item.
  */
 public class PropertiesDialog extends JajukJDialog implements ActionListener {
-
-  /** The Constant PROPERTIES_WIZARD_6. DOCUMENT_ME */
+  /** The Constant PROPERTIES_WIZARD_6.  */
   private static final String PROPERTIES_WIZARD_6 = "PropertiesWizard.6";
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /* Main panel */
-  /** DOCUMENT_ME. */
   private JPanel jpMain;
-
   /** OK/Cancel panel. */
   private OKCancelPanel okc;
-
   /** Items. */
   private List<Item> alItems;
-
-  /** Items2. */
-  private List<Item> alItems2;
-
   /** Files filter. */
   private Set<File> filter = null;
-
   /** number of editable items (all panels). */
   private int iEditable = 0;
-
   /** First property panel. */
   private PropertiesPanel panel1;
-
   /** Second property panel. */
   private PropertiesPanel panel2;
-
-  /** Did user chnaged something ?. */
+  /** Did user changed something ?. */
   private boolean changes = false;
 
   /**
    * Constructor for normal wizard with only one wizard panel and n items to
    * display.
-   * 
+   *
    * @param alItems items to display
    */
   public PropertiesDialog(List<Item> alItems) {
-    super();
-
+    super(JajukMainWindow.getInstance(), false);
     // windows title: name of the element if there is
     // only one item, or "selection" word otherwise
     if (alItems.size() == 1) {
-      setTitle(alItems.get(0).getDesc());
+      setTitle(alItems.get(0).getTitle());
     } else {
       setTitle(Messages.getString(PROPERTIES_WIZARD_6));
     }
@@ -147,11 +136,11 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
       bMerged = true;
     }
     panel1 = new PropertiesPanel(alItems, alItems.size() == 1 ? UtilString.getLimitedString(alItems
-        .get(0).getDesc(), 50) : Messages.getString(PROPERTIES_WIZARD_6) + " [" + alItems.size()
+        .get(0).getTitle(), 50) : Messages.getString(PROPERTIES_WIZARD_6) + " [" + alItems.size()
         + "]", bMerged);
     // OK/Cancel buttons
-    okc = new OKCancelPanel(PropertiesDialog.this, Messages.getString("Apply"), Messages
-        .getString("Close"));
+    okc = new OKCancelPanel(PropertiesDialog.this, Messages.getString("Apply"),
+        Messages.getString("Close"));
     // Add items
     jpMain = new JPanel(new MigLayout("insets 5,gapx 5,gapy 5", "[grow]"));
     jpMain.add(panel1, "grow,wrap");
@@ -162,36 +151,33 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
   /**
    * Constructor for file wizard for ie with 2 wizard panels and n items to
    * display.
-   * 
+   *
    * @param alItems1 items to display in the first wizard panel (file for ie)
    * @param alItems2 items to display in the second panel (associated track for ie )
    */
   public PropertiesDialog(List<Item> alItems1, List<Item> alItems2) {
     super();
-
     // windows title: name of the element of only one item, or "selection"
     // word otherwise
-    setTitle(alItems1.size() == 1 ? alItems1.get(0).getDesc() : Messages
+    setTitle(alItems1.size() == 1 ? alItems1.get(0).getTitle() : Messages
         .getString(PROPERTIES_WIZARD_6));
     this.alItems = alItems1;
-    this.alItems2 = alItems2;
     if (alItems1.size() > 0) {
       // computes filter
       refreshFileFilter();
       if (alItems1.size() == 1) {
         panel1 = new PropertiesPanel(alItems1, UtilString.getLimitedString(alItems1.get(0)
-            .getDesc(), 50), false);
+            .getTitle(), 50), false);
       } else {
         panel1 = new PropertiesPanel(alItems1, UtilString.formatPropertyDesc(Messages
-            .getString(PROPERTIES_WIZARD_6)
-            + " [" + alItems.size() + "]"), true);
+            .getString(PROPERTIES_WIZARD_6) + " [" + alItems.size() + "]"), true);
       }
       panel1.setBorder(BorderFactory.createEtchedBorder());
     }
     if (alItems2.size() > 0) {
       if (alItems2.size() == 1) {
         panel2 = new PropertiesPanel(alItems2, UtilString.getLimitedString(alItems2.get(0)
-            .getDesc(), 50), false);
+            .getTitle(), 50), false);
       } else {
         panel2 = new PropertiesPanel(alItems2, UtilString.formatPropertyDesc(alItems2.size() + " "
             + Messages.getHumanPropertyName(Const.XML_TRACKS)), true);
@@ -200,7 +186,6 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
     }
     // OK/Cancel buttons
     okc = new OKCancelPanel(this, Messages.getString("Apply"), Messages.getString("Close"));
-
     // Add items
     jpMain = new JPanel(new MigLayout("insets 5,gapx 5,gapy 5", "[grow][grow]"));
     jpMain.add(panel1, "grow");
@@ -210,7 +195,6 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
     }
     // Use cell tag because the wrap is not done if panel2 is void
     jpMain.add(okc, "cell 0 1 1 1,span,right");
-
     display();
   }
 
@@ -221,6 +205,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
    * because files may have changed then (if user changed the file name).
    */
   private void refreshFileFilter() {
+    // TODO: alItems can be empty here!
     if (alItems.get(0) instanceof Directory) {
       filter = new HashSet<File>(alItems.size() * 10);
       for (Item item : alItems) {
@@ -238,12 +223,13 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
   }
 
   /**
-   * Display. DOCUMENT_ME
+   * Display. 
    */
   private void display() {
     SwingUtilities.invokeLater(new Runnable() {
       @Override
       public void run() {
+        UtilGUI.setEscapeKeyboardAction(PropertiesDialog.this, jpMain);
         // If none editable item, save button is disabled
         if (iEditable == 0) {
           okc.getOKButton().setEnabled(false);
@@ -251,6 +237,8 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
         getRootPane().setDefaultButton(okc.getOKButton());
         getContentPane().add(new JScrollPane(jpMain));
         pack();
+        // set default focus to make escape work
+        okc.getOKButton().requestFocusInWindow();
         setLocationRelativeTo(JajukMainWindow.getInstance());
         setVisible(true);
       }
@@ -259,7 +247,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
    */
   @Override
@@ -299,12 +287,16 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
 
   /**
    * Tells whether a link button should be shown for a given property.
-   * 
-   * @param meta DOCUMENT_ME
-   * 
+   *
+   * @param meta 
+   *
    * @return true, if checks if is linkable
    */
   public boolean isLinkable(PropertyMetaInformation meta) {
+    // No links for webradios
+    if (alItems.get(0) instanceof WebRadio) {
+      return false;
+    }
     String sKey = meta.getName();
     return sKey.equals(Const.XML_DEVICE) || sKey.equals(Const.XML_TRACK)
         || sKey.equals(Const.XML_DEVICE) || sKey.equals(Const.XML_TRACK)
@@ -321,42 +313,41 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
    * A properties panel.
    */
   class PropertiesPanel extends JPanel implements ActionListener {
-
+    /** The Constant IDX_NAME.   */
+    private static final int IDX_NAME = 0;
+    /** The Constant IDX_VALUE.   */
+    private static final int IDX_VALUE = 1;
+    /** The Constant IDX_COPY.   */
+    private static final int IDX_COPY = 2;
+    /** The Constant IDX_LINK.   */
+    private static final int IDX_LINK = 3;
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = 1L;
-
     /** Properties panel. */
     JPanel jpProperties;
-
     /** ItemManager description. */
     JLabel jlDesc;
-
     /** All dynamic widgets. */
     JComponent[][] widgets;
-
     /** Properties to display. */
     List<PropertyMetaInformation> alToDisplay;
-
     /** Items. */
-    List<Item> alItems;
-
+    List<Item> propItems;
     /** Changed properties. */
     Map<PropertyMetaInformation, Object> hmPropertyToChange = new HashMap<PropertyMetaInformation, Object>();
-
     /** Merge flag. */
     boolean bMerged = false;
 
     /**
      * Property panel for single types elements.
-     * 
+     *
      * @param alItems items to display
      * @param sDesc Description (title)
      * @param bMerged : whether this panel contains merged values
      */
     PropertiesPanel(List<Item> alItems, String sDesc, boolean bMerged) {
       super();
-
-      this.alItems = alItems;
+      this.propItems = alItems;
       this.bMerged = bMerged;
       Item pa = alItems.get(0);
       // first item Process properties to display
@@ -394,7 +385,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
           jlName.setForeground(Color.BLUE);
         }
         // Property value computes editable state
-        widgets[index][0] = jlName;
+        widgets[index][IDX_NAME] = jlName;
         // property editable ?
         boolean bEditable = meta.isEditable();
         // Check meta-data is supported for the file type
@@ -439,7 +430,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
               // to detect a change
               jdp.setDate(new Date(0));
             }
-            widgets[index][1] = jdp;
+            widgets[index][IDX_VALUE] = jdp;
           } else if (meta.getType().equals(Boolean.class)) {
             // for a boolean, value is a checkbox
             final JCheckBox jcb = new JCheckBox();
@@ -458,7 +449,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
             else {
               jcb.setSelected(!pa.getBooleanValue(meta.getName()));
             }
-            widgets[index][1] = jcb;
+            widgets[index][IDX_VALUE] = jcb;
           } else if (meta.getType().equals(Double.class) || meta.getType().equals(Integer.class)
               || meta.getType().equals(Long.class)) {
             // Note : we manage field validation by ourself, and we
@@ -497,7 +488,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
               jtfValue.setText(pa.getHumanValue(meta.getName()));
               // If several items, take first value found
             }
-            widgets[index][1] = jtfValue;
+            widgets[index][IDX_VALUE] = jtfValue;
           } else if (meta.getType().equals(String.class)
           // for genres
               && meta.getName().equals(Const.XML_GENRE)) {
@@ -539,7 +530,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
                 hmPropertyToChange.put(meta, oValue);
               }
             });
-            widgets[index][1] = jcb;
+            widgets[index][IDX_VALUE] = jcb;
           } else if (meta.getType().equals(String.class)
               && (Const.XML_ARTIST.equals(meta.getName()) || Const.XML_ALBUM_ARTIST.equals(meta
                   .getName()))) {
@@ -554,6 +545,9 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
               artists = AlbumArtistManager.getAlbumArtistsList();
               valueToCheck = pa.getHumanValue(Const.XML_ALBUM_ARTIST);
             }
+            if (artists == null) {
+              throw new IllegalStateException("Could not get a list of Artists!");
+            }
             final JComboBox jcb = new JComboBox(artists);
             jcb.setEditable(true);
             AutoCompleteDecorator.decorate(jcb);
@@ -590,7 +584,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
                 hmPropertyToChange.put(meta, oValue);
               }
             });
-            widgets[index][1] = jcb;
+            widgets[index][IDX_VALUE] = jcb;
           } else { // for all others formats (string, class)
             final JTextField jtfValue = new JTextField();
             jtfValue.addKeyListener(new KeyAdapter() {
@@ -608,7 +602,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
               // If several items, take first value found
               jtfValue.setText(pa.getHumanValue(meta.getName()));
             }
-            widgets[index][1] = jtfValue;
+            widgets[index][IDX_VALUE] = jtfValue;
           }
         } else {
           CopyableLabel jl = null;
@@ -635,46 +629,66 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
               jl.setToolTipText(s);
             }
           }
-          widgets[index][1] = jl;
-
+          widgets[index][IDX_VALUE] = jl;
         }
         // Link
         if (isLinkable(meta)) {
           JButton jbLink = new JButton(IconLoader.getIcon(JajukIcons.PROPERTIES));
           jbLink.addActionListener(this);
           jbLink.setActionCommand("link");
+          // Not focusable to avoid tabbing between field focus this button instead next field
+          jbLink.setFocusable(false);
           jbLink.setToolTipText(Messages.getString("PropertiesWizard.12"));
-          widgets[index][2] = jbLink;
+          widgets[index][IDX_LINK] = jbLink;
+        }
+        // Copy
+        if (isCopyable(widgets[index][IDX_VALUE])) {
+          JButton jbCopy = new JButton(IconLoader.getIcon(JajukIcons.COPY_TO_CLIPBOARD));
+          jbCopy.addActionListener(this);
+          jbCopy.setActionCommand("copy");
+          // Not focusable to avoid tabbing between field focus this button instead next field
+          jbCopy.setFocusable(false);
+          jbCopy.setToolTipText(Messages.getString("PropertiesWizard.14"));
+          widgets[index][IDX_COPY] = jbCopy;
         }
         index++;
       }
-
       // Add title
       JLabel jlName = new JLabel("<html><b>" + Messages.getString("PropertiesWizard.1")
           + "</b></html>");
-      jlName.setToolTipText(Messages.getString("PropertiesWizard.1"));
       JLabel jlValue = new JLabel("<html><b>" + Messages.getString("PropertiesWizard.2")
           + "</b></html>");
-      jlValue.setToolTipText(Messages.getString("PropertiesWizard.2"));
       JLabel jlLink = new JLabel("<html><b>" + Messages.getString("PropertiesWizard.4")
           + "</b></html>");
-      jlLink.setToolTipText(Messages.getString("PropertiesWizard.4"));
-
+      JLabel jlCopy = new JLabel("<html><b>" + Messages.getString("PropertiesWizard.13")
+          + "</b></html>");
       jpProperties = new JPanel(new MigLayout("insets 10,gapx 5,gapy 10", "[][grow][]"));
       jpProperties.add(jlName);
       jpProperties.add(jlValue, "grow");
+      jpProperties.add(jlCopy, "");
       jpProperties.add(jlLink, "wrap");
       // Add widgets
       int i = 0;
       int j = 4;
       // for (PropertyMetaInformation meta : alToDisplay) {
       for (int k = 0; k < alToDisplay.size(); k++) {
-        jpProperties.add(widgets[i][0]);
-        if (widgets[i][2] == null) { // link widget can be null
-          jpProperties.add(widgets[i][1], "grow,width 200:200, wrap");
+        jpProperties.add(widgets[i][IDX_NAME]);
+        if (widgets[i][IDX_LINK] == null) { // link widget can be null
+          if (widgets[i][IDX_COPY] == null) {
+            jpProperties.add(widgets[i][IDX_VALUE], "grow,width 200:200, wrap");
+          } else {
+            jpProperties.add(widgets[i][IDX_VALUE], "grow,width 200:200");
+            jpProperties.add(widgets[i][IDX_COPY], "wrap");
+          }
         } else {
-          jpProperties.add(widgets[i][1], "grow,width 200:200");
-          jpProperties.add(widgets[i][2], "wrap");
+          if (widgets[i][IDX_COPY] == null) {
+            jpProperties.add(widgets[i][IDX_VALUE], "grow,width 200:200");
+            jpProperties.add(widgets[i][IDX_LINK], "wrap");
+          } else {
+            jpProperties.add(widgets[i][IDX_VALUE], "grow,width 200:200");
+            jpProperties.add(widgets[i][IDX_COPY], "");
+            jpProperties.add(widgets[i][IDX_LINK], "wrap");
+          }
         }
         i++;
         j += 2;
@@ -686,9 +700,27 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
       add(jpProperties);
     }
 
+    /**
+     * Checks if is copyable.
+     *
+     * @param jComponent 
+     * @return true, if is copyable
+     */
+    private boolean isCopyable(JComponent jComponent) {
+      if (jComponent instanceof JXDatePicker || jComponent instanceof JTextComponent
+          || jComponent instanceof JComboBox || jComponent instanceof JLabel) {
+        // ignore some useless values...
+        if ("0".equals(extractValue(jComponent))) {
+          return false;
+        }
+        return true;
+      }
+      return false;
+    }
+
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
      */
     @Override
@@ -698,14 +730,14 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
         PropertyMetaInformation meta = alToDisplay.get(getWidgetIndex((JComponent) ae.getSource()));
         String sProperty = meta.getName();
         if (Const.XML_FILES.equals(sProperty)) {
-          Track track = (Track) alItems.get(0);
+          Track track = (Track) propItems.get(0);
           List<Item> alFiles = new ArrayList<Item>(1);
           alFiles.addAll(track.getFiles());
           // show properties window for this item
           new PropertiesDialog(alFiles);
         } else if (Const.XML_PLAYLIST_FILES.equals(sProperty)) {
           // can only be a set a files
-          String sValue = alItems.get(0).getStringValue(sProperty);
+          String sValue = propItems.get(0).getStringValue(sProperty);
           StringTokenizer st = new StringTokenizer(sValue, ",");
           List<Item> items = new ArrayList<Item>(3);
           while (st.hasMoreTokens()) {
@@ -718,7 +750,7 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
           new PropertiesDialog(items);
           // show properties window for this item
         } else {
-          String sValue = alItems.get(0).getStringValue(sProperty);
+          String sValue = propItems.get(0).getStringValue(sProperty);
           // can be only an ID
           Item pa = ItemManager.getItemManager(sProperty).getItemByID(sValue);
           if (pa != null) {
@@ -728,10 +760,40 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
             new PropertiesDialog(items);
           }
         }
+      } else if (ae.getActionCommand().equals("copy")) {
+        int i = getWidgetIndex((JComponent) ae.getSource());
+        JComponent jComponent = widgets[i][IDX_VALUE];
+        StringSelection data = new StringSelection(extractValue(jComponent));
+        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+        clipboard.setContents(data, data);
       }
     }
 
     /**
+     * Extract value.
+     * 
+     *
+     * @param jComponent 
+     * @return the string
+     */
+    private String extractValue(JComponent jComponent) {
+      String sValue = null;
+      if (jComponent instanceof JXDatePicker) {
+        sValue = ((JXDatePicker) jComponent).getDate().toString();
+      } else if (jComponent instanceof JTextComponent) {
+        sValue = ((JTextComponent) jComponent).getText();
+      } else if (jComponent instanceof JComboBox) {
+        sValue = ((JComboBox) jComponent).getSelectedItem().toString();
+      } else if (jComponent instanceof JLabel) {
+        sValue = ((JLabel) jComponent).getText();
+      } else {
+        throw new IllegalArgumentException("Unexpected type of component: "
+            + jComponent.getClass().getName());
+      }
+      return sValue;
+    }
+
+    /**
      * Save changes in tags.
      */
     protected void save() {
@@ -748,155 +810,153 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
         if (hmPropertyToChange.size() == 0) {
           return;
         }
-        // Computes all items to change
-        // contains items to be changed
-        List<Item> itemsToChange = new ArrayList<Item>(alItems);
-        // Items in error
-        List<Item> alInError = new ArrayList<Item>(itemsToChange.size());
-        // details for errors
-        String sDetails = "";
-
-        // Check typed value format, display error message only once per
-        // property
-        for (PropertyMetaInformation meta : hmPropertyToChange.keySet()) {
-          // New value
-          oValue = hmPropertyToChange.get(meta);
-          // Check it is not null for non custom properties. Note that
-          // we also allow void values for comments
-          if (oValue == null || (oValue.toString().trim().length() == 0)
-              && !(meta.isCustom() || meta.getName().equals(Const.XML_TRACK_COMMENT))) {
-            Log.error(137, '{' + meta.getName() + '}', null);
-            Messages.showErrorMessage(137, '{' + meta.getName() + '}');
-            return;
-          }
-        }
-
-        // Now we have all items to consider, write tags for each
-        // property to change
-        for (int i = 0; i < itemsToChange.size(); i++) {
-          // Note that item object can be changed during the next for loop, so
-          // do not declare it there
-          Item item = null;
+        try {
+          // Computes all items to change
+          // contains items to be changed
+          List<Item> itemsToChange = new ArrayList<Item>(propItems);
+          // Items in error
+          List<Item> alInError = new ArrayList<Item>(itemsToChange.size());
+          // details for errors
+          String sDetails = "";
+          // Check typed value format, display error message only once per
+          // property
           for (PropertyMetaInformation meta : hmPropertyToChange.keySet()) {
-            item = itemsToChange.get(i);
-
             // New value
             oValue = hmPropertyToChange.get(meta);
-            // Old value
-            String sOldValue = item.getHumanValue(meta.getName());
-            if (!UtilString.format(oValue, meta, true).equals(sOldValue)) {
-              try {
-                newItem = ItemManager.changeItem(item, meta.getName(), oValue, filter);
-                changes = true;
-              }
-              // none accessible file for this track, for this error,
-              // we display an error and leave completely
-              catch (NoneAccessibleFileException none) {
-                Log.error(none);
-                Messages.showErrorMessage(none.getCode(), item.getHumanValue(Const.XML_NAME));
-                // close window to avoid reseting all properties to
-                // old values
-                dispose();
-                return;
-              }
-              // cannot rename file, for this error, we display an
-              // error and leave completely
-              catch (CannotRenameException cre) {
-                Log.error(cre);
-                Messages.showErrorMessage(cre.getCode());
-                dispose();
-                return;
-              }
-              // probably error writing a tag, store track reference
-              // and continue
-              catch (JajukException je) {
-                Log.error(je);
-                if (!alInError.contains(item)) {
-                  alInError.add(item);
-                  // create details label with 3 levels deep
-                  sDetails += buidlDetailsString(je);
+            // Check it is not null for non custom properties. Note that
+            // we also allow void values for comments
+            if (oValue == null || (oValue.toString().trim().length() == 0)
+                && !(meta.isCustom() || meta.getName().equals(Const.XML_TRACK_COMMENT))) {
+              Log.error(137, '{' + meta.getName() + '}', null);
+              Messages.showErrorMessage(137, '{' + meta.getName() + '}');
+              return;
+            }
+          }
+          // Now we have all items to consider, write tags for each
+          // property to change
+          for (int i = 0; i < itemsToChange.size(); i++) {
+            // Note that item object can be changed during the next for loop, so
+            // do not declare it there
+            Item item = null;
+            for (PropertyMetaInformation meta : hmPropertyToChange.keySet()) {
+              item = itemsToChange.get(i);
+              // New value
+              oValue = hmPropertyToChange.get(meta);
+              // Old value
+              String sOldValue = item.getHumanValue(meta.getName());
+              if (!UtilString.format(oValue, meta, true).equals(sOldValue)) {
+                try {
+                  newItem = ItemManager.changeItem(item, meta.getName(), oValue, filter);
+                  changes = true;
+                }
+                // none accessible file for this track, for this error,
+                // we display an error and leave completely
+                catch (NoneAccessibleFileException none) {
+                  Log.error(none);
+                  Messages.showErrorMessage(none.getCode(), item.getHumanValue(Const.XML_NAME));
+                  // close window to avoid reseting all properties to
+                  // old values
+                  dispose();
+                  return;
+                }
+                // cannot rename file, for this error, we display an
+                // error and leave completely
+                catch (CannotRenameException cre) {
+                  Log.error(cre);
+                  Messages.showErrorMessage(cre.getCode());
+                  dispose();
+                  return;
+                }
+                // probably error writing a tag, store track reference
+                // and continue
+                catch (JajukException je) {
+                  Log.error(je);
+                  if (!alInError.contains(item)) {
+                    alInError.add(item);
+                    // create details label with 3 levels deep
+                    sDetails += buidlDetailsString(je);
+                  }
+                  continue;
+                }
+                // if this item was element of property panel elements,
+                // update it
+                if (propItems.contains(item)) {
+                  propItems.remove(item);
+                  propItems.add(newItem);
+                }
+                // Update itemsToChange to replace the item. Indeed, if we change
+                // several properties to the same item, the item itself must
+                // change
+                itemsToChange.set(i, newItem);
+                // if individual item, change title in case of
+                // constructor element change
+                if (!bMerged) {
+                  jlDesc.setText(UtilString.formatPropertyDesc(newItem.getTitle()));
+                }
+                // note this property have been changed
+                if (!alChanged.contains(meta)) {
+                  alChanged.add(meta);
                 }
-                continue;
-              }
-              // if this item was element of property panel elements,
-              // update it
-              if (alItems.contains(item)) {
-                alItems.remove(item);
-                alItems.add(newItem);
-              }
-              // Update itemsToChange to replace the item. Indeed, if we change
-              // several properties to the same item, the item itself must
-              // change
-              itemsToChange.set(i, newItem);
-              // if individual item, change title in case of
-              // constructor element change
-              if (!bMerged) {
-                jlDesc.setText(UtilString.formatPropertyDesc(newItem.getDesc()));
               }
-              // note this property have been changed
-              if (!alChanged.contains(meta)) {
-                alChanged.add(meta);
+            }
+            // Require full commit for all changed tags on the current file
+            try {
+              TrackManager.getInstance().commit();
+            } catch (Exception e) {
+              Log.error(e);
+              if (!alInError.contains(item)) {
+                alInError.add(item);
+                // create details label with 3 levels deep
+                sDetails += buidlDetailsString(e);
               }
             }
           }
-          // Require full commit for all changed tags on the current file
-          try {
-            TrackManager.getInstance().commit();
-          } catch (Exception e) {
-            Log.error(e);
-            if (!alInError.contains(item)) {
-              alInError.add(item);
-              // create details label with 3 levels deep
-              sDetails += buidlDetailsString(e);
+          // display a message for file write issues
+          if (alInError.size() > 0) {
+            String sInfo = "";
+            int index = 0;
+            for (Item item : alInError) {
+              // limit number of errors
+              if (index == 15) {
+                sInfo += "\n...";
+                break;
+              }
+              sInfo += "\n" + item.getHumanValue(Const.XML_NAME);
+              index++;
             }
+            Messages.showDetailedErrorMessage(104, sInfo, sDetails);
           }
-        }
-
-        // display a message for file write issues
-        if (alInError.size() > 0) {
-          String sInfo = "";
-          int index = 0;
-          for (Item item : alInError) {
-            // limit number of errors
-            if (index == 15) {
-              sInfo += "\n...";
-              break;
+          // display a message if user changed at least one property
+          if (alChanged.size() > 0) {
+            StringBuilder sbChanged = new StringBuilder();
+            sbChanged.append("{ ");
+            for (PropertyMetaInformation meta : alChanged) {
+              sbChanged.append(meta.getHumanName()).append(' ');
             }
-            sInfo += "\n" + item.getHumanValue(Const.XML_NAME);
-            index++;
-          }
-          Messages.showDetailedErrorMessage(104, sInfo, sDetails);
-        }
-
-        // display a message if user changed at least one property
-        if (alChanged.size() > 0) {
-          StringBuilder sbChanged = new StringBuilder();
-          sbChanged.append("{ ");
-          for (PropertyMetaInformation meta : alChanged) {
-            sbChanged.append(meta.getHumanName()).append(' ');
+            sbChanged.append('}');
+            InformationJPanel.getInstance().setMessage(
+                alChanged.size() + " " + Messages.getString("PropertiesWizard.10") + ": "
+                    + sbChanged.toString(), InformationJPanel.MessageType.INFORMATIVE);
           }
-          sbChanged.append('}');
-          InformationJPanel.getInstance().setMessage(
-              alChanged.size() + " " + Messages.getString("PropertiesWizard.10") + ": "
-                  + sbChanged.toString(), InformationJPanel.MessageType.INFORMATIVE);
+        } finally {
+          // Force files resorting to ensure the sorting consistency, indeed,
+          // files are sorted by name *and* track order and we need to force a
+          // files resort after an order change (this is already done in case of
+          // file name change)
+          FileManager.getInstance().forceSorting();
         }
       } finally {
         UtilGUI.stopWaiting();
         // Reset auto-commit state
         TrackManager.getInstance().setAutocommit(true);
-        // Force files resorting to ensure the sorting consistency, indeed,
-        // files are sorted by name *and* track order and we need to force a
-        // files resort after an order change (this is already done in case of
-        // file name change)
-        FileManager.getInstance().forceSorting();
       }
     }
 
     /**
      * Build the errors details message.
-     * 
+     *
      * @param e the exception
-     * 
+     *
      * @return the errors details message
      */
     private String buidlDetailsString(Exception e) {
@@ -916,9 +976,9 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
 
     /**
      * Gets the widget index.
-     * 
-     * @param widget DOCUMENT_ME
-     * 
+     *
+     * @param widget 
+     *
      * @return index of a given widget in the widget table
      */
     private int getWidgetIndex(JComponent widget) {
@@ -930,10 +990,8 @@ public class PropertiesDialog extends JajukJDialog implements ActionListener {
             break;
           }
         }
-
       }
       return resu;
     }
   }
-
 }
diff --git a/src/main/java/org/jajuk/ui/wizard/RefreshDialog.java b/src/main/java/org/jajuk/ui/wizard/RefreshDialog.java
index b3d2060..59c42b3 100644
--- a/src/main/java/org/jajuk/ui/wizard/RefreshDialog.java
+++ b/src/main/java/org/jajuk/ui/wizard/RefreshDialog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,18 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.wizard;
 
 import javax.swing.Icon;
-import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JProgressBar;
 import javax.swing.SwingUtilities;
 
 import net.miginfocom.swing.MigLayout;
 
+import org.jajuk.ui.widgets.JajukJDialog;
+import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukIcons;
 import org.jdesktop.swingx.JXBusyLabel;
@@ -35,29 +36,15 @@ import org.jdesktop.swingx.JXBusyLabel;
 /**
  * Refresh dialog.
  */
-public class RefreshDialog extends JFrame {
-
+public class RefreshDialog extends JajukJDialog {
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = -7883506101436294760L;
-
-  /** DOCUMENT_ME. */
   private JXBusyLabel jlAction;
-
-  /** DOCUMENT_ME. */
   private JProgressBar progress;
-
-  /** DOCUMENT_ME. */
   private JLabel jlRefreshing;
-
-  /** DOCUMENT_ME. */
   private boolean indeterminate = false;
-
-  /** DOCUMENT_ME. */
   private long dateLastUpdateRefresh;
-
-  /** DOCUMENT_ME. */
   private long dateLastUpdateProgress;
-
   /** Minimum dialog refresh interval in ms, avoid to saturate the EDT*. */
   private static int MIN_REFRESH_INTERVAL = 100;
 
@@ -65,48 +52,41 @@ public class RefreshDialog extends JFrame {
    * Refresh dialog (labels and a progress bar).
    * 
    * @param indeterminate whether the progress is indeterminate or not
+   * @param frame title
    */
-  public RefreshDialog(final boolean indeterminate) {
+  public RefreshDialog(final boolean indeterminate, String title) {
+    super(JajukMainWindow.getInstance(), false);
+    setTitle(title);
     this.indeterminate = indeterminate;
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        setUndecorated(true);
-        setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
-        jlAction = new JXBusyLabel();
-        progress = new JProgressBar(0, 100);
-        progress.setIndeterminate(indeterminate);
-        jlRefreshing = new JLabel();
-        setLayout(new MigLayout("insets 10,gapx 5, gapy 5", "[500!]"));
-        add(jlAction, "center,wrap");
-        add(progress, "center,grow,wrap");
-        add(jlRefreshing, "center,wrap");
-        pack();
-        setLocationRelativeTo(RefreshDialog.this);
-        setVisible(true);
-      }
-    });
+    setUndecorated(true);
+    setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
+    jlAction = new JXBusyLabel();
+    progress = new JProgressBar(0, 100);
+    progress.setIndeterminate(indeterminate);
+    jlRefreshing = new JLabel();
+    setLayout(new MigLayout("insets 10,gapx 5, gapy 5", "[500!]"));
+    add(jlAction, "center,wrap");
+    add(progress, "center,grow,wrap");
+    add(jlRefreshing, "center,wrap");
+    pack();
+    setLocationRelativeTo(RefreshDialog.this);
+    setVisible(true);
   }
 
   /**
    * Sets the action.
-   * DOCUMENT_ME
    * 
-   * @param action DOCUMENT_ME
-   * @param icon DOCUMENT_ME
+   * 
+   * @param action 
+   * @param icon 
    */
   public void setAction(final String action, final Icon icon) {
-    SwingUtilities.invokeLater(new Runnable() {
-      @Override
-      public void run() {
-        // check if the dialog is still visible, may be closed before this code is executed
-        if (jlAction != null) {
-          jlAction.setText(action);
-          jlAction.setIcon(icon);
-          jlAction.setBusy(true);
-        }
-      }
-    });
+    // check if the dialog is still visible, may be closed before this code is executed
+    if (jlAction != null) {
+      jlAction.setText(action);
+      jlAction.setIcon(icon);
+      jlAction.setBusy(true);
+    }
   }
 
   /**
@@ -161,11 +141,11 @@ public class RefreshDialog extends JFrame {
    */
   @Override
   public void dispose() {
+    // Required to avoid a memory leak
     if (jlAction != null) {
       jlAction.setBusy(false);
       jlAction = null;
     }
-
     super.dispose();
   }
 }
diff --git a/src/main/java/org/jajuk/ui/wizard/RemovePropertyWizard.java b/src/main/java/org/jajuk/ui/wizard/RemovePropertyWizard.java
index 7b348f0..a049ea6 100644
--- a/src/main/java/org/jajuk/ui/wizard/RemovePropertyWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/RemovePropertyWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.event.ActionEvent;
@@ -42,11 +41,8 @@ import org.jajuk.util.Messages;
  * Remove property wizard.
  */
 public class RemovePropertyWizard extends CustomPropertyWizard {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   JComboBox jcbName;
 
   /**
@@ -109,7 +105,7 @@ public class RemovePropertyWizard extends CustomPropertyWizard {
 
   /**
    * Populate properties.
-   * DOCUMENT_ME
+   * 
    */
   public final void populateProperties() {
     // clear combo
@@ -124,5 +120,4 @@ public class RemovePropertyWizard extends CustomPropertyWizard {
       }
     }
   }
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/ui/wizard/SimpleDeviceWizard.java b/src/main/java/org/jajuk/ui/wizard/SimpleDeviceWizard.java
index e8142d8..e2fcd72 100644
--- a/src/main/java/org/jajuk/ui/wizard/SimpleDeviceWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/SimpleDeviceWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.ui.wizard;
 
 import java.awt.event.ActionEvent;
@@ -38,6 +37,7 @@ import org.jajuk.base.DeviceManager;
 import org.jajuk.ui.widgets.JajukFileChooser;
 import org.jajuk.ui.widgets.JajukJDialog;
 import org.jajuk.ui.widgets.OKCancelPanel;
+import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.Const;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.JajukFileFilter;
@@ -52,25 +52,13 @@ import org.jajuk.util.log.Log;
  * directory.
  */
 public class SimpleDeviceWizard extends JajukJDialog implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
   JButton jbFileSelection;
-
-  /** DOCUMENT_ME. */
   JLabel jlSelectedFile;
-
-  /** DOCUMENT_ME. */
   JTextField jtfRefreshTime;
-
-  /** DOCUMENT_ME. */
   OKCancelPanel okp;
-
-  /** DOCUMENT_ME. */
   String deviceName;
-
   /** Selected directory. */
   private File fDir;
 
@@ -78,18 +66,15 @@ public class SimpleDeviceWizard extends JajukJDialog implements ActionListener {
    * Instantiates a new simple device wizard.
    */
   public SimpleDeviceWizard() {
+    super(JajukMainWindow.getInstance(), true);
     setTitle(Messages.getString("SimpleDeviceWizard.0"));
     setAlwaysOnTop(true);
-
     okp = new OKCancelPanel(this);
     jbFileSelection = new JButton(IconLoader.getIcon(JajukIcons.OPEN_DIR));
     jbFileSelection.addActionListener(this);
-
     jlSelectedFile = new JLabel(Messages.getString("FirstTimeWizard.9"));
     jlSelectedFile.setBorder(new BevelBorder(BevelBorder.LOWERED));
-
     jtfRefreshTime = new JTextField(Const.DEFAULT_REFRESH_INTERVAL);
-
     // Add items
     setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
     add(new JLabel(UtilGUI.getImage(Const.IMAGE_SEARCH)), "cell 0 0 0 3");
@@ -97,16 +82,11 @@ public class SimpleDeviceWizard extends JajukJDialog implements ActionListener {
     add(jbFileSelection, ""); // please
     add(new JLabel(Messages.getString("FirstTimeWizard.8")), "split 2,cell 1 1");
     add(jlSelectedFile, "cell 1 1, grow");
-    // select
-    // music
-    // location
-    add(new JLabel(Messages.getString("DeviceWizard.53")), "cell 1 2,split 3"); // Refresh
-    // device
-    // every
+    // select music location
+    add(new JLabel(Messages.getString("DeviceWizard.53")), "cell 1 2,split 3");
     add(jtfRefreshTime, "grow");
     add(new JLabel(Messages.getString("DeviceWizard.54")), "wrap"); // mins
     add(okp, "right,cell 1 3");
-
     getRootPane().setDefaultButton(okp.getOKButton());
   }
 
@@ -118,54 +98,49 @@ public class SimpleDeviceWizard extends JajukJDialog implements ActionListener {
     if (e.getSource() == okp.getCancelButton()) {
       dispose(); // close window
     } else if (e.getSource() == jbFileSelection) {
-      final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(DirectoryFilter
-          .getInstance()));
+      final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(
+          DirectoryFilter.getInstance()));
       jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
       jfc.setDialogTitle(Messages.getString("FirstTimeWizard.5"));
       jfc.setMultiSelectionEnabled(false);
       final int returnVal = jfc.showOpenDialog(this);
       if (returnVal == JFileChooser.APPROVE_OPTION) {
         fDir = jfc.getSelectedFile();
-
         deviceName = fDir.getName();
-
         // First, check device *name* availability, otherwise, use a <name>~<nb>
         // name
-        int code = DeviceManager.getInstance().checkDeviceAvailablity(deviceName, 0,
-            fDir.getAbsolutePath(), true);
+        int code = DeviceManager.getInstance().checkDeviceAvailablity(deviceName,
+            Device.Type.DIRECTORY, fDir.getAbsolutePath(), true);
         int prefix = 1;
         while (code == 19) { // code 19 means a device already exists with this
           // name
           deviceName = fDir.getName() + '~' + prefix;
-          code = DeviceManager.getInstance().checkDeviceAvailablity(deviceName, 0,
-              fDir.getAbsolutePath(), true);
+          code = DeviceManager.getInstance().checkDeviceAvailablity(deviceName,
+              Device.Type.DIRECTORY, fDir.getAbsolutePath(), true);
           prefix++;
         }
         // Now, test again to detected others availability issues like wrong URL
-        code = DeviceManager.getInstance().checkDeviceAvailablity(deviceName, 0,
-            fDir.getAbsolutePath(), true);
+        code = DeviceManager.getInstance().checkDeviceAvailablity(deviceName,
+            Device.Type.DIRECTORY, fDir.getAbsolutePath(), true);
         if (code != 0 && code != 19) {
           Messages.showErrorMessage(code);
           okp.getOKButton().setEnabled(false);
           return;
         }
-
         okp.getOKButton().setEnabled(true);
         okp.getOKButton().grabFocus();
-
         jlSelectedFile.setText(fDir.getAbsolutePath());
         pack(); // repack as size of dialog can be exceeded now
       }
     } else if (e.getSource() == okp.getOKButton()) {
       try {
-        if(fDir == null) {
+        if (fDir == null) {
           Messages.showErrorMessage(143);
           return;
         }
-
         // Create a directory device
-        final Device device = DeviceManager.getInstance().registerDevice(deviceName, 0,
-            fDir.getAbsolutePath());
+        final Device device = DeviceManager.getInstance().registerDevice(deviceName,
+            Device.Type.DIRECTORY, fDir.getAbsolutePath());
         device.setProperty(Const.XML_DEVICE_AUTO_MOUNT, true);
         // Set refresh time
         double dRefreshTime;
diff --git a/src/main/java/org/jajuk/ui/wizard/TipOfTheDayWizard.java b/src/main/java/org/jajuk/ui/wizard/TipOfTheDayWizard.java
index f38fc8c..30aa5b7 100644
--- a/src/main/java/org/jajuk/ui/wizard/TipOfTheDayWizard.java
+++ b/src/main/java/org/jajuk/ui/wizard/TipOfTheDayWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.wizard;
 
@@ -50,23 +50,13 @@ import org.jajuk.util.UtilSystem;
  * Small dialog which displays the "Tip of the Day" from a list of useful hints.
  */
 public class TipOfTheDayWizard extends JFrame {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
-  /** The Constant TIPS. DOCUMENT_ME */
+  /** The Constant TIPS.  */
   private static final String[] TIPS = Messages.getAll("TipOfTheDay");
-
-  /** DOCUMENT_ME. */
   private final JCheckBox cbShow;
-
-  /** DOCUMENT_ME. */
   private final JTextArea tipArea;
-
-  /** DOCUMENT_ME. */
   private final JLabel lCounter;
-
-  /** DOCUMENT_ME. */
   private int currentIndex = 0;
 
   /**
@@ -76,15 +66,12 @@ public class TipOfTheDayWizard extends JFrame {
     super(Messages.getString("TipOfTheDayView.0"));
     setAlwaysOnTop(true);
     setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
-
     cbShow = new JCheckBox(Messages.getString("TipOfTheDayView.2"));
     cbShow.setSelected(Conf.getBoolean(Const.CONF_SHOW_TIP_ON_STARTUP));
-
     tipArea = new JTextArea();
     tipArea.setWrapStyleWord(true);
     tipArea.setLineWrap(true);
     tipArea.setEditable(false);
-
     lCounter = new JLabel("999/999");
     JButton bNext = new JButton(IconLoader.getIcon(JajukIcons.PLAYER_NEXT_SMALL));
     bNext.setMargin(new Insets(1, 1, 1, 1));
@@ -95,7 +82,6 @@ public class TipOfTheDayWizard extends JFrame {
         updateTip();
       }
     });
-
     JButton bPrevious = new JButton(IconLoader.getIcon(JajukIcons.PLAYER_PREVIOUS_SMALL));
     bPrevious.setMargin(new Insets(1, 1, 1, 1));
     bPrevious.addActionListener(new ActionListener() {
@@ -105,7 +91,6 @@ public class TipOfTheDayWizard extends JFrame {
         updateTip();
       }
     });
-
     JButton bClose = new JButton(IconLoader.getIcon(JajukIcons.OK));
     bClose.setMaximumSize(bClose.getPreferredSize());
     bClose.addActionListener(new ActionListener() {
@@ -114,51 +99,40 @@ public class TipOfTheDayWizard extends JFrame {
         setVisible(false);
       }
     });
-
     JScrollPane scroll = new JScrollPane(tipArea);
     scroll.setPreferredSize(new Dimension(200, 100));
-
     JLabel lTitle = new JLabel(Messages.getString("TipOfTheDayView.1"), SwingConstants.LEFT);
     Font fTitle = lTitle.getFont();
     lTitle.setFont(new Font(fTitle.getName(), fTitle.getStyle(), (int) (fTitle.getSize() * 1.3)));
     JLabel lIcon = new JLabel(IconLoader.getIcon(JajukIcons.TIP), SwingConstants.LEFT);
-
     JPanel pTop = new JPanel(new BorderLayout());
     pTop.add(lIcon, BorderLayout.WEST);
     pTop.add(lTitle, BorderLayout.CENTER);
     UtilGUI.setEscapeKeyboardAction(this, pTop);
-
     JPanel pCenter = new JPanel(new BorderLayout());
     pCenter.setBorder(BorderFactory.createEmptyBorder(10, 10, 3, 10));
     pCenter.add(scroll, BorderLayout.CENTER);
     UtilGUI.setEscapeKeyboardAction(this, pCenter);
-
     JPanel pPrevNext = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 10));
     pPrevNext.add(bPrevious);
     pPrevNext.add(lCounter);
     pPrevNext.add(bNext);
-
     JPanel pControls = new JPanel(new BorderLayout());
     pControls.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0));
     pControls.add(cbShow, BorderLayout.WEST);
     pControls.add(pPrevNext);
-
     JPanel pButton = new JPanel(new FlowLayout(FlowLayout.RIGHT));
     pButton.add(bClose);
-
     JPanel pBottom = new JPanel(new BorderLayout());
     pBottom.add(pControls, BorderLayout.NORTH);
     pBottom.add(pButton);
     UtilGUI.setEscapeKeyboardAction(this, pBottom);
-
     add(pTop, BorderLayout.NORTH);
     add(pCenter, BorderLayout.CENTER);
     add(pBottom, BorderLayout.SOUTH);
-
     // Display a shuffled tip of the day
     shuffleIndex();
     updateTip();
-
     pack();
     if (getWidth() < 400) {
       setSize(400, getHeight());
@@ -195,8 +169,8 @@ public class TipOfTheDayWizard extends JFrame {
    */
   private final void updateTip() {
     tipArea.setText(TIPS[currentIndex]);
-    lCounter.setText(new StringBuilder().append("").append(currentIndex + 1).append("/").append(
-        TIPS.length).toString());
+    lCounter.setText(new StringBuilder().append("").append(currentIndex + 1).append("/")
+        .append(TIPS.length).toString());
     tipArea.setCaretPosition(0);
   }
 
diff --git a/src/main/java/org/jajuk/ui/wizard/WebRadioWizard.java b/src/main/java/org/jajuk/ui/wizard/WebRadioWizard.java
deleted file mode 100644
index cf321ed..0000000
--- a/src/main/java/org/jajuk/ui/wizard/WebRadioWizard.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.jajuk.ui.wizard;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-
-import net.miginfocom.swing.MigLayout;
-
-import org.jajuk.events.JajukEvent;
-import org.jajuk.events.JajukEvents;
-import org.jajuk.events.ObservationManager;
-import org.jajuk.services.webradio.WebRadio;
-import org.jajuk.services.webradio.WebRadioManager;
-import org.jajuk.ui.helpers.FontManager;
-import org.jajuk.ui.helpers.FontManager.JajukFont;
-import org.jajuk.ui.windows.JajukMainWindow;
-import org.jajuk.util.IconLoader;
-import org.jajuk.util.JajukIcons;
-import org.jajuk.util.LocaleManager;
-import org.jajuk.util.Messages;
-import org.jajuk.util.UtilGUI;
-import org.jajuk.util.log.Log;
-import org.qdwizard.Screen;
-import org.qdwizard.Wizard;
-
-/**
- * WebRadio management wizard.
- */
-public class WebRadioWizard extends Wizard {
-
-  /** web radios*. */
-  static List<WebRadio> radios;
-
-  /**
-   * DOCUMENT_ME.
-   */
-  public static class RadioPanel extends Screen implements ActionListener {
-
-    /** Generated serialVersionUID. */
-    private static final long serialVersionUID = 1L;
-
-    /** All dynamic widgets. */
-    JComponent[][] widgets;
-
-    /** DOCUMENT_ME. */
-    JButton jbNew;
-
-    /** DOCUMENT_ME. */
-    JButton jbDelete;
-
-    /** DOCUMENT_ME. */
-    JButton jbDefaults;
-
-    /** DOCUMENT_ME. */
-    JPanel jpButtons;
-
-    /** DOCUMENT_ME. */
-    JScrollPane jsp;
-
-    /** Selected radio index. */
-    int radioIndex = 0;
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getDescription()
-     */
-    @Override
-    public String getDescription() {
-      return Messages.getString("RadioWizard.0");
-    }
-
-    /* (non-Javadoc)
-     * @see org.qdwizard.Screen#getName()
-     */
-    @Override
-    public String getName() {
-      return Messages.getString("RadioWizard.1");
-    }
-
-    /**
-     * Create panel UI.
-     */
-    @Override
-    public void initUI() {
-      radios = new ArrayList<WebRadio>(WebRadioManager.getInstance().getWebRadios());
-      setCanFinish(true);
-      // button layout
-      jpButtons = new JPanel(new MigLayout("insets 5,gapx 15,gapy 0"));
-      jbNew = new JButton(Messages.getString("RadioWizard.2"), IconLoader.getIcon(JajukIcons.NEW));
-      jbNew.addActionListener(this);
-      jbNew.setToolTipText(Messages.getString("RadioWizard.2"));
-      jbDelete = new JButton(Messages.getString("RadioWizard.3"), IconLoader
-          .getIcon(JajukIcons.DELETE));
-      jbDelete.addActionListener(this);
-      jbDelete.setToolTipText(Messages.getString("RadioWizard.3"));
-      jbDefaults = new JButton(Messages.getString("RadioWizard.4"), IconLoader
-          .getIcon(JajukIcons.DEFAULTS));
-      jbDefaults.addActionListener(this);
-      jbDefaults.setToolTipText(Messages.getString("RadioWizard.4"));
-      jpButtons.add(jbNew);
-      jpButtons.add(jbDelete);
-      jpButtons.add(jbDefaults);
-
-      // Add items
-      setLayout(new MigLayout("insets 5,gapy 5", "[grow]"));
-      add(getPanel(), "grow,wrap");
-      add(jpButtons, "span,right");
-    }
-
-    /**
-     * Gets the panel.
-     * 
-     * @return a panel containing all items
-     */
-    private JScrollPane getPanel() {
-      widgets = new JComponent[radios.size()][3];
-      JPanel out = new JPanel();
-      // make sure to sort radios
-      Collections.sort(radios);
-      ButtonGroup group = new ButtonGroup();
-      // now add all web radios
-      for (int index = 0; index < radios.size(); index++) {
-        // Radio name
-        final JTextField jtfName = new JTextField();
-        jtfName.setText(radios.get(index).getName());
-        jtfName.addCaretListener(new CaretListener() {
-          @Override
-          public void caretUpdate(CaretEvent arg0) {
-            int index1 = getWidgetIndex(widgets, (JComponent) arg0.getSource());
-            String s = jtfName.getText();
-            // Check this name is not already token
-            for (int i = 0; i < widgets.length; i++) {
-              if (i == index1) {
-                continue;
-              }
-              JTextField jtf = (JTextField) widgets[i][1];
-              if (jtf.getText().equals(s)) {
-                setProblem(Messages.getString("RadioWizard.5"));
-                return;
-              }
-            }
-            // reset previous problems
-            if (s.length() == 0 || ((JTextField) widgets[index1][2]).getText().length() == 0) {
-              setProblem(Messages.getString("RadioWizard.11"));
-            } else {
-              setProblem(null);
-              jtfName.setToolTipText(s);
-            }
-            radios.get(index1).setName(s);
-          }
-        });
-        jtfName.setToolTipText(jtfName.getText());
-        widgets[index][1] = jtfName;
-        // radio button
-        final JRadioButton jrbRadio = new JRadioButton();
-        group.add(jrbRadio);
-        jrbRadio.addActionListener(new ActionListener() {
-          @Override
-          public void actionPerformed(ActionEvent ae) {
-            ((JTextField) widgets[getWidgetIndex(widgets, jrbRadio)][1]).getText();
-            radioIndex = getWidgetIndex(widgets, jrbRadio);
-          }
-        });
-        widgets[index][0] = jrbRadio;
-        if (index == radioIndex) {
-          jrbRadio.setSelected(true);
-        }
-        WebRadio radio = radios.get(index);
-        // URL
-        final JTextField jtfURL = new JTextField();
-        if (radio.getUrl() != null) {
-          jtfURL.setText(radio.getUrl());
-          jtfURL.setToolTipText(jtfURL.getText());
-        }
-        jtfURL.addCaretListener(new CaretListener() {
-          @Override
-          public void caretUpdate(CaretEvent arg0) {
-            int index1 = getWidgetIndex(widgets, (JComponent) arg0.getSource());
-            String s = jtfURL.getText();
-            // reset previous problems
-            if (s.length() == 0 || ((JTextField) widgets[index1][1]).getText().length() == 0) {
-              setProblem(Messages.getString("RadioWizard.11"));
-            } else {
-              setProblem(null);
-              jtfURL.setToolTipText(s);
-            }
-            radios.get(index1).setUrl(s);
-          }
-        });
-        widgets[index][2] = jtfURL;
-      }
-      // Create layout
-      out.setLayout(new MigLayout("insets 5,gapx 10,gapy 2", "[][][grow]"));
-      // Create header
-      JLabel jlHeader1 = new JLabel(Messages.getString("RadioWizard.9"));
-      jlHeader1.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      JLabel jlHeader2 = new JLabel(Messages.getString("RadioWizard.8"));
-      jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
-      out.add(jlHeader1, "center,span 2");
-      out.add(jlHeader2, "center,wrap");
-      // Add widgets
-      for (int i = 0; i < widgets.length; i++) {
-        out.add(widgets[i][0], "grow,left,width 25!");
-        out.add(widgets[i][1], "grow,left,width 200!");
-        out.add(widgets[i][2], "grow,left,wrap,width 250:250");
-      }
-
-      jsp = new JScrollPane(out);
-      // select first ambiance found
-      if (radios.size() > 0) {
-        JRadioButton jrb = (JRadioButton) widgets[0][0];
-        jrb.doClick();
-      }
-      return jsp;
-    }
-
-    /**
-     * Refresh panel.
-     */
-    private void refreshScreen() {
-      removeAll();
-      // refresh panel
-      add(getPanel(), "grow,wrap");
-      add(jpButtons, "center,span");
-      revalidate();
-      repaint();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-     */
-    @Override
-    public void actionPerformed(ActionEvent ae) {
-      if (ae.getSource() == jbNew) {
-        radios.add(new WebRadio("", null));
-        // refresh screen
-        refreshScreen();
-        // select new row
-        JRadioButton jrb = (JRadioButton) widgets[0][0];
-        jrb.setSelected(true);
-        radioIndex = radios.size() - 1;
-        setProblem(Messages.getString("RadioWizard.11"));
-        jbDelete.setEnabled(true);
-        JTextField jtf = (JTextField) widgets[0][1];
-        jtf.requestFocusInWindow();
-      } else if (ae.getSource() == jbDelete) {
-        WebRadio radio = radios.get(radioIndex);
-        radios.remove(radioIndex);
-        WebRadioManager.getInstance().removeWebRadio(radio);
-        if (WebRadioManager.getInstance().getWebRadios().size() == 0) {
-          jbDelete.setEnabled(false);
-        }
-        if (radioIndex > 0) {
-          radioIndex--;
-          JRadioButton jrb = (JRadioButton) widgets[radioIndex][0];
-          jrb.setSelected(true);
-        }
-        // refresh screen
-        refreshScreen();
-      } else if (ae.getSource() == jbDefaults) {
-        // Ask for confirmation
-        int choice = Messages.getChoice(Messages.getString("Confirmation_defaults_radios"),
-            JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
-        if (choice != JOptionPane.YES_OPTION) {
-          return;
-        }
-        // OK ? Restore the list
-        try {
-          UtilGUI.waiting();
-          WebRadioManager.getInstance().restore();
-          // Refresh current list
-          radios = new ArrayList<WebRadio>(WebRadioManager.getInstance().getWebRadios());
-        } catch (Exception e) {
-          // show an "operation failed' message to users
-          Messages.showErrorMessage(169);
-          Log.error(e);
-        } finally {
-          UtilGUI.stopWaiting();
-        }
-        // refresh screen
-        refreshScreen();
-      }
-    }
-  }
-
-  /**
-   * Gets the widget index.
-   *
-   * @param widgets DOCUMENT_ME
-   * @param widget DOCUMENT_ME
-   * @return index of a given widget row in the widget table
-   */
-  private static int getWidgetIndex(JComponent[][] widgets, JComponent widget) {
-    for (int row = 0; row < widgets.length; row++) {
-      for (int col = 0; col < widgets[0].length; col++) {
-        if (widget.equals(widgets[row][col])) {
-          return row;
-        }
-      }
-    }
-    return -1;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#getPreviousScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends org.qdwizard.Screen> getPreviousScreen(
-      Class<? extends org.qdwizard.Screen> screen) {
-    return null;
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#getNextScreen(java.lang.Class)
-   */
-  @Override
-  public Class<? extends org.qdwizard.Screen> getNextScreen(
-      Class<? extends org.qdwizard.Screen> screen) {
-    return null;
-  }
-
-  /**
-   * Instantiates a new web radio wizard.
-   */
-  public WebRadioWizard() {
-    super(Messages.getString("RadioWizard.7"), RadioPanel.class, null, JajukMainWindow
-        .getInstance(), LocaleManager.getLocale(), 600, 500);
-    setHeaderIcon(IconLoader.getIcon(JajukIcons.WEBRADIO));
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.ui.wizard.Wizard#finish()
-   */
-  @Override
-  public void finish() {
-    for (WebRadio radio : radios) {
-      WebRadioManager.getInstance().addWebRadio(radio);
-    }
-    // commit it to avoid it is lost before the app close
-    try {
-      WebRadioManager.getInstance().commit();
-    } catch (IOException e) {
-      Log.error(e);
-    }
-    // Refresh UI
-    ObservationManager.notify(new JajukEvent(JajukEvents.WEBRADIOS_CHANGE));
-  }
-
-}
diff --git a/src/main/java/org/jajuk/ui/wizard/ambience/AmbienceScreen.java b/src/main/java/org/jajuk/ui/wizard/ambience/AmbienceScreen.java
new file mode 100644
index 0000000..ad70008
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/ambience/AmbienceScreen.java
@@ -0,0 +1,320 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.ambience;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.base.Genre;
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.services.dj.Ambience;
+import org.jajuk.services.dj.AmbienceDigitalDJ;
+import org.jajuk.services.dj.AmbienceManager;
+import org.jajuk.ui.helpers.FontManager;
+import org.jajuk.ui.helpers.FontManager.JajukFont;
+import org.jajuk.ui.wizard.GenresSelectionDialog;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.qdwizard.Screen;
+
+public class AmbienceScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** All dynamic widgets. */
+  private JComponent[][] widgets;
+  private JButton jbNew;
+  private JButton jbDelete;
+  private JButton jbDefaults;
+  /** DJ*. */
+  private AmbienceDigitalDJ dj = null;
+  /** Selected ambience index. */
+  private int ambienceIndex = 0;
+
+  @Override
+  public void actionPerformed(final ActionEvent ae) {
+    if (ae.getSource() == jbNew) {
+      // create a void ambience
+      AmbienceWizard.ambiences.add(new Ambience(Long.toString(System.currentTimeMillis()), ""));
+      Collections.sort(AmbienceWizard.ambiences);
+      // refresh screen
+      refreshScreen();
+      // select new row
+      final JRadioButton jrb = (JRadioButton) widgets[AmbienceWizard.ambiences.size() - 1][0];
+      jrb.setSelected(true);
+      ambienceIndex = AmbienceWizard.ambiences.size() - 1;
+      setProblem(Messages.getString("DigitalDJWizard.39"));
+      jbNew.setEnabled(false);
+      jbDelete.setEnabled(true);
+      final JTextField jtf = (JTextField) widgets[ambienceIndex][1];
+      jtf.requestFocusInWindow();
+    } else if (ae.getSource() == jbDelete) {
+      final Ambience ambience = AmbienceWizard.ambiences.get(ambienceIndex);
+      AmbienceWizard.ambiences.remove(ambience);
+      AmbienceManager.getInstance().removeAmbience(ambience.getID());
+      if (AmbienceManager.getInstance().getAmbiences().size() == 0) {
+        jbDelete.setEnabled(false);
+      }
+      if (ambienceIndex > 0) {
+        ambienceIndex--;
+        final JRadioButton jrb = (JRadioButton) widgets[ambienceIndex][0];
+        jrb.setSelected(true);
+      }
+      // refresh screen
+      refreshScreen();
+    } else if (ae.getSource() == jbDefaults) {
+      AmbienceManager.getInstance().createDefaultAmbiences();
+      AmbienceWizard.ambiences = new ArrayList<Ambience>(AmbienceManager.getInstance()
+          .getAmbiences());
+      Collections.sort(AmbienceWizard.ambiences);
+      // refresh screen
+      refreshScreen();
+    }
+    // in all cases, notify command panel
+    ObservationManager.notify(new JajukEvent(JajukEvents.AMBIENCES_CHANGE));
+  }
+
+  /**
+   * Gets the widget index.
+   *
+   * @param widgets 
+   * @param widget 
+   * @return index of a given widget row in the widget table
+   */
+  private int getWidgetIndex(final JComponent[][] widgets, final JComponent widget) {
+    for (int row = 0; row < widgets.length; row++) {
+      for (int col = 0; col < widgets[0].length; col++) {
+        if (widget.equals(widgets[row][col])) {
+          return row;
+        }
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Add a genre to a proportion.
+   * 
+   * @param row row
+   */
+  private void addGenre(final int row) {
+    final Ambience ambience = AmbienceWizard.ambiences.get(row);
+    // create list of genres used in current selection
+    final GenresSelectionDialog dialog = new GenresSelectionDialog(null);
+    dialog.setSelection(ambience.getGenres());
+    dialog.setVisible(true);
+    final Set<Genre> genres = dialog.getSelectedGenres();
+    // check if at least one genre has been selected
+    if (genres.size() == 0) {
+      return;
+    }
+    StringBuilder sText = new StringBuilder();
+    // reset old genres
+    ambience.setGenres(new HashSet<Genre>(10));
+    for (final Genre genre : genres) {
+      ambience.addGenre(genre);
+      sText.append(genre.getName2()).append(',');
+    }
+    sText.deleteCharAt(sText.length() - 1);
+    // Set button text
+    ((JButton) widgets[row][2]).setText(sText.toString());
+    // if we have ambience name and some genres, register the
+    // ambience
+    if ((ambience.getName().length() > 0) && (ambience.getGenres().size() > 0)) {
+      // no more error message if at least one ambience
+      setProblem(null);
+      jbNew.setEnabled(true);
+    }
+  }
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.47");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.57");
+  }
+
+  /**
+   * Gets the panel.
+   * 
+   * @return a panel containing all items
+   */
+  private JScrollPane getPanel() {
+    widgets = new JComponent[AmbienceWizard.ambiences.size()][3];
+    final JPanel out = new JPanel();
+    // Delete|Genre name|genres list
+    final ButtonGroup group = new ButtonGroup();
+    // now add all ambiences
+    for (int index = 0; index < AmbienceWizard.ambiences.size(); index++) {
+      // Ambience name
+      final JTextField jtfName = new JTextField();
+      jtfName.setText(AmbienceWizard.ambiences.get(index).getName());
+      jtfName.addCaretListener(new CaretListener() {
+        @Override
+        public void caretUpdate(final CaretEvent arg0) {
+          final int index = getWidgetIndex(widgets, (JComponent) arg0.getSource());
+          final String s = jtfName.getText();
+          // Check this name is not already token
+          for (int i = 0; i < widgets.length; i++) {
+            if (i == index) {
+              continue;
+            }
+            final JTextField jtf = (JTextField) widgets[i][1];
+            if (jtf.getText().equals(s)) {
+              setProblem(Messages.getString("DigitalDJWizard.60"));
+              return;
+            }
+          }
+          // reset previous problems
+          if ((s.length() == 0) || (((JButton) widgets[index][2]).getText().length() == 0)) {
+            setProblem(Messages.getString("DigitalDJWizard.39"));
+          } else {
+            setProblem(null);
+          }
+          final JButton jb = (JButton) widgets[index][2];
+          final Ambience ambience = AmbienceWizard.ambiences.get(index);
+          ambience.setName(s);
+          jb.setEnabled(s.length() > 0);
+        }
+      });
+      jtfName.setToolTipText(Messages.getString("DigitalDJWizard.36"));
+      widgets[index][1] = jtfName;
+      // radio button
+      final JRadioButton jrbAmbience = new JRadioButton();
+      group.add(jrbAmbience);
+      jrbAmbience.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(final ActionEvent ae) {
+          ((JTextField) widgets[getWidgetIndex(widgets, jrbAmbience)][1]).getText();
+          ambienceIndex = getWidgetIndex(widgets, jrbAmbience);
+        }
+      });
+      widgets[index][0] = jrbAmbience;
+      if (index == ambienceIndex) {
+        jrbAmbience.setSelected(true);
+      }
+      final Ambience ambience = AmbienceWizard.ambiences.get(index);
+      // genre list
+      final JButton jbGenre = new JButton(IconLoader.getIcon(JajukIcons.GENRE));
+      if (ambience.getName().length() == 0) {
+        jbGenre.setEnabled(false);
+      }
+      if ((ambience.getGenres() != null) && (ambience.getGenres().size() > 0)) {
+        jbGenre.setText(ambience.getGenresDesc());
+        jbGenre.setToolTipText(ambience.getGenresDesc());
+      }
+      jbGenre.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(final ActionEvent ae) {
+          final int row = getWidgetIndex(widgets, (JComponent) ae.getSource());
+          addGenre(row);
+          // refresh ambience (force an action event)
+          final JRadioButton jrb = (JRadioButton) widgets[row][0];
+          jrb.doClick();
+        }
+      });
+      jbGenre.setToolTipText(Messages.getString("DigitalDJWizard.27"));
+      widgets[index][2] = jbGenre;
+    }
+    // Create layout
+    out.setLayout(new MigLayout("insets 5,gapx 5", "[][][grow]"));
+    // Create header
+    final JLabel jlHeader1 = new JLabel(Messages.getString("DigitalDJWizard.37"));
+    jlHeader1.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+    final JLabel jlHeader2 = new JLabel(Messages.getString("DigitalDJWizard.27"));
+    jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+    out.add(jlHeader1, "center,span 2");
+    out.add(jlHeader2, "center,wrap");
+    // Add widgets
+    for (int i = 0; i < widgets.length; i++) {
+      out.add(widgets[i][0], "grow,center,width 25!");
+      out.add(widgets[i][1], "grow,center,width 120!");
+      out.add(widgets[i][2], "center,grow,wrap,width 270:270");
+    }
+    final JScrollPane jsp = new JScrollPane(out);
+    // select first ambiance found
+    if (AmbienceWizard.ambiences.size() > 0) {
+      final JRadioButton jrb = (JRadioButton) widgets[0][0];
+      jrb.doClick();
+    }
+    return jsp;
+  }
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  public void initUI() {
+    AmbienceWizard.ambiences = new ArrayList<Ambience>(AmbienceManager.getInstance().getAmbiences());
+    Collections.sort(AmbienceWizard.ambiences);
+    setCanFinish(true);
+    jbNew = new JButton(Messages.getString("DigitalDJWizard.32"),
+        IconLoader.getIcon(JajukIcons.NEW));
+    jbNew.addActionListener(this);
+    jbNew.setToolTipText(Messages.getString("DigitalDJWizard.33"));
+    jbDelete = new JButton(Messages.getString("DigitalDJWizard.34"),
+        IconLoader.getIcon(JajukIcons.DELETE));
+    jbDelete.addActionListener(this);
+    jbDelete.setToolTipText(Messages.getString("DigitalDJWizard.35"));
+    jbDefaults = new JButton(Messages.getString("DigitalDJWizard.62"),
+        IconLoader.getIcon(JajukIcons.DEFAULTS));
+    jbDefaults.addActionListener(this);
+    jbDefaults.setToolTipText(Messages.getString("DigitalDJWizard.63"));
+    // Add items
+    refreshScreen();
+  }
+
+  /**
+   * Refresh panel.
+   */
+  private void refreshScreen() {
+    setLayout(new MigLayout("insets 5,gapy 15", "[center,grow]"));
+    removeAll();
+    // refresh panel
+    add(getPanel(), "grow,wrap");
+    add(jbNew, "split 3");
+    add(jbDelete);
+    add(jbDefaults);
+    revalidate();
+    repaint();
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/ambience/AmbienceWizard.java b/src/main/java/org/jajuk/ui/wizard/ambience/AmbienceWizard.java
new file mode 100644
index 0000000..0153282
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/ambience/AmbienceWizard.java
@@ -0,0 +1,78 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.wizard.ambience;
+
+import java.util.List;
+
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.services.dj.Ambience;
+import org.jajuk.services.dj.AmbienceManager;
+import org.jajuk.ui.widgets.InformationJPanel;
+import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.LocaleManager;
+import org.jajuk.util.Messages;
+import org.qdwizard.Wizard;
+
+/**
+ * Ambiences management wizard.
+ */
+public class AmbienceWizard extends Wizard {
+  /** Ambiences*. */
+  static List<Ambience> ambiences;
+
+  /**
+   * Instantiates a new ambience wizard.
+   */
+  public AmbienceWizard() {
+    super(new Wizard.Builder(Messages.getString("DigitalDJWizard.56"), AmbienceScreen.class,
+        JajukMainWindow.getInstance()).hSize(600).vSize(500).locale(LocaleManager.getLocale())
+        .icon(IconLoader.getIcon(JajukIcons.AMBIENCE)));
+  }
+
+  @Override
+  public void finish() {
+    for (final Ambience ambience : AmbienceWizard.ambiences) {
+      AmbienceManager.getInstance().registerAmbience(ambience);
+    }
+    // commit it to avoid it is lost before the app close
+    AmbienceManager.getInstance().commit();
+    // Refresh UI
+    ObservationManager.notify(new JajukEvent(JajukEvents.AMBIENCES_CHANGE));
+    InformationJPanel.getInstance().setMessage(Messages.getString("Success"),
+        InformationJPanel.MessageType.INFORMATIVE);
+  }
+
+  @Override
+  public Class<? extends org.qdwizard.Screen> getNextScreen(
+      final Class<? extends org.qdwizard.Screen> screen) {
+    return null;
+  }
+
+  @Override
+  public Class<? extends org.qdwizard.Screen> getPreviousScreen(
+      final Class<? extends org.qdwizard.Screen> screen) {
+    return null;
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/ActionSelectionScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/ActionSelectionScreen.java
new file mode 100644
index 0000000..d82157d
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/ActionSelectionScreen.java
@@ -0,0 +1,101 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JRadioButton;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.services.dj.DigitalDJManager;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.Messages;
+import org.qdwizard.ClearPoint;
+import org.qdwizard.Screen;
+
+/**
+ * Action type (new or alter).
+ */
+ at ClearPoint
+public class ActionSelectionScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** NEW code. */
+  public static final String ACTION_CREATION = "0";
+  /** CHANGE code. */
+  public static final String ACTION_CHANGE = "1";
+  /** DELETE code. */
+  public static final String ACTION_DELETE = "2";
+  ButtonGroup bgActions;
+  JRadioButton jrbNew;
+  JRadioButton jrbChange;
+  JRadioButton jrbDelete;
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  public void initUI() {
+    setLayout(new MigLayout("insets 10,gapx 10,gapy 15"));
+    bgActions = new ButtonGroup();
+    jrbNew = new JRadioButton(Messages.getString("DigitalDJWizard.17"));
+    jrbNew.addActionListener(this);
+    jrbNew.doClick();
+    jrbChange = new JRadioButton(Messages.getString("DigitalDJWizard.18"));
+    jrbChange.addActionListener(this);
+    jrbDelete = new JRadioButton(Messages.getString("DigitalDJWizard.19"));
+    jrbDelete.addActionListener(this);
+    // disabled change and remove if none dj
+    if (DigitalDJManager.getInstance().getDJs().size() == 0) {
+      jrbChange.setEnabled(false);
+      jrbDelete.setEnabled(false);
+    }
+    bgActions.add(jrbNew);
+    bgActions.add(jrbChange);
+    bgActions.add(jrbDelete);
+    add(jrbNew, "left,wrap");
+    add(jrbChange, "left,wrap");
+    add(jrbDelete, "left,wrap");
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent e) {
+    if (e.getSource() == jrbNew) {
+      data.put(Variable.ACTION, ACTION_CREATION);
+    } else if (e.getSource() == jrbChange) {
+      data.put(Variable.ACTION, ACTION_CHANGE);
+    } else if (e.getSource() == jrbDelete) {
+      data.put(Variable.ACTION, ACTION_DELETE);
+    }
+  }
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.16");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.45");
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/AmbiencesScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/AmbiencesScreen.java
new file mode 100644
index 0000000..02d9325
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/AmbiencesScreen.java
@@ -0,0 +1,136 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.services.dj.Ambience;
+import org.jajuk.services.dj.AmbienceDigitalDJ;
+import org.jajuk.services.dj.AmbienceManager;
+import org.jajuk.services.dj.DigitalDJ;
+import org.jajuk.services.dj.DigitalDJManager;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.Messages;
+import org.qdwizard.Screen;
+
+/**
+ * Ambience based.
+ */
+public class AmbiencesScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** All dynamic widgets. */
+  JComponent[][] widgets;
+  /** Ambiences*. */
+  List<Ambience> ambiences;
+  /** DJ*. */
+  AmbienceDigitalDJ dj = null;
+  /** Selected ambience index. */
+  int ambienceIndex = 0;
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.58");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.31");
+  }
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  public void initUI() {
+    // the returned list is sorted by name
+    ambiences = AmbienceManager.getInstance().getAmbiences();
+    // We need at least one ambience
+    if (ambiences.size() == 0) {
+      setProblem(Messages.getString("DigitalDJWizard.38"));
+    }
+    setCanFinish(true);
+    // Get DJ
+    dj = (AmbienceDigitalDJ) DigitalDJManager.getInstance().getDJByName(
+        (String) data.get(Variable.DJ_NAME));
+    setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
+    add(getAmbiencesPanel(), "grow");
+  }
+
+  /**
+   * Gets the ambiences panel.
+   * 
+   * @return a panel containing all ambiences
+   */
+  private JScrollPane getAmbiencesPanel() {
+    ButtonGroup bg = new ButtonGroup();
+    widgets = new JComponent[ambiences.size()][3];
+    JPanel out = new JPanel();
+    out.setLayout(new MigLayout("insets 0,gapx 10,gapy 10", "[grow]"));
+    int index = 0;
+    for (Ambience ambience : ambiences) {
+      JRadioButton jrb = new JRadioButton(ambience.getName());
+      jrb.addActionListener(this);
+      bg.add(jrb);
+      widgets[index][0] = jrb;
+      out.add(jrb, "left gap 5,wrap");
+      index++;
+    }
+    // DJ change, set right ambience
+    if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))) {
+      DigitalDJ lDJ = (DigitalDJ) data.get(Variable.CHANGE);
+      Ambience ambience = ((AmbienceDigitalDJ) lDJ).getAmbience();
+      index = 0;
+      for (Ambience a : ambiences) {
+        if (a.equals(ambience)) {
+          JRadioButton jrb = (JRadioButton) widgets[index][0];
+          jrb.doClick();// select right ambience, it will set
+          // right value into data
+          break;
+        }
+        index++;
+      }
+    } else {
+      // select first ambience found
+      JRadioButton jrb = (JRadioButton) widgets[0][0];
+      jrb.doClick();
+    }
+    JScrollPane jsp = new JScrollPane(out);
+    jsp.setBorder(null);
+    return jsp;
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent e) {
+    int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) e.getSource());
+    data.put(Variable.AMBIENCE, ambiences.get(row));
+    setProblem(null);
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/ChangeScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/ChangeScreen.java
new file mode 100644
index 0000000..25245f5
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/ChangeScreen.java
@@ -0,0 +1,114 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.services.dj.AmbienceDigitalDJ;
+import org.jajuk.services.dj.DigitalDJ;
+import org.jajuk.services.dj.DigitalDJManager;
+import org.jajuk.services.dj.ProportionDigitalDJ;
+import org.jajuk.services.dj.TransitionDigitalDJ;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.Messages;
+import org.qdwizard.Screen;
+
+/**
+ * DJ Selection for change.
+ */
+public class ChangeScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  JComponent[][] widgets;
+  ButtonGroup bgDJS;
+  List<DigitalDJ> djs;
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  public void initUI() {
+    djs = DigitalDJManager.getInstance().getDJsSorted();
+    // We use an inner panel for scrolling purpose
+    JPanel jp = new JPanel();
+    jp.setLayout(new MigLayout("insets 0,gapx 0,gapy 10"));
+    widgets = new JComponent[djs.size()][1];
+    setLayout(new MigLayout("insets 10,gapx 10,gapy 15"));
+    bgDJS = new ButtonGroup();
+    int index = 0;
+    for (DigitalDJ dj : djs) {
+      JRadioButton jrb = new JRadioButton(dj.getName());
+      jrb.addActionListener(this);
+      bgDJS.add(jrb);
+      widgets[index][0] = jrb;
+      jp.add(jrb, "left gap 5,wrap");
+      index++;
+    }
+    // If more than one DJ, select first
+    if (djs.size() > 0) {
+      JRadioButton jrb = (JRadioButton) widgets[0][0];
+      jrb.doClick();
+    } else {
+      setProblem(Messages.getString("DigitalDJWizard.40"));
+    }
+    setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
+    JScrollPane jsp = new JScrollPane(jp);
+    jsp.setBorder(null);
+    add(jsp, "grow");
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent e) {
+    int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) e.getSource());
+    // set DJ type useful for screen choice
+    DigitalDJ dj = djs.get(row);
+    data.put(Variable.CHANGE, dj);
+    if (dj instanceof AmbienceDigitalDJ) {
+      data.put(Variable.DJ_TYPE, TypeSelectionScreen.DJ_TYPE_AMBIENCE);
+    }
+    if (dj instanceof ProportionDigitalDJ) {
+      data.put(Variable.DJ_TYPE, TypeSelectionScreen.DJ_TYPE_PROPORTION);
+    }
+    if (dj instanceof TransitionDigitalDJ) {
+      data.put(Variable.DJ_TYPE, TypeSelectionScreen.DJ_TYPE_TRANSITION);
+    }
+    setProblem(null);
+  }
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.44");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.43");
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/DigitalDJWizard.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/DigitalDJWizard.java
new file mode 100644
index 0000000..943a5a8
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/DigitalDJWizard.java
@@ -0,0 +1,243 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.swing.JComponent;
+
+import org.jajuk.events.JajukEvent;
+import org.jajuk.events.JajukEvents;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.services.dj.Ambience;
+import org.jajuk.services.dj.AmbienceDigitalDJ;
+import org.jajuk.services.dj.DigitalDJ;
+import org.jajuk.services.dj.DigitalDJManager;
+import org.jajuk.services.dj.Proportion;
+import org.jajuk.services.dj.ProportionDigitalDJ;
+import org.jajuk.services.dj.Transition;
+import org.jajuk.services.dj.TransitionDigitalDJ;
+import org.jajuk.ui.widgets.InformationJPanel;
+import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.jajuk.util.log.Log;
+import org.qdwizard.Wizard;
+
+/**
+ * DJ creation wizard.
+ */
+public class DigitalDJWizard extends Wizard {
+  /**
+   * List of the variables used in the wizard
+   */
+  enum Variable {
+    /** Wizard action. */
+    ACTION,
+    /** DJ type variable name. */
+    DJ_TYPE,
+    /** DJ name variable name. */
+    DJ_NAME,
+    /** Track unicity. */
+    UNICITY,
+    /** Ratings level. */
+    RATINGS_LEVEL,
+    /** Fade duration. */
+    FADE_DURATION,
+    /** Transitions. */
+    TRANSITIONS,
+    /** Proportions. */
+    PROPORTIONS,
+    /** Ambience. */
+    AMBIENCE,
+    /** DJ to remove. */
+    REMOVE,
+    /** DJ to change. */
+    CHANGE,
+    /** Max number of tracks to queue. */
+    MAX_TRACKS
+  }
+
+  /**
+   * Gets the widget index.
+   *
+   * @param widgets 
+   * @param widget 
+   * @return index of a given widget row in the widget table
+   */
+  static int getWidgetIndex(JComponent[][] widgets, JComponent widget) {
+    for (int row = 0; row < widgets.length; row++) {
+      for (int col = 0; col < widgets[0].length; col++) {
+        if (widget.equals(widgets[row][col])) {
+          return row;
+        }
+      }
+    }
+    return -1;
+  }
+
+  @Override
+  public Class<? extends org.qdwizard.Screen> getPreviousScreen(
+      Class<? extends org.qdwizard.Screen> screen) {
+    if (ActionSelectionScreen.class.equals(screen)) {
+      return null;
+    } else if (TypeSelectionScreen.class.equals(screen)) {
+      return ActionSelectionScreen.class;
+    } else if (GeneralOptionsScreen.class.equals(screen)) {
+      if (ActionSelectionScreen.ACTION_CREATION.equals(data.get(Variable.ACTION))) {
+        return TypeSelectionScreen.class;
+      } else {
+        return ChangeScreen.class;
+      }
+    } else if (TransitionsScreen.class.equals(screen) || ProportionsScreen.class.equals(screen)
+        || AmbiencesScreen.class.equals(screen)) {
+      return GeneralOptionsScreen.class;
+    } else if (RemoveScreen.class.equals(screen)) {
+      return ActionSelectionScreen.class;
+    } else if (ChangeScreen.class.equals(screen)) {
+      return ActionSelectionScreen.class;
+    }
+    return null;
+  }
+
+  @Override
+  public Class<? extends org.qdwizard.Screen> getNextScreen(
+      Class<? extends org.qdwizard.Screen> screen) {
+    if (ActionSelectionScreen.class.equals(screen)) {
+      String sAction = (String) data.get(Variable.ACTION);
+      if (ActionSelectionScreen.ACTION_CREATION.equals(sAction)) {
+        return TypeSelectionScreen.class;
+      } else if (ActionSelectionScreen.ACTION_CHANGE.equals(sAction)) {
+        return ChangeScreen.class;
+      } else if (ActionSelectionScreen.ACTION_DELETE.equals(sAction)) {
+        return RemoveScreen.class;
+      }
+    } else if (TypeSelectionScreen.class.equals(screen)) {
+      return GeneralOptionsScreen.class;
+    } else if (GeneralOptionsScreen.class.equals(screen)) {
+      String sType = (String) data.get(Variable.DJ_TYPE);
+      if (TypeSelectionScreen.DJ_TYPE_AMBIENCE.equals(sType)) {
+        return AmbiencesScreen.class;
+      } else if (TypeSelectionScreen.DJ_TYPE_PROPORTION.equals(sType)) {
+        return ProportionsScreen.class;
+      } else if (TypeSelectionScreen.DJ_TYPE_TRANSITION.equals(sType)) {
+        return TransitionsScreen.class;
+      }
+    } else if (RemoveScreen.class.equals(screen)) {
+      return null;
+    } else if (ChangeScreen.class.equals(screen)) {
+      return GeneralOptionsScreen.class;
+    }
+    return null;
+  }
+
+  /**
+   * Instantiates a new digital dj wizard.
+   */
+  public DigitalDJWizard() {
+    super(new Wizard.Builder(Messages.getString("DigitalDJWizard.4"), ActionSelectionScreen.class,
+        JajukMainWindow.getInstance()).hSize(700).vSize(500)
+        .icon(IconLoader.getIcon(JajukIcons.DIGITAL_DJ)));
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void finish() {
+    DigitalDJ dj = null;
+    String sAction = (String) data.get(Variable.ACTION);
+    if (ActionSelectionScreen.ACTION_DELETE.equals(sAction)) {
+      try {
+        DigitalDJManager.getInstance().remove((DigitalDJ) data.get(Variable.REMOVE));
+      } catch (IOException e) {
+        Log.error(e);
+      }
+    } else if (ActionSelectionScreen.ACTION_CREATION.equals(sAction)) {
+      String sType = (String) data.get(Variable.DJ_TYPE);
+      // create a unique ID for this DJ, simply use current time in ms
+      String sID = Long.toString(System.currentTimeMillis());
+      if (TypeSelectionScreen.DJ_TYPE_AMBIENCE.equals(sType)) {
+        Ambience ambience = (Ambience) data.get(Variable.AMBIENCE);
+        dj = new AmbienceDigitalDJ(sID);
+        ((AmbienceDigitalDJ) dj).setAmbience(ambience);
+      } else if (TypeSelectionScreen.DJ_TYPE_PROPORTION.equals(sType)) {
+        dj = new ProportionDigitalDJ(sID);
+        List<Proportion> proportions = (List<Proportion>) data.get(Variable.PROPORTIONS);
+        ((ProportionDigitalDJ) dj).setProportions(proportions);
+      } else if (TypeSelectionScreen.DJ_TYPE_TRANSITION.equals(sType)) {
+        List<Transition> transitions = (List<Transition>) data.get(Variable.TRANSITIONS);
+        dj = new TransitionDigitalDJ(sID);
+        ((TransitionDigitalDJ) dj).setTransitions(transitions);
+      } else {
+        throw new IllegalArgumentException("Unknown type of DJ: " + sType);
+      }
+      setProperties(dj);
+      DigitalDJManager.getInstance().register(dj);
+      // commit the DJ right now
+      DigitalDJManager.commit(dj);
+      // If first DJ, select it as default
+      if (DigitalDJManager.getInstance().getDJs().size() == 1) {
+        Conf.setProperty(Const.CONF_DEFAULT_DJ, dj.getID());
+      }
+    } else if (ActionSelectionScreen.ACTION_CHANGE.equals(sAction)) {
+      String sType = (String) data.get(Variable.DJ_TYPE);
+      dj = (DigitalDJ) data.get(Variable.CHANGE);
+      if (TypeSelectionScreen.DJ_TYPE_AMBIENCE.equals(sType)) {
+        Ambience ambience = (Ambience) data.get(Variable.AMBIENCE);
+        ((AmbienceDigitalDJ) dj).setAmbience(ambience);
+      } else if (TypeSelectionScreen.DJ_TYPE_PROPORTION.equals(sType)) {
+        List<Proportion> proportions = (List<Proportion>) data.get(Variable.PROPORTIONS);
+        ((ProportionDigitalDJ) dj).setProportions(proportions);
+      } else if (TypeSelectionScreen.DJ_TYPE_TRANSITION.equals(sType)) {
+        List<Transition> transitions = (List<Transition>) data.get(Variable.TRANSITIONS);
+        ((TransitionDigitalDJ) dj).setTransitions(transitions);
+      }
+      setProperties(dj);
+      // commit the DJ right now
+      DigitalDJManager.commit(dj);
+    }
+    // Refresh command panel (useful for ie if DJ names changed)
+    ObservationManager.notify(new JajukEvent(JajukEvents.DJS_CHANGE));
+    InformationJPanel.getInstance().setMessage(Messages.getString("Success"),
+        InformationJPanel.MessageType.INFORMATIVE);
+  }
+
+  /**
+   * Store the properties from the Wizard to the specified DJ.
+   * 
+   * @param dj The DJ to populate.
+   */
+  private void setProperties(DigitalDJ dj) {
+    String sName = (String) data.get(Variable.DJ_NAME);
+    int iFadeDuration = (Integer) data.get(Variable.FADE_DURATION);
+    int iRateLevel = (Integer) data.get(Variable.RATINGS_LEVEL);
+    boolean bUnicity = (Boolean) data.get(Variable.UNICITY);
+    int iMaxTracks = (Integer) data.get(Variable.MAX_TRACKS);
+    dj.setName(sName);
+    dj.setFadingDuration(iFadeDuration);
+    dj.setRatingLevel(iRateLevel);
+    dj.setTrackUnicity(bUnicity);
+    dj.setMaxTracks(iMaxTracks);
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/GeneralOptionsScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/GeneralOptionsScreen.java
new file mode 100644
index 0000000..44d1e15
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/GeneralOptionsScreen.java
@@ -0,0 +1,250 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.JTextField;
+import javax.swing.border.BevelBorder;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.services.dj.DigitalDJ;
+import org.jajuk.services.dj.DigitalDJManager;
+import org.jajuk.ui.helpers.DefaultMouseWheelListener;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.Messages;
+import org.qdwizard.Screen;
+
+/**
+ * General options panel.
+ */
+public class GeneralOptionsScreen extends Screen implements ActionListener, CaretListener,
+    ChangeListener {
+  /** The Constant NO_MAX_TRACKS.   */
+  private static final String NO_MAX_TRACKS = "  ";
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  JLabel jlName;
+  JTextField jtfName;
+  JLabel jlRatingLevel;
+  JSlider jsRatingLevel;
+  JLabel jlFadeDuration;
+  JSlider jsFadeDuration;
+  JCheckBox jcbMaxTracks;
+  JSlider jsMaxTracks;
+  JLabel jnMaxTracks;
+  JCheckBox jcbUnicity;
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.49");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.48");
+  }
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  public void initUI() {
+    if (ActionSelectionScreen.ACTION_CREATION.equals(data.get(Variable.ACTION))) {
+      // default values
+      data.put(Variable.FADE_DURATION, 10);
+      data.put(Variable.RATINGS_LEVEL, 0); // all tracks by default
+      data.put(Variable.UNICITY, false);
+      data.put(Variable.MAX_TRACKS, -1);
+    } else if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))) {
+      // keep existing DJ values
+      DigitalDJ dj = (DigitalDJ) data.get(Variable.CHANGE);
+      data.put(Variable.FADE_DURATION, dj.getFadingDuration());
+      data.put(Variable.RATINGS_LEVEL, dj.getRatingLevel());
+      data.put(Variable.UNICITY, dj.isTrackUnicity());
+      data.put(Variable.MAX_TRACKS, dj.getMaxTracks());
+    }
+    jlName = new JLabel(Messages.getString("DigitalDJWizard.6"));
+    jtfName = new JTextField();
+    jtfName.setToolTipText(Messages.getString("DigitalDJWizard.6"));
+    jtfName.addCaretListener(this);
+    jtfName.requestFocusInWindow();
+    jlRatingLevel = new JLabel(Messages.getString("DigitalDJWizard.8"));
+    jlRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
+    jsRatingLevel = new JSlider(0, 4, (Integer) data.get(Variable.RATINGS_LEVEL));
+    jsRatingLevel.setMajorTickSpacing(1);
+    jsRatingLevel.setMinorTickSpacing(1);
+    jsRatingLevel.setPaintTicks(true);
+    jsRatingLevel.setSnapToTicks(true);
+    jsRatingLevel.setPaintLabels(true);
+    jsRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
+    jsRatingLevel.addMouseWheelListener(new DefaultMouseWheelListener(jsRatingLevel));
+    jsRatingLevel.addChangeListener(this);
+    jlFadeDuration = new JLabel(Messages.getString("DigitalDJWizard.9"));
+    jlFadeDuration.setToolTipText(Messages.getString("DigitalDJWizard.54"));
+    jsFadeDuration = new JSlider(0, 30, (Integer) data.get(Variable.FADE_DURATION));
+    jsFadeDuration.addMouseWheelListener(new DefaultMouseWheelListener(jsFadeDuration));
+    jsFadeDuration.addChangeListener(this);
+    jsFadeDuration.setMajorTickSpacing(10);
+    jsFadeDuration.setMinorTickSpacing(1);
+    jsFadeDuration.setPaintTicks(true);
+    jsFadeDuration.setPaintLabels(true);
+    jsFadeDuration.setToolTipText(Messages.getString("DigitalDJWizard.54"));
+    // CheckBox for enabling/disabling slider, jsMaxTrack
+    int nMaxTracks = (Integer) data.get(Variable.MAX_TRACKS);
+    jcbMaxTracks = new JCheckBox(Messages.getString("DigitalDJWizard.67"), nMaxTracks != -1);
+    jcbMaxTracks.setToolTipText(Messages.getString("DigitalDJWizard.68"));
+    // initialize the slider based if max track is enabled or not
+    if (nMaxTracks != -1) {
+      jsMaxTracks = new JSlider(0, 5000, nMaxTracks);
+      jsMaxTracks.setEnabled(true);
+      jnMaxTracks = new JLabel(Integer.toString(nMaxTracks));
+    } else {
+      jsMaxTracks = new JSlider(0, 5000, 100);
+      jsMaxTracks.setEnabled(false);
+      jnMaxTracks = new JLabel(NO_MAX_TRACKS);
+    }
+    jnMaxTracks.setBorder(new BevelBorder(BevelBorder.LOWERED));
+    jsMaxTracks.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxTracks));
+    jsMaxTracks.addChangeListener(this);
+    jsMaxTracks.setMajorTickSpacing(100);
+    jsMaxTracks.setMinorTickSpacing(10);
+    jsMaxTracks.setPaintTicks(false);
+    jsMaxTracks.setPaintLabels(false);
+    jsMaxTracks.setToolTipText(Messages.getString("DigitalDJWizard.68"));
+    // enable/disable slider depending on checkbox
+    jcbMaxTracks.addActionListener(this);
+    jcbUnicity = new JCheckBox(Messages.getString("DigitalDJWizard.10"),
+        (Boolean) data.get(Variable.UNICITY));
+    jcbUnicity.setToolTipText(Messages.getString("DigitalDJWizard.55"));
+    jcbUnicity.addActionListener(new ActionListener() {
+      @Override
+      public void actionPerformed(ActionEvent arg0) {
+        data.put(Variable.UNICITY, jcbUnicity.isSelected());
+      }
+    });
+    // DJ change, set default values
+    if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))) {
+      DigitalDJ dj = (DigitalDJ) data.get(Variable.CHANGE);
+      jtfName.setText(dj.getName());
+      jsFadeDuration.setValue((Integer) data.get(Variable.FADE_DURATION));
+      jsRatingLevel.setValue((Integer) data.get(Variable.RATINGS_LEVEL));
+      jcbUnicity.setSelected((Boolean) data.get(Variable.UNICITY));
+      if (((Integer) data.get(Variable.MAX_TRACKS)) != -1) {
+        jsMaxTracks.setValue((Integer) data.get(Variable.MAX_TRACKS));
+      } else {
+        jsMaxTracks.setValue(100);
+      }
+    } else { // new dj, dj name is required
+      setProblem(Messages.getString("DigitalDJWizard.41"));
+    }
+    setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
+    add(jlName);
+    add(jtfName, "grow,wrap");
+    add(jlRatingLevel);
+    add(jsRatingLevel, "grow,wrap");
+    add(jlFadeDuration);
+    add(jsFadeDuration, "grow,wrap");
+    add(jcbMaxTracks);
+    {
+      JPanel panel = new JPanel();
+      panel.setLayout(new MigLayout("", "[grow][]"));
+      panel.add(jsMaxTracks, "grow");
+      panel.add(jnMaxTracks);
+      add(panel, "grow,wrap");
+    }
+    add(jcbUnicity, "wrap");
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent ae) {
+    if (ae.getSource() == jcbUnicity) {
+      data.put(Variable.UNICITY, jcbUnicity.isSelected());
+    } else if (ae.getSource() == jcbMaxTracks) {
+      jsMaxTracks.setEnabled(jcbMaxTracks.isSelected());
+      updateMaxTracks();
+    }
+  }
+
+  @Override
+  public void caretUpdate(CaretEvent ce) {
+    if (ce.getSource() == jtfName) {
+      data.put(Variable.DJ_NAME, jtfName.getText());
+      String sName = jtfName.getText();
+      // string length = 0
+      if (sName.length() == 0) {
+        setProblem(Messages.getString("DigitalDJWizard.41"));
+      }
+      // display an error message if the dj already exists and not in
+      // "change" mode
+      else if (DigitalDJManager.getInstance().getDJNames().contains(sName)) {
+        // if we are in change mode and the name is still the
+        // same, no error
+        if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))
+            && ((DigitalDJ) data.get(Variable.CHANGE)).getName().equals(sName)) {
+          setProblem(null);
+          return;
+        }
+        setProblem(Messages.getString("DigitalDJWizard.42"));
+      } else {
+        setProblem(null); // no more problem
+      }
+    }
+  }
+
+  @Override
+  public void stateChanged(ChangeEvent ie) {
+    if (ie.getSource() == jsFadeDuration && !jsFadeDuration.getValueIsAdjusting()) {
+      data.put(Variable.FADE_DURATION, jsFadeDuration.getValue());
+    } else if (ie.getSource() == jsRatingLevel && !jsRatingLevel.getValueIsAdjusting()) {
+      data.put(Variable.RATINGS_LEVEL, jsRatingLevel.getValue());
+    } else if (ie.getSource() == jsMaxTracks) {
+      updateMaxTracks();
+    }
+  }
+
+  /**
+   * Update all items related to the Max Track feature.
+   */
+  private void updateMaxTracks() {
+    // store -1 if checkbox is not enabled and update the label accordingly
+    if (jcbMaxTracks.isSelected()) {
+      if (!jsMaxTracks.getValueIsAdjusting()) {
+        data.put(Variable.MAX_TRACKS, jsMaxTracks.getValue());
+      }
+      jnMaxTracks.setText(Integer.toString(jsMaxTracks.getValue()));
+    } else {
+      if (!jsMaxTracks.getValueIsAdjusting()) {
+        data.put(Variable.MAX_TRACKS, -1);
+      }
+      jnMaxTracks.setText(NO_MAX_TRACKS);
+    }
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/ProportionsScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/ProportionsScreen.java
new file mode 100644
index 0000000..3f1fd92
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/ProportionsScreen.java
@@ -0,0 +1,309 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.base.Genre;
+import org.jajuk.base.GenreManager;
+import org.jajuk.services.dj.Ambience;
+import org.jajuk.services.dj.DigitalDJ;
+import org.jajuk.services.dj.Proportion;
+import org.jajuk.services.dj.ProportionDigitalDJ;
+import org.jajuk.ui.helpers.FontManager;
+import org.jajuk.ui.helpers.FontManager.JajukFont;
+import org.jajuk.ui.wizard.GenresSelectionDialog;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.jajuk.util.log.Log;
+import org.qdwizard.Screen;
+
+/**
+ * Proportion panel.
+ */
+public class ProportionsScreen extends Screen {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** All dynamic widgets. */
+  JComponent[][] widgets;
+  /** Proportions*. */
+  List<Proportion> proportions;
+
+  /* (non-Javadoc)
+   * @see org.qdwizard.Screen#getDescription()
+   */
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.50");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.29");
+  }
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  @SuppressWarnings("unchecked")
+  public void initUI() {
+    if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))) {
+      DigitalDJ dj = (DigitalDJ) data.get(Variable.CHANGE);
+      proportions = (List<Proportion>) ((ArrayList<Proportion>) ((ProportionDigitalDJ) dj)
+          .getProportions()).clone();
+      data.put(Variable.PROPORTIONS, getCleanedProportions());
+      proportions.add(new Proportion()); // add a void item
+    } else {
+      proportions = new ArrayList<Proportion>(10);
+      proportions.add(new Proportion()); // add a void item
+      setProblem(Messages.getString("DigitalDJWizard.30"));
+    }
+    setCanFinish(true);
+    // set layout
+    setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
+    add(getProportionsPanel(), "grow");
+  }
+
+  /**
+   * Gets the cleaned proportions.
+   * 
+   * @return Filled proportions only
+   */
+  private List<Proportion> getCleanedProportions() {
+    List<Proportion> out = new ArrayList<Proportion>(proportions.size());
+    for (Proportion proportion : proportions) {
+      if (proportion.getGenres() != null && proportion.getGenres().size() > 0) {
+        out.add(proportion);
+      }
+    }
+    return out;
+  }
+
+  /**
+   * Gets the proportions panel.
+   * 
+   * @return a panel containing all proportions
+   */
+  private JScrollPane getProportionsPanel() {
+    widgets = new JComponent[proportions.size()][3];
+    JPanel out = new JPanel();
+    // Delete|Genre list|proportion in %
+    // now add all known proportions
+    for (int index = 0; index < proportions.size(); index++) {
+      // Delete button
+      JButton jbDelete = new JButton(IconLoader.getIcon(JajukIcons.DELETE));
+      jbDelete.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(ActionEvent ae) {
+          proportions.remove(DigitalDJWizard.getWidgetIndex(widgets, (JComponent) ae.getSource()));
+          data.put(Variable.PROPORTIONS, getCleanedProportions());
+          refreshScreen();
+        }
+      });
+      // cannot delete if void selection
+      if (proportions.size() == 1) {
+        jbDelete.setEnabled(false);
+      }
+      jbDelete.setToolTipText(Messages.getString("DigitalDJWizard.21"));
+      widgets[index][0] = jbDelete;
+      // genre list
+      JButton jbGenre = new JButton(IconLoader.getIcon(JajukIcons.LIST));
+      Proportion proportion = proportions.get(index);
+      if (proportion.getGenres() != null) {
+        jbGenre.setText(proportion.getGenresDesc());
+        jbGenre.setToolTipText(proportion.getGenresDesc());
+      }
+      jbGenre.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(ActionEvent ae) {
+          int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) ae.getSource());
+          addGenre(row);
+        }
+      });
+      jbGenre.setToolTipText(Messages.getString("DigitalDJWizard.27"));
+      widgets[index][1] = jbGenre;
+      // Proportion
+      JSpinner jsNb = new JSpinner(new SpinnerNumberModel((int) (proportion.getProportion() * 100),
+          1, 100, 1));
+      jsNb.addChangeListener(new ChangeListener() {
+        @Override
+        public void stateChanged(ChangeEvent ce) {
+          if (getTotalValue() > 100) {
+            setProblem(Messages.getString("DigitalDJWizard.59"));
+            return;
+          } else {
+            setProblem(null);
+          }
+          int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) ce.getSource());
+          int nb = Integer.parseInt(((JSpinner) ce.getSource()).getValue().toString());
+          Proportion proportion = proportions.get(row);
+          proportion.setProportion(((float) nb) / 100);
+        }
+      });
+      jsNb.setToolTipText(Messages.getString("DigitalDJWizard.28"));
+      widgets[index][2] = jsNb;
+    }
+    // Create layout
+    out.setLayout(new MigLayout("insets 5,gapx 10,gapy 10", "[][530!][]"));
+    // Create header
+    JLabel jlHeader1 = new JLabel(Messages.getString("DigitalDJWizard.27"));
+    jlHeader1.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+    JLabel jlHeader2 = new JLabel(Messages.getString("DigitalDJWizard.28"));
+    jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+    out.add(jlHeader1, "cell 1 0, center");
+    out.add(jlHeader2, "cell 2 0, center,wrap");
+    // Add widgets
+    for (int i = 0; i < widgets.length; i++) {
+      out.add(widgets[i][0], "left");
+      out.add(widgets[i][1], "grow,width ::530");
+      out.add(widgets[i][2], "wrap");
+    }
+    // Display an error message if sum of proportion is > 100%
+    if (getTotalValue() > 100) {
+      setProblem(Messages.getString("DigitalDJWizard.59"));
+    }
+    JScrollPane jsp = new JScrollPane(out);
+    jsp.setBorder(null);
+    return jsp;
+  }
+
+  /**
+   * Gets the total value.
+   * 
+   * @return Sum of all proportions
+   */
+  private int getTotalValue() {
+    int total = 0;
+    for (JComponent[] element : widgets) {
+      JSpinner jsp = (JSpinner) element[2];
+      // Only filled proportions are token into account
+      JButton jb = (JButton) element[1];
+      if (jb.getText() == null || jb.getText().equals("")) {
+        continue;
+      }
+      total += Integer.parseInt(jsp.getValue().toString());
+    }
+    return total;
+  }
+
+  /**
+   * Add a genre to a proportion.
+   * 
+   * @param row row
+   */
+  private void addGenre(int row) {
+    synchronized (GenreManager.getInstance()) {
+      Proportion proportion = proportions.get(row);
+      // create list of genres used in existing transitions
+      Set<Genre> disabledGenres = new HashSet<Genre>();
+      for (int i = 0; i < proportions.size(); i++) {
+        if (i != row) { // do not exclude current proportion that
+          // will be selected
+          disabledGenres.addAll(proportions.get(i).getGenres());
+        }
+      }
+      GenresSelectionDialog dialog = new GenresSelectionDialog(disabledGenres);
+      dialog.setSelection(proportion.getGenres());
+      dialog.setVisible(true);
+      Set<Genre> genres = dialog.getSelectedGenres();
+      // check if at least one genre has been selected
+      if (genres.size() == 0) {
+        return;
+      }
+      // reset genres
+      proportion.setGenre(new Ambience());
+      String sText = "";
+      for (Genre genre : genres) {
+        // handle null
+        if (genre == null) {
+          Log.warn("Could not add genre, got an empty genre from the Wizard Dialog!");
+          continue;
+        }
+        proportion.addGenre(genre);
+        sText += genre.getName2() + ',';
+      }
+      sText = sText.substring(0, sText.length() - 1);
+      // Set button text
+      ((JButton) widgets[row][1]).setText(sText);
+      // check if the proportion is fully selected now
+      if (proportion.getGenres().size() > 0) {
+        // Make sure current delete button is now enabled
+        ((JButton) widgets[row][0]).setEnabled(true);
+        // Reset wizard error message
+        setProblem(null);
+        // Fill wizard data
+        data.put(Variable.PROPORTIONS, getCleanedProportions());
+        // create a new void proportion if needed
+        if (!containsVoidItem()) {
+          proportions.add(new Proportion());
+        }
+        // Refresh screen to add a new void row
+        refreshScreen();
+      }
+    }
+  }
+
+  /**
+   * Contains void item.
+   * 
+   * @return whether a void item already exist (used to avoid creating several
+   * void items)
+   */
+  private boolean containsVoidItem() {
+    for (JComponent[] element : widgets) {
+      JButton jb = (JButton) element[1];
+      if (jb.getText().equals("")) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Refresh panel.
+   */
+  private void refreshScreen() {
+    removeAll();
+    // refresh panel
+    add(getProportionsPanel(), "grow");
+    revalidate();
+    repaint();
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/RemoveScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/RemoveScreen.java
new file mode 100644
index 0000000..d03380d
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/RemoveScreen.java
@@ -0,0 +1,112 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.services.dj.DigitalDJ;
+import org.jajuk.services.dj.DigitalDJManager;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.Messages;
+import org.qdwizard.Screen;
+
+/**
+ * DJ removal.
+ */
+public class RemoveScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  JComponent[][] widgets;
+  ButtonGroup bgDJS;
+  List<DigitalDJ> djs;
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  public void initUI() {
+    djs = new ArrayList<DigitalDJ>(DigitalDJManager.getInstance().getDJs());
+    Collections.sort(djs);
+    widgets = new JComponent[djs.size()][1];
+    // We use an inner panel for scrolling purpose
+    JPanel jp = new JPanel();
+    jp.setLayout(new MigLayout("insets 0,gapx 0,gapy 10"));
+    bgDJS = new ButtonGroup();
+    setCanFinish(true);
+    int index = 0;
+    for (DigitalDJ dj : djs) {
+      JRadioButton jrb = new JRadioButton(dj.getName());
+      jrb.addActionListener(this);
+      bgDJS.add(jrb);
+      widgets[index][0] = jrb;
+      jp.add(jrb, "left gap 5,wrap");
+      index++;
+    }
+    setProblem(Messages.getString("DigitalDJWizard.40"));
+    // select first ambience found
+    JRadioButton jrb = (JRadioButton) widgets[0][0];
+    jrb.doClick();
+    setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
+    JScrollPane jsp = new JScrollPane(jp);
+    jsp.setBorder(null);
+    add(jsp, "grow");
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+   */
+  @Override
+  public void actionPerformed(ActionEvent e) {
+    int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) e.getSource());
+    data.put(Variable.REMOVE, djs.get(row));
+    setProblem(null);
+  }
+
+  /* (non-Javadoc)
+   * @see org.qdwizard.Screen#getDescription()
+   */
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.40");
+  }
+
+  /* (non-Javadoc)
+   * @see org.qdwizard.Screen#getName()
+   */
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.51");
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/TransitionsScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/TransitionsScreen.java
new file mode 100644
index 0000000..a994641
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/TransitionsScreen.java
@@ -0,0 +1,308 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.base.Genre;
+import org.jajuk.base.GenreManager;
+import org.jajuk.services.dj.Ambience;
+import org.jajuk.services.dj.Transition;
+import org.jajuk.services.dj.TransitionDigitalDJ;
+import org.jajuk.ui.helpers.FontManager;
+import org.jajuk.ui.helpers.FontManager.JajukFont;
+import org.jajuk.ui.wizard.GenresSelectionDialog;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.qdwizard.Screen;
+
+/**
+ * Transitions panel.
+ */
+public class TransitionsScreen extends Screen {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** All dynamic widgets. */
+  JComponent[][] widgets;
+  /** Transitions*. */
+  List<Transition> alTransitions;
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.52");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.20");
+  }
+
+  /**
+   * Gets the cleaned transitions.
+   * 
+   * @return Filled transitions only
+   */
+  private List<Transition> getCleanedTransitions() {
+    List<Transition> out = new ArrayList<Transition>(alTransitions.size());
+    for (Transition transition : alTransitions) {
+      if (transition.getFrom() != null && transition.getTo() != null
+          && transition.getFrom().getGenres().size() > 0
+          && transition.getTo().getGenres().size() > 0) {
+        out.add(transition);
+      }
+    }
+    return out;
+  }
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  @SuppressWarnings("unchecked")
+  public void initUI() {
+    if (ActionSelectionScreen.ACTION_CHANGE.equals(data.get(Variable.ACTION))) {
+      TransitionDigitalDJ dj = (TransitionDigitalDJ) data.get(Variable.CHANGE);
+      alTransitions = (List<Transition>) ((ArrayList<Transition>) dj.getTransitions()).clone();
+      data.put(Variable.TRANSITIONS, getCleanedTransitions());
+      // add a void transition
+      alTransitions.add(new Transition(Const.DEFAULT_TRANSITION_TRACK_NUMBER));
+    } else { // DJ creation
+      alTransitions = new ArrayList<Transition>(10);
+      // add a void transition
+      alTransitions.add(new Transition(Const.DEFAULT_TRANSITION_TRACK_NUMBER));
+      setProblem(Messages.getString("DigitalDJWizard.26"));
+    }
+    setCanFinish(true);
+    // set layout
+    setLayout(new MigLayout("insets 10,gapx 5", "[grow]"));
+    add(getTransitionsPanel(), "grow");
+  }
+
+  /**
+   * Gets the transitions panel.
+   * 
+   * @return a panel containing all transitions
+   */
+  private JScrollPane getTransitionsPanel() {
+    widgets = new JComponent[alTransitions.size()][4];
+    JPanel out = new JPanel();
+    // Delete|FROM list| To list|nb tracks
+    // now add all known transitions
+    for (int index = 0; index < alTransitions.size(); index++) {
+      // Delete button
+      JButton jbDelete = new JButton(IconLoader.getIcon(JajukIcons.DELETE));
+      jbDelete.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(ActionEvent ae) {
+          alTransitions.remove(DigitalDJWizard.getWidgetIndex(widgets, (JComponent) ae.getSource()));
+          refreshScreen();
+          data.put(Variable.TRANSITIONS, getCleanedTransitions());
+        }
+      });
+      // cannot delete if void selection
+      if (alTransitions.size() == 1) {
+        jbDelete.setEnabled(false);
+      }
+      jbDelete.setToolTipText(Messages.getString("DigitalDJWizard.21"));
+      widgets[index][0] = jbDelete;
+      // From genre list
+      JButton jbFrom = new JButton(IconLoader.getIcon(JajukIcons.LIST));
+      Transition transition = alTransitions.get(index);
+      if (transition.getFrom().getGenres().size() > 0) {
+        jbFrom.setText(transition.getFromString());
+        jbFrom.setToolTipText(transition.getFromString());
+      }
+      jbFrom.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(ActionEvent ae) {
+          int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) ae.getSource());
+          addGenre(row, true);
+        }
+      });
+      jbFrom.setToolTipText(Messages.getString("DigitalDJWizard.22"));
+      widgets[index][1] = jbFrom;
+      // To genre list
+      JButton jbTo = new JButton(IconLoader.getIcon(JajukIcons.LIST));
+      if (transition.getTo().getGenres().size() > 0) {
+        jbTo.setText(transition.getToString());
+        jbTo.setToolTipText(transition.getToString());
+      }
+      jbTo.addActionListener(new ActionListener() {
+        @Override
+        public void actionPerformed(ActionEvent ae) {
+          int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) ae.getSource());
+          addGenre(row, false);
+        }
+      });
+      jbTo.setToolTipText(Messages.getString("DigitalDJWizard.23"));
+      widgets[index][2] = jbTo;
+      // Nb of tracks
+      JSpinner jsNb = new JSpinner(new SpinnerNumberModel(transition.getNbTracks(), 1, 10, 1));
+      jsNb.addChangeListener(new ChangeListener() {
+        @Override
+        public void stateChanged(ChangeEvent ce) {
+          int row = DigitalDJWizard.getWidgetIndex(widgets, (JComponent) ce.getSource());
+          int nb = Integer.parseInt(((JSpinner) ce.getSource()).getValue().toString());
+          Transition transition = alTransitions.get(row);
+          transition.setNb(nb);
+        }
+      });
+      jsNb.setToolTipText(Messages.getString("DigitalDJWizard.24"));
+      widgets[index][3] = jsNb;
+    }
+    // Create layout
+    out.setLayout(new MigLayout("insets 5,gapx 10,gapy 10", "[][270!][270!][]"));
+    // Create header
+    JLabel jlHeader2 = new JLabel(Messages.getString("DigitalDJWizard.22"));
+    jlHeader2.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+    JLabel jlHeader3 = new JLabel(Messages.getString("DigitalDJWizard.23"));
+    jlHeader3.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+    JLabel jlHeader4 = new JLabel(Messages.getString("DigitalDJWizard.24"));
+    jlHeader4.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
+    out.add(jlHeader2, "cell 1 0, center");
+    out.add(jlHeader3, "cell 2 0,center");
+    out.add(jlHeader4, "cell 3 0,center,wrap");
+    // Add widgets
+    for (int i = 0; i < widgets.length; i++) {
+      out.add(widgets[i][0]);
+      out.add(widgets[i][1], "grow,width ::270");
+      out.add(widgets[i][2], "grow,width ::270");
+      out.add(widgets[i][3], "grow,center,wrap");
+    }
+    JScrollPane jsp = new JScrollPane(out);
+    jsp.setBorder(null);
+    return jsp;
+  }
+
+  /**
+   * Add a genre to a transition.
+   * 
+   * @param row row
+   * @param bFrom is it a from button ?
+   */
+  private void addGenre(int row, boolean bFrom) {
+    synchronized (GenreManager.getInstance()) {
+      Transition transition = alTransitions.get(row);
+      // create list of genres used in existing transitions
+      Set<Genre> disabledGenres = new HashSet<Genre>();
+      for (int i = 0; i < alTransitions.size(); i++) {
+        Transition t = alTransitions.get(i);
+        // ignore all genres expect those from current button
+        if (bFrom && i != row) {
+          disabledGenres.addAll(t.getFrom().getGenres());
+        }
+      }
+      GenresSelectionDialog dialog = new GenresSelectionDialog(disabledGenres);
+      if (bFrom) {
+        dialog.setSelection(transition.getFrom().getGenres());
+      } else {
+        dialog.setSelection(transition.getTo().getGenres());
+      }
+      dialog.setVisible(true);
+      Set<Genre> genres = dialog.getSelectedGenres();
+      // check if at least one genre has been selected
+      if (genres.size() == 0) {
+        return;
+      }
+      String sText = "";
+      for (Genre genre : genres) {
+        sText += genre.getName2() + ',';
+      }
+      sText = sText.substring(0, sText.length() - 1);
+      int nb = Integer.parseInt(((JSpinner) widgets[row][3]).getValue().toString());
+      // Set button text
+      if (bFrom) {
+        ((JButton) widgets[row][1]).setText(sText);
+      } else {
+        ((JButton) widgets[row][2]).setText(sText);
+      }
+      // set selected genre in transition object
+      if (bFrom) {
+        transition.setFrom(new Ambience(Long.toString(System.currentTimeMillis()), "", genres));
+      } else {
+        transition.setTo(new Ambience(Long.toString(System.currentTimeMillis()), "", genres));
+      }
+      // check if the transaction is fully selected now
+      if (transition.getFrom().getGenres().size() > 0 && transition.getTo().getGenres().size() > 0) {
+        // Make sure current delete button is now enabled
+        ((JButton) widgets[row][0]).setEnabled(true);
+        // Reset wizard error message
+        setProblem(null);
+        // Fill wizard data
+        data.put(Variable.TRANSITIONS, getCleanedTransitions());
+        // create a new void proportion if needed
+        if (!containsVoidItem()) {
+          // we duplicate the nb for new row
+          alTransitions.add(new Transition(nb));
+        }
+        // Refresh screen to add a new void row
+        refreshScreen();
+      }
+    }
+  }
+
+  /**
+   * Contains void item.
+   * 
+   * @return whether a void item already exist (used to avoid creating several
+   * void items)
+   */
+  private boolean containsVoidItem() {
+    for (JComponent[] element : widgets) {
+      JButton jbFrom = (JButton) element[1];
+      JButton jbTo = (JButton) element[2];
+      if (jbFrom.getText().equals("") || jbTo.getText().equals("")) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Refresh panel.
+   */
+  private void refreshScreen() {
+    removeAll();
+    // refresh panel
+    add(getTransitionsPanel(), "grow");
+    revalidate();
+    repaint();
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/digital_dj/TypeSelectionScreen.java b/src/main/java/org/jajuk/ui/wizard/digital_dj/TypeSelectionScreen.java
new file mode 100644
index 0000000..aa9ee29
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/digital_dj/TypeSelectionScreen.java
@@ -0,0 +1,96 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.digital_dj;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JRadioButton;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.services.dj.AmbienceManager;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard.Variable;
+import org.jajuk.util.Messages;
+import org.qdwizard.Screen;
+
+/**
+ * DJ type choice.
+ */
+public class TypeSelectionScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** Transition DJ code. */
+  static final String DJ_TYPE_TRANSITION = "0";
+  /** Proportions DJ code. */
+  static final String DJ_TYPE_PROPORTION = "1";
+  /** Ambience DJ code. */
+  static final String DJ_TYPE_AMBIENCE = "2";
+  ButtonGroup bgTypes;
+  JRadioButton jrbTransitions;
+  JRadioButton jrbProp;
+  JRadioButton jrbAmbiance;
+
+  /**
+   * Create panel UI.
+   */
+  @Override
+  public void initUI() {
+    setLayout(new MigLayout("insets 10,gapx 10,gapy 15"));
+    bgTypes = new ButtonGroup();
+    jrbTransitions = new JRadioButton(Messages.getString("DigitalDJWizard.1"));
+    jrbTransitions.addActionListener(this);
+    jrbTransitions.doClick(); // default selection
+    jrbProp = new JRadioButton(Messages.getString("DigitalDJWizard.2"));
+    jrbProp.addActionListener(this);
+    jrbAmbiance = new JRadioButton(Messages.getString("DigitalDJWizard.3"));
+    jrbAmbiance.addActionListener(this);
+    // can select ambience DJ only if at least one ambience defined
+    jrbAmbiance.setEnabled(AmbienceManager.getInstance().getAmbiences().size() > 0);
+    bgTypes.add(jrbProp);
+    bgTypes.add(jrbTransitions);
+    bgTypes.add(jrbAmbiance);
+    add(jrbTransitions, "left,wrap");
+    add(jrbProp, "left,wrap");
+    add(jrbAmbiance, "left,wrap");
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent e) {
+    if (e.getSource() == jrbTransitions) {
+      data.put(Variable.DJ_TYPE, DJ_TYPE_TRANSITION);
+    } else if (e.getSource() == jrbProp) {
+      data.put(Variable.DJ_TYPE, DJ_TYPE_PROPORTION);
+    } else if (e.getSource() == jrbAmbiance) {
+      data.put(Variable.DJ_TYPE, DJ_TYPE_AMBIENCE);
+    }
+  }
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("DigitalDJWizard.0");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("DigitalDJWizard.46");
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/PreparePartyConvertSettings.java b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyConvertSettings.java
similarity index 90%
rename from src/main/java/org/jajuk/ui/wizard/PreparePartyConvertSettings.java
rename to src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyConvertSettings.java
index d41405a..f619efa 100644
--- a/src/main/java/org/jajuk/ui/wizard/PreparePartyConvertSettings.java
+++ b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyConvertSettings.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,10 +16,9 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
-package org.jajuk.ui.wizard;
+package org.jajuk.ui.wizard.prepare_party;
 
 import java.awt.Frame;
 import java.awt.event.ActionEvent;
@@ -37,20 +36,15 @@ import org.jajuk.ui.widgets.OKCancelPanel;
 import org.jajuk.util.Messages;
 
 /**
- * Simple device creation wizard that creates a directory device given a
- * directory.
+ * Inner dialog of prepare party wizard used to configure PACPL (format converter)s
  */
 public class PreparePartyConvertSettings extends JajukJDialog implements ActionListener {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Listener which is informed about changes to the settings. */
   ChangeListener listener;
-
   /** Text field for the input of the command. */
   JTextField jtfPACPLCommand;
-
   /** OK/Cancel buttons. */
   OKCancelPanel okp;
 
@@ -63,35 +57,25 @@ public class PreparePartyConvertSettings extends JajukJDialog implements ActionL
    */
   public PreparePartyConvertSettings(ChangeListener listener, String command, Frame parent) {
     super(parent, true);
-
     setLocationRelativeTo(parent);
-
     this.listener = listener;
-
     setTitle(Messages.getString("PreparePartyWizard.38"));
     setAlwaysOnTop(true);
-
     okp = new OKCancelPanel(this);
     jtfPACPLCommand = new JTextField(command);
     // select all
     jtfPACPLCommand.setSelectionStart(0);
     jtfPACPLCommand.setSelectionEnd(command.length());
-
     // Add items
     setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[]"));
-
     add(new JLabel(Messages.getString("PreparePartyWizard.39")), "wrap");
     add(jtfPACPLCommand, "grow,wrap");
     add(okp, "wrap");
-
     getRootPane().setDefaultButton(okp.getOKButton());
     pack();
     setVisible(true);
   }
 
-  /* (non-Javadoc)
-   * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-   */
   @Override
   public void actionPerformed(final ActionEvent e) {
     if (e.getSource() == okp.getCancelButton()) {
@@ -100,7 +84,6 @@ public class PreparePartyConvertSettings extends JajukJDialog implements ActionL
     if (e.getSource() == okp.getOKButton()) {
       // inform the caller about the new value
       listener.stateChanged(new ChangeEvent(jtfPACPLCommand.getText()));
-
       // exit
       dispose();
     }
diff --git a/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizard.java b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizard.java
new file mode 100644
index 0000000..3327292
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizard.java
@@ -0,0 +1,421 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.wizard.prepare_party;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.commons.lang.StringUtils;
+import org.jajuk.base.Playlist;
+import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.LocaleManager;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilPrepareParty;
+import org.jajuk.util.error.JajukException;
+import org.jajuk.util.log.Log;
+import org.qdwizard.Screen;
+import org.qdwizard.Wizard;
+
+/**
+ * Wizard to select a set of files and write them to a separate directory
+ * outside of the collection in order to use them in a MP3 device or any other
+ * media player.
+ * 
+ * TODO: progress bar is not done yet
+ * 
+ * TODO: a "cancel" button in the progress bar would be nice to let the user
+ * cancel if he finds out that too many were selected
+ */
+public class PreparePartyWizard extends Wizard {
+  /** Wizard data*/
+  enum Variable {
+    /** Which source to use for the tracks. */
+    MODE,
+    /** Which item was selected in the first page of the wizard. */
+    ITEM,
+    /** Where to put the files. */
+    DEST_PATH,
+    /** Whether there is a track number max */
+    MAXTRACKS_ENABLED,
+    /** Key for max. number of track */
+    MAXTRACKS,
+    /** Whether there is a size max. */
+    MAXSIZE_ENABLED,
+    /** Key for max. size of party */
+    MAXSIZE,
+    /** Whether there is a length max.*/
+    MAXLENGTH_ENABLED,
+    /** Key for max length of party. */
+    MAXLENGTH,
+    /** Whether we limit conversion to one format. */
+    ONE_MEDIA_ENABLED,
+    /** Key for limit to one audio type. */
+    ONE_MEDIA,
+    /** Key for audio type conversion. */
+    CONVERT_MEDIA,
+    /** Key for the command to use for audio conversion. */
+    CONVERT_COMMAND,
+    /** Used to enable replacing characters outside the normal range. */
+    NORMALIZE_FILENAME,
+    /** Ratings level. */
+    RATING_LEVEL,
+    /** store a temporary playlist that is provided by the PlaylistView without storing it in the PlaylistManager we keep it 
+     * here to be able to re-display it in the Pages later on  
+     * We need to keep it outside the ActionSelectionPanel because the panel is re-created during back-forward operations. */
+    TEMP_PLAYLIST
+  }
+
+  /**
+   * The source of the Party.
+   */
+  enum Mode {
+    /** Use one of the available DJs. */
+    DJ,
+    /** Use one of hte available Ambiences. */
+    Ambience,
+    /** Use random tracks from all available track. */
+    Shuffle,
+    /** Use a playlist. */
+    Playlist,
+    /** Use songs from the BestOf list. */
+    BestOf,
+    /** Use songs from the Novelties list. */
+    Novelties,
+    /** Use songs from the current play queue. */
+    Queue,
+    /** Use the available bookmarks. */
+    Bookmarks,
+    /** Special mode for when the dialog is invoked with a newly created playlist. */
+    ProvidedPlaylist
+  }
+
+  /**
+   * Default constructor that lets the user choose where the tracks are taken
+   * from.
+   * 
+   * @param bProvidedPlaylist Indicates that a playlist was provided to the dialog and thus the
+   * first page is not displayed
+   */
+  public PreparePartyWizard(boolean bProvidedPlaylist, Playlist playlist) {
+    super(new Wizard.Builder(Messages.getString("PreparePartyWizard.1"),
+        bProvidedPlaylist ? PreparePartyWizardGeneralOptionsScreen.class
+            : PreparePartyWizardActionSelectionScreen.class, JajukMainWindow.getInstance())
+        .hSize(800).vSize(550).locale(LocaleManager.getLocale())
+        .icon(IconLoader.getIcon(JajukIcons.PREPARE_PARTY_32X32)));
+    if (playlist != null) {
+      setPlaylist(playlist);
+    }
+    restoreProperties();
+  }
+
+  /**
+   * Set the provided playlist so that the first page can be skipped if wanted.
+   * 
+   * This needs to be done as static method as the Wizard-constructor already
+   * needs to have this data available!
+   * 
+   * @param playlist The playlist to use for the party
+   */
+  public void setPlaylist(Playlist playlist) {
+    // store playlist and the mode that we are now having
+    data.put(Variable.TEMP_PLAYLIST, playlist);
+    // store the mode and the playlist in the data as well
+    data.put(Variable.MODE, Mode.ProvidedPlaylist);
+    data.put(Variable.ITEM, playlist.getName());
+  }
+
+  @Override
+  public void finish() {
+    // write properties to keep the selected directory
+    storeProperties();
+    // retrieve the full list of files according to the selected mode
+    List<org.jajuk.base.File> files = getFiles();
+    if (files == null) {
+      return;
+    }
+    // define the target directory
+    final Date curDate = new Date();
+    // Do not use ':' character in destination directory, it's
+    // forbidden under Windows
+    final SimpleDateFormat stamp = new SimpleDateFormat("yyyyMMdd-HHmm", Locale.getDefault());
+    final String dirName = "Party-" + stamp.format(curDate);
+    final java.io.File destDir = new java.io.File(((String) data.get(Variable.DEST_PATH)), dirName);
+    if (!destDir.mkdir()) {
+      Log.warn("Could not create destination directory " + destDir);
+    }
+    Log.debug("Going to copy " + files.size() + " files to directory {{"
+        + destDir.getAbsolutePath() + "}}");
+    // perform the actual copying
+    UtilPrepareParty.copyFiles(files, destDir, isTrue(Variable.NORMALIZE_FILENAME),
+        isTrue(Variable.ONE_MEDIA_ENABLED) && isTrue(Variable.CONVERT_MEDIA),
+        (String) data.get(Variable.ONE_MEDIA), (String) data.get(Variable.CONVERT_COMMAND));
+  }
+
+  /**
+   * Return if the specified element is true in the data-map.
+   * 
+   * @param key The key to look up in the data-object.
+   * 
+   * @return true if the value was stored as boolean true, false otherwise.
+   */
+  private final boolean isTrue(final Variable key) {
+    return data.containsKey(key) && Boolean.TRUE.equals(data.get(key));
+  }
+
+  /**
+   * Gets the list of files to copy depending on the current mode.
+   * 
+   * @return the files
+   */
+  private List<org.jajuk.base.File> getFiles() {
+    List<org.jajuk.base.File> files;
+    if (Mode.DJ.equals(data.get(Variable.MODE))) {
+      files = UtilPrepareParty.getDJFiles((String) data.get(Variable.ITEM));
+    } else if (Mode.Ambience.equals(data.get(Variable.MODE))) {
+      files = UtilPrepareParty.getAmbienceFiles((String) data.get(Variable.ITEM));
+    } else if (Mode.Playlist.equals(data.get(Variable.MODE))
+        || Mode.ProvidedPlaylist.equals(data.get(Variable.MODE))) {
+      try {
+        Playlist tempPlaylist = (Playlist) data.get(Variable.TEMP_PLAYLIST);
+        files = UtilPrepareParty.getPlaylistFiles((String) data.get(Variable.ITEM), tempPlaylist);
+      } catch (JajukException e1) {
+        Log.error(e1);
+        return null;
+      }
+    } else if (Mode.Shuffle.equals(data.get(Variable.MODE))) {
+      files = UtilPrepareParty.getShuffleFiles();
+    } else if (Mode.BestOf.equals(data.get(Variable.MODE))) {
+      try {
+        files = UtilPrepareParty.getBestOfFiles();
+      } catch (JajukException e1) {
+        Log.error(e1);
+        return null;
+      }
+    } else if (Mode.Queue.equals(data.get(Variable.MODE))) {
+      try {
+        files = UtilPrepareParty.getQueueFiles();
+      } catch (JajukException e1) {
+        Log.error(e1);
+        return null;
+      }
+    } else if (Mode.Bookmarks.equals(data.get(Variable.MODE))) {
+      try {
+        files = UtilPrepareParty.getBookmarkFiles();
+      } catch (JajukException e1) {
+        Log.error(e1);
+        return null;
+      }
+    } else if (Mode.Novelties.equals(data.get(Variable.MODE))) {
+      try {
+        files = UtilPrepareParty.getNoveltiesFiles();
+      } catch (JajukException e1) {
+        Log.error(e1);
+        return null;
+      }
+    } else {
+      throw new IllegalArgumentException("Unknown mode in PreparePartyWizard: "
+          + data.get(Variable.MODE));
+    }
+    // filter by media first
+    if (isTrue(Variable.ONE_MEDIA_ENABLED) && !isTrue(Variable.CONVERT_MEDIA)) {
+      files = UtilPrepareParty.filterMedia(files, (String) data.get(Variable.ONE_MEDIA));
+    }
+    // then filter out by rating
+    if (data.containsKey(Variable.RATING_LEVEL)) {
+      files = UtilPrepareParty.filterRating(files, (Integer) data.get(Variable.RATING_LEVEL));
+    }
+    // filter max length
+    if (isTrue(Variable.MAXLENGTH_ENABLED)) {
+      files = UtilPrepareParty.filterMaxLength(files, (Integer) data.get(Variable.MAXLENGTH));
+    }
+    // filter max size
+    if (isTrue(Variable.MAXSIZE_ENABLED)) {
+      files = UtilPrepareParty.filterMaxSize(files, (Integer) data.get(Variable.MAXSIZE));
+    }
+    // filter max tracks
+    if (isTrue(Variable.MAXTRACKS_ENABLED)) {
+      files = UtilPrepareParty.filterMaxTracks(files, (Integer) data.get(Variable.MAXTRACKS));
+    }
+    return files;
+  }
+
+  /**
+   * Stores all the values that are stored in the data-map to the Conf-system.
+   */
+  private void storeProperties() {
+    storeValue(Variable.MODE);
+    storeValue(Variable.ITEM);
+    storeValue(Variable.DEST_PATH);
+    storeValue(Variable.MAXTRACKS_ENABLED);
+    storeValue(Variable.MAXTRACKS);
+    storeValue(Variable.MAXSIZE_ENABLED);
+    storeValue(Variable.MAXSIZE);
+    storeValue(Variable.MAXLENGTH_ENABLED);
+    storeValue(Variable.MAXLENGTH);
+    storeValue(Variable.ONE_MEDIA_ENABLED);
+    storeValue(Variable.ONE_MEDIA);
+    storeValue(Variable.CONVERT_MEDIA);
+    storeValue(Variable.CONVERT_COMMAND);
+    storeValue(Variable.NORMALIZE_FILENAME);
+    storeValue(Variable.RATING_LEVEL);
+  }
+
+  /**
+   * Store one value as String.
+   * 
+   * @param key The name of the property to store in the overall configuration
+   */
+  private void storeValue(final Variable key) {
+    // nothing to do?
+    if (data.get(key) == null) {
+      return;
+    }
+    Conf.setProperty(Const.CONF_PREPARE_PARTY + key, data.get(key).toString());
+  }
+
+  /**
+   * Restore all the values that are potentially stored in the configuration
+   * system.
+   */
+  private void restoreProperties() {
+    restoreModeAndItemValue();
+    restoreStringValue(Variable.DEST_PATH);
+    restoreBooleanValue(Variable.MAXTRACKS_ENABLED);
+    restoreIntValue(Variable.MAXTRACKS);
+    restoreBooleanValue(Variable.MAXSIZE_ENABLED);
+    restoreIntValue(Variable.MAXSIZE);
+    restoreBooleanValue(Variable.MAXLENGTH_ENABLED);
+    restoreIntValue(Variable.MAXLENGTH);
+    restoreBooleanValue(Variable.ONE_MEDIA_ENABLED);
+    restoreStringValue(Variable.ONE_MEDIA);
+    restoreBooleanValue(Variable.CONVERT_MEDIA);
+    restoreStringValue(Variable.CONVERT_COMMAND);
+    if (StringUtils.isBlank((String) data.get(Variable.CONVERT_COMMAND))) {
+      data.put(Variable.CONVERT_COMMAND, "pacpl"); // use default value if none set
+      // yet
+    }
+    restoreBooleanValue(Variable.NORMALIZE_FILENAME);
+    restoreIntValue(Variable.RATING_LEVEL);
+  }
+
+  /**
+   * Restore one string value from the configuration.
+   * 
+   * @param key The key to restore.
+   */
+  private void restoreStringValue(final Variable key) {
+    String sValue = Conf.getString(Const.CONF_PREPARE_PARTY + key);
+    // nothing to do if not set
+    if (sValue == null) {
+      return;
+    }
+    data.put(key, sValue);
+  }
+
+  /**
+   * Restore one integer value from the configuration.
+   * 
+   * @param key The key to restore.
+   */
+  private void restoreIntValue(final Variable key) {
+    // do nothing if not available yet
+    if (Conf.getString(Const.CONF_PREPARE_PARTY + key) == null) {
+      return;
+    }
+    data.put(key, Conf.getInt(Const.CONF_PREPARE_PARTY + key));
+  }
+
+  /**
+   * Restore one boolean value from the configuration.
+   * 
+   * @param key The key to restore.
+   */
+  private void restoreBooleanValue(final Variable key) {
+    // do nothing if not available yet
+    if (Conf.getString(Const.CONF_PREPARE_PARTY + key) == null) {
+      return;
+    }
+    data.put(key, Conf.getBoolean(Const.CONF_PREPARE_PARTY + key));
+  }
+
+  /**
+   * Restore mode and item values, they may require some special handling.
+   */
+  private void restoreModeAndItemValue() {
+    String sMode = Conf.getString(Const.CONF_PREPARE_PARTY + Variable.MODE);
+    // nothing to do if not set
+    if (sMode == null) {
+      return;
+    }
+    try {
+      data.put(Variable.MODE, Mode.valueOf(sMode));
+    } catch (IllegalArgumentException e) {
+      Log.warn("Could not convert mode: " + sMode + ", using default mode: " + Mode.DJ);
+      data.put(Variable.MODE, Mode.DJ);
+    }
+    switch ((Mode) data.get(Variable.MODE)) {
+    // restore the value for the ones where we have a selection
+    case Ambience:
+    case DJ:
+    case Playlist:
+      data.put(Variable.ITEM, Conf.getString(Const.CONF_PREPARE_PARTY + Variable.ITEM));
+      break;
+    // nothing to do
+    case BestOf:
+    case Bookmarks:
+    case Shuffle:
+    case Novelties:
+    case Queue:
+      // we usually are not able to restore this, therefore don't do anything
+    case ProvidedPlaylist:
+    default:
+      break;
+    }
+  }
+
+  @Override
+  public Class<? extends Screen> getNextScreen(Class<? extends Screen> screen) {
+    if (PreparePartyWizardActionSelectionScreen.class.equals(screen)) {
+      return PreparePartyWizardGeneralOptionsScreen.class;
+    } else if (PreparePartyWizardGeneralOptionsScreen.class.equals(screen)) {
+      return PreparePartyWizardPathSelectionScreen.class;
+    }
+    return null;
+  }
+
+  @Override
+  public Class<? extends Screen> getPreviousScreen(Class<? extends Screen> screen) {
+    // there is no "back" if we got a playlist passed in
+    if (PreparePartyWizardGeneralOptionsScreen.class.equals(screen)
+        && !Mode.ProvidedPlaylist.equals(data.get(Variable.MODE))) {
+      return PreparePartyWizardActionSelectionScreen.class;
+    } else if (PreparePartyWizardPathSelectionScreen.class.equals(screen)) {
+      return PreparePartyWizardGeneralOptionsScreen.class;
+    }
+    return null;
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardActionSelectionScreen.java b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardActionSelectionScreen.java
new file mode 100644
index 0000000..687898f
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardActionSelectionScreen.java
@@ -0,0 +1,296 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.prepare_party;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JComboBox;
+import javax.swing.JRadioButton;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.base.Playlist;
+import org.jajuk.base.PlaylistManager;
+import org.jajuk.services.bookmark.Bookmarks;
+import org.jajuk.services.dj.Ambience;
+import org.jajuk.services.dj.AmbienceManager;
+import org.jajuk.services.dj.DigitalDJ;
+import org.jajuk.services.dj.DigitalDJManager;
+import org.jajuk.services.players.QueueModel;
+import org.jajuk.ui.wizard.prepare_party.PreparePartyWizard.Mode;
+import org.jajuk.ui.wizard.prepare_party.PreparePartyWizard.Variable;
+import org.jajuk.util.Messages;
+import org.qdwizard.ClearPoint;
+import org.qdwizard.Screen;
+
+/**
+ * First Panel of the Wizard, it shows a selection of sources where the user can choose one, e.g. DJs, Ambiences, ...
+ */
+ at ClearPoint
+public class PreparePartyWizardActionSelectionScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = -6981770030816500259L;
+  /** The group for the various sources. */
+  private ButtonGroup bgActions;
+  /** DJ. */
+  private JRadioButton jrbDJ;
+  /** DJ. */
+  @SuppressWarnings("rawtypes")
+  private JComboBox jcbDJ;
+  /** Ambience. */
+  private JRadioButton jrbAmbience;
+  /** Ambience. */
+  @SuppressWarnings("rawtypes")
+  private JComboBox jcbAmbience;
+  /** Playlist. */
+  private JRadioButton jrbPlaylist;
+  /** Playlist. */
+  @SuppressWarnings("rawtypes")
+  private JComboBox jcbPlaylist;
+  /** Shuffle. */
+  private JRadioButton jrbShuffle;
+  /** Shuffle. */
+  private JRadioButton jrbBestOf;
+  /** Novelties. */
+  private JRadioButton jrbNovelties;
+  /** Queue. */
+  private JRadioButton jrbQueue;
+  /** Bookmarks. */
+  private JRadioButton jrbBookmark;
+
+  /**
+   * Create panel UI.
+   */
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Override
+  public void initUI() {
+    bgActions = new ButtonGroup();
+    jrbDJ = new JRadioButton(Messages.getString("PreparePartyWizard.6"));
+    jrbDJ.addActionListener(this);
+    // populate DJs
+    List<DigitalDJ> djs = DigitalDJManager.getInstance().getDJsSorted();
+    jcbDJ = new JComboBox();
+    for (DigitalDJ dj : djs) {
+      jcbDJ.addItem(dj.getName());
+    }
+    jcbDJ.addActionListener(this);
+    jrbAmbience = new JRadioButton(Messages.getString("PreparePartyWizard.7"));
+    jrbAmbience.addActionListener(this);
+    List<Ambience> ambiences = AmbienceManager.getInstance().getAmbiences();
+    jcbAmbience = new JComboBox();
+    for (Ambience amb : ambiences) {
+      jcbAmbience.addItem(amb.getName());
+    }
+    jcbAmbience.addActionListener(this);
+    jrbPlaylist = new JRadioButton(Messages.getString("PreparePartyWizard.8"));
+    jrbPlaylist.addActionListener(this);
+    jcbPlaylist = new JComboBox();
+    Playlist tempPlaylist = (Playlist) data.get(Variable.TEMP_PLAYLIST);
+    if (tempPlaylist != null) {
+      // check if this is a "temporary" playlist that is provided by the
+      // PlaylistView (i.e. not yet stored in PlaylistManager)
+      jcbPlaylist.addItem(tempPlaylist.getName());
+    }
+    List<Playlist> playlists = PlaylistManager.getInstance().getPlaylists();
+    for (Playlist pl : playlists) {
+      jcbPlaylist.addItem(pl.getName());
+    }
+    jcbPlaylist.addActionListener(this);
+    jrbShuffle = new JRadioButton(Messages.getString("PreparePartyWizard.9"));
+    jrbShuffle.addActionListener(this);
+    jrbBestOf = new JRadioButton(Messages.getString("PreparePartyWizard.24"));
+    jrbBestOf.addActionListener(this);
+    jrbNovelties = new JRadioButton(Messages.getString("PreparePartyWizard.25"));
+    jrbNovelties.addActionListener(this);
+    jrbQueue = new JRadioButton(Messages.getString("PreparePartyWizard.32"));
+    jrbQueue.addActionListener(this);
+    jrbBookmark = new JRadioButton(Messages.getString("PreparePartyWizard.33"));
+    jrbBookmark.addActionListener(this);
+    bgActions.add(jrbDJ);
+    bgActions.add(jrbAmbience);
+    bgActions.add(jrbPlaylist);
+    bgActions.add(jrbBestOf);
+    bgActions.add(jrbNovelties);
+    bgActions.add(jrbQueue);
+    bgActions.add(jrbBookmark);
+    bgActions.add(jrbShuffle);
+    // populate items from the stored static data
+    readData();
+    // populate the screen
+    setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
+    add(jrbDJ, "left");
+    add(jcbDJ, "grow,wrap");
+    add(jrbAmbience, "left");
+    add(jcbAmbience, "grow,wrap");
+    add(jrbPlaylist, "left");
+    add(jcbPlaylist, "grow,wrap");
+    add(jrbBestOf, "left,wrap");
+    add(jrbNovelties, "left,wrap");
+    add(jrbQueue, "left,wrap");
+    add(jrbBookmark, "left,wrap");
+    add(jrbShuffle, "left,wrap");
+    // store initial values, done here as well to have them stored if "next"
+    // is pressed immediately
+    // and there was no data stored before (an hence nothing was read in
+    // readData())
+    updateData();
+  }
+
+  /**
+   * Return if the specified element is true in the data-map.
+   * 
+   * @param key The key to look up in the data-object.
+   * 
+   * @return true if the value was stored as boolean true, false otherwise.
+   */
+  private final boolean isTrue(final Variable key) {
+    return data.containsKey(key) && Boolean.TRUE.equals(data.get(key));
+  }
+
+  /**
+   * Initialize the UI items of the panel with values from the data
+   * object.
+   */
+  private void readData() {
+    if (data.containsKey(Variable.MODE)) {
+      // read values set before
+      switch ((Mode) data.get(Variable.MODE)) {
+      case DJ:
+        bgActions.setSelected(jrbDJ.getModel(), true);
+        jcbDJ.setSelectedItem(data.get(Variable.ITEM));
+        break;
+      case Ambience:
+        bgActions.setSelected(jrbAmbience.getModel(), true);
+        jcbAmbience.setSelectedItem(data.get(Variable.ITEM));
+        break;
+      case Playlist:
+      case ProvidedPlaylist: // we did a "PrepareParty" from a Playlist
+        // before, in this case show the Playlist again
+        // here
+        bgActions.setSelected(jrbPlaylist.getModel(), true);
+        jcbPlaylist.setSelectedItem(data.get(Variable.ITEM));
+        break;
+      case Shuffle:
+        bgActions.setSelected(jrbShuffle.getModel(), true);
+        // no combo box for shuffle...
+        break;
+      case BestOf:
+        bgActions.setSelected(jrbBestOf.getModel(), true);
+        // no combo box for bestof...
+        break;
+      case Novelties:
+        bgActions.setSelected(jrbNovelties.getModel(), true);
+        // no combo box for novelties...
+        break;
+      case Queue:
+        bgActions.setSelected(jrbQueue.getModel(), true);
+        // no combo box for queue...
+        break;
+      case Bookmarks:
+        bgActions.setSelected(jrbBookmark.getModel(), true);
+        // no combo box for bookmarks...
+        break;
+      default:
+        throw new IllegalArgumentException("Unexpected value in switch!");
+      }
+    } else {
+      // no values set yet, select a useful radio button at least
+      // select Ambience as default selection if there is no DJ available
+      if (jcbDJ.getItemCount() == 0) {
+        bgActions.setSelected(jrbAmbience.getModel(), true);
+      } else {
+        // otherwise select DJ as default option
+        bgActions.setSelected(jrbDJ.getModel(), true);
+      }
+    }
+    // finally disable some items if there is nothing in there
+    if (jcbDJ.getItemCount() == 0) {
+      jrbDJ.setEnabled(false);
+      jcbDJ.setEnabled(false);
+    }
+    // disable Playlist UI if there is no Playlist-Mode already selected by
+    // the incoming data...
+    if (jcbPlaylist.getItemCount() == 0
+        && !(Mode.Playlist.equals(data.get(Variable.MODE)) || Mode.ProvidedPlaylist.equals(data
+            .get(Variable.MODE)))) {
+      jrbPlaylist.setEnabled(false);
+      jcbPlaylist.setEnabled(false);
+    }
+    // check if we have queue-entries or bookmarks
+    if (QueueModel.getQueue().isEmpty()) {
+      jrbQueue.setEnabled(false);
+    }
+    if (Bookmarks.getInstance().getFiles().isEmpty()) {
+      jrbBookmark.setEnabled(false);
+    }
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent e) {
+    // Update all the values that are needed later
+    updateData();
+  }
+
+  /**
+   * Store the current values from the UI items into the data object.
+   */
+  private void updateData() {
+    // depending on the selected radio button read the combo box value and set
+    // the selected MODE
+    if (jrbDJ.isSelected()) {
+      data.put(Variable.MODE, Mode.DJ);
+      data.put(Variable.ITEM, jcbDJ.getSelectedItem());
+    } else if (jrbAmbience.isSelected()) {
+      data.put(Variable.MODE, Mode.Ambience);
+      data.put(Variable.ITEM, jcbAmbience.getSelectedItem());
+    } else if (jrbPlaylist.isSelected()) {
+      data.put(Variable.MODE, Mode.Playlist);
+      data.put(Variable.ITEM, jcbPlaylist.getSelectedItem());
+    } else if (jrbShuffle.isSelected()) {
+      data.put(Variable.MODE, Mode.Shuffle);
+      data.remove(Variable.ITEM);
+    } else if (jrbBestOf.isSelected()) {
+      data.put(Variable.MODE, Mode.BestOf);
+      data.remove(Variable.ITEM);
+    } else if (jrbNovelties.isSelected()) {
+      data.put(Variable.MODE, Mode.Novelties);
+      data.remove(Variable.ITEM);
+    } else if (jrbQueue.isSelected()) {
+      data.put(Variable.MODE, Mode.Queue);
+      data.remove(Variable.ITEM);
+    } else if (jrbBookmark.isSelected()) {
+      data.put(Variable.MODE, Mode.Bookmarks);
+      data.remove(Variable.ITEM);
+    }
+  }
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("PreparePartyWizard.3");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("PreparePartyWizard.2");
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardGeneralOptionsScreen.java b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardGeneralOptionsScreen.java
new file mode 100644
index 0000000..61b066d
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardGeneralOptionsScreen.java
@@ -0,0 +1,557 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.prepare_party;
+
+import java.awt.Desktop;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.SwingConstants;
+import javax.swing.border.BevelBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.base.Type;
+import org.jajuk.base.TypeManager;
+import org.jajuk.ui.helpers.DefaultMouseWheelListener;
+import org.jajuk.ui.windows.JajukMainWindow;
+import org.jajuk.ui.wizard.prepare_party.PreparePartyWizard.Variable;
+import org.jajuk.util.Const;
+import org.jajuk.util.Messages;
+import org.jajuk.util.UtilPrepareParty;
+import org.jajuk.util.log.Log;
+import org.qdwizard.ClearPoint;
+import org.qdwizard.Screen;
+
+/**
+ * General options panel.
+ */
+ at ClearPoint
+public class PreparePartyWizardGeneralOptionsScreen extends Screen implements ActionListener,
+    ChangeListener, MouseListener {
+  /** Constant for MigLayout. */
+  private static final String GROW = "grow";
+  /** Constant for MigLayout. */
+  private static final String GROW_TWO_COL = "[grow][]";
+  /** Constant for MigLayout. */
+  private static final String LABEL_WIDTH = "width 40:40:";
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = 1L;
+  /** Empty value. */
+  private static final String NO_VALUE = " ";
+  /** Enable limit on number of tracks. */
+  private JCheckBox jcbMaxTracks;
+  /** The max. number of tracks */
+  private JSlider jsMaxTracks;
+  /** The max. number of tracks */
+  private JLabel jnMaxTracks;
+  /** Enable limit on max size. */
+  private JCheckBox jcbMaxSize;
+  /** Max size (in MB) of party. */
+  private JSlider jsMaxSize;
+  /** Max size (in MB) of party. */
+  private JLabel jnMaxSize;
+  /** Enable limit on max playing length. */
+  private JCheckBox jcbMaxLength;
+  /** Max playing length of party (in minutes). */
+  private JSlider jsMaxLength;
+  /** Max playing length of party (in minutes). */
+  private JLabel jnMaxLength;
+  /** Enable limit on specific audio type. */
+  private JCheckBox jcbOneMedia;
+  /** Limit to one type of audo file. */
+  @SuppressWarnings("rawtypes")
+  private JComboBox jcbMedia;
+  /** Enable conversion to the selected audio type. */
+  private JCheckBox jcbConvertMedia;
+  /** Audio conversion. */
+  private JLabel jlConvertMedia;
+  /** Button to configure audio conversion. */
+  private JButton jbConvertConfig;
+  /** Limit on rate of tracks. */
+  private JLabel jlRatingLevel;
+  /** The min. number of stars a track needs to have */
+  private JSlider jsRatingLevel;
+  /** Enable normalizing filenames so they can be stored on windows fileshares. */
+  private JCheckBox jcbNormalizeFilename;
+
+  /* (non-Javadoc)
+   * @see org.qdwizard.Screen#getDescription()
+   */
+  @Override
+  public String getDescription() {
+    return Messages.getString("PreparePartyWizard.5");
+  }
+
+  /* (non-Javadoc)
+   * @see org.qdwizard.Screen#getName()
+   */
+  @Override
+  public String getName() {
+    return Messages.getString("PreparePartyWizard.4");
+  }
+
+  /**
+   * Create panel UI.
+   */
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Override
+  public void initUI() {
+    { // Max Tracks
+      jcbMaxTracks = new JCheckBox(Messages.getString("PreparePartyWizard.10"));
+      jcbMaxTracks.setToolTipText(Messages.getString("PreparePartyWizard.11"));
+      jsMaxTracks = new JSlider(0, 1000, 100);
+      jnMaxTracks = new JLabel(NO_VALUE);
+      jnMaxTracks.setBorder(new BevelBorder(BevelBorder.LOWERED));
+      jnMaxTracks.setHorizontalAlignment(SwingConstants.RIGHT);
+      jsMaxTracks.setMajorTickSpacing(100);
+      jsMaxTracks.setMinorTickSpacing(10);
+      jsMaxTracks.setPaintTicks(true);
+      jsMaxTracks.setPaintLabels(true);
+      jsMaxTracks.setToolTipText(Messages.getString("PreparePartyWizard.11"));
+    }
+    { // Max Size
+      jcbMaxSize = new JCheckBox(Messages.getString("PreparePartyWizard.12"));
+      jcbMaxSize.setToolTipText(Messages.getString("PreparePartyWizard.13"));
+      jsMaxSize = new JSlider(0, 1000, 100);
+      jnMaxSize = new JLabel(NO_VALUE);
+      jnMaxSize.setBorder(new BevelBorder(BevelBorder.LOWERED));
+      jnMaxSize.setHorizontalAlignment(SwingConstants.RIGHT);
+      jsMaxSize.setMajorTickSpacing(100);
+      jsMaxSize.setMinorTickSpacing(10);
+      jsMaxSize.setPaintTicks(true);
+      jsMaxSize.setPaintLabels(true);
+      jsMaxSize.setToolTipText(Messages.getString("PreparePartyWizard.13"));
+    }
+    { // Max Length
+      jcbMaxLength = new JCheckBox(Messages.getString("PreparePartyWizard.14"));
+      jcbMaxLength.setToolTipText(Messages.getString("PreparePartyWizard.15"));
+      jsMaxLength = new JSlider(0, 1000, 100);
+      jnMaxLength = new JLabel(NO_VALUE);
+      jnMaxLength.setBorder(new BevelBorder(BevelBorder.LOWERED));
+      jnMaxLength.setHorizontalAlignment(SwingConstants.RIGHT);
+      jsMaxLength.setMajorTickSpacing(100);
+      jsMaxLength.setMinorTickSpacing(10);
+      jsMaxLength.setPaintTicks(true);
+      jsMaxLength.setPaintLabels(true);
+      jsMaxLength.setToolTipText(Messages.getString("PreparePartyWizard.15"));
+    }
+    { // Choose Media
+      jcbOneMedia = new JCheckBox(Messages.getString("PreparePartyWizard.16"));
+      jcbOneMedia.setToolTipText(Messages.getString("PreparePartyWizard.17"));
+      jcbMedia = new JComboBox();
+      List<Type> types = TypeManager.getInstance().getTypes();
+      // sort the list on extension here
+      Collections.sort(types, new TypeComparator());
+      for (Type type : types) {
+        // exclude playlists and web-radios from selection as we cannot copy
+        // those.
+        if (!type.getExtension().equals(Const.EXT_PLAYLIST)
+            && !type.getExtension().equals(Const.EXT_RADIO)) {
+          jcbMedia.addItem(type.getExtension());
+        }
+      }
+      jcbMedia.setToolTipText(Messages.getString("PreparePartyWizard.17"));
+      jcbConvertMedia = new JCheckBox(Messages.getString("PreparePartyWizard.34"));
+      jcbConvertMedia.setToolTipText(Messages.getString("PreparePartyWizard.35"));
+      // to show help and allow clicking for viewing the related web-page
+      jlConvertMedia = new JLabel(Messages.getString("PreparePartyWizard.37"));
+      jbConvertConfig = new JButton(Messages.getString("PreparePartyWizard.40"));
+    }
+    { // Rating Level
+      jlRatingLevel = new JLabel(Messages.getString("DigitalDJWizard.8"));
+      jlRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
+      jsRatingLevel = new JSlider(0, 4, 0);
+      jsRatingLevel.setMajorTickSpacing(1);
+      jsRatingLevel.setMinorTickSpacing(1);
+      jsRatingLevel.setPaintTicks(true);
+      jsRatingLevel.setSnapToTicks(true);
+      jsRatingLevel.setPaintLabels(true);
+      jsRatingLevel.setToolTipText(Messages.getString("DigitalDJWizard.53"));
+    }
+    jcbNormalizeFilename = new JCheckBox(Messages.getString("PreparePartyWizard.26"));
+    jcbNormalizeFilename.setToolTipText(Messages.getString("PreparePartyWizard.27"));
+    // populate the UI items with values from the data object
+    readData();
+    // add listeners after reading initial data to not overwrite them with
+    // init-state-change actions
+    // enable/disable slider depending on checkbox
+    jcbMaxTracks.addActionListener(this);
+    jsMaxTracks.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxTracks));
+    jsMaxTracks.addChangeListener(this);
+    // enable/disable slider depending on checkbox
+    jcbMaxSize.addActionListener(this);
+    jsMaxSize.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxSize));
+    jsMaxSize.addChangeListener(this);
+    // enable/disable slider depending on checkbox
+    jcbMaxLength.addActionListener(this);
+    jsMaxLength.addMouseWheelListener(new DefaultMouseWheelListener(jsMaxLength));
+    jsMaxLength.addChangeListener(this);
+    // enable/disable combobox depending on checkbox
+    jcbOneMedia.addActionListener(this);
+    jcbMedia.addActionListener(this);
+    jcbConvertMedia.addActionListener(this);
+    jlConvertMedia.addMouseListener(this);
+    jbConvertConfig.addActionListener(this);
+    // get informed about rating level slider changes
+    jsRatingLevel.addMouseWheelListener(new DefaultMouseWheelListener(jsRatingLevel));
+    jsRatingLevel.addChangeListener(this);
+    jcbNormalizeFilename.addActionListener(this);
+    setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
+    add(jcbMaxTracks);
+    {
+      JPanel panel = new JPanel();
+      panel.setLayout(new MigLayout("", GROW_TWO_COL));
+      panel.add(jsMaxTracks, GROW);
+      panel.add(jnMaxTracks, LABEL_WIDTH);
+      add(panel, "grow,wrap");
+    }
+    add(jcbMaxSize);
+    {
+      JPanel panel = new JPanel();
+      panel.setLayout(new MigLayout("", GROW_TWO_COL));
+      panel.add(jsMaxSize, GROW);
+      panel.add(jnMaxSize, LABEL_WIDTH);
+      add(panel, "grow,wrap");
+    }
+    add(jcbMaxLength);
+    {
+      JPanel panel = new JPanel();
+      panel.setLayout(new MigLayout("", GROW_TWO_COL));
+      panel.add(jsMaxLength, GROW);
+      panel.add(jnMaxLength, LABEL_WIDTH);
+      add(panel, "grow,wrap");
+    }
+    add(jcbOneMedia);
+    add(jcbMedia, "grow,wrap");
+    // dummy-Label to get the CheckBox for "convert" into the second column
+    add(new JLabel());
+    add(jcbConvertMedia, "grow,wrap");
+    add(new JLabel());
+    {
+      JPanel panel = new JPanel();
+      panel.setLayout(new MigLayout("", GROW_TWO_COL));
+      panel.add(jlConvertMedia, GROW);
+      panel.add(jbConvertConfig);
+      add(panel, "grow,wrap");
+    }
+    add(jcbNormalizeFilename, "grow,wrap");
+    add(jlRatingLevel);
+    add(jsRatingLevel, "grow,wrap");
+    // store initial values and adjust values
+    updateData();
+  }
+
+  /**
+   * Populate the UI items with values from the data object.
+   */
+  private void readData() {
+    // set the values from the stored data
+    // initially these are not set, so we need to query for "containsKey"...
+    if (isTrue(Variable.MAXTRACKS_ENABLED)) {
+      jsMaxTracks.setEnabled(true);
+      jcbMaxTracks.setSelected(true);
+    } else {
+      jsMaxTracks.setEnabled(false);
+      jcbMaxTracks.setSelected(false);
+    }
+    if (data.containsKey(Variable.MAXTRACKS)) {
+      jsMaxTracks.setValue((Integer) data.get(Variable.MAXTRACKS));
+    }
+    if (isTrue(Variable.MAXSIZE_ENABLED)) {
+      jsMaxSize.setEnabled(true);
+      jcbMaxSize.setSelected(true);
+    } else {
+      jsMaxSize.setEnabled(false);
+      jcbMaxSize.setSelected(false);
+    }
+    if (data.containsKey(Variable.MAXSIZE)) {
+      jsMaxSize.setValue((Integer) data.get(Variable.MAXSIZE));
+    }
+    if (isTrue(Variable.MAXLENGTH_ENABLED)) {
+      jsMaxLength.setEnabled(true);
+      jcbMaxLength.setSelected(true);
+    } else {
+      jsMaxLength.setEnabled(false);
+      jcbMaxLength.setSelected(false);
+    }
+    if (data.containsKey(Variable.MAXLENGTH)) {
+      jsMaxLength.setValue((Integer) data.get(Variable.MAXLENGTH));
+    }
+    if (isTrue(Variable.ONE_MEDIA_ENABLED)) {
+      jcbMedia.setEnabled(true);
+      jcbOneMedia.setSelected(true);
+      jcbConvertMedia.setEnabled(true);
+    } else {
+      jcbMedia.setEnabled(false);
+      jcbOneMedia.setSelected(false);
+      jcbConvertMedia.setEnabled(false);
+    }
+    // Check if pacpl can be used, do it every time the dialog starts as the
+    // user might have installed it by now
+    boolean bPACPLAvailable = UtilPrepareParty.checkPACPL((String) data
+        .get(Variable.CONVERT_COMMAND));
+    if (!bPACPLAvailable) {
+      // disable media conversion if pacpl is not found
+      jcbConvertMedia.setEnabled(false);
+    }
+    // don't set Convert to on from data if PACPL became unavailable
+    if (isTrue(Variable.CONVERT_MEDIA) && bPACPLAvailable) {
+      jcbConvertMedia.setSelected(true);
+    } else {
+      jcbConvertMedia.setSelected(false);
+    }
+    if (data.containsKey(Variable.ONE_MEDIA)) {
+      jcbMedia.setSelectedItem(data.get(Variable.ONE_MEDIA));
+    } else {
+      // default to MP3 initially
+      jcbMedia.setSelectedItem("mp3");
+    }
+    if (data.containsKey(Variable.RATING_LEVEL)) {
+      jsRatingLevel.setValue((Integer) data.get(Variable.RATING_LEVEL));
+    }
+    if (isTrue(Variable.NORMALIZE_FILENAME)) {
+      jcbNormalizeFilename.setSelected(true);
+    } else {
+      jcbNormalizeFilename.setSelected(false);
+    }
+  }
+
+  /**
+   * Return if the specified element is true in the data-map.
+   * 
+   * @param key The key to look up in the data-object.
+   * 
+   * @return true if the value was stored as boolean true, false otherwise.
+   */
+  private final boolean isTrue(final Variable key) {
+    return data.containsKey(key) && Boolean.TRUE.equals(data.get(key));
+  }
+
+  /**
+   * Write the data from the UI items to the data object.
+   */
+  private void updateData() {
+    // store if checkbox is enabled and update the label accordingly
+    updateOneItem(jcbMaxTracks, jsMaxTracks, jnMaxTracks, Variable.MAXTRACKS,
+        Variable.MAXTRACKS_ENABLED);
+    updateOneItem(jcbMaxSize, jsMaxSize, jnMaxSize, Variable.MAXSIZE, Variable.MAXSIZE_ENABLED);
+    updateOneItem(jcbMaxLength, jsMaxLength, jnMaxLength, Variable.MAXLENGTH,
+        Variable.MAXLENGTH_ENABLED);
+    if (jcbOneMedia.isSelected()) {
+      data.put(Variable.ONE_MEDIA, jcbMedia.getSelectedItem());
+      data.put(Variable.ONE_MEDIA_ENABLED, Boolean.TRUE);
+    } else {
+      // keep old value... data.remove(Variable.KEY_MEDIA);
+      data.put(Variable.ONE_MEDIA_ENABLED, Boolean.FALSE);
+    }
+    data.put(Variable.CONVERT_MEDIA, jcbConvertMedia.isSelected());
+    data.put(Variable.RATING_LEVEL, jsRatingLevel.getValue());
+    data.put(Variable.NORMALIZE_FILENAME, jcbNormalizeFilename.isSelected());
+  }
+
+  /**
+   * Helper to handle a checkbox/slider combination. It also updates an
+   * associated Label with the value from the Slider.
+   * 
+   * @param cb The checkbox to check for selected/deselected state
+   * @param slider The slider to get the value from
+   * @param label The Label to populate with the current value from the Slider.
+   * @param key The key in the data object for the value of the Slider.
+   * @param keyOn The key in the data object to store the enabled/disabled
+   * state.
+   */
+  private void updateOneItem(JCheckBox cb, JSlider slider, JLabel label, Variable key,
+      Variable keyOn) {
+    if (cb.isSelected()) {
+      if (!slider.getValueIsAdjusting()) {
+        data.put(key, slider.getValue());
+        data.put(keyOn, Boolean.TRUE);
+      }
+      label.setText(Integer.toString(slider.getValue()));
+    } else {
+      if (!slider.getValueIsAdjusting()) {
+        // keep value... data.remove(key);
+        data.put(keyOn, Boolean.FALSE);
+      }
+      label.setText(NO_VALUE);
+    }
+  }
+
+  /**
+   * Return if the specified element is true in the data-map.
+   * 
+   * @param key The key to look up in the data-object.
+   * 
+   * @return true if the value was stored as boolean true, false otherwise.
+   */
+  private final boolean isTrue(final String key) {
+    return data.containsKey(key) && Boolean.TRUE.equals(data.get(key));
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+   */
+  @Override
+  public void actionPerformed(ActionEvent ae) {
+    // if a checkbox is selected/deselected, enable/disable the
+    // sliders/comboboxes accordingly
+    if (ae.getSource() == jcbMaxTracks) {
+      jsMaxTracks.setEnabled(jcbMaxTracks.isSelected());
+    } else if (ae.getSource() == jcbMaxSize) {
+      jsMaxSize.setEnabled(jcbMaxSize.isSelected());
+    } else if (ae.getSource() == jcbMaxLength) {
+      jsMaxLength.setEnabled(jcbMaxLength.isSelected());
+    } else if (ae.getSource() == jcbOneMedia) {
+      jcbMedia.setEnabled(jcbOneMedia.isSelected());
+      jcbConvertMedia.setEnabled(jcbOneMedia.isSelected());
+    } else if (ae.getSource() == jbConvertConfig) {
+      // create the settings dialog, it will display itself and inform us when
+      // the value is changed with "Ok"
+      new PreparePartyConvertSettings(new ChangeListener() {
+        @Override
+        public void stateChanged(ChangeEvent e) {
+          // no need for re-checking if the same command is chosen as before
+          if (e.getSource().toString().equals(data.get(Variable.CONVERT_COMMAND))) {
+            Log.debug("Same pacpl-command as before: " + e.getSource().toString());
+            return;
+          }
+          Log.debug("New pacpl-command: " + e.getSource().toString());
+          data.put(Variable.CONVERT_COMMAND, e.getSource().toString());
+          // re-check if pacpl can be called now
+          boolean bPACPLAvailable = UtilPrepareParty.checkPACPL((String) data
+              .get(Variable.CONVERT_COMMAND));
+          // disable media conversion if pacpl is not found
+          if (bPACPLAvailable) {
+            Log.debug("Updated settings for media conversion allow pacpl to be used.");
+            jcbConvertMedia.setEnabled(true);
+          } else {
+            Log.warn("Updated settings for media conversion do not allow pacpl to be used!");
+            jcbConvertMedia.setEnabled(false);
+            jcbConvertMedia.setSelected(false);
+          }
+        }
+      }, (String) data.get(Variable.CONVERT_COMMAND), JajukMainWindow.getInstance());
+    }
+    updateData();
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent
+   * )
+   */
+  @Override
+  public void stateChanged(ChangeEvent ie) {
+    // just update the stored data whenever we receive an interesting
+    // event
+    if (ie.getSource() == jsMaxTracks) {
+      updateData();
+    } else if (ie.getSource() == jsMaxSize) {
+      updateData();
+    } else if (ie.getSource() == jsMaxLength) {
+      updateData();
+    } else if (ie.getSource() == jcbMedia) {
+      updateData();
+    } else if (ie.getSource() == jsRatingLevel) {
+      updateData();
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+   */
+  @Override
+  public void mouseClicked(MouseEvent e) {
+    if (e.getSource() == jlConvertMedia) {
+      try {
+        Desktop.getDesktop().browse(
+            new URI("http://jajuk.info/index.php/Installing_Perl_Audio_Converter"));
+      } catch (IOException ex) {
+        Log.error(ex);
+      } catch (URISyntaxException ex) {
+        Log.error(ex);
+      }
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
+   */
+  @Override
+  public void mouseEntered(MouseEvent e) {
+    // nothing to do here...
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
+   */
+  @Override
+  public void mouseExited(MouseEvent e) {
+    // nothing to do here...
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
+   */
+  @Override
+  public void mousePressed(MouseEvent e) {
+    // nothing to do here...
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
+   */
+  @Override
+  public void mouseReleased(MouseEvent e) {
+    // nothing to do here...
+  }
+}
diff --git a/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardPathSelectionScreen.java b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardPathSelectionScreen.java
new file mode 100644
index 0000000..62af7b2
--- /dev/null
+++ b/src/main/java/org/jajuk/ui/wizard/prepare_party/PreparePartyWizardPathSelectionScreen.java
@@ -0,0 +1,130 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.wizard.prepare_party;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.util.Comparator;
+
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.border.BevelBorder;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.jajuk.base.Type;
+import org.jajuk.ui.widgets.JajukFileChooser;
+import org.jajuk.ui.wizard.prepare_party.PreparePartyWizard.Variable;
+import org.jajuk.util.IconLoader;
+import org.jajuk.util.JajukFileFilter;
+import org.jajuk.util.JajukIcons;
+import org.jajuk.util.Messages;
+import org.jajuk.util.filters.DirectoryFilter;
+import org.qdwizard.Screen;
+
+/**
+ * Panel for selecting the location in the filesystem.
+ */
+public class PreparePartyWizardPathSelectionScreen extends Screen implements ActionListener {
+  /** Generated serialVersionUID. */
+  private static final long serialVersionUID = -236180699495019177L;
+  /** Button for file chooser dialog. */
+  JButton jbFileSelection;
+  /** The selected file. */
+  JLabel jlSelectedFile;
+  /** Selected directory. */
+  private File fDir;
+
+  @Override
+  public void initUI() {
+    JLabel jlFileSelection = new JLabel(Messages.getString("PreparePartyWizard.20"));
+    jbFileSelection = new JButton(IconLoader.getIcon(JajukIcons.OPEN_DIR));
+    jbFileSelection.addActionListener(this);
+    JLabel jlSelectedFileText = new JLabel(Messages.getString("PreparePartyWizard.21"));
+    jlSelectedFile = new JLabel(Messages.getString("FirstTimeWizard.9"));
+    jlSelectedFile.setBorder(new BevelBorder(BevelBorder.LOWERED));
+    // previous value if available
+    if (data.containsKey(Variable.DEST_PATH)) {
+      jlSelectedFile.setText((String) data.get(Variable.DEST_PATH));
+      // we also can finish the dialog
+      setCanFinish(true);
+    } else {
+      setProblem(Messages.getString("PreparePartyWizard.22"));
+      // now we can not finish the dialog
+      setCanFinish(false);
+    }
+    // Add items
+    setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]"));
+    add(jlFileSelection);
+    add(jbFileSelection, "wrap,center");
+    add(jlSelectedFileText);
+    add(jlSelectedFile, "grow,wrap");
+  }
+
+  @Override
+  public void actionPerformed(ActionEvent e) {
+    // display a FileChooser
+    if (e.getSource() == jbFileSelection) {
+      JajukFileChooser jfc = new JajukFileChooser(
+          new JajukFileFilter(DirectoryFilter.getInstance()), fDir);
+      jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+      jfc.setDialogTitle(Messages.getString("PreparePartyWizard.22"));
+      jfc.setMultiSelectionEnabled(false);
+      final int returnVal = jfc.showOpenDialog(this);
+      if (returnVal == JFileChooser.APPROVE_OPTION) {
+        // retrieve selected directory and update it in all necessary places
+        fDir = jfc.getSelectedFile();
+        jlSelectedFile.setText(fDir.getAbsolutePath());
+        data.put(Variable.DEST_PATH, fDir.getAbsolutePath());
+        // we can finish the wizard now
+        setProblem(null);
+        // now we can finish the dialog
+        setCanFinish(true);
+      }
+    }
+  }
+
+  @Override
+  public String getDescription() {
+    return Messages.getString("PreparePartyWizard.19");
+  }
+
+  @Override
+  public String getName() {
+    return Messages.getString("PreparePartyWizard.18");
+  }
+}
+
+/**
+ * Compare two types.
+ */
+final class TypeComparator implements Comparator<Type> {
+  @Override
+  public int compare(Type o1, Type o2) {
+    // handle null, always equal
+    if (o1 == null || o2 == null) {
+      return 0;
+    }
+    // otherwise sort on extension here
+    return o1.getExtension().compareTo(o2.getExtension());
+  }
+}
diff --git a/src/main/java/org/jajuk/util/Conf.java b/src/main/java/org/jajuk/util/Conf.java
index 5047af5..1ded05e 100644
--- a/src/main/java/org/jajuk/util/Conf.java
+++ b/src/main/java/org/jajuk/util/Conf.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,18 +16,17 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
-import java.awt.HeadlessException;
-import java.awt.Toolkit;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.HashMap;
 import java.util.Properties;
 
 import org.jajuk.services.core.SessionService;
@@ -42,13 +41,10 @@ import org.jajuk.util.log.Log;
  * Singleton
  */
 public final class Conf implements Const {
-
   /** Properties in memory. */
   private static volatile Properties properties = new Properties();
-
   /** Default properties cache. */
   private static volatile Properties defaults = new Properties();
-
   static {
     setDefaultProperties();
     properties = (Properties) properties.clone();
@@ -95,7 +91,7 @@ public final class Conf implements Const {
   /**
    * Invert a boolean value.
    * 
-   * @param pName DOCUMENT_ME
+   * @param pName 
    */
   public static void invert(String pName) {
     boolean b = Boolean.parseBoolean(properties.getProperty(pName));
@@ -145,7 +141,7 @@ public final class Conf implements Const {
   /**
    * Reset a given property to its defaults.
    * 
-   * @param property DOCUMENT_ME
+   * @param property 
    */
   public static void setDefaultProperty(String property) {
     String defaultValue = (String) defaults.get(property);
@@ -163,7 +159,6 @@ public final class Conf implements Const {
     // We fill with current values to keep some parameters
     // like passwords and that we don't want to reset
     defaults = (Properties) properties.clone();
-
     defaults.put(CONF_OPTIONS_LANGUAGE, LocaleManager.getNativeLocale().getLanguage());
     // User preferences
     defaults.put(CONF_PERSPECTIVE_DEFAULT, SimplePerspective.class.getName());
@@ -171,12 +166,11 @@ public final class Conf implements Const {
     defaults.put(CONF_STATE_REPEAT_ALL, FALSE);
     defaults.put(CONF_STATE_KARAOKE, FALSE);
     defaults.put(CONF_STATE_SHUFFLE, FALSE);
-    defaults.put(CONF_STATE_CONTINUE, FALSE);
+    defaults.put(CONF_STATE_CONTINUE, TRUE);
     defaults.put(CONF_STATE_INTRO, FALSE);
     // no startup file by default
     defaults.put(CONF_STARTUP_ITEM, "");
     defaults.put(CONF_STARTUP_MODE, STARTUP_MODE_LAST_KEEP_POS);
-    defaults.put(CONF_STARTUP_LAST_POSITION, "0");
     defaults.put(CONF_STARTUP_STOPPED, "false");
     defaults.put(CONF_CONFIRMATIONS_DELETE_FILE, TRUE);
     defaults.put(CONF_CONFIRMATIONS_EXIT, FALSE);
@@ -185,6 +179,7 @@ public final class Conf implements Const {
     defaults.put(CONF_CONFIRMATIONS_CLEAR_HISTORY, TRUE);
     defaults.put(CONF_CONFIRMATIONS_RESET_RATINGS, TRUE);
     defaults.put(CONF_CONFIRMATIONS_REFACTOR_FILES, TRUE);
+    defaults.put(CONF_CONFIRMATIONS_BEFORE_TAG_WRITE, FALSE);
     defaults.put(CONF_OPTIONS_HIDE_UNMOUNTED, FALSE);
     defaults.put(CONF_OPTIONS_PUSH_ON_CLICK, FALSE);
     defaults.put(CONF_OPTIONS_PUSH_ON_DROP, FALSE);
@@ -206,10 +201,8 @@ public final class Conf implements Const {
     defaults.put(CONF_P2P_SHARE, FALSE);
     defaults.put(CONF_P2P_ADD_REMOTE_PROPERTIES, FALSE);
     defaults.put(CONF_P2P_HIDE_LOCAL_PROPERTIES, TRUE);
-    defaults.put(CONF_P2P_PASSWORD, "");
     defaults.put(CONF_HISTORY, "-1");
     defaults.put(CONF_TAGS_USE_PARENT_DIR, TRUE);
-    defaults.put(CONF_DROP_PLAYED_TRACKS_FROM_QUEUE, FALSE);
     defaults.put(CONF_BOOKMARKS, "");
     defaults.put(CONF_STARTUP_DISPLAY, Integer.toString(DISPLAY_MODE_MAIN_WINDOW));
     defaults.put(CONF_BESTOF_TRACKS_SIZE, "20");
@@ -228,6 +221,7 @@ public final class Conf implements Const {
     defaults.put(CONF_NETWORK_PROXY_TYPE, PROXY_TYPE_HTTP);
     defaults.put(CONF_COVERS_AUTO_COVER, TRUE);
     defaults.put(CONF_COVERS_MIRROW_COVER, FALSE);
+    defaults.put(CONF_COVERS_MIRROW_COVER_FS_MODE, TRUE);
     defaults.put(CONF_COVERS_SHUFFLE, FALSE);
     defaults.put(CONF_COVERS_SAVE_EXPLORER_FRIENDLY, FALSE);
     defaults.put(FILE_DEFAULT_COVER, "front;cover;folder;back");
@@ -251,33 +245,10 @@ public final class Conf implements Const {
         + Const.XML_ARTIST + ',' + Const.XML_GENRE + ',' + Const.XML_YEAR + ','
         + Const.XML_TRACK_RATE + ',' + Const.XML_TRACK_LENGTH + ',' + Const.XML_TRACKS + ','
         + Const.XML_TRACK_DISCOVERY_DATE);
-    int width = 800;
-    int height = 600;
-    // When ran as unit tests, no X11 server is available, catch HeadLess
-    // Exception
-    try {
-      // Default Window position: X,Y,X_size,Y_size
-      width = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
-      // Limit initial screen size (reported as problematic by some users on
-      // dual
-      // heads)
-      if (width > 1400) {
-        width = 1200;
-      } else {
-        width = width - 2 * FRAME_INITIAL_BORDER;
-      }
-      height = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
-      if (height > 1200) {
-        height = 1000;
-      } else {
-        height = height - 2 * FRAME_INITIAL_BORDER;
-      }
-    } catch (HeadlessException he) {
-      Log.debug("No graphical server available, use default screen values");
-    }
-    defaults.put(CONF_WINDOW_POSITION, FRAME_INITIAL_BORDER + "," + FRAME_INITIAL_BORDER + ","
-        + width + "," + height);
-    defaults.put(CONF_WINDOW_MAXIMIZED, "false");
+    defaults.put(CONF_WEBRADIO_COLUMNS, XML_PLAY + ',' + Const.XML_NAME + ',' + Const.XML_DESC
+        + ',' + Const.XML_KEYWORDS + ',' + Const.XML_GENRE + ',' + Const.XML_ORIGIN);
+    defaults.put(CONF_WINDOW_POSITION, "");
+    defaults.put(CONF_WINDOW_MAXIMIZED, "true");
     defaults.put(CONF_THUMBS_SHOW_COVER, Integer.toString(Const.CATALOG_VIEW_COVER_MODE_ALL));
     defaults.put(CONF_THUMBS_SIZE, THUMBNAIL_SIZE_100X100);
     defaults.put(CONF_THUMBS_SORTER, "2"); // sort by album
@@ -303,6 +274,7 @@ public final class Conf implements Const {
     defaults.put(CONF_SHOW_POPUPS, FALSE);
     defaults.put(CONF_SHOW_SYSTRAY, TRUE);
     defaults.put(CONF_MINIMIZE_TO_TRAY, FALSE);
+    defaults.put(CONF_TRAY_CLICK_DISPLAY_WINDOW, FALSE);
     defaults.put(CONF_FONTS_SIZE, "12");
     defaults.put(CONF_MPLAYER_PATH_FORCED, "");
     defaults.put(CONF_INC_RATING, "5");
@@ -317,18 +289,15 @@ public final class Conf implements Const {
     // We use trailing pattern to allow scripting like MSN plugins to
     // detect jajuk frames and extract current track
     defaults.put(CONF_PATTERN_FRAME_TITLE, '~' + PATTERN_TRACKNAME + " (" + PATTERN_ARTIST + ")~");
-    defaults.put(CONF_PATTERN_BALLOON_NOTIFIER, Messages.getString("FIFO.10") + " "
-        + Messages.getString("InformationJPanel.8"));
-    defaults.put(CONF_PATTERN_INFORMATION, Messages.getString("FIFO.10") + " "
-        + Messages.getString("InformationJPanel.8"));
+    defaults.put(CONF_PATTERN_BALLOON_NOTIFIER,
+        Messages.getString("FIFO.10") + " " + Messages.getString("InformationJPanel.8"));
+    defaults.put(CONF_PATTERN_INFORMATION,
+        Messages.getString("FIFO.10") + " " + Messages.getString("InformationJPanel.8"));
     defaults.put(CONF_SHOW_DUPLICATE_PLAYLISTS, FALSE);
     defaults.put(CONF_FORMAT_TIME_ELAPSED, "0");
     defaults.put(CONF_AUTO_SCROLL, TRUE);
-
-    // By defaults, display slimbar at the center of the screen to fix #768 : under MAC,
-    // it is overlaid the menu bar (the menu bar can't be overlaid, even by always on top frames)
-    defaults.put(CONF_SLIMBAR_POSITION, (width / 2) + "," + (height / 2));
-
+    // Let the OS show the slimbar to an optimal position.
+    defaults.put(CONF_SLIMBAR_POSITION, "");
     defaults.put(CONF_SLIMBAR_DISPLAY_QUEUE, FALSE);
     defaults.put(CONF_SLIMBAR_SMART_MODE, JajukActions.SHUFFLE_GLOBAL.toString());
     defaults.put(CONF_ALARM_ACTION, ALARM_START_ACTION);
@@ -339,24 +308,36 @@ public final class Conf implements Const {
     defaults.put(CONF_ALARM_TIME_MINUTES, "00");
     defaults.put(CONF_ALARM_TIME_SECONDS, "00");
     defaults.put(CONF_EXPLORER_PATH, "");
-
+    defaults.put(CONF_BIT_PERFECT, FALSE);
+    defaults.put(CONF_TITLE_ANIMATION, FALSE);
+    defaults.put(CONF_SPLASH_SCREEN, TRUE);
+    defaults.put(CONF_SHOW_VIDEOS, FALSE);
+    defaults.put(CONF_PRESERVE_FILE_DATES, FALSE);
+    defaults.put(CONF_MANUAL_RATINGS, FALSE);
+    defaults.put(CONF_STARTUP_QUEUE_INDEX, "-1");
     // NOT SHOW AGAIN
     defaults.put(CONF_NOT_SHOW_AGAIN_PLAYER, FALSE);
-    defaults.put(CONF_NOT_SHOW_AGAIN_CONCURRENT_SESSION, FALSE);
     defaults.put(CONF_NOT_SHOW_AGAIN_CROSS_FADE, FALSE);
     defaults.put(CONF_NOT_SHOW_AGAIN_LAF_CHANGE, FALSE);
-    
-    //Refresh delay to slow down refresh (some NAS are crashing due to intensive load)
-    defaults.put(CONF_REFRESHING_DELAY_MS, "0");
-    
+    defaults.put(CONF_STATS_MIN_VALUE_GENRE_DISPLAY, "2");
+    defaults.put(CONF_TARGET_WORKSPACE_PATH, UtilSystem.getUserHome());
     // Make a copy of default values
     properties = (Properties) defaults.clone();
   }
 
   /**
+   * Allow again to get hidden messages
+   */
+  public static void resetDontShowAgain() {
+    setProperty(CONF_NOT_SHOW_AGAIN_PLAYER, FALSE);
+    setProperty(CONF_NOT_SHOW_AGAIN_CROSS_FADE, FALSE);
+    setProperty(CONF_NOT_SHOW_AGAIN_LAF_CHANGE, FALSE);
+  }
+
+  /**
    * Return default property for given key.
    * 
-   * @param key DOCUMENT_ME
+   * @param key 
    * 
    * @return default property for given key
    */
@@ -374,80 +355,67 @@ public final class Conf implements Const {
   }
 
   /**
-   * Set a property.
+   * Set a property and persist the configuration
    * 
-   * @param sName DOCUMENT_ME
-   * @param sValue DOCUMENT_ME
+   * @param sName property name
+   * @param sValue  property value as string
    */
   public static void setProperty(String sName, String sValue) {
+    // [Perf] Ignore cases where the same value is set again 
+    Object current = properties.get(sName);
+    if (current != null && current.equals(sValue)) {
+      return;
+    }
     properties.setProperty(sName, sValue);
-  }
-
-  /**
-   * Commit properties into a file. Some preferences corruption
-   * have been reported (see https://trac.jajuk.info/ticket/1611)
-   * so we added more robust commit features : we commit the properties
-   * to a temporary file, try to parse it back (to detect invalid characters like \n) and
-   * if the parsing is ok, we override the old preference file with the
-   * temporary one.
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
-   */
-  public static void commit() throws IOException {
-    File fTempFile = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION_TEMP);
-    OutputStream str = new FileOutputStream(fTempFile);
-    // Write the temporary file
     try {
-      properties.store(str, "User configuration");
-    } finally {
-      str.flush();
-      str.close();
+      commit();
+    } catch (IOException e) {
+      Log.error(e);
     }
-    // Check if it is valid
-    checkTempPreferenceFile();
-    // If still here, we override the old preference file
-    // by the temporary one.
-    // Note that the system may crash then. It is why'll try
-    // to load the temp file at next startup if we can't find
-    // the regular file.
-    overridePreferenceFile();
   }
 
   /**
-   * Check if the temporary preference file is valid.
+   * Set a bunch of properties and persist the configuration
    * 
-   * @throws IOException if the file is invalid
+    * @param  properties a map of string key to string values 
    */
-  private static void checkTempPreferenceFile() throws IOException {
-    File fTempFile = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION_TEMP);
-    // Try to parse it again
-    InputStream in = new FileInputStream(fTempFile);
+  public static void setProperties(final HashMap<String, String> properties) {
+    for (String propertyName : properties.keySet()) {
+      Conf.properties.setProperty(propertyName, properties.get(propertyName));
+    }
     try {
-      new Properties().load(in);
-    } finally {
-      in.close();
+      commit();
+    } catch (IOException e) {
+      Log.error(e);
     }
   }
 
   /**
-   * Override.
+   * Commit properties into a file. 
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    */
-  private static void overridePreferenceFile() throws IOException {
-    File finalFile = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION);
-    File fTempFile = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION_TEMP);
+  private static void commit() throws IOException {
+    java.io.File out = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION + "."
+        + Const.FILE_SAVING_FILE_EXTENSION);
+    OutputStream str = new FileOutputStream(out);
+    // Write the temporary file
     try {
-      UtilSystem.move(fTempFile, finalFile);
-    } catch (Exception e) {
-      throw new IOException(e);
+      properties.store(str, "User configuration");
+    } finally {
+      str.flush();
+      str.close();
     }
+    // Commit with recovery support
+    java.io.File finalFile = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION);
+    UtilSystem.saveFileWithRecoverySupport(finalFile);
+    Log.debug("Conf commited to : " + finalFile.getAbsolutePath());
   }
 
   /**
    * Contains property.
    * 
-   * @param property DOCUMENT_ME
+   * @param property 
    * 
    * @return whether the given property is known
    */
@@ -460,15 +428,20 @@ public final class Conf implements Const {
    */
   public static void load() {
     try {
-      InputStream str = new FileInputStream(SessionService
-          .getConfFileByPath(Const.FILE_CONFIGURATION));
-      try {
-        properties.load(str);
-      } finally {
-        str.close();
+      File confFile = SessionService.getConfFileByPath(Const.FILE_CONFIGURATION);
+      UtilSystem.recoverFileIfRequired(confFile);
+      // Conf file doesn't exist at first launch
+      if (confFile.exists()) {
+        // Now read the conf file
+        InputStream str = new FileInputStream(confFile);
+        try {
+          properties.load(str);
+        } finally {
+          str.close();
+        }
       }
-    } catch (IOException e) {
-      e.printStackTrace(); // do not use log system here
+    } catch (Exception e) {
+      Log.error(e);
       Messages.showErrorMessage(114);
     }
   }
@@ -490,4 +463,4 @@ public final class Conf implements Const {
   public static void removeProperty(String sKey) {
     properties.remove(sKey);
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/jajuk/util/Const.java b/src/main/java/org/jajuk/util/Const.java
index 5383d3e..c9c38fe 100644
--- a/src/main/java/org/jajuk/util/Const.java
+++ b/src/main/java/org/jajuk/util/Const.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -27,1304 +27,637 @@ import java.net.URL;
  * these constants, it is implied by the fact you are in an interface.
  */
 public interface Const {
-
   // Misc
-
   /** Maximum size for covers in KB. */
   int MAX_COVER_SIZE = 2048;
-
   /** Maximum number of remote covers. */
   int MAX_REMOTE_COVERS = 10;
-
   /** Special length for player meaning end of file. */
   long TO_THE_END = -1;
-
   /** Time we wait after an error in ms. */
   int WAIT_AFTER_ERROR = 2000;
-
-  /** We need a fix size to have the same angle effect for every cover*/
+  /** We need a fix size to have the same angle effect for every cover. */
   int MIRROW_COVER_SIZE = 600;
-
   /** Default playlist name. */
   String DEFAULT_PLAYLIST_FILE = "playlist";
-
   /** Max number of connection time out before stopping to look for covers. */
   int STOP_TO_SEARCH = 5;
-
   /** Number of lines in the feedback mail. */
   int FEEDBACK_LINES = 200;
-
   /** Max history size. */
   int MAX_HISTORY_SIZE = 1000;
-
   /** Autocommit delay in ms. */
   int AUTO_COMMIT_DELAY = 3600000;
-
   /** Autorefresh thread delay in ms. */
   int AUTO_REFRESH_DELAY = 30000;
-
   /** Default refresh interval in mins for unknown types devices *. */
   String DEFAULT_REFRESH_INTERVAL = "5";
-
   /** Fading status code. */
   int FADING_STATUS = 9999;
-
   /** Need full gc memory %. */
   float NEED_FULL_GC_LEVEL = 0.90f;
-
   /** Play time to get rate +1 in secs. */
   int INC_RATE_TIME = 20;
-
   /** Max number of concurrent executions by observation manager for a given event. */
   int MAX_EVENT_EXECUTIONS = 15;
-
   /** Min number of tracks in a DJ selection without track unicity. */
   int MIN_TRACKS_NUMBER_WITHOUT_UNICITY = 100;
-
   /** Default number of tracks in a transition. */
   int DEFAULT_TRANSITION_TRACK_NUMBER = 2;
-
   /** Rate Stars columns size in pixels. */
   int RATE_COLUMN_SIZE = 75;
-
   /** Play icon columns size in pixels. */
   int PLAY_COLUMN_SIZE = 20;
-
   /** Proportion of best tracks. */
   float BESTOF_PROPORTION = 0.05f;
-
   /** Number of milliseconds in a second. */
   int MILLISECONDS_IN_A_SECOND = 1000;
-
   /** Number of seconds in a minute. */
   int SECONDS_IN_A_MINUTE = 60;
-
   /** Number of minutes in an hour. */
   int MINUTES_IN_AN_HOUR = 60;
-
-  /** Number of pixels around window at initial startup. */
-  int FRAME_INITIAL_BORDER = 60;
-  
-  /** Maximum images cache size in MB */
+  /** Maximum images cache size in MB. */
   int MAX_IMAGES_CACHE_SIZE = 100;
-
   /** Default webradio. */
   String DEFAULT_WEBRADIO = "Bluemars [Ambient/Space-Music]";
-
   /** Default hostame used in case of problem. */
   String DEFAULT_HOSTNAME = "localhost";
-
   /** Number of hours in a day. */
   int HOURS_IN_A_DAY = 24;
-
   /** Number of album bestof items. */
   int NB_BESTOF_ALBUMS = 25;
-
   /* Number of tracks for global actions (global shuffle, bestof...) */
-  /** DOCUMENT_ME. */
   int NB_TRACKS_ON_ACTION = 200;
-
   /** Cache max age (in ms). */
   long CACHE_MAX_AGE = 10 * 24 * 3600 * 1000; // 10 days
-
   /** Default auto-refresh delay for directory-type devices (mins). */
   double DEFAULT_REFRESH_INTERVAL_DIRECTORY = 0.5d;
-
   /** Default auto-refresh delay for CD-type devices (mins). */
   double DEFAULT_REFRESH_INTERVAL_CD = 0.0d;
-
   /** Default auto-refresh delay for directory-type devices (mins). */
   double DEFAULT_REFRESH_INTERVAL_NETWORK_DRIVE = 0.0d;
-
   /** Default auto-refresh delay for directory-type devices (mins). */
   double DEFAULT_REFRESH_INTERVAL_EXTERNAL_DRIVE = 3.0d;
-
   /** Default auto-refresh delay for directory-type devices (mins). */
   double DEFAULT_REFRESH_INTERVAL_PLAYER = 3.0d;
-
   /** The time we wait for mplayer to start up in ms. It can take some time on slow or heavily loaded machines... */
   int MPLAYER_START_TIMEOUT = 15000;
-
   /** Number of milliseconds in a day. */
   int MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR
       * HOURS_IN_A_DAY;
-
   /** Last elapsed time display mode format + 1 *. */
   int FORMAT_TIME_ELAPSED_MAX = 4;
-
   /** Mplayer windows exe size in bytes. */
-  long MPLAYER_WINDOWS_EXE_SIZE = 15265280l;
-
+  long MPLAYER_WINDOWS_EXE_SIZE = 21718016l;
   /** Mplayer windows exe size in bytes. */
   long MPLAYER_OSX_EXE_SIZE = 21490476l;
-
   /** Update URL = PAD file URL. */
-  String CHECK_FOR_UPDATE_URL = "http://gitorious.org/jajuk/jajuk/blobs/raw/master/jajuk/src/packaging/pad/jajuk_pad.xml";
-
+  String CHECK_FOR_UPDATE_URL = "http://jajuk.info/repository/pad/jajuk_pad.xml";
   // Jajuk version
-  /** DOCUMENT_ME. */
   String JAJUK_VERSION = "VERSION_REPLACED_BY_ANT";
-
-  /** DOCUMENT_ME. */
-  String JAJUK_CODENAME = "Killer Queen";
-
+  String JAJUK_CODENAME = "Gute Laune";
   /** Extention to the .jajuk_test directory in test mode only */
-  String TEST_VERSION = "1.9";
-
-  /** DOCUMENT_ME. */
+  String TEST_VERSION = "1.10";
   String JAJUK_VERSION_DATE = "Build: DATE_REPLACED_BY_ANT";
-
-  /** DOCUMENT_ME. */
-  String JAJUK_COPYRIGHT = "Copyright 2003-2011 The Jajuk Team";
-
-  /** DOCUMENT_ME. */
+  String JAJUK_COPYRIGHT = "Copyright 2003-2016 The Jajuk Team";
   String TYPE_VIDEO = "Type.video";
-
   // -- Files and paths --
-  /** DOCUMENT_ME. */
+  String FILE_SAVING_FILE_EXTENSION = "saving";
+  String FILE_SAVED_PROOF_FILE_EXTENSION = "proof";
   String FILE_COLLECTION = "collection.xml";
-
-  // File written by the exit hook
-  /** DOCUMENT_ME. */
-  String FILE_COLLECTION_EXIT = "collection_exit.xml";
-
-  // Void file created after exit collection file
-  /** DOCUMENT_ME. */
-  String FILE_COLLECTION_EXIT_PROOF = "exit_proof";
-
-  /** DOCUMENT_ME. */
   String FILE_REPORTING_CACHE_FILE = "cache/report";
-
+  /** The Constant XML_EXT.   */
+  String FILE_XML_EXT = ".xml";
   /** Name of the preferences property file. */
   String FILE_CONFIGURATION = "conf.properties";
-
-  /** Name of the temporary preferences property file. */
-  String FILE_CONFIGURATION_TEMP = "temp_conf.properties";
-
-  /** DOCUMENT_ME. */
   String FILE_HISTORY = "history.xml";
-
-  /** Directory containing all sessions using this workspace. */
-  String FILE_SESSIONS = "sessions";
-
-  /** DOCUMENT_ME. */
   String FILE_DEFAULT_COVER = "jajuk.file.default.cover";
-
-  /** DOCUMENT_ME. */
-  String FILE_ABSOLUTE_DEFAULT_COVER = "jajuk-default-cover.";
-
+  String FILE_ABSOLUTE_DEFAULT_COVER = "default-cover.";
   // langpack name : jajuk_<locale>.properties
-  /** DOCUMENT_ME. */
   String FILE_LANGPACK_PART1 = "jajuk";
-
-  /** DOCUMENT_ME. */
   String FILE_LANGPACK_PART2 = ".properties";
-
   // logs
-  /** DOCUMENT_ME. */
   String FILE_LOGS = "jajuk.log";
-
-  /** DOCUMENT_ME. */
-  URL FILE_LOG4J_CONF = UtilSystem.getResource("org/jajuk/util/log/jajuk-log4j-conf.xml");
-
+  String FILE_PLAYING_POSITION = "position";
+  URL FILE_LOG4J_CONF = UtilSystem.getResource("jajuk-log4j-conf.xml");
   /** Cache directory name. */
   String FILE_CACHE = "cache";
- 
   /** Bat Converter to DOS 8.3 format */
   String FILE_FILENAME_CONVERTER = "converter.bat";
-
-  /** DOCUMENT_ME. */
   String LASTFM_CACHE = "lastfm";
-
   /** Last.fm album cover cache dir. */
   String LAST_FM_ALBUM_COVER_CACHE_DIR = "album_covers";
-
   /** Last.fm album info cache dir. */
   String LAST_FM_ALBUM_INFO_CACHE_DIR = "album_info";
-
   /** Last.fm artist info cache dir. */
   String LAST_FM_ARTIST_INFO_CACHE_DIR = "artist_info";
-
   /** Last.fm artist image cache dir. */
   String LAST_FM_ARTIST_IMAGE_CACHE_DIR = "artist_images";
-
   /** Last.fm artist info cache dir. */
   String LAST_FM_ARTIST_SIMILAR_CACHE_DIR = "artist_similar";
-
   /** Last.fm artist thumb cache dir. */
   String LAST_FM_ARTIST_THUMB_CACHE_DIR = "artist_thumbs";
-
   /** Last.fm artist info cache dir. */
   String LAST_FM_ALBUM_LIST_CACHE_DIR = "album_list_info";
-
   /** Last.fm artist wiki cache dir. */
   String LAST_FM_ARTIST_WIKI_CACHE_DIR = "artist_wiki";
-
   /** Last.fm artist submission cache dir. */
   String LAST_FM_SUBMISSION_CACHE_DIR = "submission";
-
-  /** DOCUMENT_ME. */
   String FILE_INTERNAL_CACHE = "internal";
-
-  /** DOCUMENT_ME. */
   String FILE_THUMBS = "thumbs";
-
-  /** DOCUMENT_ME. */
   String FILE_THUMB_NO_COVER = "nocover.png";
-
-  /** DOCUMENT_ME. */
   String FILE_THUMB_NONE = "none.png";
-
-  /** DOCUMENT_ME. */
   String FILE_DEFAULT_BESTOF_PLAYLIST = "bestof";
-
-  /** DOCUMENT_ME. */
   String FILE_DEFAULT_NOVELTIES_PLAYLIST = "novelties";
-
-  /** DOCUMENT_ME. */
   String FILE_DEFAULT_BOOKMARKS_PLAYLIST = "bookmarks";
-
-  /** DOCUMENT_ME. */
   String FILE_DEFAULT_QUEUE_PLAYLIST = "jajuk-playlist_";
-
-  /** DOCUMENT_ME. */
   String FILE_DJ_DIR = "djs";
-
-  /** DOCUMENT_ME. */
-  String FILE_WEB_RADIOS_REPOS = "webradios.xml";
-
-  /** DOCUMENT_ME. */
+  /** jajuk web radios repository. */
+  String FILE_WEB_RADIOS_CUSTOM = "custom_radios.xml";
+  /** Preset web radios file. */
+  String FILE_WEB_RADIOS_PRESET = "preset_radios.xml";
   String FILE_FIFO = "fifo.lst";
-
   /** Bootstrap file name. */
   String FILE_BOOTSTRAP = ".jajuk_bootstrap.xml";
-
   /** Old (pre-1.9) bootstrap file name */
   String FILE_BOOTSTRAP_OLD = ".jajuk_bootstrap";
-
-  /** DOCUMENT_ME. */
   String FILE_MPLAYER_WINDOWS_EXE = "mplayer.exe";
-
-  /** DOCUMENT_ME. */
   String FILE_MPLAYER_OSX_EXE = "mplayer";
-
-  /** DOCUMENT_ME. */
   String FILE_DEFAULT_PERSPECTIVES_PATH = "perspectives";
-
-  /** DOCUMENT_ME. */
   String FILE_JAJUK_DOWNLOADED_FILES_SUFFIX = "_jajuk";
-
-  /** DOCUMENT_ME. */
   String FILE_REPORTING_CSS_ALL_FILENAME = "report-all.css";
-
-  /** DOCUMENT_ME. */
   URL FILE_REPORTING_CSS_ALL_PATH = UtilSystem.getResource("xslt/"
       + FILE_REPORTING_CSS_ALL_FILENAME);
-
-  /** DOCUMENT_ME. */
   String FILE_REPORTING_CSS_PRINT_FILENAME = "report-print.css";
-
-  /** DOCUMENT_ME. */
   URL FILE_REPORTING_CSS_PRINT_PATH = UtilSystem.getResource("xslt/"
       + FILE_REPORTING_CSS_PRINT_FILENAME);
-
   /** Mplayer Windows exe provided by jajuk URL . */
-  String URL_MPLAYER_WINDOWS = "http://repository.jajuk.info/mplayer/20090114/mplayer.exe";
-
+  String URL_MPLAYER_WINDOWS = "http://repository.jajuk.info/mplayer/20130411/mplayer.exe";
   /** Mplayer OSX exe provided by jajuk URL . */
   String URL_MPLAYER_OSX = "http://repository.jajuk.info/mplayer/osx/1.0rc2/mplayer";
-
-  /** DOCUMENT_ME. */
-  String URL_DEFAULT_WEBRADIOS = "http://svn2.assembla.com/svn/common-jukebox/common-jukebox/src/main/resources/preset_radios.xml";
-
+  String URL_WEBRADIO_PRESETS = "http://svn2.assembla.com/svn/common-jukebox/common-jukebox/src/main/resources/preset_radios.xml";
   // sequence
-  /** DOCUMENT_ME. */
   String AMBIENCE_PREFIX = "jajuk.ambience.";
-
   // Proxy type: http
-  /** DOCUMENT_ME. */
   String PROXY_TYPE_HTTP = "http";
-
   // Proxy type: socks
-  /** DOCUMENT_ME. */
   String PROXY_TYPE_SOCKS = "socks";
-
   // Unknown
-  /** DOCUMENT_ME. */
   String UNKNOWN_ARTIST = "unknown_artist";
-
-  /** DOCUMENT_ME. */
   String UNKNOWN_ALBUM = "unknown_album";
-
-  /** DOCUMENT_ME. */
   String UNKNOWN_GENRE = "unknown_genre";
-
-  /** DOCUMENT_ME. */
   String UNKNOWN_YEAR = "unknown_year";
-
-  /** DOCUMENT_ME. */
   String VARIOUS_ARTIST = "various_artist";
-
-  /** DOCUMENT_ME. */
   String COVER_NONE = "none";
-
   // images
-  /** DOCUMENT_ME. */
   URL IMAGES_SPLASHSCREEN = UtilSystem.getResource("images/included/jajuk-splashscreen.jpg");
-
-  /** DOCUMENT_ME. */
   URL IMAGE_SEARCH = UtilSystem.getResource("images/included/search.png");
-
   // XSLT Files
-  /** DOCUMENT_ME. */
   URL XSLT_ARTIST = UtilSystem.getResource("xslt/artist.xsl");
-
-  /** DOCUMENT_ME. */
   URL XSLT_ALBUM = UtilSystem.getResource("xslt/album.xsl");
-
-  /** DOCUMENT_ME. */
   URL XSLT_GENRE = UtilSystem.getResource("xslt/genre.xsl");
-
-  /** DOCUMENT_ME. */
   URL XSLT_YEAR = UtilSystem.getResource("xslt/genre.xsl");
-
-  /** DOCUMENT_ME. */
   URL XSLT_DIRECTORY = UtilSystem.getResource("xslt/directory.xsl");
-
-  /** DOCUMENT_ME. */
   URL XSLT_DEVICE = UtilSystem.getResource("xslt/device.xsl");
-
-  /** DOCUMENT_ME. */
   URL XSLT_COLLECTION_LOGICAL = UtilSystem.getResource("xslt/logical_collection.xsl");
-
-  /** DOCUMENT_ME. */
   String COLLECTION_LOGICAL = "logical";
-
-  /** DOCUMENT_ME. */
   String COLLECTION_PHYSICAL = "physical";
-
   // -- Command line options --
-
   /** Tells jajuk it is inside the IDE. */
   String CLI_IDE = "ide";
-
   /** Tells jajuk to use a .jajuk_test repository */
   String CLI_TEST = "test";
-
   /** Special forced workspace location CLI option. */
   String CLI_WORKSPACE_LOCATION = "workspace";
-
   // players impls
-  /** DOCUMENT_ME. */
   String PLAYER_IMPL_JAVALAYER = "org.jajuk.services.players.JavaLayerPlayerImpl";
-
-  /** DOCUMENT_ME. */
   String PLAYER_IMPL_MPLAYER = "org.jajuk.services.players.MPlayerPlayerImpl";
-
-  /** DOCUMENT_ME. */
   String PLAYER_IMPL_WEBRADIOS = "org.jajuk.services.players.WebRadioPlayerImpl";
-
   // tag impls
-  /** DOCUMENT_ME. */
   String TAG_IMPL_NO_TAGS = "org.jajuk.services.tags.NoTagsTagImpl";
-
-  /** DOCUMENT_ME. */
   String TAG_IMPL_JAUDIOTAGGER = "org.jajuk.services.tags.JAudioTaggerTagImpl";
-
   // device types
-
   // Devices sync mode
-  /** DOCUMENT_ME. */
   String DEVICE_SYNCHRO_MODE_BI = "bi";
-
-  /** DOCUMENT_ME. */
   String DEVICE_SYNCHRO_MODE_UNI = "uni";
-
   // extensions
-  /** DOCUMENT_ME. */
   String EXT_MP3 = "mp3";
-
-  /** DOCUMENT_ME. */
   String EXT_MP2 = "mp2";
-
-  /** DOCUMENT_ME. */
   String EXT_PLAYLIST = "m3u";
-
-  /** DOCUMENT_ME. */
   String EXT_OGG = "ogg";
-
-  /** DOCUMENT_ME. */
+  /** Ogg Vorbis Audio (see http://en.wikipedia.org/wiki/Ogg, some applications start using this now, e.g. Soundkonverter */
+  String EXT_OGA = "oga";
   String EXT_WAV = "wav";
-
-  /** DOCUMENT_ME. */
   String EXT_AU = "au";
-
-  /** DOCUMENT_ME. */
   String EXT_AIF = "aif";
-
-  /** DOCUMENT_ME. */
   String EXT_AIFF = "aiff";
-
-  /** DOCUMENT_ME. */
   String EXT_FLAC = "flac";
-
   /** Extension of the thumbnails. */
   String EXT_THUMB = "png";
-
-  /** DOCUMENT_ME. */
   String EXT_MPC = "mpc";
-
-  /** DOCUMENT_ME. */
   String EXT_MPPLUS = "mp+";
-
-  /** DOCUMENT_ME. */
   String EXT_MPP = "mpp";
-
-  /** DOCUMENT_ME. */
   String EXT_WMA = "wma";
-
-  /** DOCUMENT_ME. */
   String EXT_APE = "ape";
-
-  /** DOCUMENT_ME. */
   String EXT_MAC = "mac";
-
-  /** DOCUMENT_ME. */
   String EXT_M4A = "m4a";
-
-  /** DOCUMENT_ME. */
   String EXT_REAL_RM = "rm";
-
-  /** DOCUMENT_ME. */
   String EXT_REAL_RA = "ra";
-
-  /** DOCUMENT_ME. */
   String EXT_RADIO = "radio";
-
-  /** DOCUMENT_ME. */
   String EXT_AVI = "avi";
-
-  /** DOCUMENT_ME. */
   String EXT_MPG = "mpg";
-
-  /** DOCUMENT_ME. */
   String EXT_MPEG = "mpeg";
-
-  /** DOCUMENT_ME. */
   String EXT_MKV = "mkv";
-
-  /** DOCUMENT_ME. */
   String EXT_ASF = "asf";
-
-  /** DOCUMENT_ME. */
   String EXT_WMV = "wmv";
-
-  /** DOCUMENT_ME. */
   String EXT_MOV = "mov";
-
-  /** DOCUMENT_ME. */
   String EXT_OGM = "ogm";
-
-  /** DOCUMENT_ME. */
   String EXT_MP4 = "mp4";
-
-  /** DOCUMENT_ME. */
   String EXT_WV = "wv";
-
-  /** DOCUMENT_ME. */
   String EXT_FLV = "flv";
-
   // details keys
-  /** DOCUMENT_ME. */
   String DETAIL_CURRENT_FILE_ID = "current file id";
-
-  /** DOCUMENT_ME. */
   String DETAIL_CURRENT_FILE = "current file";
-
-  /** DOCUMENT_ME. */
   String DETAIL_CURRENT_DATE = "current date";
-
-  /** DOCUMENT_ME. */
-  String DETAIL_SPECIAL_MODE_NORMAL = "norm";
-
-  /** DOCUMENT_ME. */
   String DETAIL_SELECTION = "selection";
-
-  /** DOCUMENT_ME. */
   String DETAIL_ORIGIN = "origin";
-
   /** Provides details on the perspective that thrown the event. */
   String DETAIL_PERSPECTIVE = "perspective";
-
   /** Provides details on the view that thrown the event. */
   String DETAIL_VIEW = "view";
-
-  /** DOCUMENT_ME. */
   String DETAIL_REASON = "reason";
-
-  /** DOCUMENT_ME. */
   String DETAIL_CONTENT = "content";
-
-  /** DOCUMENT_ME. */
   String DETAIL_OLD = "old";
-
-  /** DOCUMENT_ME. */
   String DETAIL_NEW = "new";
-
   // startup mode
-  /** DOCUMENT_ME. */
   String STARTUP_MODE_NOTHING = "nothing";
-
-  /** DOCUMENT_ME. */
   String STARTUP_MODE_SHUFFLE = "shuffle";
-
-  /** DOCUMENT_ME. */
   String STARTUP_MODE_ITEM = "file";
-
-  /** DOCUMENT_ME. */
   String STARTUP_MODE_LAST = "last";
-
-  /** DOCUMENT_ME. */
   String STARTUP_MODE_LAST_KEEP_POS = "last_keep_pos";
-
-  /** DOCUMENT_ME. */
   String STARTUP_MODE_BESTOF = "bestof";
-
-  /** DOCUMENT_ME. */
   String STARTUP_MODE_NOVELTIES = "novelties";
-
   // --- Configuration keys ---
-
-  /** DOCUMENT_ME. */
   String CONF_RELEASE = "jajuk.release";
-
-  /** DOCUMENT_ME. */
   String CONF_PERSPECTIVE_DEFAULT = "jajuk.preference.perspective.default";
-
-  /** DOCUMENT_ME. */
   String CONF_STATE_REPEAT = "jajuk.state.mode.repeat";
-
-  /** DOCUMENT_ME. */
   String CONF_STATE_REPEAT_ALL = "jajuk.state.mode.repeat.all";
-
-  /** DOCUMENT_ME. */
   String CONF_STATE_SHUFFLE = "jajuk.state.mode.shuffle";
-
-  /** DOCUMENT_ME. */
   String CONF_STATE_KARAOKE = "jajuk.state.karaoke";
-
-  /** DOCUMENT_ME. */
   String CONF_STATE_CONTINUE = "jajuk.state.mode.continue";
-
-  /** DOCUMENT_ME. */
   String CONF_STATE_INTRO = "jajuk.state.mode.intro";
-
-  /** DOCUMENT_ME. */
   String CONF_STARTUP_ITEM = "jajuk.startup.file";
-
-  /** DOCUMENT_ME. */
   String CONF_STARTUP_MODE = "jajuk.startup.mode";
-
   /** Tell if last jajuk session was closed in stopped mode. */
   String CONF_STARTUP_STOPPED = "jajuk.startup.stopped";
-
-  /** DOCUMENT_ME. */
   String CONF_CONFIRMATIONS_DELETE_FILE = "jajuk.confirmations.delete_file";
-
-  /** DOCUMENT_ME. */
   String CONF_CONFIRMATIONS_EXIT = "jajuk.confirmations.exit";
-
-  /** DOCUMENT_ME. */
   String CONF_CONFIRMATIONS_REMOVE_DEVICE = "jajuk.confirmations.remove_device";
-
-  /** DOCUMENT_ME. */
   String CONF_CONFIRMATIONS_DELETE_COVER = "jajuk.confirmations.delete_cover";
-
-  /** DOCUMENT_ME. */
   String CONF_CONFIRMATIONS_CLEAR_HISTORY = "jajuk.confirmations.clear_history";
-
-  /** DOCUMENT_ME. */
   String CONF_CONFIRMATIONS_RESET_RATINGS = "jajuk.confirmations.reset_ratings";
-
-  /** DOCUMENT_ME. */
   String CONF_CONFIRMATIONS_REFACTOR_FILES = "jajuk.confirmations.refactor_files";
-
-  /** DOCUMENT_ME. */
+  String CONF_CONFIRMATIONS_BEFORE_TAG_WRITE = "jajuk.confirmations.write_tag";
   String CONF_OPTIONS_HIDE_UNMOUNTED = "jajuk.options.hide_unmounted";
-
-  /** DOCUMENT_ME. */
   String CONF_OPTIONS_LOG_LEVEL = "jajuk.options.log_level";
-
-  /** DOCUMENT_ME. */
   String CONF_OPTIONS_LANGUAGE = "jajuk.options.language";
-
-  /** DOCUMENT_ME. */
   String CONF_OPTIONS_INTRO_BEGIN = "jajuk.options.intro.begin";
-
-  /** DOCUMENT_ME. */
   String CONF_OPTIONS_INTRO_LENGTH = "jajuk.options.intro.length";
-
-  /** DOCUMENT_ME. */
   String CONF_OPTIONS_LNF = "jajuk.options.lnf";
-
-  /** DOCUMENT_ME. */
   String CONF_OPTIONS_NOVELTIES_AGE = "jajuk.options.novelties";
-
   // Look and Feel
   /** Substance default theme *. */
   String LNF_DEFAULT_THEME = "Nebula";
-
   /** Number of visible planned tracks. */
   String CONF_OPTIONS_VISIBLE_PLANNED = "jajuk.options.visible_planned";
-
   /** Default action (play or push) when clicking on an item. */
   String CONF_OPTIONS_PUSH_ON_CLICK = "jajuk.options.default_action_click";
-
   /** Default action (play or push) when dropping on an item. */
   String CONF_OPTIONS_PUSH_ON_DROP = "jajuk.options.default_action_drop";
-
   /** Table / tree sync option prefix. */
   String CONF_SYNC_TABLE_TREE = "jajuk.sync_table_tree";
-
   /** Notificator type. */
   String CONF_UI_NOTIFICATOR_TYPE = "jajuk.options.notificator_type";
-
-  /** DOCUMENT_ME. */
   String CONF_P2P_SHARE = "jajuk.options.p2p.share";
-
-  /** DOCUMENT_ME. */
   String CONF_P2P_ADD_REMOTE_PROPERTIES = "jajuk.options.p2p.add_remote_properties";
-
-  /** DOCUMENT_ME. */
   String CONF_P2P_HIDE_LOCAL_PROPERTIES = "jajuk.options.p2p.hide_local_properties";
-
-  /** DOCUMENT_ME. */
-  String CONF_P2P_PASSWORD = "jajuk.options.p2p.password";
-
-  /** DOCUMENT_ME. */
   String CONF_HISTORY = "jajuk.options.history";
-
-  /** DOCUMENT_ME. */
+  String CONF_MANUAL_RATINGS = "jajuk.options.manual_ratings";
   String CONF_TAGS_USE_PARENT_DIR = "jajuk.tags.use_parent_dir";
-
-  /** DOCUMENT_ME. */
-  String CONF_DROP_PLAYED_TRACKS_FROM_QUEUE = "jajuk.drop.played.tracks.from.queue";
-
   /** Contains files id separated by a colon. */
   String CONF_BOOKMARKS = "jajuk.bookmarks";
-
   /** Startup display mode: 0= main window + tray, 1: tray only, 2: slimbar + tray 3 : full screen. */
   String CONF_STARTUP_DISPLAY = "jajuk.startup_display_mode";
-
-  /** DOCUMENT_ME. */
   int DISPLAY_MODE_MAIN_WINDOW = 0;
-
-  /** DOCUMENT_ME. */
   int DISPLAY_MODE_TRAY = 1;
-
-  /** DOCUMENT_ME. */
   int DISPLAY_MODE_SLIMBAR_TRAY = 2;
-
-  /** DOCUMENT_ME. */
   int DISPLAY_MODE_FULLSCREEN = 3;
-
   /** Catalog view cover mode. */
   int CATALOG_VIEW_COVER_MODE_ALL = 0;
-
-  /** DOCUMENT_ME. */
   int CATALOG_VIEW_COVER_MODE_WITH = 1;
-
-  /** DOCUMENT_ME. */
   int CATALOG_VIEW_COVER_MODE_WITHOUT = 2;
-
   /** Best of size. */
   String CONF_BESTOF_TRACKS_SIZE = "jajuk.bestof_size";
-
   /** Slimbar position. */
   String CONF_SLIMBAR_POSITION = "jajuk.slimbar_pos";
-
-  /** DOCUMENT_ME. */
   String CONF_SLIMBAR_DISPLAY_QUEUE = "jajuk.slimbar_display_queue";
-
   /** Gain (float). */
   String CONF_VOLUME = "jajuk.volume";
-
   /** Use regular expressions ?. */
   String CONF_REGEXP = "jajuk.regexp";
-
   /** Force mplayer to use short names *. */
   String CONF_SHORT_NAMES = "jajuk.short_names";
-
   /** Collection backup size in MB. */
   String CONF_BACKUP_SIZE = "jajuk.backup_size";
-
   /** Collection file charset (utf-8 or utf-16). */
   String CONF_COLLECTION_CHARSET = "jajuk.collection_charset";
-
-  /** DOCUMENT_ME. */
-  String CONF_STARTUP_LAST_POSITION = "jajuk.startup.last_position";
-
-  /** DOCUMENT_ME. */
+  /** Path of workspace the user wants to use but may be unavailable */
+  String CONF_TARGET_WORKSPACE_PATH = "jajuk.target_workspace";
   String CONF_NETWORK_USE_PROXY = "jajuk.network.use_proxy";
-
-  /** DOCUMENT_ME. */
   String CONF_NETWORK_PROXY_TYPE = "jajuk.network.proxy_type";
-
-  /** DOCUMENT_ME. */
   String CONF_NETWORK_PROXY_HOSTNAME = "jajuk.network.proxy_hostname";
-
-  /** DOCUMENT_ME. */
   String CONF_NETWORK_PROXY_PORT = "jajuk.network.proxy_port";
-
-  /** DOCUMENT_ME. */
   String CONF_NETWORK_PROXY_LOGIN = "jajuk.network.proxy_login";
-
-  /** DOCUMENT_ME. */
   String CONF_NETWORK_PROXY_PWD = "jajuk.network.proxy_pwd";
-
-  /** DOCUMENT_ME. */
   String CONF_LASTFM_AUDIOSCROBBLER_ENABLE = "jajuk.network.audioscrobbler";
-
-  /** DOCUMENT_ME. */
   String CONF_LASTFM_USER = "jajuk.network.ASUser";
-
-  /** DOCUMENT_ME. */
   String CONF_LASTFM_PASSWORD = "jajuk.network.ASPassword";
-
-  /** DOCUMENT_ME. */
   String CONF_COVERS_AUTO_COVER = "jajuk.covers.auto_cover";
-
-  /** DOCUMENT_ME. */
   String CONF_COVERS_MIRROW_COVER = "jajuk.covers.mirrow_cover";
-
-  /** DOCUMENT_ME. */
+  String CONF_COVERS_MIRROW_COVER_FS_MODE = "jajuk.covers.mirrow_cover_fs_mode";
   String CONF_COVERS_SHUFFLE = "jajuk.covers.shuffle";
-
-  /** DOCUMENT_ME. */
   String CONF_COVERS_SAVE_EXPLORER_FRIENDLY = "jajuk.covers.save.explorer.friendly";
-
-  /** DOCUMENT_ME. */
   String CONF_COVERS_SIZE = "jajuk.covers.size";
-
-  /** DOCUMENT_ME. */
   String CONF_COVERS_ACCURACY = "jajuk.covers.accuracy";
-
-  /** DOCUMENT_ME. */
   String CONF_NETWORK_CONNECTION_TO = "jajuk.network.connection_timeout";
-
   /** Last Option selected tab. */
   String CONF_OPTIONS_TAB = "jajuk.options.tab";
-
   /** Data buffer size in bytes. */
   String CONF_BUFFER_SIZE = "jajuk.buffer_size";
-
   /** Audio buffer size in bytes. */
   String CONF_AUDIO_BUFFER_SIZE = "jajuk.audio_buffer_size";
-
   /** Window position and size. */
   String CONF_WINDOW_POSITION = "jajuk.window_position";
-
   /** is Window maximized. */
   String CONF_WINDOW_MAXIMIZED = "jajuk.window_MAXIMIZED";
-
   /** Window position and size. */
   String CONF_PATTERN_FRAME_TITLE = "jajuk.frame.title";
-
   /** Refactoring pattern*. */
   String CONF_PATTERN_REFACTOR = "jajuk.refactor_pattern";
-
   /** Animation pattern*. */
   String CONF_PATTERN_ANIMATION = "jajuk.animation_pattern";
-
   /** Balloon notifier pattern. */
   String CONF_PATTERN_BALLOON_NOTIFIER = "jajuk.pattern.balloon_pattern";
-
   /** Information view pattern. */
   String CONF_PATTERN_INFORMATION = "jajuk.pattern.information_pattern";
-
   /** Files table columns. */
   String CONF_FILES_TABLE_COLUMNS = "jajuk.ui.physical_table_columns";
-
   /** Files table edition state. */
   String CONF_FILES_TABLE_EDITION = "jajuk.ui.physical_table_edition";
-
   /** Tracks table columns. */
   String CONF_TRACKS_TABLE_COLUMNS = "jajuk.ui.logical_table_columns";
-
   /** Tracks table edition state. */
   String CONF_TRACKS_TABLE_EDITION = "jajuk.ui.logical_table_edition";
-
   /** Albums table edition state. */
   String CONF_ALBUMS_TABLE_COLUMNS = "jajuk.ui.albums_table_columns";
-
   /** Albums table edition state. */
   String CONF_ALBUMS_TABLE_EDITION = "jajuk.ui.albums_table_edition";
-
+  /** Webradio table edition state. */
+  String CONF_WEBRADIO_TABLE_EDITION = "jajuk.ui.webradio_table_edition";
   /** Playlist editor columns to display. */
   String CONF_PLAYLIST_EDITOR_COLUMNS = "jajuk.ui.playlist_editor_columns";
-
   /** Playlist repository columns to display. */
   String CONF_PLAYLIST_REPOSITORY_COLUMNS = "jajuk.ui.playlist_repository_columns";
-
   /** Queue columns to display. */
   String CONF_QUEUE_COLUMNS = "jajuk.ui.queue_columns";
-
+  /** Web radios view columns to display. */
+  String CONF_WEBRADIO_COLUMNS = "jajuk.ui.webradio_columns";
   /** Catalog items size. */
   String CONF_THUMBS_SIZE = "jajuk.ui.cover_catalog.thumbs_size";
-
   /** Catalog items cover filter. */
   String CONF_THUMBS_SHOW_COVER = "jajuk.ui.cover_catalog.show_cover";
-
   /** Catalog sorter*. */
   String CONF_THUMBS_SORTER = "jajuk.catalog.sorter";
-
   /** Catalog filter*. */
   String CONF_THUMBS_FILTER = "jajuk.catalog.filter";
-
   /** Display tips on startup. */
   String CONF_SHOW_TIP_ON_STARTUP = "jajuk.tip.show_on_startup";
-
   /** Wikipedia language*. */
   String CONF_WIKIPEDIA_LANGUAGE = "jajuk.wikipedia.lang";
-
   /** Cross fade duration in secs. */
   String CONF_FADE_DURATION = "jajuk.fade_duration";
-
   /** Logical tree sort order. */
   String CONF_LOGICAL_TREE_SORT_ORDER = "jajuk.logical_tree_sort_order";
-
   /** Default dj. */
   String CONF_DEFAULT_DJ = "jajuk.default_dj";
-
   /** Default web radio. */
   String CONF_DEFAULT_WEB_RADIO = "jajuk.default_web_radio";
-
   /** List of ignored versions during update check. */
   String CONF_IGNORED_RELEASES = "jajuk.update.ignored_releases";
-
   /** Check for update property. */
   String CONF_CHECK_FOR_UPDATE = "jajuk.update.check_for_updates";
-
   /** Default ambience*. */
   String CONF_DEFAULT_AMBIENCE = "jajuk.default_ambience";
-
   /* Wrong player not show again flag */
-  /** DOCUMENT_ME. */
   String CONF_NOT_SHOW_AGAIN_PLAYER = "jajuk.not_show_again.player";
-
-  /** Concurrent session not show again flag. */
-  String CONF_NOT_SHOW_AGAIN_CONCURRENT_SESSION = "jajuk.not_show_again.concurrent_session";
-
   /** Cross fade alert not show again flag *. */
   String CONF_NOT_SHOW_AGAIN_CROSS_FADE = "jajuk.not_show_again.fade";
-
   /** Laf change not show again flag *. */
   String CONF_NOT_SHOW_AGAIN_LAF_CHANGE = "jajuk.not_show_laf_change";
-
   /** Global random mode: song or album level ? *. */
   String CONF_GLOBAL_RANDOM_MODE = "jajuk.global_random.mode";
-
   /** Novelties random mode: song or album level ?*. */
   String CONF_NOVELTIES_MODE = "jajuk.global_novelties.mode";
-
   /** Initial frame size/position forced value *. */
   String CONF_FRAME_POS_FORCED = "jajuk.frame.forced_position";
-
   // Forced mplayer path
-  /** DOCUMENT_ME. */
   String CONF_MPLAYER_PATH_FORCED = "jajuk.mplayer.forced_path";
-
   /** Hotkeys flag *. */
   String CONF_OPTIONS_HOTKEYS = "jajuk.options.use_hotkeys";
-
   /** MPLayer additional arguments *. */
   String CONF_MPLAYER_ARGS = "jajuk.player.mplayer_args";
-
   /** MPlayer additional environment variables *. */
   String CONF_ENV_VARIABLES = "jajuk.player.env_variables";
-
   /** Max Number of thumbs displayed at the same time in catalog view. */
   String CONF_CATALOG_PAGE_SIZE = "jajuk.catalog.pages_size";
-
   /** Show Catalog popups. */
   String CONF_SHOW_POPUPS = "jajuk.show_popups";
-
   /** Show systray. */
   String CONF_SHOW_SYSTRAY = "jajuk.show_systray";
-
+  /** Enable Title view Animation. */
+  String CONF_TITLE_ANIMATION = "jajuk.title_animation";
   /** Minimize to tray. */
   String CONF_MINIMIZE_TO_TRAY = "jajuk.minimize_to_tray";
-
+  /** Display on tray click. */
+  String CONF_TRAY_CLICK_DISPLAY_WINDOW = "jajuk.tray_click_display_window";
   /** Enable Last.FM information queries */
   String CONF_LASTFM_INFO = "jajuk.lastfm_information";
-
   /** Webradio playing at jajuk stop ?. */
   String CONF_WEBRADIO_WAS_PLAYING = "jajuk.webradio.was_playing";
-
   /** Font size. */
   String CONF_FONTS_SIZE = "jajuk.fonts_size";
-
   /** Increase rate value. */
   String CONF_INC_RATING = "jajuk.inc_rating.step";
-
   /** Use file date as discovery date option. */
   String CONF_FORCE_FILE_DATE = "jajuk.force_file_date";
-
   /** Perspective chooser icon size: 16x16, 32x32 or 40x40. */
   String CONF_PERSPECTIVE_ICONS_SIZE = "jajuk.ui.perspective_icons_size";
-
   /** Show duplicate playlists in playlist view. */
   String CONF_SHOW_DUPLICATE_PLAYLISTS = "jajuk.ui.show_duplicate_playlists";
-
   /** Smart mode selected in slimbar. */
   String CONF_SLIMBAR_SMART_MODE = "jajuk.ui.slimbar.smart_mode";
-
   /** volnorm option. */
   String CONF_USE_VOLNORM = "jajuk.mplayer.volnorm";
-
   /** None internet access switch. */
   String CONF_NETWORK_NONE_INTERNET_ACCESS = "jajuk.network.none_internet_access";
-
   /** Remembered directory for parties. */
   String CONF_PREPARE_PARTY = "jajuk.prepare_party.";
-  
-  /** Refreshing delay. */
-  String CONF_REFRESHING_DELAY_MS = "jajuk.refreshing_delay_ms";
-
+  /** Slashscreen flag. */
+  String CONF_SPLASH_SCREEN = "jajuk.splashscreen";
+  /** Current item index in fifo. */
+  String CONF_STARTUP_QUEUE_INDEX = "jajuk.current_file_index";
+  /** Current item index in fifo. */
+  String CONF_STATS_MIN_VALUE_GENRE_DISPLAY = "jajuk.stats.min_value_genre_display";
   /** Shuffle/novelties mode. */
   String MODE_ALBUM = "album";
-
-  /** DOCUMENT_ME. */
   String MODE_TRACK = "track";
-
-  /** DOCUMENT_ME. */
   String MODE_ALBUM2 = "album2";
-
   // miscelanous
-  /** DOCUMENT_ME. */
   String TRUE = "true";
-
-  /** DOCUMENT_ME. */
   String FALSE = "false";
-
   // Date format
-  /** DOCUMENT_ME. */
   String DATE_FILE = "yyyyMMdd";
-
-  /** DOCUMENT_ME. */
   String ADDITION_DATE_FORMAT = "yyyyMMdd";
-
   // Playlists
-  /** DOCUMENT_ME. */
   String PLAYLIST_NOTE = "#Playlist generated by Jajuk " + Const.JAJUK_VERSION;
-
   // XML tags
-  /** DOCUMENT_ME. */
   String XML_COLLECTION = "collection";
-
-  /** DOCUMENT_ME. */
+  /** Webradio file XML tags static strings*/
+  String XML_RADIO = "Radio";
   String XML_VERSION = "jajuk_version";
-
-  /** DOCUMENT_ME. */
   String XML_TYPES = "types";
-
-  /** DOCUMENT_ME. */
   String XML_TYPE = "type";
-
-  /** DOCUMENT_ME. */
   String XML_DEVICES = "devices";
-
-  /** DOCUMENT_ME. */
   String XML_DEVICE = "device";
-
-  /** DOCUMENT_ME. */
   String XML_GENRES = "styles";
-
-  /** DOCUMENT_ME. */
   String XML_GENRE = "style";
-
-  /** DOCUMENT_ME. */
   String XML_ARTISTS = "authors";
-
-  /** DOCUMENT_ME. */
   String XML_ALBUM_ARTISTS = "album-artists";
-
-  /** DOCUMENT_ME. */
   String XML_ARTIST = "author";
-
-  /** DOCUMENT_ME. */
   String XML_ALBUMS = "albums";
-
-  /** DOCUMENT_ME. */
   String XML_ALBUM = "album";
-
-  /** DOCUMENT_ME. */
   String XML_ALBUM_ARTIST = "album_artist";
-
-  /** DOCUMENT_ME. */
   String XML_ALBUM_DISC_ID = "disc_id";
-
-  /** DOCUMENT_ME. */
   String XML_TRACKS = "tracks";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK = "track";
-
-  /** DOCUMENT_ME. */
   String XML_DIRECTORIES = "directories";
-
-  /** DOCUMENT_ME. */
   String XML_DIRECTORY = "directory";
-
-  /** DOCUMENT_ME. */
   String XML_FILES = "files";
-
-  /** DOCUMENT_ME. */
   String XML_FILE = "file";
-
-  /** DOCUMENT_ME. */
   String XML_PLAYLIST_FILES = "playlist_files";
-
-  /** DOCUMENT_ME. */
   String XML_PLAYLIST_FILE = "playlist_file";
-
-  /** DOCUMENT_ME. */
   String XML_PLAYLISTS = "playlists";
-
-  /** DOCUMENT_ME. */
   String XML_ID = "id";
-
-  /** DOCUMENT_ME. */
   String XML_YEAR = "year";
-
-  /** DOCUMENT_ME. */
   String XML_YEARS = "years";
-
-  /** DOCUMENT_ME. */
   String XML_PLAY = "play";
-
-  /** DOCUMENT_ME. */
   String XML_FILE_DATE = "date";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_NAME = "name";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_ALBUM = "album";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_GENRE = "style";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_ARTIST = "author";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_YEAR = "year";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_LENGTH = "length";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_TYPE = "type";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_RATE = "rate";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_HITS = "hits";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_DISCOVERY_DATE = "added";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_ORDER = "order";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_DISC_NUMBER = "disc_number";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_PREFERENCE = "pf";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_TOTAL_PLAYTIME = "tpt";
-
-  /** DOCUMENT_ME. */
   String XML_TRACK_BANNED = "ban";
-
-  /** DOCUMENT_ME. */
+  String XML_TRACK_SCROBBLE = "scrobble";
   String XML_PLAYLIST = "playlist";
-
-  /** DOCUMENT_ME. */
   String XML_NAME = "name";
-
-  /** DOCUMENT_ME. */
   String XML_PATH = "path";
-
-  /** DOCUMENT_ME. */
   String XML_URL = "url";
-
-  /** DOCUMENT_ME. */
+  String XML_ORIGIN = "origin";
+  /** Keywords, separated by a ';'*/
+  String XML_KEYWORDS = "keywords";
+  /** Label*/
+  String XML_DESC = "label";
+  /** Bitrate */
+  String XML_BITRATE = "bitrate";
+  /** Frequency */
+  String XML_FREQUENCY = "frequency";
   String XML_QUALITY = "quality";
-
-  /** DOCUMENT_ME. */
   String XML_SIZE = "size";
-
-  /** DOCUMENT_ME. */
   String XML_DEVICE_MOUNT_POINT = "mount_point";
-
-  /** DOCUMENT_ME. */
   String XML_DEVICE_AUTO_REFRESH = "auto_refresh";
-
-  /** DOCUMENT_ME. */
   String XML_DEVICE_AUTO_MOUNT = "auto_mount";
-
-  /** DOCUMENT_ME. */
   String XML_DEVICE_SYNCHRO_SOURCE = "synchro_source";
-
-  /** DOCUMENT_ME. */
   String XML_DEVICE_SYNCHRO_MODE = "synchro_mode";
-
-  /** DOCUMENT_ME. */
   String XML_EXPANDED = "exp"; // can be 'y' or 'n'
-
   /** Cached cover. */
   String XML_ALBUM_DISCOVERED_COVER = "cover_cache";
-  
   /** Selected cover. */
   String XML_ALBUM_SELECTED_COVER = "cover";
-  
-  /** DOCUMENT_ME. */
   String XML_DIRECTORY_PARENT = "parent";
-
-  /** DOCUMENT_ME. */
   String XML_DIRECTORY_SYNCHRONIZED = "sync";
-
-  /** DOCUMENT_ME. */
   String XML_TYPE_EXTENSION = "extension";
-
-  /** DOCUMENT_ME. */
   String XML_TYPE_PLAYER_IMPL = "player_impl";
-
-  /** DOCUMENT_ME. */
   String XML_TYPE_TAG_IMPL = "tag_impl";
-
-  /** DOCUMENT_ME. */
   String XML_TYPE_IS_MUSIC = "music";
-
-  /** DOCUMENT_ME. */
   String XML_TYPE_SEEK_SUPPORTED = "seek";
-
   // icon used in the physical tree
-  /** DOCUMENT_ME. */
   String XML_TYPE_ICON = "icon";
-
   /** comment tag. */
   String XML_TRACK_COMMENT = "comment";
-
   /** "any" criteria. */
   String XML_ANY = "any";
-
   // constructor property flag
-  /** DOCUMENT_ME. */
   String XML_CONSTRUCTOR = "constructor";
-
   // property should be displayed ?
-  /** DOCUMENT_ME. */
   String XML_VISIBLE = "visible";
-
   // property editable ?
-  /** DOCUMENT_ME. */
   String XML_EDITABLE = "editable";
-
   // Property unique ?
-  /** DOCUMENT_ME. */
   String XML_UNIQUE = "unique";
-
   // custom property flag
-  /** DOCUMENT_ME. */
   String XML_CUSTOM = "custom";
-
   // Property
-  /** DOCUMENT_ME. */
   String XML_PROPERTY = "property";
-
   // default value
-  /** DOCUMENT_ME. */
   String XML_DEFAULT_VALUE = "default_value";
-
   // general dj tag
-  /** DOCUMENT_ME. */
   String XML_DJ_DJ = "dj";
-
   // general parameters
-  /** DOCUMENT_ME. */
   String XML_DJ_GENERAL = "general_parameters";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_RATING_LEVEL = "rating_level";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_UNICITY = "unicity";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_FADE_DURATION = "fade_duration";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_MAX_TRACKS = "max_tracks";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_PROPORTIONS = "proportions";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_PROPORTION = "proportion";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_AMBIENCE = "ambience";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_GENRES = "styles";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_VALUE = "values";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_PROPORTION_CLASS = "org.jajuk.services.dj.ProportionDigitalDJ";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_TRANSITION_CLASS = "org.jajuk.services.dj.TransitionDigitalDJ";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_AMBIENCE_CLASS = "org.jajuk.services.dj.AmbienceDigitalDJ";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_EXTENSION = "dj";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_TRANSITION = "transition";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_TRANSITIONS = "transitions";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_FROM = "from";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_TO = "to";
-
-  /** DOCUMENT_ME. */
   String XML_DJ_NUMBER = "number";
-
-  /** DOCUMENT_ME. */
   String XML_STREAMS = "streams";
-
-  /** DOCUMENT_ME. */
   String XML_STREAM = "stream";
-
   /*
    * Reserved XML tags for property names (note that a user can choose a property name equals to
    * meta information attributes names without pbm)
    */
-  /** DOCUMENT_ME. */
   String[] XML_RESERVED_ATTRIBUTE_NAMES = { XML_NAME, XML_ID, XML_TYPE_EXTENSION,
       XML_TYPE_PLAYER_IMPL, XML_TYPE_TAG_IMPL, XML_TYPE_SEEK_SUPPORTED, XML_TYPE_ICON,
       XML_TYPE_IS_MUSIC, XML_TYPE, XML_URL, XML_DEVICE_AUTO_MOUNT, XML_DEVICE_AUTO_REFRESH,
@@ -1333,152 +666,75 @@ public interface Const {
       XML_DIRECTORY_PARENT, XML_DEVICE, XML_DIRECTORY, XML_TRACK, XML_SIZE, XML_QUALITY,
       XML_PLAYLIST_FILES, XML_TRACK_COMMENT, XML_ANY, XML_TRACK_ORDER, XML_DEVICE_SYNCHRO_MODE,
       XML_DEVICE_SYNCHRO_SOURCE, XML_FILE_DATE, XML_TRACK_TOTAL_PLAYTIME, XML_TRACK_PREFERENCE,
-      XML_TRACK_BANNED, XML_TRACK_DISC_NUMBER, XML_ALBUM_ARTIST, XML_ALBUM_DISC_ID };
-
-  /** DOCUMENT_ME. */
+      XML_TRACK_BANNED, XML_TRACK_DISC_NUMBER, XML_ALBUM_ARTIST, XML_ALBUM_DISC_ID,
+      XML_TRACK_SCROBBLE, XML_ORIGIN };
+  /** Option name. */
   String PROPERTY_SEPARATOR = "Property_";
-
   // Formats
-  /** DOCUMENT_ME. */
+  /** Option name. */
   String FORMAT_STRING = "Property_Format_String";
-
-  /** DOCUMENT_ME. */
+  /** Option name. */
   String FORMAT_NUMBER = "Property_Format_Number";
-
-  /** DOCUMENT_ME. */
+  /** Option name. */
   String FORMAT_BOOLEAN = "Property_Format_Boolean";
-
-  /** DOCUMENT_ME. */
+  /** Option name.. */
   String FORMAT_FLOAT = "Property_Format_Float";
-
-  /** DOCUMENT_ME. */
+  /** Option name.. */
   String FORMAT_DATE = "Property_Format_Date";
-
   // Thumbs
-  /** DOCUMENT_ME. */
   String THUMBNAIL_SIZE_50X50 = "50x50";
-
-  /** DOCUMENT_ME. */
   String THUMBNAIL_SIZE_100X100 = "100x100";
-
-  /** DOCUMENT_ME. */
   String THUMBNAIL_SIZE_150X150 = "150x150";
-
-  /** DOCUMENT_ME. */
   String THUMBNAIL_SIZE_200X200 = "200x200";
-
-  /** DOCUMENT_ME. */
   String THUMBNAIL_SIZE_250X250 = "250x250";
-
-  /** DOCUMENT_ME. */
   String THUMBNAIL_SIZE_300X300 = "300x300";
-
   // Patterns
-  /** DOCUMENT_ME. */
   String PATTERN_ARTIST = "%artist";
-
-  /** DOCUMENT_ME. */
   String PATTERN_ALBUM_ARTIST = "%album_artist";
-
-  /** DOCUMENT_ME. */
   String PATTERN_DISC = "%disc";
-
-  /** DOCUMENT_ME. */
   String PATTERN_ALBUM = "%album";
-
-  /** DOCUMENT_ME. */
   String PATTERN_GENRE = "%genre";
-
-  /** DOCUMENT_ME. */
   String PATTERN_YEAR = "%year";
-
-  /** DOCUMENT_ME. */
   String PATTERN_TRACKNAME = "%title";
-
-  /** DOCUMENT_ME. */
   String PATTERN_TRACKORDER = "%n";
-
-  /** DOCUMENT_ME. */
-  String PATTERN_DEFAULT_REORG = PATTERN_ALBUM_ARTIST + "/" + PATTERN_YEAR + " - " + PATTERN_ALBUM
-      + "/" + PATTERN_TRACKORDER + " - " + PATTERN_ARTIST + " - " + PATTERN_TRACKNAME;
-
-  /** DOCUMENT_ME. */
+  String PATTERN_DEFAULT_REORG = PATTERN_YEAR + " - " + PATTERN_ALBUM + "/" + PATTERN_TRACKORDER
+      + " - " + PATTERN_ARTIST + " - " + PATTERN_TRACKNAME;
   String PATTERN_DEFAULT_ANIMATION = PATTERN_TRACKNAME + " (" + PATTERN_ARTIST + ")";
-
   // Strings
-  /** DOCUMENT_ME. */
   String FRAME_MAXIMIZED = "max";
-
   // Alarm Clock
-  /** DOCUMENT_ME. */
   String CONF_ALARM_TIME_HOUR = "jajuk.alarm.hour";
-
-  /** DOCUMENT_ME. */
   String CONF_ALARM_TIME_MINUTES = "jajuk.alarm.minutes";
-
-  /** DOCUMENT_ME. */
   String CONF_ALARM_TIME_SECONDS = "jajuk.alarm.seconds";
-
-  /** DOCUMENT_ME. */
   String CONF_ALARM_FILE = "jajuk.alarm.file";
-
-  /** DOCUMENT_ME. */
   String CONF_ALARM_MODE = "jajuk.alarm.mode";
-
-  /** DOCUMENT_ME. */
   String CONF_FORMAT_TIME_ELAPSED = "jajuk.format_elapsed_time";
-
-  /** DOCUMENT_ME. */
   String CONF_ALARM_ACTION = "jajuk.alarm.action";
-
-  /** DOCUMENT_ME. */
   String CONF_ALARM_ENABLED = "jajuk.alarm.enabled";
-
-  /** DOCUMENT_ME. */
+  /** Option name. */
   String CONF_AUTO_SCROLL = "jajuk.auto_scroll";
-
-  /** DOCUMENT_ME. */
+  /** Option name. */
   String CONF_EXPLORER_PATH = "jajuk.explorer_path";
-
+  /** Option name. */
+  String CONF_BIT_PERFECT = "jajuk.bit_perfect";
+  String CONF_SHOW_VIDEOS = "jajuk.show_videos";
+  String CONF_PRESERVE_FILE_DATES = "jajuk.preserve_date";
   // Alarm actions
-  /** DOCUMENT_ME. */
   String ALARM_START_ACTION = "Start Playing";
-
-  /** DOCUMENT_ME. */
   String ALARM_STOP_ACTION = "Stop Playing";
-
   // Preferences
-  /** DOCUMENT_ME. */
   long PREFERENCE_ADORE = 3;
-
-  /** DOCUMENT_ME. */
   long PREFERENCE_LOVE = 2;
-
-  /** DOCUMENT_ME. */
   long PREFERENCE_LIKE = 1;
-
-  /** DOCUMENT_ME. */
   long PREFERENCE_UNSET = 0;
-
-  /** DOCUMENT_ME. */
   long PREFERENCE_AVERAGE = -1;
-
-  /** DOCUMENT_ME. */
   long PREFERENCE_POOR = -2;
-
-  /** DOCUMENT_ME. */
   long PREFERENCE_HATE = -3;
-
-  /** DOCUMENT_ME. */
   String B_P_HTML = "</b></p></html>";
-
-  /** DOCUMENT_ME. */
   String P_B = "<p><b>";
-
-  /** DOCUMENT_ME. */
   String HTML = "<html>";
-
   /** File name where the tag cover is stored in. */
   String TAG_COVER_FILE = "tag_cover.png";
-
+  /** Current radio track */
+  String CURRENT_RADIO_TRACK = "current_radio_track";
 }
diff --git a/src/main/java/org/jajuk/util/DownloadManager.java b/src/main/java/org/jajuk/util/DownloadManager.java
index 8441a9e..dd1607c 100644
--- a/src/main/java/org/jajuk/util/DownloadManager.java
+++ b/src/main/java/org/jajuk/util/DownloadManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,44 +16,45 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.util;
 
-import ext.services.network.NetworkUtils;
-import ext.services.network.Proxy;
-
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.Authenticator;
 import java.net.HttpURLConnection;
 import java.net.PasswordAuthentication;
 import java.net.Proxy.Type;
 import java.net.URL;
+import java.net.URLConnection;
 import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.jajuk.services.core.SessionService;
 import org.jajuk.util.log.Log;
 
+import ext.services.network.NetworkUtils;
+import ext.services.network.Proxy;
+
 /**
  * Manages network downloads.
  */
 public final class DownloadManager {
-
-  /** DOCUMENT_ME. */
   private static Proxy proxy;
 
+  private static final int BUFFER_SIZE = 8000;
+
   /**
    * private constructor to avoid instantiating utility class.
    */
@@ -63,7 +64,7 @@ public final class DownloadManager {
   /**
    * Gets the remote covers list.
    * 
-   * @param search DOCUMENT_ME
+   * @param search 
    * 
    * @return a list of urls
    * 
@@ -75,53 +76,34 @@ public final class DownloadManager {
     if (search == null || search.trim().equals("")) {
       return alOut;
     }
-    // Select cover size
-    int i = Conf.getInt(Const.CONF_COVERS_SIZE);
-    String size = null;
-    switch (i) {
-    case 0: // small only
-      size = "small";
-      break;
-    case 1: // small or medium
-      size = "small|medium";
-      break;
-    case 2: // medium only
-      size = "medium";
-      break;
-    case 3: // medium or large
-      size = "medium|large";
-      break;
-    case 4: // large only
-      size = "large";
-      break;
-    }
-    String sSearchUrl = "http://images.google.com/images?q="
-        + URLEncoder.encode(search, "ISO-8859-1") + "&ie=ISO-8859-1&hl=en&btnG=Google+Search"
-        + "&imgsz=" + size;
-    Log.debug("Search URL: {{" + sSearchUrl + "}}");
-    String sRes = downloadText(new URL(sSearchUrl));
-    if (sRes == null || sRes.length() == 0) {
-      return alOut;
+    URL url = new URL("https://www.google.com/search?q=" + URLEncoder.encode(search, "ISO-8859-1")
+        + "&tbm=isch&biw=1092&source=lnms");
+    final URLConnection connection = url.openConnection();
+    // User-Agent is required to avoid 403 Google response
+    connection.setRequestProperty("User-Agent",
+        "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0");
+
+    // Retrieve response
+    String line;
+    final StringBuilder builder = new StringBuilder();
+    final BufferedReader reader = new BufferedReader(
+        new InputStreamReader(connection.getInputStream()));
+    while ((line = reader.readLine()) != null) {
+      builder.append(line);
     }
-    // Extract urls
-    Pattern pattern = Pattern.compile("http://[^,<>]*(.jpg|.gif|.png)");
-    // "http://[^,]*(.jpg|.gif|.png).*[0-9]* [xX] [0-9]*.*- [0-9]*");
-    Matcher matcher = pattern.matcher(sRes);
-    while (matcher.find()) {
-      // Clean up URLS
-      String sUrl = matcher.group().replaceAll("%2520", "%20");
-      URL url = new URL(sUrl);
 
-      // Remove duplicates
-      if (alOut.contains(url)) {
-        continue;
-      }
-      // Ignore URLs related to Google
-      if (url.toString().toLowerCase(Locale.getDefault()).matches(".*google.*")) {
-        continue;
+    // Analyse response with a pattern to extract image url
+    final Pattern pattern = Pattern.compile("data-src=\"https://[^ ]*\"");
+    final Matcher matcher = pattern.matcher(builder);
+    while (matcher.find()) {
+      final String sUrl = matcher.group();
+      if (sUrl.length() > 11) {
+        url = new URL(sUrl.substring(10, sUrl.length() - 1));
+        // Remove duplicates
+        if (!alOut.contains(url)) {
+          alOut.add(url);
+        }
       }
-      // Add the new url
-      alOut.add(url);
     }
     return alOut;
   }
@@ -135,25 +117,19 @@ public final class DownloadManager {
    * @throws IOException If a network problem occurs.
    */
   public static void download(URL url, File fDestination) throws IOException {
-    // Drop the query if user required "none Internet access from jajuk".
-    // This method shouldn't be called anyway because we views have to deal with
-    // this option at their level, this is a additional control.
-    if (Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS)) {
-      return;
-    }
     HttpURLConnection connection = NetworkUtils.getConnection(url, proxy);
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fDestination));
     try {
       BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
       try {
-        int i;
-        while ((i = bis.read()) != -1) {
-          bos.write(i);
+        int bytesRead = -1;
+        byte[] buffer = new byte[BUFFER_SIZE];
+        while ((bytesRead = bis.read(buffer)) != -1) {
+          bos.write(buffer, 0, bytesRead);
         }
       } finally {
         bis.close();
       }
-
       bos.flush();
     } finally {
       bos.close();
@@ -164,8 +140,7 @@ public final class DownloadManager {
   /**
    * Download the resource at the given url and cache it <br>
    * If the file is already in cache, it is returned immediately <br>
-   * The cache is currently cleared at each Jajuk session startup.
-   * 
+   *  
    * @param url url to download
    * 
    * @return cached file or null if a problem occurred
@@ -185,26 +160,10 @@ public final class DownloadManager {
     // probable collisions between views
     synchronized (file.getName().intern()) {
       // check if file is not already downloaded or being downloaded
-      if (file.exists()) {
+      if (file.exists() && file.length() > 0) {
         return file;
       }
-      HttpURLConnection connection = NetworkUtils.getConnection(url, proxy);
-      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
-      try {
-        BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
-        try {
-          int i;
-          while ((i = bis.read()) != -1) {
-            bos.write(i);
-          }
-        } finally {
-          bis.close();
-        }
-        bos.flush();
-      } finally {
-        bos.close();
-      }
-      connection.disconnect();
+      download(url,file);
       return file;
     }
   }
@@ -213,7 +172,7 @@ public final class DownloadManager {
    * Download the cover list.
    * 
    * @param url to download
-   * @param charset DOCUMENT_ME
+   * @param charset 
    * 
    * @return result as an array of bytes, null if a problem occurred
    * 
@@ -237,7 +196,7 @@ public final class DownloadManager {
   /**
    * Download text with the default charset UTF-8.
    * 
-   * @param url DOCUMENT_ME
+   * @param url 
    * 
    * @return the string
    * 
@@ -334,5 +293,4 @@ public final class DownloadManager {
   public static Proxy getProxy() {
     return proxy;
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/Filter.java b/src/main/java/org/jajuk/util/Filter.java
index e36a8ff..2274cfa 100644
--- a/src/main/java/org/jajuk/util/Filter.java
+++ b/src/main/java/org/jajuk/util/Filter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,14 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.util;
 
-import java.util.Collection;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
@@ -35,22 +36,18 @@ import org.jajuk.util.log.Log;
  * Filter on meta information.
  */
 public class Filter {
-
   /** Key. */
   String key;
-
   /** Value*. */
   String sValue;
-
   /** Human*. */
   boolean bHuman = false;
-
   /** Exact*. */
   boolean bExact = false;
 
   /**
    * Filter constructor.
-   * 
+   *
    * @param key key (property name). null if the filter is on any property
    * @param sValue value
    * @param bHuman is the filter apply value itself or its human representation if
@@ -66,7 +63,7 @@ public class Filter {
 
   /**
    * Checks if is exact.
-   * 
+   *
    * @return true, if is exact
    */
   public boolean isExact() {
@@ -75,7 +72,7 @@ public class Filter {
 
   /**
    * Checks if is human.
-   * 
+   *
    * @return true, if is human
    */
   public boolean isHuman() {
@@ -84,7 +81,7 @@ public class Filter {
 
   /**
    * Gets the property.
-   * 
+   *
    * @return the property
    */
   public String getProperty() {
@@ -93,7 +90,7 @@ public class Filter {
 
   /**
    * Gets the value.
-   * 
+   *
    * @return the value
    */
   public String getValue() {
@@ -109,35 +106,35 @@ public class Filter {
    * <p>
    * This filter is not thread safe.
    * </p>
-   * 
+   *
    * @param list The input list to filter. Filtering is done in-place on this list.
    * @param filter The filter to apply on the list.
    */
-  public static void filterItems(Collection<? extends Item> list, Filter filter) {
+  public static <T extends Item> List<T> filterItems(List<T> list, Filter filter,
+      @SuppressWarnings("unused")
+      Class<T> clazz) {
     if (filter == null || filter.getValue() == null) {
-      return;
+      return list;
     }
     // Check if property is not the "fake" any property
     boolean bAny = (filter.getProperty() == null || "any".equals(filter.getProperty()));
-
     String comparator = null;
     String checked = filter.getValue();
     // If checked is void, return the list as it
     if (StringUtils.isBlank(checked)) {
-      return;
+      return list;
     }
     // If pattern is wrong, return a void list
     try {
       Pattern.compile(checked);
     } catch (PatternSyntaxException e) {
       Log.debug("Wrong regexp pattern: " + checked);
-      list.clear();
-      return;
+      return Collections.emptyList();
     }
-
-    Iterator<? extends Item> it = list.iterator();
+    List<T> newList = new ArrayList<T>();
+    Iterator<T> it = list.iterator();
     while (it.hasNext()) {
-      Item item = it.next();
+      T item = it.next();
       // If none property set, the search if global "any"
       if (bAny) {
         comparator = item.getAny();
@@ -171,11 +168,10 @@ public class Filter {
         // Do not use Regexp matches() method, too costly
         bMatch = UtilString.matchesIgnoreCaseAndOrder(checked, comparator);
       }
-      if (!bMatch) {
-        it.remove();
+      if (bMatch) {
+        newList.add(item);
       }
     }
-    return;
+    return newList;
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/IconLoader.java b/src/main/java/org/jajuk/util/IconLoader.java
index 784c480..e6f6e7c 100644
--- a/src/main/java/org/jajuk/util/IconLoader.java
+++ b/src/main/java/org/jajuk/util/IconLoader.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.util;
 
 import java.util.HashMap;
@@ -33,7 +32,6 @@ import javax.swing.ImageIcon;
  * </p>
  */
 final public class IconLoader {
-
   /** Icons cache *. */
   private static Map<JajukIcons, ImageIcon> cache = new HashMap<JajukIcons, ImageIcon>(200);
 
@@ -53,7 +51,7 @@ final public class IconLoader {
   public static ImageIcon getNoCoverIcon(int size) {
     String constant = new StringBuilder("NO_COVER_").append(size).append('X').append(size)
         .toString();
-    return getIcon(JajukIcons.valueOf(JajukIcons.class, constant));
+    return getIcon(JajukIcons.valueOf(constant));
   }
 
   /**
@@ -65,851 +63,428 @@ final public class IconLoader {
    * before being returned.
    */
   public static ImageIcon getIcon(JajukIcons icon) {
-
     // Try to recover the icon from the cache first
     if (cache.containsKey(icon)) {
       return cache.get(icon);
     }
-
     ImageIcon out = null;
-
     if (icon == JajukIcons.NO_COVER) {
       out = new ImageIcon(UtilSystem.getResource("images/included/" + Const.FILE_THUMB_NO_COVER));
-    }
-
-    else if (icon == JajukIcons.NONE) {
+    } else if (icon == JajukIcons.NONE) {
       out = new ImageIcon(UtilSystem.getResource("images/included/" + Const.FILE_THUMB_NONE));
-    }
-
-    else if (icon == JajukIcons.NO_COVER_50X50) {
+    } else if (icon == JajukIcons.NO_COVER_50X50) {
       out = UtilGUI.getResizedImage(getIcon(JajukIcons.NO_COVER), 50, 50);
-    }
-
-    else if (icon == JajukIcons.NO_COVER_100X100) {
+    } else if (icon == JajukIcons.NO_COVER_100X100) {
       out = UtilGUI.getResizedImage(getIcon(JajukIcons.NO_COVER), 100, 100);
-    }
-
-    else if (icon == JajukIcons.NO_COVER_150X150) {
+    } else if (icon == JajukIcons.NO_COVER_150X150) {
       out = UtilGUI.getResizedImage(getIcon(JajukIcons.NO_COVER), 150, 150);
-    }
-
-    else if (icon == JajukIcons.NO_COVER_200X200) {
+    } else if (icon == JajukIcons.NO_COVER_200X200) {
       out = UtilGUI.getResizedImage(getIcon(JajukIcons.NO_COVER), 200, 200);
-    }
-
-    else if (icon == JajukIcons.NO_COVER_250X250) {
+    } else if (icon == JajukIcons.NO_COVER_250X250) {
       out = UtilGUI.getResizedImage(getIcon(JajukIcons.NO_COVER), 250, 250);
-    }
-
-    else if (icon == JajukIcons.NO_COVER_300X300) {
+    } else if (icon == JajukIcons.NO_COVER_300X300) {
       out = UtilGUI.getResizedImage(getIcon(JajukIcons.NO_COVER), 300, 300);
-    }
-
-    else if (icon == JajukIcons.LOGO) {
+    } else if (icon == JajukIcons.LOGO) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/jajuk-icon_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.TRAY) {
+    } else if (icon == JajukIcons.TRAY) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/jajuk-icon_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.COVER_16X16) {
+    } else if (icon == JajukIcons.COVER_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/thumbnail_16x16.png"));
-    }
-
-    // Correctly displayed under JRE 1.6, ugly under Linux/JRE 1.5
-    else if (icon == JajukIcons.LOGO_FRAME) {
+    } else if (icon == JajukIcons.LOGO_FRAME) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/jajuk-icon_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.REPEAT) {
+    } else if (icon == JajukIcons.REPEAT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/repeat_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.REPEAT_ALL) {
+    } else if (icon == JajukIcons.REPEAT_ALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/repeat_all_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.SHUFFLE) {
+    } else if (icon == JajukIcons.SHUFFLE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/shuffle_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.CONTINUE) {
+    } else if (icon == JajukIcons.CONTINUE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/continue_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.INTRO) {
+    } else if (icon == JajukIcons.INTRO) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/intro_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.KARAOKE) {
+    } else if (icon == JajukIcons.KARAOKE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/karaoke_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.SHUFFLE_GLOBAL) {
+    } else if (icon == JajukIcons.SHUFFLE_GLOBAL) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/shuffle_global_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.SHUFFLE_GLOBAL_16X16) {
+    } else if (icon == JajukIcons.SHUFFLE_GLOBAL_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/shuffle_global_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.BESTOF) {
+    } else if (icon == JajukIcons.BESTOF) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/bestof_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.BESTOF_16X16) {
+    } else if (icon == JajukIcons.BESTOF_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/bestof_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.MUTED) {
+    } else if (icon == JajukIcons.MUTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/mute_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.VOLUME_LEVEL1) {
+    } else if (icon == JajukIcons.VOLUME_LEVEL1) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/volume1.png"));
-    }
-
-    else if (icon == JajukIcons.VOLUME_LEVEL2) {
+    } else if (icon == JajukIcons.VOLUME_LEVEL2) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/volume2.png"));
-    }
-
-    else if (icon == JajukIcons.VOLUME_LEVEL3) {
+    } else if (icon == JajukIcons.VOLUME_LEVEL3) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/volume3.png"));
-    }
-
-    else if (icon == JajukIcons.WEBRADIO) {
+    } else if (icon == JajukIcons.WEBRADIO) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/webradio_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.NOVELTIES) {
+    } else if (icon == JajukIcons.NOVELTIES) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/novelties_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.NOVELTIES_16X16) {
+    } else if (icon == JajukIcons.NOVELTIES_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/novelties_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_NEXT_SMALL) {
+    } else if (icon == JajukIcons.PLAYER_NEXT_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_next_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.SAVE_AS) {
+    } else if (icon == JajukIcons.SAVE_AS) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/saveas_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_PREVIOUS_SMALL) {
+    } else if (icon == JajukIcons.PLAYER_PREVIOUS_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_previous_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_PREVIOUS) {
+    } else if (icon == JajukIcons.PLAYER_PREVIOUS) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/player_previous_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_PREVIOUS_BIG) {
+    } else if (icon == JajukIcons.PLAYER_PREVIOUS_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_previous_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_NEXT) {
+    } else if (icon == JajukIcons.PLAYER_NEXT) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/player_next_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_NEXT_BIG) {
+    } else if (icon == JajukIcons.PLAYER_NEXT_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_next_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.INC_RATING) {
+    } else if (icon == JajukIcons.INC_RATING) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/inc_rating_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.REW) {
+    } else if (icon == JajukIcons.REW) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/player_rew_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_REWIND_BIG) {
+    } else if (icon == JajukIcons.PLAYER_REWIND_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_rew_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.AUTOSCROLL) {
+    } else if (icon == JajukIcons.AUTOSCROLL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/autoscroll.png"));
-    }
-
-    else if (icon == JajukIcons.REW_16X16) {
+    } else if (icon == JajukIcons.REW_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_rew_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_PLAY) {
+    } else if (icon == JajukIcons.PLAYER_PLAY) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/player_play_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_PLAY_BIG) {
+    } else if (icon == JajukIcons.PLAYER_PLAY_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_play_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.PLAY_16X16) {
+    } else if (icon == JajukIcons.PLAY_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_play_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_PAUSE) {
+    } else if (icon == JajukIcons.PLAYER_PAUSE) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/player_pause_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_PAUSE_BIG) {
+    } else if (icon == JajukIcons.PLAYER_PAUSE_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_pause_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.PAUSE_16X16) {
+    } else if (icon == JajukIcons.PAUSE_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_pause_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_STOP) {
+    } else if (icon == JajukIcons.PLAYER_STOP) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/player_stop_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_STOP_BIG) {
+    } else if (icon == JajukIcons.PLAYER_STOP_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_stop_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.STOP_16X16) {
+    } else if (icon == JajukIcons.STOP_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_stop_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.FWD) {
+    } else if (icon == JajukIcons.FWD) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/player_fwd_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYER_FORWARD_BIG) {
+    } else if (icon == JajukIcons.PLAYER_FORWARD_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_fwd_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.FWD_16X16) {
+    } else if (icon == JajukIcons.FWD_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_fwd_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.VOLUME) {
+    } else if (icon == JajukIcons.VOLUME) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/volume_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.CLOSE) {
+    } else if (icon == JajukIcons.CLOSE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/close_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.SLIM_WINDOW) {
+    } else if (icon == JajukIcons.SLIM_WINDOW) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/slim_window_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.FULL_SCREEN) {
+    } else if (icon == JajukIcons.FULL_SCREEN) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/full_window_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.POSITION) {
+    } else if (icon == JajukIcons.STOP_AFTER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/position_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.INFO) {
+    } else if (icon == JajukIcons.INFO) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/info_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.BOOKMARK_FOLDERS) {
+    } else if (icon == JajukIcons.BOOKMARK_FOLDERS) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/bookmark_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_SIMPLE) {
+    } else if (icon == JajukIcons.PERSPECTIVE_SIMPLE) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_simple_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_PHYSICAL) {
+    } else if (icon == JajukIcons.PERSPECTIVE_PHYSICAL) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_physic_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_LOGICAL) {
+    } else if (icon == JajukIcons.PERSPECTIVE_LOGICAL) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_logic_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_STATISTICS) {
+    } else if (icon == JajukIcons.PERSPECTIVE_STATISTICS) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_stat_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_CONFIGURATION) {
+    } else if (icon == JajukIcons.PERSPECTIVE_CONFIGURATION) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_configuration_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_PLAYER) {
+    } else if (icon == JajukIcons.PERSPECTIVE_PLAYER) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_player_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_CATALOG) {
+    } else if (icon == JajukIcons.PERSPECTIVE_CATALOG) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_catalog_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_PLAYLISTS) {
+    } else if (icon == JajukIcons.PERSPECTIVE_PLAYLISTS) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_playlists_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.PERSPECTIVE_INFORMATION) {
+    } else if (icon == JajukIcons.PERSPECTIVE_INFORMATION) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/perspective_information_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.OPEN_FILE) {
+    } else if (icon == JajukIcons.OPEN_FILE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/fileopen_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.EXIT) {
+    } else if (icon == JajukIcons.EXIT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/exit_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.NEW) {
+    } else if (icon == JajukIcons.NEW) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/new_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.SEARCH) {
+    } else if (icon == JajukIcons.SEARCH) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/search_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DELETE) {
+    } else if (icon == JajukIcons.DELETE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/delete_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PROPERTIES) {
+    } else if (icon == JajukIcons.PROPERTIES) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/properties_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.VOID) {
+    } else if (icon == JajukIcons.VOID) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/void_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.CONFIGURATION) {
+    } else if (icon == JajukIcons.CONFIGURATION) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/configure_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.MOUNT) {
+    } else if (icon == JajukIcons.MOUNT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/mount_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.UPDATE_MANAGER) {
+    } else if (icon == JajukIcons.UPDATE_MANAGER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/update_manager_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.UNMOUNT) {
+    } else if (icon == JajukIcons.UNMOUNT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/unmount_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TRACES) {
+    } else if (icon == JajukIcons.TRACES) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/traces_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TEST) {
+    } else if (icon == JajukIcons.TEST) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/test_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.REORGANIZE) {
+    } else if (icon == JajukIcons.REORGANIZE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/reorganize_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.REFRESH) {
+    } else if (icon == JajukIcons.REFRESH) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/refresh_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.RESTORE_ALL_VIEWS) {
+    } else if (icon == JajukIcons.RESTORE_ALL_VIEWS) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/refresh_all_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.SYNCHRO) {
+    } else if (icon == JajukIcons.SYNCHRO) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/synchro_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_NEW) {
+    } else if (icon == JajukIcons.DEVICE_NEW) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/new_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_CD_MOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_CD_MOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/cdrom_mount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_CD_UNMOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_CD_UNMOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/cdrom_unmount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_EXT_DD_MOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_EXT_DD_MOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/ext_dd_mount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_EXT_DD_UNMOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_EXT_DD_UNMOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/ext_dd_unmount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_DIRECTORY_MOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_DIRECTORY_MOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/folder_mount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_DIRECTORY_UNMOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_DIRECTORY_UNMOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/folder_unmount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_PLAYER_MOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_PLAYER_MOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_mount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_PLAYER_UNMOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_PLAYER_UNMOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/player_unmount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/nfs_mount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED) {
+    } else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED) {
       out = new ImageIcon(UtilSystem.getResource("icons/64x64/nfs_unmount_64x64.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_CD_MOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_CD_MOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/cdrom_mount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_CD_UNMOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_CD_UNMOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/cdrom_unmount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_EXT_DD_MOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_EXT_DD_MOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/ext_dd_mount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_EXT_DD_UNMOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_EXT_DD_UNMOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/ext_dd_unmount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_MOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/nfs_mount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_NETWORK_DRIVE_UNMOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/nfs_unmount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_DIRECTORY_MOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_DIRECTORY_MOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/folder_mount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_DIRECTORY_UNMOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_DIRECTORY_UNMOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/folder_unmount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_PLAYER_MOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_PLAYER_MOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/player_mount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.DEVICE_PLAYER_UNMOUNTED_SMALL) {
+    } else if (icon == JajukIcons.DEVICE_PLAYER_UNMOUNTED_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/player_unmount_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.OK) {
+    } else if (icon == JajukIcons.OK) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/ok_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.OK_SMALL) {
+    } else if (icon == JajukIcons.OK_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/ok_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.KO) {
+    } else if (icon == JajukIcons.KO) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/ko_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.TRACK) {
+    } else if (icon == JajukIcons.TRACK) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/track_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DIRECTORY_SYNCHRO) {
+    } else if (icon == JajukIcons.DIRECTORY_SYNCHRO) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/dir_synchro_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DIRECTORY_DESYNCHRO) {
+    } else if (icon == JajukIcons.DIRECTORY_DESYNCHRO) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/dir_desynchro_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYLIST_FILE) {
+    } else if (icon == JajukIcons.PLAYLIST_FILE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/playlist_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.GENRE) {
+    } else if (icon == JajukIcons.GENRE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/genre_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.EMPTY) {
+    } else if (icon == JajukIcons.EMPTY) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/empty_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ARTIST) {
+    } else if (icon == JajukIcons.ARTIST) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/artist_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ALBUM) {
+    } else if (icon == JajukIcons.ALBUM) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/album_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.YEAR) {
+    } else if (icon == JajukIcons.YEAR) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/clock_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.APPLY_FILTER) {
+    } else if (icon == JajukIcons.APPLY_FILTER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/filter_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DISCOVERY_DATE) {
+    } else if (icon == JajukIcons.DISCOVERY_DATE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/calendar_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.CLEAR_FILTER) {
+    } else if (icon == JajukIcons.CLEAR_FILTER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/clear_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ADVANCED_FILTER) {
+    } else if (icon == JajukIcons.ADVANCED_FILTER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/complex_search_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYLIST_NEW) {
+    } else if (icon == JajukIcons.PLAYLIST_NEW) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/playlist_new_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYLIST_NEW_SMALL) {
+    } else if (icon == JajukIcons.PLAYLIST_NEW_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/new_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYLIST_BOOKMARK) {
+    } else if (icon == JajukIcons.PLAYLIST_BOOKMARK) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/playlist_bookmark_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYLIST_BOOKMARK_SMALL) {
+    } else if (icon == JajukIcons.PLAYLIST_BOOKMARK_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/bookmark_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYLIST_BESTOF) {
+    } else if (icon == JajukIcons.PLAYLIST_BESTOF) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/bestof_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.PLAYLIST_NOVELTIES) {
+    } else if (icon == JajukIcons.PLAYLIST_NOVELTIES) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/novelties_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.RUN) {
+    } else if (icon == JajukIcons.RUN) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_play_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ADD) {
+    } else if (icon == JajukIcons.ADD) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/add_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.REMOVE) {
+    } else if (icon == JajukIcons.REMOVE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/remove_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.UP) {
+    } else if (icon == JajukIcons.UP) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/up_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DOWN) {
+    } else if (icon == JajukIcons.DOWN) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/down_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ADD_SHUFFLE) {
+    } else if (icon == JajukIcons.ADD_SHUFFLE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/add_shuffle_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.CLEAR) {
+    } else if (icon == JajukIcons.CLEAR) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/clear_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.SAVE) {
+    } else if (icon == JajukIcons.SAVE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/save_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.EXT_DRIVE) {
+    } else if (icon == JajukIcons.EXT_DRIVE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/ext_drive_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DEFAULT_COVER) {
+    } else if (icon == JajukIcons.DEFAULT_COVER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/ok_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.FINISH_ALBUM) {
+    } else if (icon == JajukIcons.FINISH_ALBUM) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/finish_album_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.FINISH_ALBUM_16X16) {
+    } else if (icon == JajukIcons.FINISH_ALBUM_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/finish_album_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.NET_SEARCH) {
+    } else if (icon == JajukIcons.NET_SEARCH) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/netsearch_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TRACK_FIFO_PLANNED) {
+    } else if (icon == JajukIcons.TRACK_FIFO_PLANNED) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/clock_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TRACK_FIFO_NORM) {
+    } else if (icon == JajukIcons.TRACK_FIFO_NORM) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_play_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TRACK_FIFO_REPEAT) {
+    } else if (icon == JajukIcons.TRACK_FIFO_REPEAT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/repeat_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TRACK_FIFO_PLAYING) {
-      out = new ImageIcon(UtilSystem.getResource("icons/16x16/ok_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.WIZARD) {
+    } else if (icon == JajukIcons.WIZARD) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/wizard_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_MP3) {
+    } else if (icon == JajukIcons.TYPE_MP3) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_mp3_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_MP2) {
+    } else if (icon == JajukIcons.TYPE_MP2) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_mp2_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_OGG) {
+    } else if (icon == JajukIcons.TYPE_OGG) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_ogg_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_AU) {
+    } else if (icon == JajukIcons.TYPE_AU) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_wav_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_AIFF) {
+    } else if (icon == JajukIcons.TYPE_AIFF) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_wav_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_FLAC) {
+    } else if (icon == JajukIcons.TYPE_FLAC) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_flac_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_MPC) {
+    } else if (icon == JajukIcons.TYPE_MPC) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_wav_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_WMA) {
+    } else if (icon == JajukIcons.TYPE_WMA) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_wma_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_APE) {
+    } else if (icon == JajukIcons.TYPE_APE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_ape_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_AAC) {
+    } else if (icon == JajukIcons.TYPE_AAC) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_aac_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_WAV) {
+    } else if (icon == JajukIcons.TYPE_WAV) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_wav_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TYPE_RAM) {
+    } else if (icon == JajukIcons.TYPE_RAM) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/type_ram_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.NO_EDIT) {
+    } else if (icon == JajukIcons.NO_EDIT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/stop_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.EDIT) {
+    } else if (icon == JajukIcons.EDIT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/edit_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.UNKNOWN) {
+    } else if (icon == JajukIcons.UNKNOWN) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/presence_unknown_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TIP) {
+    } else if (icon == JajukIcons.TIP) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/tip_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.TIP_SMALL) {
+    } else if (icon == JajukIcons.TIP_SMALL) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/tip_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.OPEN_DIR) {
+    } else if (icon == JajukIcons.OPEN_DIR) {
       out = new ImageIcon(UtilSystem.getResource("icons/40x40/folder_open_40x40.png"));
-    }
-
-    else if (icon == JajukIcons.STAR_0) {
+    } else if (icon == JajukIcons.STAR_0) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/star0_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.STAR_1) {
+    } else if (icon == JajukIcons.STAR_1) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/star1_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.STAR_2) {
+    } else if (icon == JajukIcons.STAR_2) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/star2_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.STAR_3) {
+    } else if (icon == JajukIcons.STAR_3) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/star3_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.STAR_4) {
+    } else if (icon == JajukIcons.STAR_4) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/star4_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DROP_DOWN_32X32) {
+    } else if (icon == JajukIcons.DROP_DOWN_32X32) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/dropdown_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.DROP_DOWN_16X16) {
+    } else if (icon == JajukIcons.DROP_DOWN_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/dropdown_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DIGITAL_DJ) {
+    } else if (icon == JajukIcons.DIGITAL_DJ) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/ddj_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.DIGITAL_DJ_16X16) {
+    } else if (icon == JajukIcons.DIGITAL_DJ_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/ddj_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.WEBRADIO_16X16) {
+    } else if (icon == JajukIcons.WEBRADIO_16X16) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/webradio_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.LIST) {
+    } else if (icon == JajukIcons.LIST) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/contents_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.CDDB) {
+    } else if (icon == JajukIcons.CDDB) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/cddb_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PLAY_TABLE) {
+    } else if (icon == JajukIcons.PLAY_TABLE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/player_play_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DEFAULTS) {
+    } else if (icon == JajukIcons.DEFAULTS) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/undo_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DEFAULTS_BIG) {
+    } else if (icon == JajukIcons.DEFAULTS_BIG) {
       out = new ImageIcon(UtilSystem.getResource("icons/22x22/undo_22x22.png"));
-    }
-
-    else if (icon == JajukIcons.ACCURACY_LOW) {
+    } else if (icon == JajukIcons.ACCURACY_LOW) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/accuracy_low_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ACCURACY_MEDIUM) {
+    } else if (icon == JajukIcons.ACCURACY_MEDIUM) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/accuracy_medium_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ACCURACY_HIGH) {
+    } else if (icon == JajukIcons.ACCURACY_HIGH) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/accuracy_high_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.REPORT) {
+    } else if (icon == JajukIcons.REPORT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/report_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PUSH) {
+    } else if (icon == JajukIcons.PUSH) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/push_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.COPY) {
+    } else if (icon == JajukIcons.COPY) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/editcopy_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.CUT) {
+    } else if (icon == JajukIcons.CUT) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/editcut_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PASTE) {
+    } else if (icon == JajukIcons.PASTE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/editpaste_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.LAUNCH) {
+    } else if (icon == JajukIcons.LAUNCH) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/launch_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.HISTORY) {
+    } else if (icon == JajukIcons.HISTORY) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/history_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.POPUP) {
+    } else if (icon == JajukIcons.POPUP) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/popup_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.ALARM) {
+    } else if (icon == JajukIcons.ALARM) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/alarm_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.BAN) {
+    } else if (icon == JajukIcons.BAN) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/ban_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.UNBAN) {
+    } else if (icon == JajukIcons.UNBAN) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/ok_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREFERENCE_ADORE) {
+    } else if (icon == JajukIcons.PREFERENCE_ADORE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/preference-adore_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREFERENCE_AVERAGE) {
+    } else if (icon == JajukIcons.PREFERENCE_AVERAGE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/preference-average_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREFERENCE_POOR) {
+    } else if (icon == JajukIcons.PREFERENCE_POOR) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/preference-poor_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREFERENCE_HATE) {
+    } else if (icon == JajukIcons.PREFERENCE_HATE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/preference-hate_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREFERENCE_LIKE) {
+    } else if (icon == JajukIcons.PREFERENCE_LIKE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/preference-like_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREFERENCE_LOVE) {
+    } else if (icon == JajukIcons.PREFERENCE_LOVE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/preference-love_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREFERENCE_UNSET) {
+    } else if (icon == JajukIcons.PREFERENCE_UNSET) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/preference-unknown_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREPARE_PARTY) {
+    } else if (icon == JajukIcons.PREPARE_PARTY) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/ext_drive_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.PREPARE_PARTY_32X32) {
+    } else if (icon == JajukIcons.PREPARE_PARTY_32X32) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/ext_drive_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.COPY_TO_CLIPBOARD) {
+    } else if (icon == JajukIcons.COPY_TO_CLIPBOARD) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/copy_url_clipboard_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.AMBIENCE) {
+    } else if (icon == JajukIcons.AMBIENCE) {
       out = new ImageIcon(UtilSystem.getResource("icons/32x32/ambience_32x32.png"));
-    }
-
-    else if (icon == JajukIcons.OPEN_EXPLORER) {
+    } else if (icon == JajukIcons.OPEN_EXPLORER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/explorer_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.TREE_TABLE_SYNC) {
+    } else if (icon == JajukIcons.TREE_TABLE_SYNC) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/tree-table-sync_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DONATE) {
+    } else if (icon == JajukIcons.DONATE) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/donate_16x16.png"));
-    }
-
-    else if (icon == JajukIcons.DISC_NUMBER) {
+    } else if (icon == JajukIcons.DISC_NUMBER) {
       out = new ImageIcon(UtilSystem.getResource("icons/16x16/disc_number_16x16.png"));
     }
-
     // Cache the result
     if (!cache.containsKey(icon)) {
       cache.put(icon, out);
diff --git a/src/main/java/org/jajuk/util/JajukFileFilter.java b/src/main/java/org/jajuk/util/JajukFileFilter.java
index 8a77a2d..97de7ef 100644
--- a/src/main/java/org/jajuk/util/JajukFileFilter.java
+++ b/src/main/java/org/jajuk/util/JajukFileFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.util;
 
 import java.io.File;
@@ -30,9 +29,7 @@ import org.apache.commons.lang.StringUtils;
 
 /**
  * Advanced file filter.
- * 
- * @see <a href="https://trac.jajuk.info/wiki/JajukDevGuide#Filesfilters">The
- * description</a> for direction to use
+ *  * 
  * <p>
  * Example: new
  * JajukFilter(false,JajukFileFilter.DirectoryFilter.getInstance(),
@@ -49,34 +46,26 @@ public class JajukFileFilter extends FileFilter implements java.io.FileFilter, C
   // that is overwritten later on, we should investigate if we can separate those two concerns...
   // also some filters do not really depend on JajukFileFilter, e.g. DirectoryFilter, and thus
   // might return incorrect data in certain cases, e.g. extension...
-
   /** Filters. */
   private JajukFileFilter[] filters = {};
-
   /** Show directories (useful to allow user to navigate). */
   protected boolean bShowDirectories = false;
-
   /** List of Extensions for the current filter. */
   protected String[] extensions = {};
-
-  /** DOCUMENT_ME. */
   protected String extensionsString = "";
-
   /** And or OR applied to multi filters ?. */
   private boolean bAND = true;
 
   /**
    * Filter constructor.
    *
-   * @param bAND DOCUMENT_ME
+   * @param bAND 
    * @param filters undefined list of jajuk filter to be applied (logical AND applied
    * between filters)
    */
   public JajukFileFilter(final boolean bAND, final JajukFileFilter... filters) {
     super();
-
     this.bAND = bAND;
-
     this.filters = new JajukFileFilter[filters.length];
     System.arraycopy(filters, 0, this.filters, 0, filters.length);
   }
@@ -104,7 +93,6 @@ public class JajukFileFilter extends FileFilter implements java.io.FileFilter, C
    */
   public JajukFileFilter(final String[] extensions) {
     super();
-
     this.extensions = (extensions != null) ? extensions : new String[] {};
     final int size = this.extensions.length;
     for (int i = 0; i < size; i++) {
@@ -128,7 +116,6 @@ public class JajukFileFilter extends FileFilter implements java.io.FileFilter, C
   @Override
   public boolean accept(final File f) {
     boolean acceptance = false;
-
     if (filters.length != 0) {
       boolean test = false;
       if (bAND) {
@@ -194,7 +181,6 @@ public class JajukFileFilter extends FileFilter implements java.io.FileFilter, C
   protected boolean isKnownExtension(final File file) {
     if (file != null) {
       final String extension = UtilSystem.getExtension(file).toLowerCase(Locale.getDefault());
-
       for (final String ext : extensions) {
         if (extension.equals(ext)) {
           return true;
@@ -225,5 +211,4 @@ public class JajukFileFilter extends FileFilter implements java.io.FileFilter, C
   protected boolean show(final File file) {
     return (file.isDirectory()) ? bShowDirectories : (isKnownExtension(file));
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/JajukIcons.java b/src/main/java/org/jajuk/util/JajukIcons.java
index 66d7a48..8db5fd1 100644
--- a/src/main/java/org/jajuk/util/JajukIcons.java
+++ b/src/main/java/org/jajuk/util/JajukIcons.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -24,626 +24,13 @@ package org.jajuk.util;
  * List of Jajuk icons.
  */
 public enum JajukIcons {
-
-  /** DOCUMENT_ME. */
-  NO_COVER,
-
-  /** DOCUMENT_ME. */
-  NONE,
-
-  /** DOCUMENT_ME. */
-  NO_COVER_50X50, 
- /** DOCUMENT_ME. */
-  NO_COVER_100X100, 
- /** DOCUMENT_ME. */
-  NO_COVER_150X150, 
- /** DOCUMENT_ME. */
-  NO_COVER_200X200, 
- /** DOCUMENT_ME. */
-  NO_COVER_250X250, 
- /** DOCUMENT_ME. */
-  NO_COVER_300X300,
-
-  /** DOCUMENT_ME. */
-  LOGO,
-
-  /** DOCUMENT_ME. */
-  TRAY,
-
-  /** DOCUMENT_ME. */
-  COVER_16X16,
-
-  /** DOCUMENT_ME. */
-  LOGO_FRAME,
-
-  /** DOCUMENT_ME. */
-  REPEAT,
-
-  /** DOCUMENT_ME. */
-  REPEAT_ALL,
-
-  /** DOCUMENT_ME. */
-  SHUFFLE,
-
-  /** DOCUMENT_ME. */
-  CONTINUE,
-
-  /** DOCUMENT_ME. */
-  INTRO,
-
-  /** DOCUMENT_ME. */
-  KARAOKE,
-
-  /** DOCUMENT_ME. */
-  SHUFFLE_GLOBAL,
-
-  /** DOCUMENT_ME. */
-  SHUFFLE_GLOBAL_16X16,
-
-  /** DOCUMENT_ME. */
-  BESTOF,
-
-  /** DOCUMENT_ME. */
-  BESTOF_16X16,
-
-  /** DOCUMENT_ME. */
-  MUTED,
-
-  /** DOCUMENT_ME. */
-  VOLUME_LEVEL1,
-
-  /** DOCUMENT_ME. */
-  VOLUME_LEVEL2,
-
-  /** DOCUMENT_ME. */
-  VOLUME_LEVEL3,
-
-  /** DOCUMENT_ME. */
-  WEBRADIO,
-
-  /** DOCUMENT_ME. */
-  NOVELTIES,
-
-  /** DOCUMENT_ME. */
-  NOVELTIES_16X16,
-
-  /** DOCUMENT_ME. */
-  PLAYER_NEXT_SMALL,
-
-  /** DOCUMENT_ME. */
-  SAVE_AS,
-
-  /** DOCUMENT_ME. */
-  PLAYER_PREVIOUS_SMALL,
-
-  /** DOCUMENT_ME. */
-  PLAYER_PREVIOUS,
-
-  /** DOCUMENT_ME. */
-  PLAYER_PREVIOUS_BIG,
-
-  /** DOCUMENT_ME. */
-  PLAYER_NEXT,
-
-  /** DOCUMENT_ME. */
-  PLAYER_NEXT_BIG,
-
-  /** DOCUMENT_ME. */
-  INC_RATING,
-
-  /** DOCUMENT_ME. */
-  REW,
-
-  /** DOCUMENT_ME. */
-  REW_16X16,
-
-  /** DOCUMENT_ME. */
-  PLAYER_PLAY,
-
-  /** DOCUMENT_ME. */
-  PLAY_16X16,
-
-  /** DOCUMENT_ME. */
-  PLAYER_PAUSE,
-
-  /** DOCUMENT_ME. */
-  PAUSE_16X16,
-
-  /** DOCUMENT_ME. */
-  PLAYER_STOP,
-
-  /** DOCUMENT_ME. */
-  STOP_16X16,
-
-  /** DOCUMENT_ME. */
-  FWD,
-
-  /** DOCUMENT_ME. */
-  FWD_16X16,
-
-  /** DOCUMENT_ME. */
-  VOLUME,
-
-  /** DOCUMENT_ME. */
-  CLOSE,
-
-  /** DOCUMENT_ME. */
-  SLIM_WINDOW,
-
-  /** DOCUMENT_ME. */
-  FULL_SCREEN,
-
-  /** DOCUMENT_ME. */
-  POSITION,
-
-  /** DOCUMENT_ME. */
-  INFO,
-
-  /** DOCUMENT_ME. */
-  BOOKMARK_FOLDERS,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_SIMPLE,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_PHYSICAL,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_LOGICAL,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_STATISTICS,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_CONFIGURATION,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_PLAYER,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_CATALOG,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_PLAYLISTS,
-
-  /** DOCUMENT_ME. */
-  PERSPECTIVE_INFORMATION,
-
-  /** DOCUMENT_ME. */
-  OPEN_FILE,
-
-  /** DOCUMENT_ME. */
-  EXIT,
-
-  /** DOCUMENT_ME. */
-  NEW,
-
-  /** DOCUMENT_ME. */
-  SEARCH,
-
-  /** DOCUMENT_ME. */
-  DELETE,
-
-  /** DOCUMENT_ME. */
-  PROPERTIES,
-
-  /** DOCUMENT_ME. */
-  VOID,
-
-  /** DOCUMENT_ME. */
-  CONFIGURATION,
-
-  /** DOCUMENT_ME. */
-  MOUNT,
-
-  /** DOCUMENT_ME. */
-  UPDATE_MANAGER,
-
-  /** DOCUMENT_ME. */
-  UNMOUNT,
-
-  /** DOCUMENT_ME. */
-  TRACES,
-
-  /** DOCUMENT_ME. */
-  TEST,
-
-  /** DOCUMENT_ME. */
-  REORGANIZE,
-
-  /** DOCUMENT_ME. */
-  REFRESH,
-
-  /** DOCUMENT_ME. */
-  RESTORE_ALL_VIEWS,
-
-  /** DOCUMENT_ME. */
-  SYNCHRO,
-
-  /** DOCUMENT_ME. */
-  DEVICE_NEW,
-
-  /** DOCUMENT_ME. */
-  DEVICE_CD_MOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_CD_UNMOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_EXT_DD_MOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_EXT_DD_UNMOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_DIRECTORY_MOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_DIRECTORY_UNMOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_PLAYER_MOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_PLAYER_UNMOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_NETWORK_DRIVE_MOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_NETWORK_DRIVE_UNMOUNTED,
-
-  /** DOCUMENT_ME. */
-  DEVICE_CD_MOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_CD_UNMOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_EXT_DD_MOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_EXT_DD_UNMOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_NETWORK_DRIVE_MOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_NETWORK_DRIVE_UNMOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_DIRECTORY_MOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_DIRECTORY_UNMOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_PLAYER_MOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  DEVICE_PLAYER_UNMOUNTED_SMALL,
-
-  /** DOCUMENT_ME. */
-  OK,
-
-  /** DOCUMENT_ME. */
-  OK_SMALL,
-
-  /** DOCUMENT_ME. */
-  KO,
-
-  /** DOCUMENT_ME. */
-  TRACK,
-
-  /** DOCUMENT_ME. */
-  DIRECTORY_SYNCHRO,
-
-  /** DOCUMENT_ME. */
-  DIRECTORY_DESYNCHRO,
-
-  /** DOCUMENT_ME. */
-  PLAYLIST_FILE,
-
-  /** DOCUMENT_ME. */
-  GENRE,
-
-  /** DOCUMENT_ME. */
-  EMPTY,
-
-  /** DOCUMENT_ME. */
-  ARTIST,
-
-  /** DOCUMENT_ME. */
-  ALBUM,
-
-  /** DOCUMENT_ME. */
-  YEAR,
-
-  /** DOCUMENT_ME. */
-  APPLY_FILTER,
-
-  /** DOCUMENT_ME. */
-  DISCOVERY_DATE,
-
-  /** DOCUMENT_ME. */
-  CLEAR_FILTER,
-
-  /** DOCUMENT_ME. */
-  ADVANCED_FILTER,
-
-  /** DOCUMENT_ME. */
-  PLAYLIST_NEW,
-
-  /** DOCUMENT_ME. */
-  PLAYLIST_NEW_SMALL,
-
-  /** DOCUMENT_ME. */
-  PLAYLIST_BOOKMARK,
-
-  /** DOCUMENT_ME. */
-  PLAYLIST_BOOKMARK_SMALL,
-
-  /** DOCUMENT_ME. */
-  PLAYLIST_BESTOF,
-
-  /** DOCUMENT_ME. */
-  PLAYLIST_NOVELTIES,
-
-  /** DOCUMENT_ME. */
-  RUN,
-
-  /** DOCUMENT_ME. */
-  ADD,
-
-  /** DOCUMENT_ME. */
-  REMOVE,
-
-  /** DOCUMENT_ME. */
-  UP,
-
-  /** DOCUMENT_ME. */
-  DOWN,
-
-  /** DOCUMENT_ME. */
-  ADD_SHUFFLE,
-
-  /** DOCUMENT_ME. */
-  CLEAR,
-
-  /** DOCUMENT_ME. */
-  SAVE,
-
-  /** DOCUMENT_ME. */
-  EXT_DRIVE,
-
-  /** DOCUMENT_ME. */
-  DEFAULT_COVER,
-
-  /** DOCUMENT_ME. */
-  FINISH_ALBUM,
-
-  /** DOCUMENT_ME. */
-  FINISH_ALBUM_16X16,
-
-  /** DOCUMENT_ME. */
-  NET_SEARCH,
-
-  /** DOCUMENT_ME. */
-  TRACK_FIFO_PLANNED,
-
-  /** DOCUMENT_ME. */
-  TRACK_FIFO_NORM,
-
-  /** DOCUMENT_ME. */
-  TRACK_FIFO_REPEAT,
-
-  /** DOCUMENT_ME. */
-  TRACK_FIFO_PLAYING,
-
-  /** DOCUMENT_ME. */
-  WIZARD,
-
-  /** DOCUMENT_ME. */
-  TYPE_MP3,
-
-  /** DOCUMENT_ME. */
-  TYPE_MP2,
-
-  /** DOCUMENT_ME. */
-  TYPE_OGG,
-
-  /** DOCUMENT_ME. */
-  TYPE_AU,
-
-  /** DOCUMENT_ME. */
-  TYPE_AIFF,
-
-  /** DOCUMENT_ME. */
-  TYPE_FLAC,
-
-  /** DOCUMENT_ME. */
-  TYPE_MPC,
-
-  /** DOCUMENT_ME. */
-  TYPE_WMA,
-
-  /** DOCUMENT_ME. */
-  TYPE_APE,
-
-  /** DOCUMENT_ME. */
-  TYPE_AAC,
-
-  /** DOCUMENT_ME. */
-  TYPE_WAV,
-
-  /** DOCUMENT_ME. */
-  TYPE_RAM,
-
-  /** DOCUMENT_ME. */
-  NO_EDIT,
-
-  /** DOCUMENT_ME. */
-  EDIT,
-
-  /** DOCUMENT_ME. */
-  UNKNOWN,
-
-  /** DOCUMENT_ME. */
-  TIP,
-
-  /** DOCUMENT_ME. */
-  TIP_SMALL,
-
-  /** DOCUMENT_ME. */
-  OPEN_DIR,
-
-  /** DOCUMENT_ME. */
-  STAR_0,
-
-  /** DOCUMENT_ME. */
-  STAR_1,
-
-  /** DOCUMENT_ME. */
-  STAR_2,
-
-  /** DOCUMENT_ME. */
-  STAR_3,
-
-  /** DOCUMENT_ME. */
-  STAR_4,
-
-  /** DOCUMENT_ME. */
-  DROP_DOWN_32X32,
-
-  /** DOCUMENT_ME. */
-  DROP_DOWN_16X16,
-
-  /** DOCUMENT_ME. */
-  DIGITAL_DJ,
-
-  /** DOCUMENT_ME. */
-  DIGITAL_DJ_16X16,
-
-  /** DOCUMENT_ME. */
-  WEBRADIO_16X16,
-
-  /** DOCUMENT_ME. */
-  LIST,
-
-  /** DOCUMENT_ME. */
-  CDDB,
-
-  /** DOCUMENT_ME. */
-  PLAY_TABLE,
-
-  /** DOCUMENT_ME. */
-  DEFAULTS,
-
-  /** DOCUMENT_ME. */
-  DEFAULTS_BIG,
-
-  /** DOCUMENT_ME. */
-  ACCURACY_LOW,
-
-  /** DOCUMENT_ME. */
-  ACCURACY_MEDIUM,
-
-  /** DOCUMENT_ME. */
-  ACCURACY_HIGH,
-
-  /** DOCUMENT_ME. */
-  REPORT,
-
-  /** DOCUMENT_ME. */
-  PUSH,
-
-  /** DOCUMENT_ME. */
-  COPY,
-
-  /** DOCUMENT_ME. */
-  CUT,
-
-  /** DOCUMENT_ME. */
-  PASTE,
-
-  /** DOCUMENT_ME. */
-  LAUNCH,
-
-  /** DOCUMENT_ME. */
-  HISTORY,
-
-  /** DOCUMENT_ME. */
-  POPUP,
-
-  /** DOCUMENT_ME. */
-  ALARM,
-
-  /** DOCUMENT_ME. */
-  BAN,
-
-  /** DOCUMENT_ME. */
-  PREFERENCE_HATE,
-
-  /** DOCUMENT_ME. */
-  PREFERENCE_POOR,
-
-  /** DOCUMENT_ME. */
-  PREFERENCE_AVERAGE,
-
-  /** DOCUMENT_ME. */
-  PREFERENCE_LIKE,
-
-  /** DOCUMENT_ME. */
-  PREFERENCE_LOVE,
-
-  /** DOCUMENT_ME. */
-  PREFERENCE_ADORE,
-
-  /** DOCUMENT_ME. */
-  PREFERENCE_UNSET,
-
-  /** DOCUMENT_ME. */
-  UNBAN,
-
-  /** DOCUMENT_ME. */
-  PREPARE_PARTY,
-
+  NO_COVER, NONE, NO_COVER_50X50, NO_COVER_100X100, NO_COVER_150X150, NO_COVER_200X200, NO_COVER_250X250, NO_COVER_300X300, LOGO, TRAY, COVER_16X16, LOGO_FRAME, REPEAT, REPEAT_ALL, SHUFFLE, CONTINUE, INTRO, KARAOKE, SHUFFLE_GLOBAL, SHUFFLE_GLOBAL_16X16, BESTOF, BESTOF_16X16, MUTED, VOLUME_LEVEL1, VOLUME_LEVEL2, VOLUME_LEVEL3, WEBRADIO, NOVELTIES, NOVELTIES_16X16, PLAYER_NEXT_SMALL, SAVE_AS, PLAYER_PREVIOUS_SMALL, PLAYER_PREVIOUS, PLAYER_PREVIOUS_BIG, PLAYER_NEXT, PLAYER_NEXT_BIG, INC_RAT [...]
   /** Larger icon for Prepare Party Wizard. */
-  PREPARE_PARTY_32X32,
-
-  /** DOCUMENT_ME. */
-  COPY_TO_CLIPBOARD,
-
-  /** DOCUMENT_ME. */
-  OPEN_EXPLORER,
-
-  /** DOCUMENT_ME. */
-  AMBIENCE,
-
-  /** DOCUMENT_ME. */
-  PLAYER_FORWARD_BIG,
-
-  /** DOCUMENT_ME. */
-  PLAYER_STOP_BIG,
-
-  /** DOCUMENT_ME. */
-  PLAYER_PLAY_BIG,
-
-  /** DOCUMENT_ME. */
-  PLAYER_PAUSE_BIG,
-
-  /** DOCUMENT_ME. */
-  PLAYER_REWIND_BIG,
-
-  /** DOCUMENT_ME. */
-  AUTOSCROLL,
-
+  PREPARE_PARTY_32X32, COPY_TO_CLIPBOARD, OPEN_EXPLORER, AMBIENCE, PLAYER_FORWARD_BIG, PLAYER_STOP_BIG, PLAYER_PLAY_BIG, PLAYER_PAUSE_BIG, PLAYER_REWIND_BIG, AUTOSCROLL,
   /** Tree/table synchronization icon. */
   TREE_TABLE_SYNC,
-
   /** Money. */
   DONATE,
-
   /** Disc number. */
   DISC_NUMBER
 }
diff --git a/src/main/java/org/jajuk/util/LocaleManager.java b/src/main/java/org/jajuk/util/LocaleManager.java
index c7e97e6..95df849 100644
--- a/src/main/java/org/jajuk/util/LocaleManager.java
+++ b/src/main/java/org/jajuk/util/LocaleManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -30,7 +30,6 @@ import java.util.Locale;
  * Manages locales used in jajuk.
  */
 public class LocaleManager {
-
   /**
    * private constructor for utility class with only static methods.
    */
@@ -42,8 +41,7 @@ public class LocaleManager {
   private static List<Locale> supportedLocales = Arrays.asList(new Locale[] { Locale.ENGLISH,
       Locale.FRENCH, Locale.GERMAN, new Locale("nl"), new Locale("es"), new Locale("ca"),
       new Locale("ko"), new Locale("el"), new Locale("ru"), new Locale("gl"), new Locale("cs"),
-      new Locale("pt") });
-
+      new Locale("pt"), new Locale("zh") });
   /** Local ( language) to be used, default is English. */
   private static Locale locale = getNativeLocale();
 
@@ -103,7 +101,7 @@ public class LocaleManager {
   /**
    * Return Description for a given local id.
    * 
-   * @param sLocal DOCUMENT_ME
+   * @param sLocal 
    * 
    * @return localized description
    */
@@ -114,7 +112,7 @@ public class LocaleManager {
   /**
    * Return local for a given description.
    * 
-   * @param sDesc DOCUMENT_ME
+   * @param sDesc 
    * 
    * @return local
    */
@@ -126,5 +124,4 @@ public class LocaleManager {
     }
     return null;
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/MD5Processor.java b/src/main/java/org/jajuk/util/MD5Processor.java
index cd9ce17..64221e5 100644
--- a/src/main/java/org/jajuk/util/MD5Processor.java
+++ b/src/main/java/org/jajuk/util/MD5Processor.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -31,12 +31,8 @@ import org.jajuk.util.log.Log;
  * Convenient class to compute MD5 hashcodes and return them using predefined
  * base.
  */
-
 public final class MD5Processor {
-
-  /** DOCUMENT_ME. */
   private static MessageDigest msgDigest;
-
   static {
     try {
       msgDigest = MessageDigest.getInstance("MD5");
@@ -62,7 +58,7 @@ public final class MD5Processor {
     try {
       msgDigest.update(sIn.getBytes("UTF-8"));
     } catch (UnsupportedEncodingException e) {
-      // This cannot normaly happen
+      // This should not happen
       Log.error(e);
       return null;
     }
diff --git a/src/main/java/org/jajuk/util/Messages.java b/src/main/java/org/jajuk/util/Messages.java
index fb262c5..a322297 100644
--- a/src/main/java/org/jajuk/util/Messages.java
+++ b/src/main/java/org/jajuk/util/Messages.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
 import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
+import java.awt.Dimension;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.URL;
@@ -46,7 +45,6 @@ import javax.xml.parsers.SAXParserFactory;
 
 import net.miginfocom.swing.MigLayout;
 
-import org.jajuk.ui.widgets.OKCancelPanel;
 import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.util.log.Log;
 import org.xml.sax.SAXException;
@@ -59,29 +57,23 @@ import org.xml.sax.helpers.DefaultHandler;
  * </p>.
  */
 public class Messages extends DefaultHandler {
-
   /** Messages initialized flag. */
   protected static boolean bInitialized = false;
-
   /** All choice option, completes JDialog options. */
   public static final int ALL_OPTION = 10;
-
   /** Specific Yes NO All Cancel option. */
   public static final int YES_NO_ALL_CANCEL_OPTION = 11;
-
   /** User choice. */
   private static int choice;
-
   /** Messages themselves extracted from an XML file to this properties class*. */
   protected static Properties properties;
-
   /** English messages used as default*. */
   private static Properties propertiesEn;
 
   /**
    * Contains.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return whether given key exists
    */
@@ -92,7 +84,7 @@ public class Messages extends DefaultHandler {
   /**
    * Gets the string.
    * 
-   * @param key DOCUMENT_ME
+   * @param key 
    * 
    * @return the string
    */
@@ -143,14 +135,11 @@ public class Messages extends DefaultHandler {
   public static String[] getAll(final String base) {
     final List<String> msgs = new ArrayList<String>();
     final String prefix = base + ".";
-
     try {
       final Properties lProperties = getProperties();
       final Properties defaultProperties = getPropertiesEn();
-
       for (int i = 0;; i++) {
         String sOut = lProperties.getProperty(prefix + i);
-
         if (sOut == null) {
           // this property is unknown for this local, try in English
           sOut = defaultProperties.getProperty(prefix + i);
@@ -198,7 +187,7 @@ public class Messages extends DefaultHandler {
   /**
    * Return Flag icon for given description.
    * 
-   * @param sDesc DOCUMENT_ME
+   * @param sDesc 
    * 
    * @return the icon
    */
@@ -211,19 +200,16 @@ public class Messages extends DefaultHandler {
   /**
    * ***************************************************************************
    * Parse a fake properties file inside an XML file as CDATA.
-   * 
-   * @param locale DOCUMENT_ME
-   * 
+   *
+   * @param locale 
    * @return a properties with all entries
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
    * @throws SAXException the SAX exception
+   * @throws IOException Signals that an I/O exception has occurred.
    * @throws ParserConfigurationException the parser configuration exception
-   * @throws Exception    */
+   */
   private static Properties parseLangpack(final Locale locale) throws SAXException, IOException,
       ParserConfigurationException {
     final Properties lProperties = new Properties();
-
     // Choose right jajuk_<lang>.properties file to load
     final StringBuilder sbFilename = new StringBuilder(Const.FILE_LANGPACK_PART1);
     if (!Locale.ENGLISH.equals(locale)) { // for English, properties file is
@@ -231,7 +217,6 @@ public class Messages extends DefaultHandler {
       sbFilename.append('_').append(locale);
     }
     sbFilename.append(Const.FILE_LANGPACK_PART2);
-
     // property file URL, either in the jajuk.jar jar
     // (normal execution) or found as regular file if in
     // development debug mode
@@ -240,7 +225,6 @@ public class Messages extends DefaultHandler {
     if (url == null) {
       throw new IOException("Could not read resource: " + resource);
     }
-
     // parse it, actually it is a big properties file as CDATA in an XML
     // file
     final SAXParserFactory spf = SAXParserFactory.newInstance();
@@ -306,11 +290,10 @@ public class Messages extends DefaultHandler {
    * CAUTION! the thread which calls this method musn't have locks on resources
    * : otherwise it can conduct to GUI freeze
    * </p>.
-   * 
+   *
    * @param sText : dialog text
+   * @param optionsType 
    * @param iType message type like JOptionPane.WARNING
-   * @param optionsType DOCUMENT_ME
-   * 
    * @return the choice
    */
   public static int getChoice(final String sText, final int optionsType, final int iType) {
@@ -344,7 +327,7 @@ public class Messages extends DefaultHandler {
   /**
    * Gets the title for type.
    * 
-   * @param iType DOCUMENT_ME
+   * @param iType 
    * 
    * @return String for given JOptionPane message type
    */
@@ -363,7 +346,7 @@ public class Messages extends DefaultHandler {
   /**
    * Show a dialog with specified warning message.
    * 
-   * @param sMessage DOCUMENT_ME
+   * @param sMessage 
    */
   public static void showWarningMessage(final String sMessage) {
     SwingUtilities.invokeLater(new Runnable() {
@@ -378,7 +361,7 @@ public class Messages extends DefaultHandler {
   /**
    * Show a dialog with specified warning message + a "not show again" button.
    * 
-   * @param sMessage DOCUMENT_ME
+   * @param sMessage 
    * @param sProperty : property name
    */
   public static void showHideableWarningMessage(final String sMessage, final String sProperty) {
@@ -394,15 +377,14 @@ public class Messages extends DefaultHandler {
             null);
         message.getResu();
       }
-
     });
   }
 
   /**
    * Show a dialog with specified error message and an icon.
    * 
-   * @param sMessage DOCUMENT_ME
-   * @param icon DOCUMENT_ME
+   * @param sMessage 
+   * @param icon 
    */
   public static void showInfoMessage(final String sMessage, final Icon icon) {
     SwingUtilities.invokeLater(new Runnable() {
@@ -417,8 +399,8 @@ public class Messages extends DefaultHandler {
   /**
    * Show a dialog with specified error message and infosup.
    * 
-   * @param code DOCUMENT_ME
-   * @param sInfoSup DOCUMENT_ME
+   * @param code 
+   * @param sInfoSup 
    */
   public static void showErrorMessage(final int code, final String sInfoSup) {
     SwingUtilities.invokeLater(new Runnable() {
@@ -432,7 +414,7 @@ public class Messages extends DefaultHandler {
   /**
    * Show a dialog with specified error message.
    * 
-   * @param code DOCUMENT_ME
+   * @param code 
    */
   public static void showErrorMessage(final int code) {
     showErrorMessage(code, null);
@@ -440,10 +422,10 @@ public class Messages extends DefaultHandler {
 
   /**
    * Show a dialog with specified error message and infosup and details.
-   * 
-   * @param sInfoSup DOCUMENT_ME
-   * @param code DOCUMENT_ME
-   * @param sDetails DOCUMENT_ME
+   *
+   * @param code 
+   * @param sInfoSup 
+   * @param sDetails 
    */
   public static void showDetailedErrorMessage(final int code, final String sInfoSup,
       final String sDetails) {
@@ -459,8 +441,8 @@ public class Messages extends DefaultHandler {
   /**
    * Show a dialog with specified error message with infos up.
    * 
-   * @param sMessage DOCUMENT_ME
-   * @param sInfoSup DOCUMENT_ME
+   * @param sMessage 
+   * @param sInfoSup 
    */
   public static void showInfoMessage(final String sMessage, final String sInfoSup) {
     SwingUtilities.invokeLater(new Runnable() {
@@ -476,7 +458,7 @@ public class Messages extends DefaultHandler {
   /**
    * Show a dialog with specified error message.
    * 
-   * @param sMessage DOCUMENT_ME
+   * @param sMessage 
    */
   public static void showInfoMessage(final String sMessage) {
     SwingUtilities.invokeLater(new Runnable() {
@@ -502,7 +484,7 @@ public class Messages extends DefaultHandler {
   /**
    * Gets localized and human property name for given key.
    * 
-   * @param sKey DOCUMENT_ME
+   * @param sKey 
    * 
    * @return the human property name or the property itself if not translated
    */
@@ -516,12 +498,11 @@ public class Messages extends DefaultHandler {
 
   /**
    * Gets the properties.
-   * 
+   *
    * @return Returns the properties.
-   * 
-   * @throws ParserConfigurationException the parser configuration exception
-   * @throws IOException Signals that an I/O exception has occurred.
    * @throws SAXException the SAX exception
+   * @throws IOException Signals that an I/O exception has occurred.
+   * @throws ParserConfigurationException the parser configuration exception
    */
   public static Properties getProperties() throws SAXException, IOException,
       ParserConfigurationException {
@@ -557,7 +538,6 @@ public class Messages extends DefaultHandler {
  * Confirmation Dialog
  */
 class ConfirmDialog extends JajukDialog {
-
   /**
    * Confirm dialog constructor
    * 
@@ -573,7 +553,6 @@ class ConfirmDialog extends JajukDialog {
   ConfirmDialog(final String sText, final String sTitle, final int optionsType, final int iType,
       Component parent) {
     super();
-
     final JOptionPane optionPane = UtilGUI.getNarrowOptionPane(72);
     if (optionsType == Messages.YES_NO_ALL_CANCEL_OPTION) {
       optionPane.setOptions(new Object[] { Messages.getString("Yes"), Messages.getString("No"),
@@ -614,18 +593,15 @@ class ConfirmDialog extends JajukDialog {
       // result is an integer when using JOptionPane standard types
       iResu = (Integer) resu;
     }
-
     // manually dispose to free up memory, somehow this is not done automatically!
     dialog.dispose();
   }
-
 }
 
 /**
  * Message Dialog
  */
 class DetailsMessageDialog extends JajukDialog {
-
   /**
    * Message dialog constructor
    * 
@@ -636,7 +612,6 @@ class DetailsMessageDialog extends JajukDialog {
   DetailsMessageDialog(final String sText, final String sTitle, final int iType,
       final String sDetails, final Icon icon) {
     super();
-
     final JOptionPane optionPane = UtilGUI.getNarrowOptionPane(72);
     optionPane.setMessage(sText);
     if (sDetails != null) {
@@ -654,40 +629,30 @@ class DetailsMessageDialog extends JajukDialog {
     if (optionPane.getValue().equals(Messages.getString("Details"))) {
       // details
       final JDialog dialogDetail = new JDialog(dialog, Messages.getString("Details"));
+      dialogDetail.setMaximumSize(new Dimension(800, 600));
       final JPanel jp = new JPanel();
-      jp.setLayout(new MigLayout("ins 5", "[800]", "[600][]"));
+      jp.setLayout(new MigLayout("ins 5", "[grow]", "[grow]"));
       final JTextArea jta = new JTextArea(sDetails);
       jta.setEditable(false);
-      jp.add(new JScrollPane(jta), "wrap");
-      final OKCancelPanel jbOKC = new OKCancelPanel(new ActionListener() {
-        @Override
-        public void actionPerformed(final ActionEvent arg0) {
-          dialogDetail.dispose();
-        }
-      });
-      jp.add(jbOKC, "span,alignx center");
+      jp.add(new JScrollPane(jta), "wrap,grow");
       dialogDetail.setModal(true);
       dialogDetail.setAlwaysOnTop(true);
       dialogDetail.setContentPane(jp);
       dialogDetail.pack();
       dialogDetail.setLocationRelativeTo(JajukMainWindow.getInstance());
       dialogDetail.setVisible(true);
-
       // manually dispose to free up memory, somehow this is not done automatically!
       dialog.dispose();
     }
-
     // manually dispose to free up memory, somehow this is not done automatically!
     dialog.dispose();
   }
-
 }
 
 /**
  * Hideable message dialog (has a "not show again" button)
  */
 class HideableMessageDialog extends JajukDialog {
-
   /**
    * Message dialog constructor
    * 
@@ -700,7 +665,6 @@ class HideableMessageDialog extends JajukDialog {
   HideableMessageDialog(final String sText, final String sTitle, final String sProperty,
       final int iType, final Icon icon) {
     super();
-
     final JOptionPane optionPane = UtilGUI.getNarrowOptionPane(72);
     optionPane.setMessage(UtilGUI.getLimitedMessage(sText, 20));
     final Object[] options = { Messages.getString("Ok"), Messages.getString("Hide") };
@@ -720,18 +684,15 @@ class HideableMessageDialog extends JajukDialog {
       // Not show again
       Conf.setProperty(sProperty, Const.TRUE);
     }
-
     // manually dispose to free up memory, somehow this is not done automatically!
     dialog.dispose();
   }
-
 }
 
 /**
  * Error message dialog
  */
 class ErrorMessageDialog extends JajukDialog {
-
   /**
    * Message dialog constructor
    * 
@@ -743,7 +704,6 @@ class ErrorMessageDialog extends JajukDialog {
    */
   ErrorMessageDialog(final int code, final String sInfoSup) {
     super();
-
     final JOptionPane optionPane = UtilGUI.getNarrowOptionPane(72);
     optionPane.setMessage(UtilGUI.getLimitedMessage(Messages.getErrorMessage(code)
         + (sInfoSup != null ? (" : " + sInfoSup) : ""), 20));
@@ -757,7 +717,6 @@ class ErrorMessageDialog extends JajukDialog {
     dialog.pack();
     dialog.setLocationRelativeTo(JajukMainWindow.getInstance());
     dialog.setVisible(true);
-
     // manually dispose to free up memory, somehow this is not done automatically!
     dialog.dispose();
   }
@@ -774,5 +733,4 @@ abstract class JajukDialog {
   public int getResu() {
     return iResu;
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/ReadOnlyIterator.java b/src/main/java/org/jajuk/util/ReadOnlyIterator.java
index 2544a88..166c98a 100644
--- a/src/main/java/org/jajuk/util/ReadOnlyIterator.java
+++ b/src/main/java/org/jajuk/util/ReadOnlyIterator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -26,10 +26,9 @@ import java.util.Iterator;
  * A convenient class that prevents remove() method from an iterator <br>
  * Generic class.
  *
- * @param <V> DOCUMENT_ME
+ * @param <V> 
  */
 public class ReadOnlyIterator<V> {
-
   /** Managed iterator *. */
   Iterator<V> iterator;
 
@@ -59,5 +58,4 @@ public class ReadOnlyIterator<V> {
   public boolean hasNext() {
     return iterator.hasNext();
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/UpgradeManager.java b/src/main/java/org/jajuk/util/UpgradeManager.java
index 982ae1d..bca6e95 100644
--- a/src/main/java/org/jajuk/util/UpgradeManager.java
+++ b/src/main/java/org/jajuk/util/UpgradeManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.util;
 
 import java.io.File;
@@ -33,9 +32,9 @@ import java.util.StringTokenizer;
 import javax.swing.JOptionPane;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
 import org.jajuk.base.Album;
 import org.jajuk.base.AlbumManager;
-import org.jajuk.base.Collection;
 import org.jajuk.base.Device;
 import org.jajuk.base.DeviceManager;
 import org.jajuk.base.SearchResult.SearchResultType;
@@ -43,6 +42,7 @@ import org.jajuk.base.Track;
 import org.jajuk.base.TrackManager;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.services.dj.AmbienceManager;
+import org.jajuk.services.webradio.WebRadioHelper;
 import org.jajuk.ui.thumbnails.ThumbnailManager;
 import org.jajuk.util.log.Log;
 
@@ -52,19 +52,14 @@ import org.jajuk.util.log.Log;
  * Jajuk version sheme is XX.YY.ZZ (two digits possible for each part of the release)
  */
 public final class UpgradeManager implements Const {
-
   /** Last jajuk release known from Internet (parsed from a pad file). */
   private static String newVersionName;
-
   /** Is it a minor or major X.Y upgrade */
   private static boolean bUpgraded = false;
-
   /** Is it the first session ever ?. */
-  private static boolean bFirstSession = false;
-
+  private static boolean firstSession = false;
   /** Is it an old migration (more than 1 major release) ?. */
   private static boolean majorMigration = false;
-
   /** List of versions that doesn't require perspective reset at upgrade. */
   private static String[] versionsNoNeedPerspectiveReset = new String[] { "1.9" };
 
@@ -79,7 +74,7 @@ public final class UpgradeManager implements Const {
    * 
    * Jajuk version scheme is XX.YY.ZZ[RCn] (two digits possible for each part of the release)
    * 
-   * @param pStringRelease DOCUMENT_ME
+   * @param pStringRelease 
    * 
    * @return Jajuk number version = integer format of the padded release
    */
@@ -88,25 +83,27 @@ public final class UpgradeManager implements Const {
       // no string provided: use 1.0.0
       return 10000;
     }
-
     String stringRelease = pStringRelease;
     // We drop any RCx part of the release
     if (pStringRelease.contains("RC")) {
       stringRelease = pStringRelease.split("RC.*")[0];
     }
+    // We drop any "dev" part of the release
+    if (pStringRelease.contains("dev")) {
+      stringRelease = pStringRelease.split("dev.*")[0];
+    }
     // Add a trailing .0 if it is a main release like 1.X -> 1.X.0
-    int countDot = stringRelease.replaceAll("[^.]", "").length();
+    int countDot = StringUtils.countMatches(stringRelease, ".");
     if (countDot == 1) {
       stringRelease = stringRelease + ".0";
     }
     // Analyze each part of the release, throw a runtime exception if
     // the format is wrong at this point
     StringTokenizer st = new StringTokenizer(stringRelease, ".");
-    String main = UtilString.padNumber(Integer.parseInt(st.nextToken()), 2);
-    String minor = UtilString.padNumber(Integer.parseInt(st.nextToken()), 2);
-
-    String fix = UtilString.padNumber(Integer.parseInt(st.nextToken()), 2);
-    return Integer.parseInt(main + minor + fix);
+    int main = 10000 * Integer.parseInt(st.nextToken());
+    int minor = 100 * Integer.parseInt(st.nextToken());
+    int fix = Integer.parseInt(st.nextToken());
+    return main + minor + fix;
   }
 
   /**
@@ -114,18 +111,20 @@ public final class UpgradeManager implements Const {
    */
   public static void detectRelease() {
     try {
+      // In dev, don't try to upgrade
+      if ("VERSION_REPLACED_BY_ANT".equals(Const.JAJUK_VERSION)) {
+        bUpgraded = false;
+        majorMigration = false;
+        return;
+      }
       // Upgrade detection. Depends on: Configuration manager load
       final String sStoredRelease = Conf.getString(Const.CONF_RELEASE);
-
       // check if it is a new major 'x.y' release: 1.2 != 1.3 for instance
-      if (!bFirstSession
+      if (!firstSession
       // if first session, not taken as an upgrade
           && (sStoredRelease == null || // null for jajuk releases < 1.2
-          !sStoredRelease.substring(0, 3).equals(Const.JAJUK_VERSION.substring(0, 3)))
-          // Each RC is seen as an upgrade to force RC users to re-run upgrade code at each new RC
-          || Const.JAJUK_VERSION.matches(".*RC.*")) {
+          !sStoredRelease.equals(Const.JAJUK_VERSION))) {
         bUpgraded = true;
-        // Now check if this is an old migration.
         if (!SessionService.isTestMode()) {
           if (isMajorMigration(Const.JAJUK_VERSION, sStoredRelease)) {
             majorMigration = true;
@@ -149,15 +148,15 @@ public final class UpgradeManager implements Const {
    * @return true, if is first session
    */
   public static boolean isFirstSession() {
-    return bFirstSession;
+    return firstSession;
   }
 
   /**
    * Sets the first session.
-   * DOCUMENT_ME
+   * 
    */
   public static void setFirstSession() {
-    bFirstSession = true;
+    firstSession = true;
   }
 
   /**
@@ -171,29 +170,27 @@ public final class UpgradeManager implements Const {
       if (isUpgradeDetected()) {
         // For jajuk < 0.2
         upgradeOldCollectionBackupFile();
-
         // For Jajuk < 1.2
         upgradeDefaultAmbience();
-
         // For Jajuk < 1.3
         upgradeTrackPattern();
         upgradeSerFiles();
         upgradeNocover();
         upgradeWrongHotketOption();
-
         // For Jajuk < 1.4
         upgradePerspectivesRename();
-
         // For Jajuk < 1.6
         upgradePerspectiveButtonsSize();
         upgradeDJClassChanges();
-
         // For Jajuk < 1.7
         upgradeElapsedTimeFormat();
-
         // for Jajuk < 1.9
         upgradeAlarmConfFile();
         upgradeStartupConf();
+        // for Jajuk < 1.10
+        upgradeWebRadioFile();
+        // for jajuk < 1.10.5
+        upgradeCollectionExitFile();
       }
     } catch (Exception e) {
       Log.error(e);
@@ -260,7 +257,6 @@ public final class UpgradeManager implements Const {
         album.setProperty(XML_ALBUM_SELECTED_COVER, "");
       }
     }
-
   }
 
   /**
@@ -280,8 +276,7 @@ public final class UpgradeManager implements Const {
       File bootstrapOldOldHome = new File(System.getProperty("user.home") + "/"
           + Const.FILE_BOOTSTRAP_OLD);
       File bootstrapNew = new File(SessionService.getBootstrapPath());
-
-      // Fix for #1473 : move the bootstrap file if required (See https://trac.jajuk.info/ticket/1473)
+      // Fix for #1473 : move the bootstrap file if required (See #1473)
       if (UtilSystem.isUnderWindows() && !bootstrapOld.equals(bootstrapOldOldHome)
           && !bootstrapOld.exists() && bootstrapOldOldHome.exists()) {
         try {
@@ -291,7 +286,6 @@ public final class UpgradeManager implements Const {
           ex.printStackTrace();
         }
       }
-
       if (bootstrapOld.exists() && !bootstrapNew.exists()) {
         Properties prop = null;
         // Try to load a bootstrap file using plain text old format
@@ -300,7 +294,6 @@ public final class UpgradeManager implements Const {
             SessionService.getBootstrapPath(Const.FILE_BOOTSTRAP_OLD));
         prop.load(fis);
         fis.close();
-
         // If it exists and contains pre-1.7 bootstrap format (a single line with a raw path),
         // convert it to 1.7 format first
         if (prop.size() == 1) {
@@ -320,7 +313,6 @@ public final class UpgradeManager implements Const {
         }
         // Write down the new bootstrap file
         SessionService.commitBootstrapFile(prop);
-
         // Delete old bootstrap file
         bootstrapOld.delete();
       }
@@ -344,7 +336,7 @@ public final class UpgradeManager implements Const {
   /**
    * For Jajuk < 1.3: delete thumb for given size
    * 
-   * @param size DOCUMENT_ME
+   * @param size 
    */
   private static void upgradeNoCoverDelete(String size) {
     File fThumbs = SessionService.getConfFileByPath(Const.FILE_THUMBS + "/" + size + "/"
@@ -487,12 +479,10 @@ public final class UpgradeManager implements Const {
    */
   private static void upgradeCollectionRating() {
     String sRelease = Conf.getString(Const.CONF_RELEASE);
-    if (sRelease == null || sRelease.matches("0..*")
-        || (sRelease.matches("1..*") && Integer.parseInt(sRelease.substring(2, 3)) < 7)) {
+    if (sRelease == null || isOlder(sRelease, "1.7")) {
       Log.info("Migrating collection rating");
       // We keep current ratings and we recompute them on a 0 to 100 scale,
       // then we suggest user to reset the rates
-
       // Start by finding max (old) rating
       long maxRating = 0;
       ReadOnlyIterator<Track> tracks = TrackManager.getInstance().getTracksIterator();
@@ -507,12 +497,6 @@ public final class UpgradeManager implements Const {
         long newRate = (long) (100f * track.getRate() / maxRating);
         TrackManager.getInstance().changeTrackRate(track, newRate);
       }
-      // Save collection
-      try {
-        Collection.commit(SessionService.getConfFileByPath(Const.FILE_COLLECTION));
-      } catch (final IOException e) {
-        Log.error(e);
-      }
       Log.info("Migrating rating done");
       Messages.showInfoMessage(Messages.getString("Note.1"));
     }
@@ -525,7 +509,45 @@ public final class UpgradeManager implements Const {
     if (AlbumManager.getInstance().getMetaInformation(Const.XML_ALBUM_ARTIST) != null) {
       AlbumManager.getInstance().removeProperty(Const.XML_ALBUM_ARTIST);
     }
+  }
 
+  /**
+   * For jajuk < 1.10, upgrade webradio files
+   */
+  private static void upgradeWebRadioFile() {
+    try {
+      File oldFile = SessionService.getConfFileByPath("webradios.xml");
+      if (oldFile.exists()) {
+        Log.info("Migrating old webradio file : " + oldFile.getAbsolutePath());
+        File newCustomFile = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_CUSTOM);
+        UtilSystem.move(oldFile, newCustomFile);
+        //Load the old file (contains presets + real customs files)  
+        WebRadioHelper.loadCustomRadios();
+        // Download and load the real preset files to override customs and set them 'PRESET' origin
+        // Download repository
+        File fPresets = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
+        DownloadManager.download(new URL(Const.URL_WEBRADIO_PRESETS), fPresets);
+        WebRadioHelper.loadPresetsRadios(fPresets);
+      }
+    } catch (Exception e) {
+      Log.debug("Can't upgrade Webradio file", e);
+    }
+  }
+
+  /**
+   * For jajuk < 1.10.5, move collection_exit.xml to collection.xml
+   */
+  private static void upgradeCollectionExitFile() {
+    try {
+      File oldFile = SessionService.getConfFileByPath("collection_exit.xml");
+      if (oldFile.exists()) {
+        Log.info("Migrating old collection_exit file to collection.xml");
+        File newCollectionFile = SessionService.getConfFileByPath(Const.FILE_COLLECTION);
+        UtilSystem.move(oldFile, newCollectionFile);
+      }
+    } catch (Exception e) {
+      Log.debug("Can't migrate collection_exit.xml file", e);
+    }
   }
 
   /**
@@ -536,7 +558,6 @@ public final class UpgradeManager implements Const {
     new Thread() {
       @Override
       public void run() {
-
         // Clean thumbs
         ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_50X50);
         ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_100X100);
@@ -570,7 +591,6 @@ public final class UpgradeManager implements Const {
     } catch (Throwable e) {
       Log.error(e);
     }
-
   }
 
   /**
@@ -587,7 +607,6 @@ public final class UpgradeManager implements Const {
     } catch (Throwable e) {
       Log.error(e);
     }
-
   }
 
   /**
@@ -621,7 +640,7 @@ public final class UpgradeManager implements Const {
       // Don't use this in test
           && !("VERSION_REPLACED_BY_ANT".equals(Const.JAJUK_VERSION))
           // We display the upgrade icon only if PAD release is newer than current release
-          && isNewer(Const.JAJUK_VERSION, sPadRelease)) {
+          && isNewer(sPadRelease, Const.JAJUK_VERSION)) {
         newVersionName = sPadRelease;
         return;
       }
@@ -654,32 +673,51 @@ public final class UpgradeManager implements Const {
   /**
    * Return whether two releases switch is a major upgrade or not.
    * 
-   * @param currentRelease DOCUMENT_ME
-   * @param comparedRelease DOCUMENT_ME
+   * @param currentRelease 
+   * @param comparedRelease 
    * 
    * @return whether two releases switch is a major upgrade or not
    */
-  protected static boolean isMajorMigration(String currentRelease, String comparedRelease) {
-    int iCurrentRelease = getNumberRelease(currentRelease);
+  protected static boolean isMajorMigration(String codeRelease, String comparedRelease) {
+    int iCurrentRelease = getNumberRelease(codeRelease);
     int iComparedRelease = getNumberRelease(comparedRelease);
     return iComparedRelease / 100 != iCurrentRelease / 100;
   }
 
   /**
-   * Return whether second release is newer than first.
+   * Return whether first release is newer than second.
    * 
-   * @param currentRelease DOCUMENT_ME
-   * @param comparedRelease DOCUMENT_ME
+   * @param currentRelease 
+   * @param comparedRelease 
    * 
-   * @return whether second release is newer than first
+   * @return whether first release is newer than second
    */
-  protected static boolean isNewer(String currentRelease, String comparedRelease) {
+  protected static boolean isNewer(String comparedRelease, String currentRelease) {
     int iCurrentRelease = getNumberRelease(currentRelease);
     int iComparedRelease = getNumberRelease(comparedRelease);
     return iComparedRelease > iCurrentRelease;
   }
 
   /**
+  * Return whether first release is older than second.
+  * 
+  * @param currentRelease 
+  * @param comparedRelease 
+  * 
+  * @return whether first release is newer than second
+  */
+  protected static boolean isOlder(String comparedRelease, String currentRelease) {
+    // Manage dev case
+    if ("VERSION_REPLACED_BY_ANT".equals(comparedRelease)
+        || "VERSION_REPLACED_BY_ANT".equals(currentRelease)) {
+      return false;
+    }
+    int iCurrentRelease = getNumberRelease(currentRelease);
+    int iComparedRelease = getNumberRelease(comparedRelease);
+    return iComparedRelease < iCurrentRelease;
+  }
+
+  /**
    * Require user to perform a deep scan.
    */
   private static void deepScanRequest() {
diff --git a/src/main/java/org/jajuk/util/UtilFeatures.java b/src/main/java/org/jajuk/util/UtilFeatures.java
index 15df99f..f18c978 100644
--- a/src/main/java/org/jajuk/util/UtilFeatures.java
+++ b/src/main/java/org/jajuk/util/UtilFeatures.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,10 +16,13 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,6 +30,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Scanner;
 import java.util.Set;
 
@@ -42,9 +46,11 @@ import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.events.ObservationManager;
 import org.jajuk.events.Observer;
+import org.jajuk.services.core.SessionService;
 import org.jajuk.services.dj.Ambience;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
+import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.widgets.InformationJPanel;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
@@ -53,7 +59,6 @@ import org.jajuk.util.log.Log;
  * General use utilities methods.
  */
 public final class UtilFeatures {
-
   /** Genres. */
   public static final String[] GENRES = { "Blues", "Classic Rock", "Country", "Dance", "Disco",
       "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B",
@@ -75,12 +80,13 @@ public final class UtilFeatures {
       "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club-House", "Hardcore", "Terror",
       "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta", "Heavy Metal",
       "Black Metal", "Crossover", "Contemporary C", "Christian Rock", "Merengue", "Salsa",
-      "Thrash Metal", "Anime", "JPop", "SynthPop" };
+      "Thrash Metal", "Anime", "JPop", "SynthPop", "Variety", "News", "Talk", "Student Station",
+      "Sport", "Generalist", "Urban", "Education", "Humor", "8-bits", "Eclectic" };
 
   /**
    * Apply play option.
    * 
-   * @param alFiles DOCUMENT_ME
+   * @param alFiles 
    * 
    * @return Given list to play with shuffle or others rules applied
    */
@@ -102,9 +108,9 @@ public final class UtilFeatures {
    * null files are ignored
    * </p>.
    * 
-   * @param alFiles DOCUMENT_ME
-   * @param bRepeat DOCUMENT_ME
-   * @param bUserLauched DOCUMENT_ME
+   * @param alFiles 
+   * @param bRepeat 
+   * @param bUserLauched 
    * 
    * @return the list< stack item>
    */
@@ -157,7 +163,7 @@ public final class UtilFeatures {
   /**
    * Convenient method for getPlayableFiles(collection<item>).
    * 
-   * @param item DOCUMENT_ME
+   * @param item 
    * 
    * @return files
    */
@@ -216,8 +222,8 @@ public final class UtilFeatures {
   /**
    * Gets the shuffle item.
    *
-   * @param <T> DOCUMENT_ME
-   * @param col DOCUMENT_ME
+   * @param <T> 
+   * @param col 
    * @return a single shuffle element from a list, null if none element in
    * provided collection
    */
@@ -237,7 +243,7 @@ public final class UtilFeatures {
   /**
    * Return a genre string for a given genre id *.
    * 
-   * @param i DOCUMENT_ME
+   * @param i 
    * 
    * @return the string genre
    */
@@ -252,14 +258,13 @@ public final class UtilFeatures {
   /**
    * Checks if is standard cover.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    * 
    * @return whether the given filename is a standard cover or not
    */
   public static boolean isStandardCover(final java.io.File file) {
     boolean defaultCover = false;
     String sFileName = file.getName();
-
     Scanner s = new Scanner(Conf.getString(Const.FILE_DEFAULT_COVER)).useDelimiter(";");
     while (s.hasNext()) {
       String next = s.next();
@@ -269,14 +274,12 @@ public final class UtilFeatures {
       }
     }
     s.close();
-
     if (!defaultCover) {
       // just for previous compatibility, now it is a directory
       // property
       defaultCover = sFileName.toLowerCase(Locale.getDefault()).matches(
           ".*" + Const.FILE_ABSOLUTE_DEFAULT_COVER + ".*");
     }
-
     return defaultCover;
   }
 
@@ -290,7 +293,7 @@ public final class UtilFeatures {
    * Try to compute time length in milliseconds using BasicPlayer API. (code
    * from jlGui 2.3)
    * 
-   * @param properties DOCUMENT_ME
+   * @param properties 
    * 
    * @return the time length estimation
    */
@@ -334,7 +337,7 @@ public final class UtilFeatures {
   /**
    * Gets the preference for selection.
    * 
-   * @param selection DOCUMENT_ME
+   * @param selection 
    * 
    * @return first item in selection preference
    */
@@ -353,47 +356,61 @@ public final class UtilFeatures {
     if (trackList.size() == 0) {
       return Const.PREFERENCE_UNSET;
     }
-    Track firstTrack = trackList.get(0);
-    long preferenceFirstItem = firstTrack.getLongValue(Const.XML_TRACK_PREFERENCE);
-    for (int i = 1; i < trackList.size(); i++) {
-      Track track = trackList.get(i);
-      if (track.getLongValue(Const.XML_TRACK_PREFERENCE) != preferenceFirstItem) {
-        return Const.PREFERENCE_UNSET;
-      }
+    long sum = 0;
+    for (Track track : trackList) {
+      sum += track.getLongValue(Const.XML_TRACK_PREFERENCE);
     }
-    return preferenceFirstItem;
+    return (sum) / trackList.size();
   }
 
   /**
-   * Perform updates on this view to reflect current playing item status.
+   * Helper method factorizing updates used to reflect current playing item status.
    * 
-   * @param oberver DOCUMENT_ME
+   * @param observer the observer to update
    */
-  public static void updateStatus(Observer oberver) {
+  public static void updateStatus(Observer observer) {
     // check if a track or a webradio has already been launched
     if (QueueModel.isPlayingRadio()) {
-      oberver.update(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED, ObservationManager
-          .getDetailsLastOccurence(JajukEvents.WEBRADIO_LAUNCHED)));
+      Properties webradioInfoUpdatedEvent = ObservationManager
+          .getDetailsLastOccurence(JajukEvents.WEBRADIO_INFO_UPDATED);
+      Properties webradioLaunchedEvent = ObservationManager
+          .getDetailsLastOccurence(JajukEvents.WEBRADIO_LAUNCHED);
+      if (webradioInfoUpdatedEvent != null) {
+        // We consider that if WEBRADIO_INFO_UPDATED event is not null, WEBRADIO_LAUNCHED can't be null.
+        WebRadio updatedWebRadio = (WebRadio) webradioInfoUpdatedEvent.get(Const.DETAIL_CONTENT);
+        WebRadio radio = (WebRadio) webradioLaunchedEvent.get(Const.DETAIL_CONTENT);
+        //If web radio has an updated event then use that event else use the default event from the web radio launch      
+        if (radio.getName().equals(updatedWebRadio.getName())) {
+          observer.update(new JajukEvent(JajukEvents.WEBRADIO_INFO_UPDATED,
+              webradioInfoUpdatedEvent));
+        } else {
+          observer.update(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED, webradioLaunchedEvent));
+        }
+      } else if (webradioLaunchedEvent != null) {
+        observer.update(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED, webradioLaunchedEvent));
+      }
     } else if (!QueueModel.isStopped()) {
-      oberver.update(new JajukEvent(JajukEvents.FILE_LAUNCHED, ObservationManager
+      observer.update(new JajukEvent(JajukEvents.FILE_LAUNCHED, ObservationManager
           .getDetailsLastOccurence(JajukEvents.FILE_LAUNCHED)));
-      oberver.update(new JajukEvent(JajukEvents.PLAYER_PLAY, ObservationManager
+      observer.update(new JajukEvent(JajukEvents.PLAYER_PLAY, ObservationManager
           .getDetailsLastOccurence(JajukEvents.PLAYER_PLAY)));
     } else {
       // if queue is not empty we can activate the control buttons
       if (QueueModel.getQueueSize() > 0) {
-        oberver.update(new JajukEvent(JajukEvents.PLAYER_STOP));
+        observer.update(new JajukEvent(JajukEvents.PLAYER_STOP));
       } else {
-        oberver.update(new JajukEvent(JajukEvents.ZERO));
+        observer.update(new JajukEvent(JajukEvents.ZERO));
       }
     }
+    // Force update due to parameter changes
+    observer.update(new JajukEvent(JajukEvents.PARAMETERS_CHANGE));
   }
 
   /**
    * Return sum of decimal digits in n. Code from
    * http://www.cs.princeton.edu/introcs/51data/CDDB.java.html
    * 
-   * @param n DOCUMENT_ME
+   * @param n 
    * 
    * @return the long
    */
@@ -408,36 +425,11 @@ public final class UtilFeatures {
   }
 
   /**
-   * Computes a disk id. Code based on
-   * http://www.cs.princeton.edu/introcs/51data/CDDB.java.html
-   * 
-   * @param durations List of durations
-   * 
-   * @return the disk ID as a long
-   */
-  public static long computeDiscID(List<Long> durations) {
-    int totalLength = 0;
-    int nbTracks = durations.size();
-    for (Long l : durations) {
-      totalLength += l;
-    }
-    int checkSum = 0;
-    for (Long duration : durations) {
-      checkSum += sumOfDigits(duration);
-    }
-    long xx = checkSum % 255;
-    long yyyy = totalLength;
-    long zz = nbTracks;
-    // XXYYYYZZ
-    return ((xx << 24) | (yyyy << 8) | zz);
-  }
-
-  /**
    * Shuffle a list of items and ensure that final list first element
    * is different from the initial list's one
    * <p>The list should not be void</p>.
    * 
-   * @param list DOCUMENT_ME
+   * @param list 
    * 
    * @return shuffled list
    */
@@ -453,7 +445,7 @@ public final class UtilFeatures {
   /**
    * Return a flat list of files for given input list without duplicates nor sorting.
    * 
-   * @param in DOCUMENT_ME
+   * @param in 
    * 
    * @return a flat list of files for given input list
    * 
@@ -490,10 +482,41 @@ public final class UtilFeatures {
           } else {
             out.add(track.getBestFile(true));
           }
-
         }
       }
     }
     return new ArrayList<File>(out);
   }
+
+  /**
+   * Return the last played track position as read from the position file from disk
+   * @return the last played track position
+   */
+  public static float readPersistedPlayingPosition() {
+    float out = 0.0f;
+    java.io.File positionFile = SessionService.getConfFileByPath(Const.FILE_PLAYING_POSITION);
+    // Note that the position file is written by the player during playing
+    if (positionFile.exists()) {
+      try {
+        String content = Files.readFirstLine(positionFile, Charsets.UTF_8);
+        out = Float.parseFloat(content);
+      } catch (Exception e) {
+        Log.error(e);
+      }
+    }
+    return out;
+  }
+
+  /**
+   * Store the current played track position as a float to the position file
+   * @param position the playing position as a float. Example : 0.1
+   */
+  public static void storePersistedPlayingPosition(float position) {
+    java.io.File positionFile = SessionService.getConfFileByPath(Const.FILE_PLAYING_POSITION);
+    try {
+      Files.write(Float.toString(position).getBytes(), positionFile);
+    } catch (Exception e) {
+      Log.error(e);
+    }
+  }
 }
diff --git a/src/main/java/org/jajuk/util/UtilGUI.java b/src/main/java/org/jajuk/util/UtilGUI.java
index c93199d..7ff1d54 100644
--- a/src/main/java/org/jajuk/util/UtilGUI.java
+++ b/src/main/java/org/jajuk/util/UtilGUI.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -43,6 +43,8 @@ import java.awt.RenderingHints;
 import java.awt.Toolkit;
 import java.awt.Window;
 import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.PixelGrabber;
@@ -81,53 +83,46 @@ import org.jajuk.ui.perspectives.PerspectiveManager;
 import org.jajuk.ui.views.IView;
 import org.jajuk.ui.widgets.CommandJPanel;
 import org.jajuk.ui.widgets.InformationJPanel;
-import org.jajuk.ui.widgets.JajukJMenuBar;
 import org.jajuk.ui.widgets.PerspectiveBarJPanel;
 import org.jajuk.ui.windows.JajukFullScreenWindow;
 import org.jajuk.ui.windows.JajukMainWindow;
 import org.jajuk.ui.windows.JajukSlimbar;
 import org.jajuk.ui.windows.JajukSystray;
-import org.jajuk.ui.windows.WindowState;
-import org.jajuk.ui.windows.WindowStateDecorator;
 import org.jajuk.util.log.Log;
+import org.jdesktop.swingx.JXBusyLabel;
+import org.jdesktop.swingx.JXPanel;
 import org.jdesktop.swingx.decorator.Highlighter;
 import org.jdesktop.swingx.decorator.HighlighterFactory;
-import org.jvnet.substance.SubstanceLookAndFeel;
-import org.jvnet.substance.api.SubstanceColorScheme;
-import org.jvnet.substance.api.SubstanceSkin;
-import org.jvnet.substance.skin.SkinInfo;
-import org.jvnet.substance.skin.SubstanceBusinessLookAndFeel;
+import org.pushingpixels.substance.api.DecorationAreaType;
+import org.pushingpixels.substance.api.SubstanceColorScheme;
+import org.pushingpixels.substance.api.SubstanceLookAndFeel;
+import org.pushingpixels.substance.api.SubstanceSkin;
+import org.pushingpixels.substance.api.skin.SkinInfo;
+import org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel;
 
 /**
  * Set of GUI convenient methods.
  */
 public final class UtilGUI {
-
   /* different types of Cursors that are available */
-  /** The Constant WAIT_CURSOR. DOCUMENT_ME */
+  /** The Constant WAIT_CURSOR.  */
   public static final Cursor WAIT_CURSOR = new Cursor(Cursor.WAIT_CURSOR);
-
-  /** The Constant LINK_CURSOR. DOCUMENT_ME */
+  /** The Constant LINK_CURSOR.  */
   public static final Cursor LINK_CURSOR = new Cursor(Cursor.HAND_CURSOR);
-
-  /** The Constant DEFAULT_CURSOR. DOCUMENT_ME */
+  /** The Constant DEFAULT_CURSOR.  */
   public static final Cursor DEFAULT_CURSOR = new Cursor(Cursor.DEFAULT_CURSOR);
-
   // Current cursor that is displayed
-  /** DOCUMENT_ME. */
   private static Cursor currentCursor = DEFAULT_CURSOR;
-
-  /** Substance theme *. */
+  /** Substance theme. */
   private static String theme;
-
   /** Alternate color rows highlighter used in every table. */
   private static Highlighter alternateColorHighlighter;
 
   /**
    * Return whether the given highlighter is the alternateColorHighlighter.
-   * 
-   * @param other DOCUMENT_ME
-   * 
+   *
+   * @param other 
+   *
    * @return whether the given highlighter is the alternateColorHighlighter
    */
   public static boolean isAlternateColorHighlighter(Highlighter other) {
@@ -143,7 +138,6 @@ public final class UtilGUI {
 
   /** Current active color scheme *. */
   private static SubstanceColorScheme colorScheme;
-
   /** Set cursor thread, stored to avoid construction. */
   private static Runnable setCursorThread = new Runnable() {
     @Override
@@ -169,8 +163,8 @@ public final class UtilGUI {
 
   /**
    * Display a given image in a frame (for debuging purpose).
-   * 
-   * @param ii DOCUMENT_ME
+   *
+   * @param ii 
    */
   public static void displayImage(final ImageIcon ii) {
     final JFrame jf = new JFrame();
@@ -181,9 +175,9 @@ public final class UtilGUI {
 
   /**
    * Write down a memory image to a file.
-   * 
-   * @param src DOCUMENT_ME
-   * @param dest DOCUMENT_ME
+   *
+   * @param src 
+   * @param dest 
    */
   public static void extractImage(final Image src, final File dest) {
     final BufferedImage bi = UtilGUI.toBufferedImage(src);
@@ -197,7 +191,7 @@ public final class UtilGUI {
 
   /**
    * Gets the graphics device of main frame.
-   * 
+   *
    * @return the current display of the main frame
    */
   public static GraphicsDevice getGraphicsDeviceOfMainFrame() {
@@ -205,8 +199,8 @@ public final class UtilGUI {
         .getLocalGraphicsEnvironment();
     for (int i = 0; i < GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices().length; i++) {
       GraphicsDevice graphicsDevice = localGraphicsEnvironment.getScreenDevices()[i];
-      if (graphicsDevice.getDefaultConfiguration().getBounds().contains(
-          JajukMainWindow.getInstance().getLocation())) {
+      if (graphicsDevice.getDefaultConfiguration().getBounds()
+          .contains(JajukMainWindow.getInstance().getLocation())) {
         return graphicsDevice;
       }
     }
@@ -215,9 +209,9 @@ public final class UtilGUI {
 
   /**
    * Gets the centred panel.
-   * 
-   * @param jc DOCUMENT_ME
-   * 
+   *
+   * @param jc 
+   *
    * @return an horizontaly centred panel
    */
   public static JPanel getCentredPanel(final JComponent jc) {
@@ -226,11 +220,11 @@ public final class UtilGUI {
 
   /**
    * Gets the centred panel.
-   * 
-   * @param jc DOCUMENT_ME
+   *
+   * @param jc 
    * @param iOrientation : vertical or horizontal orientation, use BoxLayout.X_AXIS or
    * BoxLayout.Y_AXIS
-   * 
+   *
    * @return a centred panel
    */
   public static JPanel getCentredPanel(final JComponent jc, final int iOrientation) {
@@ -250,22 +244,21 @@ public final class UtilGUI {
 
   /**
    * Gets the html color.
-   * 
+   *
    * @param color java color
-   * 
+   *
    * @return HTML RGB color ex: FF0000
    */
   public static String getHTMLColor(final Color color) {
     return Long.toString(color.getRed(), 16) + Long.toString(color.getGreen(), 16)
         + Long.toString(color.getBlue(), 16);
-
   }
 
   /**
    * Get required image with specified url.
-   * 
-   * @param url DOCUMENT_ME
-   * 
+   *
+   * @param url 
+   *
    * @return the image
    */
   public static ImageIcon getImage(final URL url) {
@@ -278,7 +271,6 @@ public final class UtilGUI {
         ii = new ImageIcon(url);
         UtilSystem.iconCache.put(sURL, ii);
       }
-
     } catch (final Exception e) {
       Log.error(e);
     }
@@ -287,10 +279,10 @@ public final class UtilGUI {
 
   /**
    * Gets the limited message.
-   * 
+   *
    * @param sText text to display, lines separated by \n characters
    * @param limit : max number of lines to be displayed without scroller
-   * 
+   *
    * @return formated message: either a string, or a textarea
    */
   public static Object getLimitedMessage(final String sText, final int limit) {
@@ -312,21 +304,19 @@ public final class UtilGUI {
    * code from
    * http://java.sun.com/developer/onlineTraining/new2java/supplements/
    * 2005/July05.html#1 Used to correctly display long messages
-   * 
-   * @param maxCharactersPerLineCount DOCUMENT_ME
-   * 
+   *
+   * @param maxCharactersPerLineCount 
+   *
    * @return the narrow option pane
    */
   public static JOptionPane getNarrowOptionPane(final int maxCharactersPerLineCount) {
     // Our inner class definition
     class NarrowOptionPane extends JOptionPane {
       private static final long serialVersionUID = 1L;
-
       int lmaxCharactersPerLineCount;
 
       NarrowOptionPane(final int maxCharactersPerLineCount) {
         super();
-
         this.lmaxCharactersPerLineCount = maxCharactersPerLineCount;
       }
 
@@ -340,27 +330,54 @@ public final class UtilGUI {
 
   /**
    * Resize an image.
-   * 
+   *
    * @param img image to resize
-   * @param iNewWidth DOCUMENT_ME
-   * @param iNewHeight DOCUMENT_ME
-   * 
+   * @param iNewWidth 
+   * @param iNewHeight 
+   *
    * @return resized image
    */
   public static ImageIcon getResizedImage(final ImageIcon img, final int iNewWidth,
       final int iNewHeight) {
     Image scaleImg = img.getImage().getScaledInstance(iNewWidth, iNewHeight,
         Image.SCALE_AREA_AVERAGING);
-    // Leave image cache here as we may want to keep original image
+    // Leave source image cache here as we may want to keep original image
+    // but free the new image
+    scaleImg.flush();
     return new ImageIcon(scaleImg);
   }
 
   /**
+  * Show busy label when searching lyrics over provided panel.
+  * @param panel panel to override.
+  */
+  public static void showBusyLabel(final JXPanel panel) {
+    SwingUtilities.invokeLater(new Runnable() {
+      @Override
+      public void run() {
+        panel.removeAll();
+        Dimension dim = new Dimension(panel.getWidth() / 3, panel.getWidth() / 3);
+        final JXBusyLabel busy = new JXBusyLabel(dim);
+        busy.setBusy(true);
+        JPanel inner = new JPanel();
+        inner.setMinimumSize(new Dimension(panel.getWidth(), panel.getHeight()));
+        inner.setLayout(new BoxLayout(inner, BoxLayout.X_AXIS));
+        inner.add(Box.createHorizontalGlue());
+        inner.add(UtilGUI.getCentredPanel(busy, BoxLayout.Y_AXIS));
+        inner.add(Box.createHorizontalGlue());
+        panel.add(inner);
+        panel.revalidate();
+        panel.repaint();
+      }
+    });
+  }
+
+  /**
    * Gets the scaled image.
-   * 
-   * @param img DOCUMENT_ME
-   * @param iScale DOCUMENT_ME
-   * 
+   *
+   * @param img 
+   * @param iScale 
+   *
    * @return a scaled image
    */
   public static ImageIcon getScaledImage(final ImageIcon img, final int iScale) {
@@ -382,8 +399,8 @@ public final class UtilGUI {
 
   /**
    * Setup Substance look and feel.
-   * 
-   * @param pTheme DOCUMENT_ME
+   *
+   * @param pTheme 
    */
   public static void setupSubstanceLookAndFeel(final String pTheme) {
     // Check the theme is known, if not take the default theme
@@ -393,26 +410,22 @@ public final class UtilGUI {
       theme = Const.LNF_DEFAULT_THEME;
       Conf.setProperty(Const.CONF_OPTIONS_LNF, Const.LNF_DEFAULT_THEME);
     }
-
     // Set substance LAF
     try {
       UIManager.setLookAndFeel(new SubstanceBusinessLookAndFeel());
     } catch (UnsupportedLookAndFeelException e) {
       Log.error(e);
     }
-
     // Set substance LAF
     SubstanceLookAndFeel.setSkin(themes.get(theme).getClassName());
-
     // hide some useless elements such locker for not editable labels
     UIManager.put(SubstanceLookAndFeel.SHOW_EXTRA_WIDGETS, Boolean.FALSE);
-
     // Store current color scheme (cannot change for the wall session)
-    colorScheme = SubstanceLookAndFeel.getCurrentSkin().getMainActiveColorScheme();
-
+    colorScheme = SubstanceLookAndFeel.getCurrentSkin().getActiveColorScheme(DecorationAreaType.NONE);
     // Set view foreground colors
     SubstanceSkin theme = SubstanceLookAndFeel.getCurrentSkin();
-    SubstanceColorScheme scheme = theme.getMainActiveColorScheme();
+    
+    SubstanceColorScheme scheme = theme.getActiveColorScheme(DecorationAreaType.NONE);
     Color foregroundActive = null;
     Color foregroundInactive = null;
     Color backgroundActive = null;
@@ -432,24 +445,19 @@ public final class UtilGUI {
     UIManager.put("InternalFrame.inactiveTitleForeground", foregroundInactive);
     UIManager.put("InternalFrame.activeTitleBackground", backgroundActive);
     UIManager.put("InternalFrame.inactiveTitleBackground", backgroundInactive);
-    UIManager.put("DockViewTitleBar.titleFont", FontManager.getInstance().getFont(
-        JajukFont.VIEW_FONT));
-
-    // Set windows decoration to look and feel
-    JFrame.setDefaultLookAndFeelDecorated(true);
-    JDialog.setDefaultLookAndFeelDecorated(true);
-
+    UIManager.put("DockViewTitleBar.titleFont",
+        FontManager.getInstance().getFont(JajukFont.VIEW_FONT));
   }
 
   /**
    * Display given container at given position.
-   * 
+   *
+   * @param window 
    * @param iFromTop max number of pixels from top
    * @param iFromLeft max number of pixels from left
-   * @param window DOCUMENT_ME
    */
   public static void setShuffleLocation(final Window window, final int iFromTop, final int iFromLeft) {
-    window.setLocation((int) (Math.random() * iFromTop), (int) (Math.random() * iFromLeft));
+    window.setLocation((int) (Math.random() * iFromTop), (int) (Math.random() * iFromLeft)); //NOSONAR
   }
 
   /**
@@ -473,10 +481,10 @@ public final class UtilGUI {
   }
 
   /**
-   * To buffered image. DOCUMENT_ME
-   * 
+   * To buffered image. 
+   *
    * @param image the input image
-   * 
+   *
    * @return the buffered image
    */
   public static BufferedImage toBufferedImage(final Image image) {
@@ -485,11 +493,11 @@ public final class UtilGUI {
 
   /**
    * Create a buffered image without forced alpha channel.
-   * 
+   *
    * @param image the input image
-   * @param targetWidth DOCUMENT_ME
-   * @param targetHeight DOCUMENT_ME
-   * 
+   * @param targetWidth 
+   * @param targetHeight 
+   *
    * @return the buffered image
    */
   public static BufferedImage toBufferedImage(final Image image, final int targetWidth,
@@ -502,12 +510,12 @@ public final class UtilGUI {
    * <p>
    * Code adapted from from http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html
    * </p>
-   * 
+   *
    * @param image the input image
-   * @param forcedAlpha Force using an alpha chanel for target image
-   * @param targetWidth DOCUMENT_ME
-   * @param targetHeight DOCUMENT_ME
-   * 
+   * @param targetWidth 
+   * @param targetHeight 
+   * @param forcedAlpha Force using an alpha channel for target image
+   *
    * @return buffered image from an image
    */
   public static BufferedImage toBufferedImage(final Image image, final int targetWidth,
@@ -565,7 +573,6 @@ public final class UtilGUI {
         g2.dispose();
         ret = tmp;
       } while (w != targetWidth || h != targetHeight);
-
       image.flush();
       loadedImage.flush();
       return ret;
@@ -574,9 +581,9 @@ public final class UtilGUI {
 
   /**
    * Get3d image.
-   * 
-   * @param img DOCUMENT_ME
-   * 
+   *
+   * @param img 
+   *
    * @return the 3d image
    */
   public static BufferedImage get3dImage(Image img) {
@@ -584,16 +591,13 @@ public final class UtilGUI {
     int gap = 10;
     float opacity = 0.3f;
     float fadeHeight = 0.6f;
-
     // cover
     BufferedImage coverImage = UtilGUI.toBufferedImage(img, Const.MIRROW_COVER_SIZE,
         Const.MIRROW_COVER_SIZE, true);
-
-    PerspectiveFilter filter1 = new PerspectiveFilter(0, angle, Const.MIRROW_COVER_SIZE - angle / 2,
-        (int) (angle * (5.0 / 3.0)), Const.MIRROW_COVER_SIZE - angle / 2, Const.MIRROW_COVER_SIZE, 0,
-        Const.MIRROW_COVER_SIZE + angle);
+    PerspectiveFilter filter1 = new PerspectiveFilter(0, angle,
+        Const.MIRROW_COVER_SIZE - angle / 2, (int) (angle * (5.0 / 3.0)), Const.MIRROW_COVER_SIZE
+            - angle / 2, Const.MIRROW_COVER_SIZE, 0, Const.MIRROW_COVER_SIZE + angle);
     coverImage = filter1.filter(coverImage, null);
-
     // reflection
     int imageWidth = coverImage.getWidth();
     int imageHeight = coverImage.getHeight();
@@ -606,37 +610,31 @@ public final class UtilGUI {
         0, imageHeight, new Color(0.0f, 0.0f, 0.0f, opacity)));
     rg.fillRect(0, 0, imageWidth, imageHeight);
     rg.dispose();
-
     PerspectiveFilter filter2 = new PerspectiveFilter(0, 0, coverImage.getHeight() - angle / 2,
         angle * 2, coverImage.getHeight() - angle / 2, coverImage.getHeight() + angle * 2, 0,
         coverImage.getHeight());
     BufferedImage reflectedImage = filter2.filter(reflection, null);
-
     // now draw everything on one bufferedImage
     BufferedImage finalImage = new BufferedImage(imageWidth, (int) (1.4 * imageHeight),
         BufferedImage.TYPE_INT_ARGB);
-
     Graphics g = finalImage.getGraphics();
     Graphics2D g2d = (Graphics2D) g;
-
     g2d.drawRenderedImage(coverImage, null);
-
     g2d.translate(0, 2 * imageHeight + gap);
     g2d.scale(1, -1);
     g2d.drawRenderedImage(reflectedImage, null);
     g2d.dispose();
     reflection.flush();
     coverImage.flush();
-
     return finalImage;
   }
 
   /**
    * This method returns true if the specified image has transparent pixels
    * Found at http://www.exampledepot.com/egs/java.awt.image/HasAlpha.html
-   * 
-   * @param image DOCUMENT_ME
-   * 
+   *
+   * @param image 
+   *
    * @return true if the specified image has transparent pixels
    */
   public static boolean hasAlpha(Image image) {
@@ -668,7 +666,6 @@ public final class UtilGUI {
   public static void updateAllUIs() {
     Frame frames[];
     frames = Frame.getFrames();
-
     for (final Frame element : frames) {
       UtilGUI.updateWindowUI(element);
     }
@@ -684,8 +681,8 @@ public final class UtilGUI {
    * current look and feel. Based on the Sun
    * SwingUtilities.updateComponentTreeUI, but ensures that the update happens
    * on the components of a JToolbar before the JToolbar itself.
-   * 
-   * @param c DOCUMENT_ME
+   *
+   * @param c 
    */
   public static void updateComponentTreeUI(final Component c) {
     UtilGUI.updateComponentTreeUI0(c);
@@ -695,35 +692,29 @@ public final class UtilGUI {
   }
 
   /**
-   * Update component tree u i0. DOCUMENT_ME
-   * 
-   * @param c DOCUMENT_ME
+   * Update component tree u i0. 
+   *
+   * @param c 
    */
   private static void updateComponentTreeUI0(final Component c) {
-
     Component[] children = null;
-
     if (c instanceof JToolBar) {
       children = ((JToolBar) c).getComponents();
-
       if (children != null) {
         for (final Component element : children) {
           UtilGUI.updateComponentTreeUI0(element);
         }
       }
-
       ((JComponent) c).updateUI();
     } else {
       if (c instanceof JComponent) {
         ((JComponent) c).updateUI();
       }
-
       if (c instanceof JMenu) {
         children = ((JMenu) c).getMenuComponents();
       } else if (c instanceof Container) {
         children = ((Container) c).getComponents();
       }
-
       if (children != null) {
         for (final Component element : children) {
           UtilGUI.updateComponentTreeUI0(element);
@@ -735,7 +726,7 @@ public final class UtilGUI {
   /**
    * Method to attempt a dynamic update for all components of the given
    * <code>Window</code>.
-   * 
+   *
    * @param window The <code>Window</code> for which the look and feel update has to
    * be performed against.
    */
@@ -745,9 +736,7 @@ public final class UtilGUI {
     } catch (final Exception exception) {
       Log.error(exception);
     }
-
     final Window windows[] = window.getOwnedWindows();
-
     for (final Window element : windows) {
       UtilGUI.updateWindowUI(element);
     }
@@ -755,7 +744,7 @@ public final class UtilGUI {
 
   /**
    * Gets the alternate highlighter.
-   * 
+   *
    * @return a theme-dependent alternate row highlighter used in tables or trees
    */
   public static Highlighter getAlternateHighlighter() {
@@ -763,7 +752,7 @@ public final class UtilGUI {
       return alternateColorHighlighter;
     }
     SubstanceSkin theme = SubstanceLookAndFeel.getCurrentSkin();
-    SubstanceColorScheme scheme = theme.getMainActiveColorScheme();
+    SubstanceColorScheme scheme = theme.getActiveColorScheme(DecorationAreaType.NONE);
     Color color1 = scheme.getWatermarkStampColor();
     Color color2 = scheme.getWatermarkDarkColor();
     Highlighter highlighter = HighlighterFactory.createAlternateStriping(color1, color2);
@@ -773,26 +762,24 @@ public final class UtilGUI {
 
   /**
    * Checks if is over.
-   * 
-   * @param location DOCUMENT_ME
-   * @param dimension DOCUMENT_ME
-   * 
+   *
+   * @param location 
+   * @param dimension 
+   *
    * @return whether the current mouse cursor if above a given component
    */
   public static boolean isOver(Point location, Dimension dimension) {
     java.awt.Point p = MouseInfo.getPointerInfo().getLocation();
-
     if (p.getX() <= location.getX() || p.getY() <= location.getY()) {
       return false;
     }
-
     return (p.getX() < (dimension.getWidth() + location.getX()) && p.getY() < (dimension
         .getHeight() + location.getY()));
   }
 
   /**
    * Gets the ultra light color.
-   * 
+   *
    * @return ultralight color for current color scheme
    */
   static public Color getUltraLightColor() {
@@ -801,7 +788,7 @@ public final class UtilGUI {
 
   /**
    * Gets the foreground color.
-   * 
+   *
    * @return foreground color for current color scheme
    */
   static public Color getForegroundColor() {
@@ -810,9 +797,9 @@ public final class UtilGUI {
 
   /**
    * Display a dialog with given url picture.
-   * 
-   * @param url DOCUMENT_ME
-   * 
+   *
+   * @param url 
+   *
    * @throws MalformedURLException the malformed url exception
    */
   static public void showPictureDialog(String url) throws MalformedURLException {
@@ -829,61 +816,39 @@ public final class UtilGUI {
   }
 
   /**
-   * configures gui for repeat single enable/disable.
-   * 
-   * @param enable DOCUMENT_ME
-   */
-  public static void setRepeatSingleGui(boolean enable) {
-    // always disable repeat all
-    Conf.setProperty(Const.CONF_STATE_REPEAT_ALL, Const.FALSE);
-    JajukJMenuBar.getInstance().setRepeatAllSelected(false);
-    CommandJPanel.getInstance().setRepeatAllSelected(false);
-    Conf.setProperty(Const.CONF_STATE_REPEAT, Boolean.toString(enable));
-    JajukJMenuBar.getInstance().setRepeatSelected(enable);
-    CommandJPanel.getInstance().setRepeatSelected(enable);
-
-  }
-
-  /**
-   * configures gui for repeat all enable/disable.
-   * 
-   * @param enable DOCUMENT_ME
-   */
-  public static void setRepeatAllGui(boolean enable) {
-    // always disable repeat single
-    Conf.setProperty(Const.CONF_STATE_REPEAT, Boolean.toString(false));
-    JajukJMenuBar.getInstance().setRepeatSelected(false);
-    CommandJPanel.getInstance().setRepeatSelected(false);
-
-    Conf.setProperty(Const.CONF_STATE_REPEAT_ALL, Boolean.toString(enable));
-
-    JajukJMenuBar.getInstance().setRepeatAllSelected(enable);
-    CommandJPanel.getInstance().setRepeatAllSelected(enable);
-
-  }
-
-  /**
    * Registers the ESCAPE key on the Panel so that it closes the Dialog.
-   * 
-   * @param window DOCUMENT_ME
-   * @param pane DOCUMENT_ME
+   *
+   * @param window 
+   * @param pane 
    */
   public static void setEscapeKeyboardAction(final Window window, JComponent pane) {
+    final KeyEventDispatcher dispatcher = new KeyEventDispatcher() {
+      @Override
+      public boolean dispatchKeyEvent(KeyEvent e) {
+        // For some reasons (under Linux at least), pressing escape only trigger PRESSED
+        // and RELEASED key events
+        if (e.getKeyCode() == KeyEvent.VK_ESCAPE && e.getID() == KeyEvent.KEY_PRESSED
+            && window.isFocused()) {
+          window.dispose();
+          return true;
+        }
+        return false;
+      }
+    };
     // Add keystroke to close window when pressing escape
-    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
-        new KeyEventDispatcher() {
-          @Override
-          public boolean dispatchKeyEvent(KeyEvent e) {
-            // For some reasons (under Linux at least), pressing escape only trigger PRESSED 
-            // and RELEASED key events 
-            if (e.getKeyCode() == KeyEvent.VK_ESCAPE && e.getID() == KeyEvent.KEY_PRESSED
-                && window.isFocused()) {
-              window.dispose();
-              return true;
-            }
-            return false;
-          }
-        });
+    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher);
+    // make sure the key event dispatcher is removed as soon as the Window is closing
+    window.addWindowListener(new WindowAdapter() {
+      @Override
+      public void windowClosing(WindowEvent e) {
+        KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
+      }
+
+      @Override
+      public void windowClosed(WindowEvent e) {
+        KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
+      }
+    });
   }
 
   /**
@@ -892,14 +857,13 @@ public final class UtilGUI {
    * <exception catching is preferred in the longCall() method without throwing
    * it to the fastCall() one.
    * </p>
-   * 
-   * @param displayable DOCUMENT_ME
+   *
+   * @param displayable 
    */
   public static void populate(final TwoStepsDisplayable displayable) {
     SwingWorker<Object, Void> sw = new SwingWorker<Object, Void>() {
-
       @Override
-      protected Object doInBackground() throws Exception {
+      protected Object doInBackground() {
         return displayable.longCall();
       }
 
@@ -920,21 +884,21 @@ public final class UtilGUI {
 
   /**
    * Center a given window to the center of the screen.
-   * 
-   * @param window DOCUMENT_ME
+   *
+   * @param window 
    */
   public static void centerWindow(Window window) {
     Toolkit tk = Toolkit.getDefaultToolkit();
     Dimension screenSize = tk.getScreenSize();
     int screenHeight = screenSize.height;
     int screenWidth = screenSize.width;
-    window.setLocation((screenWidth / 2) - (window.getWidth() / 2), (screenHeight / 2)
-        - (window.getHeight() / 2));
+    window.setLocation((screenWidth / 2) - (window.getWidth() / 2),
+        (screenHeight / 2) - (window.getHeight() / 2));
   }
 
   /**
    * Return any displayed window (between main window, slimbar...)
-   * 
+   *
    * @return any displayed window (between main window, slimbar...)
    */
   public static Window getActiveWindow() {
@@ -952,9 +916,9 @@ public final class UtilGUI {
 
   /**
    * Gets the given component's parent view.
-   * 
+   *
    * @param component the component
-   * 
+   *
    * @return the parent view or null if none IView is among its ancestors
    */
   public static IView getParentView(Component component) {
@@ -969,39 +933,4 @@ public final class UtilGUI {
       return null;
     }
   }
-
-  /**
-   * Store window-type configuration.
-   */
-  public static void storeWindowSate() {
-    WindowStateDecorator sdSlimbar = JajukSlimbar.getInstance().getWindowStateDecorator();
-    WindowStateDecorator sdMainWindow = JajukMainWindow.getInstance().getWindowStateDecorator();
-    WindowStateDecorator sdfullscreen = JajukFullScreenWindow.getInstance()
-        .getWindowStateDecorator();
-
-    // Set main window display at next startup as a default
-    Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_MAIN_WINDOW));
-
-    if (sdSlimbar.getWindowState() == WindowState.BUILT_DISPLAYED) {
-      Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer
-          .toString(Const.DISPLAY_MODE_SLIMBAR_TRAY));
-    }
-
-    if (sdMainWindow.isDisplayed()) {
-      Conf
-          .setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_MAIN_WINDOW));
-    }
-
-    // None window displayed ? set the tray only (if the show tray option is
-    // set)
-    if (!sdSlimbar.isDisplayed() && !sdMainWindow.isDisplayed() && !sdfullscreen.isDisplayed()
-        && Conf.getBoolean(Const.CONF_SHOW_SYSTRAY)) {
-      Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_TRAY));
-    }
-
-    if (sdfullscreen.getWindowState() == WindowState.BUILT_DISPLAYED) {
-      Conf.setProperty(Const.CONF_STARTUP_DISPLAY, Integer.toString(Const.DISPLAY_MODE_FULLSCREEN));
-    }
-  }
-
 }
diff --git a/src/main/java/org/jajuk/util/UtilPrepareParty.java b/src/main/java/org/jajuk/util/UtilPrepareParty.java
index cfafe5a..8530656 100644
--- a/src/main/java/org/jajuk/util/UtilPrepareParty.java
+++ b/src/main/java/org/jajuk/util/UtilPrepareParty.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -28,10 +28,13 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.CharUtils;
 import org.apache.commons.lang.StringUtils;
 import org.jajuk.base.FileManager;
 import org.jajuk.base.Playlist;
@@ -53,6 +56,8 @@ import org.jajuk.util.log.Log;
  * easier testing.
  */
 public class UtilPrepareParty {
+  /** character that is used to replace if filename normalization is used. */
+  private static final String FILLER_CHAR = "_";
 
   /**
    * Instantiates a new util prepare party.
@@ -78,7 +83,6 @@ public class UtilPrepareParty {
         newFiles.add(file);
       }
     }
-
     return newFiles;
   }
 
@@ -101,11 +105,9 @@ public class UtilPrepareParty {
       if ((accumulated + file.getTrack().getDuration()) / 60 > time) {
         return newFiles;
       }
-
       accumulated += file.getTrack().getDuration();
       newFiles.add(file);
     }
-
     // there were not enough files to reach the limit, return the full list
     return files;
   }
@@ -129,11 +131,9 @@ public class UtilPrepareParty {
       if ((accumulated + file.getSize()) / (1024 * 1024) > size) {
         return newFiles;
       }
-
       accumulated += file.getSize();
       newFiles.add(file);
     }
-
     // there were not enough files to reach the limit, return the full list
     return files;
   }
@@ -156,11 +156,9 @@ public class UtilPrepareParty {
       if (count > tracks) {
         return newFiles;
       }
-
       count++;
       newFiles.add(file);
     }
-
     // there were not enough files to reach the limit, return the full list
     return files;
   }
@@ -183,10 +181,122 @@ public class UtilPrepareParty {
         newFiles.add(file);
       }
     }
-
     return newFiles;
   }
 
+  /** Map containing all the replacements that we do to "normalize" a filename. */
+  private static Map<Character, String> replaceMap = null;
+
+  /**
+   * Normalize filenames so that they do not.
+   * 
+   * TODO: is there some utility method that can do this?
+   * 
+   * @param name Name that should be normalized
+   * 
+   * @return the filename where special characters are replaced/removed
+   */
+  public static synchronized String normalizeFilename(String name) {
+    // initialize map if necessary
+    if (replaceMap == null) {
+      replaceMap = new HashMap<Character, String>();
+      // German umlauts can be handled better than just using the filler_char,
+      // we
+      // can keep the filename readable
+      replaceMap.put('à', "a");
+      replaceMap.put('á', "a");
+      replaceMap.put('â', "a");
+      replaceMap.put('ã', "a");
+      replaceMap.put('ä', "ae");
+      replaceMap.put('å', "a");
+      replaceMap.put('æ', "ae");
+      replaceMap.put('À', "A");
+      replaceMap.put('Á', "A");
+      replaceMap.put('Â', "A");
+      replaceMap.put('Ã', "A");
+      replaceMap.put('Ä', "AE");
+      replaceMap.put('Å', "A");
+      replaceMap.put('Æ', "AE");
+      replaceMap.put('Ç', "C");
+      replaceMap.put('ç', "c");
+      replaceMap.put('Ð', "D");
+      replaceMap.put('È', "E");
+      replaceMap.put('É', "E");
+      replaceMap.put('Ê', "E");
+      replaceMap.put('Ë', "E");
+      replaceMap.put('é', "e");
+      replaceMap.put('è', "e");
+      replaceMap.put('é', "e");
+      replaceMap.put('ê', "e");
+      replaceMap.put('ë', "e");
+      replaceMap.put('Ì', "I");
+      replaceMap.put('Í', "I");
+      replaceMap.put('Î', "I");
+      replaceMap.put('Ï', "I");
+      replaceMap.put('ì', "i");
+      replaceMap.put('í', "i");
+      replaceMap.put('î', "i");
+      replaceMap.put('ï', "i");
+      replaceMap.put('Ñ', "N");
+      replaceMap.put('ñ', "n");
+      replaceMap.put('Ò', "O");
+      replaceMap.put('Ó', "O");
+      replaceMap.put('Ô', "O");
+      replaceMap.put('Õ', "O");
+      replaceMap.put('Ö', "OE");
+      replaceMap.put('Ő', "O");
+      replaceMap.put('Œ', "O");
+      replaceMap.put('ò', "o");
+      replaceMap.put('ó', "o");
+      replaceMap.put('ô', "o");
+      replaceMap.put('õ', "o");
+      replaceMap.put('ö', "oe");
+      replaceMap.put('ő', "o");
+      replaceMap.put('œ', "oe");
+      replaceMap.put('ß', "ss");
+      replaceMap.put('Ù', "U");
+      replaceMap.put('Ú', "U");
+      replaceMap.put('Û', "U");
+      replaceMap.put('Ü', "UE");
+      replaceMap.put('ù', "u");
+      replaceMap.put('ú', "u");
+      replaceMap.put('û', "u");
+      replaceMap.put('ü', "ue");
+      replaceMap.put('Ý', "Y");
+      replaceMap.put('ý', "y");
+      replaceMap.put('ÿ', "y");
+      // some more special characters that can be replaced with more useful
+      // values
+      // than FILLER_CHAR
+      replaceMap.put('€', "EUR");
+      replaceMap.put('&', "and");
+      // replace path-separators and colon that could cause trouble on other
+      // OSes, also question mark and star can produce errors
+      replaceMap.put('/', FILLER_CHAR);
+      replaceMap.put('\\', FILLER_CHAR);
+      replaceMap.put(':', FILLER_CHAR);
+      replaceMap.put('?', FILLER_CHAR);
+      replaceMap.put('*', FILLER_CHAR);
+      replaceMap.put('!', FILLER_CHAR);
+    }
+    StringBuilder newName = new StringBuilder(name.length());
+    for (int i = 0; i < name.length(); i++) {
+      char c = name.charAt(i);
+      // replace some things that we can replace with other useful values
+      if (replaceMap.containsKey(c)) {
+        newName.append(replaceMap.get(c));
+      } else if (CharUtils.isAsciiPrintable(c)) {
+        // any other ASCII character is added
+        newName.append(c);
+      } else {
+        // everything else outside the ASCII range is simple removed to not
+        // cause any trouble
+        newName.append(FILLER_CHAR);
+      }
+    }
+    return newName.toString();
+  }
+
   /**
    * Get files from the specified DJ.
    * 
@@ -209,7 +319,6 @@ public class UtilPrepareParty {
   public static List<org.jajuk.base.File> getAmbienceFiles(String name) {
     final List<org.jajuk.base.File> files;
     Ambience ambience = AmbienceManager.getInstance().getAmbienceByName(name);
-
     files = new ArrayList<org.jajuk.base.File>();
     // Get a shuffle selection
     List<org.jajuk.base.File> allFiles = FileManager.getInstance().getGlobalShufflePlaylist();
@@ -241,7 +350,6 @@ public class UtilPrepareParty {
     if (tempPlaylist != null && name.equals(tempPlaylist.getName())) {
       return tempPlaylist.getFiles();
     }
-
     // get the Playlist from the Manager by name
     Playlist playlist = PlaylistManager.getInstance().getPlaylistByName(name);
     return playlist.getFiles();
@@ -314,7 +422,6 @@ public class UtilPrepareParty {
    */
   private static List<String> splitCommand(String command) {
     List<String> list = new ArrayList<String>();
-
     StringBuilder word = new StringBuilder();
     boolean quote = false;
     int i = 0;
@@ -323,11 +430,9 @@ public class UtilPrepareParty {
       // word boundary
       if (Character.isWhitespace(c) && !quote) {
         i++;
-
         // finish current word
         list.add(word.toString());
         word = new StringBuilder();
-
         // skip more whitespaces
         while (Character.isWhitespace(command.charAt(i)) && i < command.length()) {
           i++;
@@ -337,18 +442,14 @@ public class UtilPrepareParty {
         if (c == '"') {
           quote = !quote;
         }
-
         word.append(c);
-
         i++;
       }
     }
-
     // finish last word
     if (word.length() > 0) {
       list.add(word.toString());
     }
-
     return list;
   }
 
@@ -363,15 +464,12 @@ public class UtilPrepareParty {
   public static boolean checkPACPL(String pacpl) {
     // here we just want to verify that we find pacpl
     // first build the commandline for "pacpl --help"
-
     // see the manual page of "pacpl"
     List<String> list = splitCommand(pacpl);
     list.add("--help");
-
     // create streams for catching stdout and stderr
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     ByteArrayOutputStream err = new ByteArrayOutputStream();
-
     int ret = 0;
     final ProcessLauncher launcher = new ProcessLauncher(out, err, 10000);
     try {
@@ -381,18 +479,15 @@ public class UtilPrepareParty {
       Log.debug("Exception while checking for 'pacpl', cannot use functionality to convert media files while copying: "
           + e.getMessage());
     }
-
     // if we do not find the application or if we got an error, log some details
     // and disable notification support
     if (ret != 0) {
       // log out the results
       Log.debug("pacpl command returned to out(" + ret + "): " + out.toString());
       Log.debug("pacpl command returned to err: " + err.toString());
-
       Log.info("Cannot use functionality to convert media files, application 'pacpl' seems to be not available correctly.");
       return false;
     }
-
     // pacpl is enabled and seems to be supported by the OS
     return true;
   }
@@ -421,34 +516,26 @@ public class UtilPrepareParty {
   public static int convertPACPL(String pacpl, File file, String toFormat, java.io.File toDir,
       String newName) {
     // first build the commandline for "pacpl"
-
     // see the manual page of "pacpl"
-
     // first split the command itself with observing quotes, splitting is
     // necessary because it can be something like "perl <locatoin>/pacpl"
     List<String> list = splitCommand(pacpl);
-
     // where to store the file
     list.add("--outdir");
     list.add(toDir.getAbsolutePath());
-
     // specify new filename
     list.add("--outfile");
     list.add(newName);
-
     // specify output format
     list.add("--to");
     list.add(toFormat);
-
     // now add the actual file to convert
     list.add(file.getAbsolutePath());
-
     // create streams for catching stdout and stderr
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     ByteArrayOutputStream err = new ByteArrayOutputStream();
-
     int ret = 0;
-    StringBuffer commandLog = new StringBuffer();
+    StringBuilder commandLog = new StringBuilder();
     for (String arg : list) {
       commandLog.append(arg + " ");
     }
@@ -461,7 +548,6 @@ public class UtilPrepareParty {
       ret = -1;
       Log.error(e);
     }
-
     // log out the results
     if (!out.toString().isEmpty()) {
       Log.debug("pacpl command returned to out(" + ret + "): " + out.toString());
@@ -471,14 +557,12 @@ public class UtilPrepareParty {
     } else {
       Log.debug("pacpl command returned: " + ret);
     }
-
     if (!err.toString().isEmpty()) {
       Log.debug("pacpl command returned to err: " + err.toString());
       if (err.toString().indexOf("encode failed") != -1) {
         ret = -1;
       }
     }
-
     return ret;
   }
 
@@ -487,23 +571,20 @@ public class UtilPrepareParty {
    * 
    * @param files The list of flies to copy.
    * @param destDir The target location.
-   * @param isNormalize DOCUMENT_ME
-   * @param isConvertMedia DOCUMENT_ME
-   * @param media DOCUMENT_ME
-   * @param convertCommand DOCUMENT_ME
+   * @param isNormalize 
+   * @param isConvertMedia 
+   * @param media 
+   * @param convertCommand 
    */
   public static void copyFiles(final List<org.jajuk.base.File> files, final java.io.File destDir,
       final boolean isNormalize, final boolean isConvertMedia, final String media,
       final String convertCommand) {
-
     Thread thread = new Thread("PrepareParty - File Copy") {
-
       @Override
       public void run() {
         UtilGUI.waiting();
         // start time to display elapsed time at the end
         long lRefreshDateStart = System.currentTimeMillis();
-
         // start copying and create a playlist on the fly
         int convert_errors = 0;
         final java.io.File file = new java.io.File(destDir.getAbsolutePath() + "/playlist.m3u");
@@ -513,29 +594,23 @@ public class UtilPrepareParty {
             bw.write(Const.PLAYLIST_NOTE);
             int count = 0;
             for (final org.jajuk.base.File entry : files) {
-
               // update progress
               count++;
-
               // We can use the actual file name as we do numbering of the files,
               // this is important for existing playlists to keep the order
               String name = StringUtils.leftPad(Integer.valueOf(count).toString(), 5, '0') + '_'
                   + entry.getFIO().getName();
-
               // normalize filenames if necessary
               if (isNormalize) {
-                name = UtilString.normalizeFilename(name);
+                name = UtilPrepareParty.normalizeFilename(name);
               }
-
               // check if we need to convert the file format
               if (isConvertMedia && !entry.getType().getExtension().equals(media)) {
                 // Notify that we are converting a file
                 Properties properties = new Properties();
                 properties.put(Const.DETAIL_CONTENT, entry.getName());
                 properties.put(Const.DETAIL_NEW, name + "." + media);
-
                 ObservationManager.notify(new JajukEvent(JajukEvents.FILE_CONVERSION, properties));
-
                 int ret = UtilPrepareParty.convertPACPL(convertCommand, entry.getFIO(), media,
                     destDir, name);
                 if (ret != 0) {
@@ -546,68 +621,52 @@ public class UtilPrepareParty {
                   // Conversion is done, new filename is <oldname.old_extension.target_extension>
                   name = name + "." + media;
                 }
-
               } else {
                 // do a normal copy otherwise
                 FileUtils.copyFile(entry.getFIO(), new File(destDir, name));
               }
-
               // increase hits for this track/file as it is likely played outside of Jajuk
               entry.getTrack().incHits();
-
               // write playlist as well
               bw.newLine();
               bw.write(name);
-
               // Notify that a file has been copied
               Properties properties = new Properties();
               properties.put(Const.DETAIL_CONTENT, entry.getName());
               ObservationManager.notify(new JajukEvent(JajukEvents.FILE_COPIED, properties));
             }
-
             bw.flush();
           } finally {
             bw.close();
           }
-
           // Send a last event with null properties to inform the
           // client that the party is done
           ObservationManager.notify(new JajukEvent(JajukEvents.FILE_COPIED));
-
         } catch (final IOException e) {
           Log.error(e);
           Messages.showErrorMessage(180, e.getMessage());
           return;
         } finally {
-
           long refreshTime = System.currentTimeMillis() - lRefreshDateStart;
-
           // inform the user about the number of resulting tracks
           StringBuilder sbOut = new StringBuilder();
           sbOut.append(Messages.getString("PreparePartyWizard.31")).append(" ")
               .append(destDir.getAbsolutePath()).append(".\n").append(files.size()).append(" ")
               .append(Messages.getString("PreparePartyWizard.23")).append(" ")
               .append(((refreshTime < 1000) ? refreshTime + " ms." : refreshTime / 1000 + " s."));
-
           // inform user if converting did not work
           if (convert_errors > 0) {
             sbOut.append("\n").append(Integer.toString(convert_errors))
                 .append(Messages.getString("PreparePartyWizard.36"));
           }
-
           String message = sbOut.toString();
-
           Log.debug(message);
-
           UtilGUI.stopWaiting();
-
           // Display end of copy message with stats
           Messages.showInfoMessage(message);
         }
       }
-
     };
-
     thread.start();
   }
 }
diff --git a/src/main/java/org/jajuk/util/UtilString.java b/src/main/java/org/jajuk/util/UtilString.java
index f686455..c446c0f 100644
--- a/src/main/java/org/jajuk/util/UtilString.java
+++ b/src/main/java/org/jajuk/util/UtilString.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,42 +16,41 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
 import java.text.DateFormat;
-import java.text.Normalizer;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collection;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Properties;
 import java.util.StringTokenizer;
 
-import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.base.AlbumArtistManager;
 import org.jajuk.base.AlbumManager;
-import org.jajuk.base.ArtistManager;
 import org.jajuk.base.File;
+import org.jajuk.base.FileManager;
 import org.jajuk.base.GenreManager;
 import org.jajuk.base.ItemManager;
 import org.jajuk.base.PropertyMetaInformation;
 import org.jajuk.base.Track;
+import org.jajuk.base.TrackManager;
 import org.jajuk.util.error.JajukException;
 
 /**
  * Set of convenient classes for string manipulation.
  */
 public final class UtilString {
-
   /** The list of characters that we need to escape in strings. */
   private final static String ESCAPE_CHARACTERS = "\\[](){}.*+?$^|-";
-
+  private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>();
   /** Constant date FORMATTER, one by thread for perfs, we need an instance by thread because this class is not thread safe. */
   private static final ThreadLocal<SimpleDateFormat> FORMATTER = new ThreadLocal<SimpleDateFormat>() {
     @Override
@@ -60,9 +59,6 @@ public final class UtilString {
     }
   };
 
-  /** Character that is used to replace if filename normalization is used. */
-  private static final String FILLER_CHAR = "_";
-
   /**
    * private constructor to avoid instantiating utility class.
    */
@@ -71,16 +67,16 @@ public final class UtilString {
 
   /**
    * Apply the Album pattern.
-   * 
+   *
    * @param file file to apply pattern to
-   * @param sPattern DOCUMENT_ME
+   * @param sPattern 
    * @param bMandatory are all needed tags mandatory ?
-   * @param normalize DOCUMENT_ME
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * 
+   * @param normalize 
+   * @param out 
+   * @param track 
+   *
    * @return the string
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   private static String applyAlbumPattern(final org.jajuk.base.File file, final String sPattern,
@@ -108,15 +104,15 @@ public final class UtilString {
 
   /**
    * Apply the Year pattern.
-   * 
+   *
    * @param file file to apply pattern to
-   * @param sPattern DOCUMENT_ME
+   * @param sPattern 
    * @param bMandatory are all needed tags mandatory ?
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * 
+   * @param out 
+   * @param track 
+   *
    * @return the string
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   private static String applyYearPattern(final org.jajuk.base.File file, final String sPattern,
@@ -138,12 +134,12 @@ public final class UtilString {
 
   /**
    * Apply the Track pattern.
-   * 
-   * @param sPattern DOCUMENT_ME
-   * @param normalize DOCUMENT_ME
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * 
+   *
+   * @param sPattern 
+   * @param normalize 
+   * @param out 
+   * @param track 
+   *
    * @return the string
    */
   private static String applyTrackPattern(final String sPattern, final boolean normalize,
@@ -162,15 +158,15 @@ public final class UtilString {
 
   /**
    * Apply the Track Order pattern.
-   * 
+   *
    * @param file file to apply pattern to
-   * @param sPattern DOCUMENT_ME
+   * @param sPattern 
    * @param bMandatory are all needed tags mandatory ?
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * 
+   * @param out 
+   * @param track 
+   *
    * @return the string
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   private static String applyTrackOrderPattern(final org.jajuk.base.File file,
@@ -179,7 +175,6 @@ public final class UtilString {
     if (sPattern.contains(Const.PATTERN_TRACKORDER)) {
       // override Order from filename if not set explicitly
       long lOrder = handleOrder(file, bMandatory, track);
-
       // prepend one digit numbers with "0"
       if (lOrder < 10) {
         return out.replace(Const.PATTERN_TRACKORDER, "0" + lOrder);
@@ -187,20 +182,19 @@ public final class UtilString {
         return out.replace(Const.PATTERN_TRACKORDER, lOrder + "");
       }
     }
-
     return out;
   }
 
   /**
    * Handle order.
-   * DOCUMENT_ME
-   * 
-   * @param file DOCUMENT_ME
-   * @param bMandatory DOCUMENT_ME
-   * @param track DOCUMENT_ME
    * 
+   *
+   * @param file 
+   * @param bMandatory 
+   * @param track 
+   *
    * @return the long
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   private static long handleOrder(final org.jajuk.base.File file, final boolean bMandatory,
@@ -229,16 +223,16 @@ public final class UtilString {
 
   /**
    * Apply the Genre pattern.
-   * 
+   *
    * @param file file to apply pattern to
-   * @param sPattern DOCUMENT_ME
+   * @param sPattern 
    * @param bMandatory are all needed tags mandatory ?
-   * @param normalize DOCUMENT_ME
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * 
+   * @param normalize 
+   * @param out 
+   * @param track 
+   *
    * @return the string
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   private static String applyGenrePattern(final org.jajuk.base.File file, final String sPattern,
@@ -266,16 +260,16 @@ public final class UtilString {
 
   /**
    * Apply the Artist pattern.
-   * 
+   *
    * @param file file to apply pattern to
-   * @param sPattern DOCUMENT_ME
+   * @param sPattern 
    * @param bMandatory are all needed tags mandatory ?
-   * @param normalize DOCUMENT_ME
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
-   * 
+   * @param normalize 
+   * @param out 
+   * @param track 
+   *
    * @return the string
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   private static String applyArtistPattern(final org.jajuk.base.File file, final String sPattern,
@@ -284,9 +278,7 @@ public final class UtilString {
     String ret = out;
     String sValue;
     if (sPattern.contains(Const.PATTERN_ARTIST)) {
-
       sValue = track.getArtist().getName();
-
       if (normalize) {
         sValue = UtilSystem.getNormalizedFilename(sValue);
       }
@@ -306,57 +298,88 @@ public final class UtilString {
   /**
    * Apply a pattern. This replaces certain patterns in the provided Pattern
    * with information from the file and returns the result.
-   * 
+   *
    * @param file file to apply pattern to
-   * @param sPattern DOCUMENT_ME
+   * @param sPattern 
    * @param bMandatory are all needed tags mandatory ?
-   * @param normalize DOCUMENT_ME
-   * 
+   * @param normalize Remove characters non compatible with filenames in fil systems
+   *
    * @return computed string
    * make sure the created string can be used as file name on target
    * file system
-   * 
+   *
    * @throws JajukException if some tags are missing
    */
   public static String applyPattern(final org.jajuk.base.File file, final String sPattern,
       final boolean bMandatory, final boolean normalize) throws JajukException {
     String out = sPattern;
     final Track track = file.getTrack();
-
     // Check Artist name
     out = UtilString.applyArtistPattern(file, sPattern, bMandatory, normalize, out, track);
-
     // Check Album artist, use artist name if no album artist
     out = UtilString.applyAlbumArtistPattern(sPattern, normalize, out, track);
-
     // Check Genre name
     out = UtilString.applyGenrePattern(file, sPattern, bMandatory, normalize, out, track);
-
     // Check Album Name
     out = UtilString.applyAlbumPattern(file, sPattern, bMandatory, normalize, out, track);
-
     // Check Track Order
     out = UtilString.applyTrackOrderPattern(file, sPattern, bMandatory, out, track);
-
     // Check Track name
     out = UtilString.applyTrackPattern(sPattern, normalize, out, track);
-
     // Check Year Value
     out = UtilString.applyYearPattern(file, sPattern, bMandatory, out, track);
-
     // Check Disc Value
     out = UtilString.applyDiscPattern(file, sPattern, bMandatory, out, track);
-
+    // Check Custom Properties
+    out = UtilString.applyCustomPattern(file, sPattern, normalize, out, track);
     return out;
   }
 
   /**
+   * Apply Custom property pattern.
+   *
+   * @param sPattern 
+   * @param normalize 
+   * @param out 
+   * @param track 
+   * @return the string
+   */
+  private static String applyCustomPattern(final org.jajuk.base.File file, String sPattern,
+      boolean normalize, String out, Track track) {
+    String ret = out;
+    String sValue;
+    //Merge files and tracks properties. file wins in they both contain a custom property with the same name.
+    Map<String, Object> properties = track.getProperties();
+    properties.putAll(file.getProperties());
+    Collection<PropertyMetaInformation> customProperties = FileManager.getInstance()
+        .getCustomProperties();
+    customProperties.addAll(TrackManager.getInstance().getCustomProperties());
+    Iterator<PropertyMetaInformation> it2 = customProperties.iterator();
+    while (it2.hasNext()) {
+      PropertyMetaInformation meta = it2.next();
+      if (sPattern.contains("%" + meta.getName())) {
+        Object o = properties.get(meta.getName());
+        if (o != null) {
+          sValue = o.toString();
+        } else {
+          sValue = meta.getDefaultValue().toString();
+        }
+        if (normalize) {
+          sValue = UtilSystem.getNormalizedFilename(sValue);
+        }
+        ret = ret.replaceAll("%" + meta.getName(), sValue);
+      }
+    }
+    return ret;
+  }
+
+  /**
    * Apply album artist pattern.
    *
-   * @param sPattern DOCUMENT_ME
-   * @param normalize DOCUMENT_ME
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
+   * @param sPattern 
+   * @param normalize 
+   * @param out 
+   * @param track 
    * @return the string
    */
   private static String applyAlbumArtistPattern(String sPattern, boolean normalize, String out,
@@ -376,11 +399,11 @@ public final class UtilString {
   /**
    * Apply disc pattern.
    *
-   * @param file DOCUMENT_ME
-   * @param sPattern DOCUMENT_ME
-   * @param bMandatory DOCUMENT_ME
-   * @param out DOCUMENT_ME
-   * @param track DOCUMENT_ME
+   * @param file 
+   * @param sPattern 
+   * @param bMandatory 
+   * @param out 
+   * @param track 
    * @return the string
    * @throws JajukException the jajuk exception
    */
@@ -389,7 +412,6 @@ public final class UtilString {
     if (sPattern.contains(Const.PATTERN_DISC)) {
       // override Order from filename if not set explicitly
       long lDiscNumber = handleDiscNumber(file, bMandatory, track);
-
       // prepend one digit numbers with "0"
       if (lDiscNumber < 10) {
         return out.replace(Const.PATTERN_DISC, "0" + lDiscNumber);
@@ -397,20 +419,19 @@ public final class UtilString {
         return out.replace(Const.PATTERN_DISC, lDiscNumber + "");
       }
     }
-
     return out;
   }
 
   /**
    * Handle disc number.
-   * DOCUMENT_ME
-   * 
-   * @param file DOCUMENT_ME
-   * @param bMandatory DOCUMENT_ME
-   * @param track DOCUMENT_ME
    * 
+   *
+   * @param file 
+   * @param bMandatory 
+   * @param track 
+   *
    * @return the long
-   * 
+   *
    * @throws JajukException the jajuk exception
    */
   private static long handleDiscNumber(File file, boolean bMandatory, Track track)
@@ -439,9 +460,9 @@ public final class UtilString {
 
   /**
    * Contains non digit or letters.
-   * 
+   *
    * @param s String to analyse
-   * 
+   *
    * @return whether the given string contains non digit or letter characters
    */
   public static boolean containsNonDigitOrLetters(final String s) {
@@ -457,9 +478,9 @@ public final class UtilString {
 
   /**
    * Encode URLS.
-   * 
-   * @param s DOCUMENT_ME
-   * 
+   *
+   * @param s 
+   *
    * @return the string
    */
   public static String encodeURL(final String s) {
@@ -472,24 +493,22 @@ public final class UtilString {
    */
   /**
    * Escape string.
-   * DOCUMENT_ME
-   * 
-   * @param s DOCUMENT_ME
    * 
+   *
+   * @param s 
+   *
    * @return the string
    */
   public static String escapeString(String s) {
     int length = s.length();
-    StringBuffer buffer = new StringBuffer(2 * length);
+    StringBuilder buffer = new StringBuilder(2 * length);
     for (int i = 0; i != length; i++) {
       char c = s.charAt(i);
-
       // if we have a character that needs to be escaped, we prepend backslash
       // before it
       if (ESCAPE_CHARACTERS.indexOf(c) != -1) {
         buffer.append('\\');
       }
-
       // now append the actual character
       buffer.append(c);
     }
@@ -499,8 +518,8 @@ public final class UtilString {
   /**
    * Format an object to a string.
    *
-   * @param oValue DOCUMENT_ME
-   * @param meta DOCUMENT_ME
+   * @param oValue 
+   * @param meta 
    * @param bHuman is this string intended to be human-readable ?
    * @return the string
    */
@@ -523,18 +542,22 @@ public final class UtilString {
 
   /**
    * Gets the locale date formatter.
-   * 
+   *
    * @return locale date FORMATTER instance
    */
   public static DateFormat getLocaleDateFormatter() {
-    return DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.getDefault());
+    // store the dateFormat as ThreadLocal to avoid performance impact via the costly construction
+    if (dateFormat.get() == null) {
+      dateFormat.set(DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.getDefault()));
+    }
+    return dateFormat.get();
   }
 
   /**
    * Formatter for properties dialog window.
-   * 
-   * @param sDesc DOCUMENT_ME
-   * 
+   *
+   * @param sDesc 
+   *
    * @return the string
    */
   public static String formatPropertyDesc(final String sDesc) {
@@ -543,9 +566,9 @@ public final class UtilString {
 
   /**
    * format genre: first letter uppercase and others lowercase.
-   * 
-   * @param genre DOCUMENT_ME
-   * 
+   *
+   * @param genre 
+   *
    * @return the string
    */
   public static String formatGenre(final String genre) {
@@ -555,7 +578,6 @@ public final class UtilString {
     if (genre.length() == 1) {
       return genre.substring(0, 1).toUpperCase(Locale.getDefault());
     }
-
     // construct string with first letter uppercase and rest lowercase
     return genre.substring(0, 1).toUpperCase(Locale.getDefault())
         + genre.toLowerCase(Locale.getDefault()).substring(1);
@@ -563,9 +585,9 @@ public final class UtilString {
 
   /**
    * Performs some cleanups for strings comming from tag libs.
-   * 
-   * @param s DOCUMENT_ME
-   * 
+   *
+   * @param s 
+   *
    * @return the string
    */
   public static String formatTag(final String s) {
@@ -583,9 +605,9 @@ public final class UtilString {
 
   /**
    * Format a time from secs to a human readable format.
-   * 
-   * @param lTime DOCUMENT_ME
-   * 
+   *
+   * @param lTime 
+   *
    * @return the string
    */
   public static String formatTimeBySec(final long lTime) {
@@ -619,9 +641,9 @@ public final class UtilString {
    * <p> < to <
    * <p>> to >
    * <p> & to &
-   * 
-   * @param s DOCUMENT_ME
-   * 
+   *
+   * @param s 
+   *
    * @return the string
    */
   public static String formatXML(final String s) {
@@ -644,9 +666,9 @@ public final class UtilString {
 
   /**
    * Replace reserved xml chars.
-   * 
-   * @param s DOCUMENT_ME
-   * 
+   *
+   * @param s 
+   *
    * @return the string
    */
   private static String replaceReservedXMLChars(final String s) {
@@ -671,7 +693,7 @@ public final class UtilString {
 
   /**
    * Gets the addition date formatter.
-   * 
+   *
    * @return Thread-safe addition date simple format instance
    */
   public static DateFormat getAdditionDateFormatter() {
@@ -680,7 +702,7 @@ public final class UtilString {
 
   /**
    * Gets the anonymized jajuk properties.
-   * 
+   *
    * @return Anonymized Jajuk properties (for log or quality agent)
    */
   public static Properties getAnonymizedJajukProperties() {
@@ -695,7 +717,7 @@ public final class UtilString {
 
   /**
    * Gets the anonymized system properties.
-   * 
+   *
    * @return Anonymized System properties (for log or quality agent)
    */
   public static Properties getAnonymizedSystemProperties() {
@@ -713,16 +735,15 @@ public final class UtilString {
     properties.remove("deployment.user.security.trusted.certs");
     properties.remove("deployment.user.security.trusted.clientauthcerts");
     properties.remove("jajuk.log");
-
     return properties;
   }
 
   /**
    * Make sure to reduce a string to the given size.
-   * 
+   *
    * @param sIn Input string, example: blabla
    * @param iSize max size, example: 3
-   * 
+   *
    * @return bla...
    */
   public static String getLimitedString(final String sIn, final int iSize) {
@@ -735,9 +756,9 @@ public final class UtilString {
 
   /**
    * Checks if is char.
-   * 
+   *
    * @param ucs4char char to test
-   * 
+   *
    * @return whether the char is valid, code taken from Apache sax
    * implementation
    */
@@ -749,35 +770,50 @@ public final class UtilString {
 
   /**
    * Checks if is xml valid.
-   * 
-   * @param s DOCUMENT_ME
-   * 
+   *
+   * @param s 
+   *
    * @return whether given string is XML-valid
    */
   public static boolean isXMLValid(final String s) {
     // check invalid chars
     for (int i = 0; i < s.length(); i++) {
       final char c = s.charAt(i);
-
       // check reserved chars
       if (-1 != "&\'\"<>".indexOf(c)) {
         return false;
       }
-
       if (!UtilString.isChar(c)) {
         return false;
       }
     }
-
     return true;
   }
 
   /**
+   * Return whether a string is null or void
+   * @param str the string to test
+   * @return whether a string is null or void
+   */
+  public static boolean isEmpty(String str) {
+    return StringUtils.isEmpty(str);
+  }
+
+  /**
+   * Return whether a string is neither null nor void
+   * @param str the string to test
+   * @return whether a string is neither null nor void
+   */
+  public static boolean isNotEmpty(String str) {
+    return !StringUtils.isEmpty(str);
+  }
+
+  /**
    * Pad an int with zeros.
-   * 
+   *
    * @param l the number to be padded
    * @param size the targeted size
-   * 
+   *
    * @return the string
    */
   public static String padNumber(final long l, final int size) {
@@ -790,12 +826,12 @@ public final class UtilString {
 
   /**
    * Parse a string to an object.
-   * 
-   * @param sValue DOCUMENT_ME
-   * @param cType DOCUMENT_ME
-   * 
+   *
+   * @param sValue 
+   * @param cType 
+   *
    * @return parsed item
-   * 
+   *
    * @throws ParseException the parse exception
    * @throws ClassNotFoundException the class not found exception
    */
@@ -818,10 +854,10 @@ public final class UtilString {
 
   /**
    * Handle boolean.
-   * DOCUMENT_ME
-   * 
-   * @param sValue DOCUMENT_ME
    * 
+   *
+   * @param sValue 
+   *
    * @return the boolean
    */
   private static Boolean handleBoolean(final String sValue) {
@@ -840,12 +876,12 @@ public final class UtilString {
 
   /**
    * Fast long parser, low level check, replacement of Long.parseLong()
-   * 
+   *
    * CAUTION : do not use if the value can be negative or you will get
    * unexpected results
-   * 
+   *
    * @param in must be a set of digits with a size > 0 and be positive
-   * 
+   *
    * @return the long
    */
   public static long fastLongParser(String in) {
@@ -864,9 +900,9 @@ public final class UtilString {
 
   /**
    * Fast Boolean parser, low level check, replacement of Boolean.parseBoolean()
-   * 
+   *
    * @param in must be a string beginning by true or false (lower case)
-   * 
+   *
    * @return true, if fast boolean parser
    */
   public static boolean fastBooleanParser(String in) {
@@ -879,9 +915,9 @@ public final class UtilString {
    * Thx http://www.idevelopment.info/data/Programming/java/security/
    * java_cryptography_extension/rot13.java
    * </p>
-   * 
+   *
    * @param in text to encode / decode in rote 13
-   * 
+   *
    * @return encoded /decoded text
    */
   public static String rot13(final String in) {
@@ -902,10 +938,10 @@ public final class UtilString {
 
   /**
    * Matches ignore case and order.
-   * 
+   *
    * @param tested the string to be tested
    * @param key the search criteria, can be several words separated by a space
-   * 
+   *
    * @return whether the given tested string matches the key
    */
   public static boolean matchesIgnoreCaseAndOrder(final String tested, final String key) {
@@ -923,9 +959,9 @@ public final class UtilString {
 
   /**
    * Encode a string to unicode representation (ie \\uxxxx\\uyyyyy...)
-   * 
+   *
    * @param in string to encode
-   * 
+   *
    * @return encoded string
    */
   public static String encodeToUnicode(String in) {
@@ -942,9 +978,9 @@ public final class UtilString {
 
   /**
    * Convert byte to hexadecimal representation.
-   * 
-   * @param b DOCUMENT_ME
-   * 
+   *
+   * @param b 
+   *
    * @return the string
    */
   public static String byteToHex(byte b) {
@@ -956,9 +992,9 @@ public final class UtilString {
 
   /**
    * Returns a concatenation of argument array.
-   * 
+   *
    * @param strings strings to be concatened
-   * 
+   *
    * @return concatenation of given strings
    */
   public static String concat(Object... strings) {
@@ -976,20 +1012,18 @@ public final class UtilString {
    * list if chars are not found in string in given order For example given
    * string "ab cd (ef) gh (ij)" and chars '(' and ')' will return a list with
    * two strings: "(ef)" and "(ij)"
-   * 
-   * @param string DOCUMENT_ME
-   * @param beginChar DOCUMENT_ME
-   * @param endChar DOCUMENT_ME
-   * 
+   *
+   * @param string 
+   * @param beginChar 
+   * @param endChar 
+   *
    * @return the text between chars
    */
   public static final List<String> getTextBetweenChars(String string, char beginChar, char endChar) {
     List<String> result = new ArrayList<String>();
-
     if (string == null || string.indexOf(beginChar) == -1 || string.indexOf(endChar) == -1) {
       return result;
     }
-
     String auxStr = string;
     int beginIndex = auxStr.indexOf(beginChar);
     int endIndex = auxStr.indexOf(endChar);
@@ -1003,43 +1037,4 @@ public final class UtilString {
     }
     return result;
   }
-
-  /**
-   * Normalize filenames so they should be correct under any OS.
-   *
-   * @param name Name that should be normalized
-   * @return the filename where special characters are replaced/removed
-   */
-  public static synchronized String normalizeFilename(String name) {
-
-    // some more special characters that can be replaced with more useful
-    // values than FILLER_CHAR
-    String temp = name.replaceAll("€", "EUR");
-    temp = temp.replaceAll("&", "and");
-
-    // Transform non-ASCII characters to ASCII form or drop them if no mapping available.
-    temp = Normalizer.normalize(temp, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
-
-    // Replace path-separators and colon that could cause trouble on other
-    // OSes, also question mark and star can produce errors
-    temp = FilenameUtils.normalize(temp);
-    int[] illegalChars = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
-        20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 34, 60, 62, 124 };
-    StringBuilder cleanName = new StringBuilder();
-    for (int i = 0; i < temp.length(); i++) {
-      int c = temp.charAt(i);
-      if (Arrays.binarySearch(illegalChars, c) < 0) {
-        cleanName.append((char) c);
-      } else {
-        cleanName.append(FILLER_CHAR);
-      }
-    }
-    temp = cleanName.toString();
-
-    // Make sure filename is not void
-    if (temp.length() == 0) {
-      temp = "normalized";
-    }
-    return temp;
-  }
 }
diff --git a/src/main/java/org/jajuk/util/UtilSystem.java b/src/main/java/org/jajuk/util/UtilSystem.java
index 97883d1..19c9f44 100644
--- a/src/main/java/org/jajuk/util/UtilSystem.java
+++ b/src/main/java/org/jajuk/util/UtilSystem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,10 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
+import com.google.common.io.Files;
+
 import ext.MersenneTwister;
 
 import java.awt.Desktop;
@@ -37,13 +39,11 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
-import java.io.RandomAccessFile;
 import java.io.Writer;
 import java.net.InetAddress;
 import java.net.URL;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -59,6 +59,8 @@ import javax.swing.ImageIcon;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.jajuk.Main;
+import org.jajuk.base.Device;
+import org.jajuk.base.DeviceManager;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.error.JajukRuntimeException;
@@ -70,13 +72,10 @@ import org.jajuk.util.log.Log;
  * Set of convenient methods for system and IO.
  */
 public final class UtilSystem {
-
-  /** The Constant LOCAL_IP.  DOCUMENT_ME */
+  /** The Constant LOCAL_IP.   */
   private static final String LOCAL_IP = "127.0.0.1";
-
   /** Is browser supported ?. */
   private static Boolean browserSupported;
-
   /** Size of the short names converter in bytes. */
   private static final int CONVERTER_FILE_SIZE = 23;
 
@@ -84,97 +83,68 @@ public final class UtilSystem {
    * MPlayer status possible values *.
    */
   public static enum MPlayerStatus {
-
-    /** DOCUMENT_ME. */
-    MPLAYER_STATUS_OK,
-    
-    /** DOCUMENT_ME. */
-    MPLAYER_STATUS_NOT_FOUND,
-    
-    /** DOCUMENT_ME. */
-    MPLAYER_STATUS_WRONG_VERSION,
-    
-    /** DOCUMENT_ME. */
-    MPLAYER_STATUS_JNLP_DOWNLOAD_PBM
+    MPLAYER_STATUS_OK, MPLAYER_STATUS_NOT_FOUND, MPLAYER_STATUS_WRONG_VERSION, MPLAYER_STATUS_JNLP_DOWNLOAD_PBM
   }
 
   /** Current date cached (for performances) *. */
   public static final Date TODAY = new Date();
-
   /** Central random object for all Jajuk *. */
-  private static final Random RANDOM = new MersenneTwister();
-
+  private static final Random RANDOM = MersenneTwister.getInstance();
   /** Cached user home directory *. */
   private static String cachedUserHomeDir;
-
   /** Are we under Linux ? *. */
   private static final boolean UNDER_LINUX;
-
   /** Are we under MAC OS Intel ? *. */
   private static final boolean UNDER_OSX;
-
   /** Are we under Windows ? *. */
   private static final boolean UNDER_WINDOWS;
-
   /** Are we under Windows 32 bits ? *. */
   private static final boolean UNDER_WINDOWS_32BIT;
-
   /** Are we under Windows 64 bits ? *. */
   private static final boolean UNDER_WINDOWS_64BIT;
-
   /** Are we in JNLP mode ? *. */
   private static final boolean UNDER_JNLP;
-
   /** Are we under KDE ? *. */
   private static final boolean UNDER_KDE;
-
   /** Directory filter used in refresh. */
   private static JajukFileFilter dirFilter;
-
   /** File filter used in refresh. */
   private static JajukFileFilter fileFilter;
-
   // Computes OS detection operations for perf reasons (can be called in loop
   // in refresh method for ie)
   static {
     final String sOS = (String) System.getProperties().get("os.name");
     // os.name can be null with JWS under MacOS
-    UNDER_WINDOWS = ((sOS != null) && (sOS.trim().toLowerCase(Locale.getDefault()).lastIndexOf(
-        "windows") != -1));
+    UNDER_WINDOWS = ((sOS != null) && (sOS.trim().toLowerCase(Locale.getDefault())
+        .lastIndexOf("windows") != -1));
   }
-
   static {
     UNDER_WINDOWS_32BIT = UtilSystem.isUnderWindows()
         && System.getProperties().get("sun.arch.data.model").equals("32");
   }
-
   static {
     UNDER_WINDOWS_64BIT = UtilSystem.isUnderWindows()
         && !System.getProperties().get("sun.arch.data.model").equals("32");
   }
-
   static {
     final String sOS = (String) System.getProperties().get("os.name");
     // os.name can be null with JWS under MacOS
-    UNDER_LINUX = ((sOS != null) && (sOS.trim().toLowerCase(Locale.getDefault()).lastIndexOf(
-        "linux") != -1));
+    UNDER_LINUX = ((sOS != null) && (sOS.trim().toLowerCase(Locale.getDefault())
+        .lastIndexOf("linux") != -1));
   }
-
   static {
     final String sArch = System.getProperty("os.arch");
     UNDER_OSX = org.jdesktop.swingx.util.OS.isMacOSX()
     // We only support Intel OSX
         && ((sArch != null) && sArch.matches(".*86.*"));
   }
-
   static {
     UNDER_JNLP = (System.getProperty("jnlpx.jvm") != null);
   }
-
   /**
   * Are we running in a KDE environment ?
   * 
-  * We check it by using ps command + a grep searching 'kdeinit' process*/
+  * We check it by using ps command + a grep searching 'ksmserver' process*/
   static {
     boolean underKDE = false;
     if (isUnderLinux()) {
@@ -186,7 +156,7 @@ public final class UtilSystem {
         proc.waitFor();
         String s;
         while ((s = stdInput.readLine()) != null) {
-          if (s.matches(".*kdeinit.*")) {
+          if (s.matches(".*ksmserver.*")) {
             underKDE = true;
             break;
           }
@@ -205,13 +175,10 @@ public final class UtilSystem {
     }
     UNDER_KDE = underKDE;
   }
-
   /** Icons cache. */
   static Map<String, ImageIcon> iconCache = new HashMap<String, ImageIcon>(200);
-
   /** Mplayer exe path. */
   private static File mplayerPath = null;
-
   /** current class loader. */
   private static ClassLoader classLoader = null;
 
@@ -226,7 +193,7 @@ public final class UtilSystem {
    * with a given maximum Mb size for the file and its backup files
    * 
    * @param file The file to back up
-   * @param iMB DOCUMENT_ME
+   * @param iMB 
    */
   public static void backupFile(final File file, final int iMB) {
     try {
@@ -252,7 +219,7 @@ public final class UtilSystem {
         // too much backup files, delete older
         if (((lUsedMB - file.length()) / 1048576 > iMB) && (alFiles.size() > 0)) {
           final File fileToDelete = alFiles.get(0);
-          if (fileToDelete != null) {
+          if (fileToDelete != null) { //NOSONAR
             if (!fileToDelete.delete()) {
               Log.warn("Could not delete file " + fileToDelete);
             }
@@ -290,13 +257,10 @@ public final class UtilSystem {
    * @throws IOException Signals that an I/O exception has occurred.
    */
   public static void copy(final File file, final File fNew) throws JajukException, IOException {
-    Log.debug("Copying: {{" + file.getAbsolutePath() + "}}  to : " + fNew.getAbsolutePath());
     if (!file.exists() || !file.canRead()) {
       throw new JajukException(9, file.getAbsolutePath(), null);
     }
-
     FileUtils.copyFile(file, fNew);
-
     // Display a warning if copied file is void as it can happen with full
     // disks
     if (fNew.length() == 0) {
@@ -305,6 +269,20 @@ public final class UtilSystem {
   }
 
   /**
+   * Return the device containing the io file
+   * @param fio the IO file to test
+   * @return the containing device or null if the file is outside any known device
+   */
+  public static Device getDeviceForFio(java.io.File fio) {
+    for (Device device : DeviceManager.getInstance().getDevices()) {
+      if (UtilSystem.isAncestor(device.getFIO(), fio)) {
+        return device;
+      }
+    }
+    return null;
+  }
+
+  /**
    * Move a file to another file (directories are not supported).
    * 
    * Note that it may be better to use this method than java.io.File.renameTo() method that
@@ -336,12 +314,11 @@ public final class UtilSystem {
   public static void copy(final File file, final String sNewName) throws JajukException,
       IOException {
     Log.debug("Renaming: {{" + file.getAbsolutePath() + "}}  to : " + sNewName);
-    final File fileNew = new File(new StringBuilder(file.getParentFile().getAbsolutePath()).append(
-        '/').append(sNewName).toString());
+    final File fileNew = new File(new StringBuilder(file.getParentFile().getAbsolutePath())
+        .append('/').append(sNewName).toString());
     if (!file.exists() || !file.canRead()) {
       throw new JajukException(9, file.getAbsolutePath(), null);
     }
-
     FileUtils.copyFile(file, fileNew);
   }
 
@@ -378,13 +355,95 @@ public final class UtilSystem {
   }
 
   /**
+   * Activate recovery support for a file than has been written into the the collection so it can be gratefully recover 
+   * in case of breakdown during the save operation. This method must be called after the file.xml.sav has been successfully written. 
+   * <pre>The steps are the following (every step can fail, all files in the same (collection) directory, thus on the same disk) :
+   * 1) Write file.xml.saving (already done when calling this method)
+   * 2) Write the proof file file.xml.proof (void)
+   * 3) Delete the file.xml file if it exists (optional under POSIX systems but we do it for consistency with Windows and to avoid a OS specific behavior)
+   * 4) Delete the proof file
+   * 5) Rename file.xml.saving to file.xml</pre>
+   * </p>
+   * @param finalFile : the final file (like collection.xml)
+   * @throws IOException
+   */
+  public static void saveFileWithRecoverySupport(File finalFile) throws IOException {
+    // Check saving file existence
+    File saving = new File(finalFile.getAbsoluteFile() + "." + Const.FILE_SAVING_FILE_EXTENSION);
+    if (!saving.exists()) {
+      throw new IOException("Saving file does not exist for file : " + finalFile.getAbsolutePath());
+    }
+    // Create the proof file
+    File proof = new File(finalFile.getAbsoluteFile() + "." + Const.FILE_SAVED_PROOF_FILE_EXTENSION);
+    Files.touch(proof);
+    if (finalFile.exists()) {
+      deleteFile(finalFile);
+    }
+    deleteFile(proof);
+    saving.renameTo(finalFile);
+  }
+
+  /**
+   * Recover a file after a breakdown (at next jajuk session) if required. Most of the time, this does nothing but 
+   * if a file has been partially saved using the @see saveFileWithRecoverySupport() method, the previous version is revored.
+   * This is guarantee to work always, except if the filesystem can't be read or written.
+   *  
+   * Note that this generic method doesn't handle the special collection.xml backup files.
+   * 
+   * <pre>Recovery actions and files existence when failure at step :
+  * No failure : only file.xml file
+    -> no recovery action
+  * @1 : file.xml, partial file.xml.saving and no file.xml.proof
+    -> delete file.xml.sav and file.xml.proof
+  * @2 : file.xml, file.xml.saving but no file.xml.proof
+    -> delete file.sav
+  * @3 : file.xml, file.xml.saving and file.xml.proof
+    -> execute saveFileWithRecoverySupport steps 3 to 5
+  * @4 : file.sav and file.xml.proof
+    -> execute saveFileWithRecoverySupport steps 4 to 5
+  * @5 : file.xml.saving only
+    -> execute saveFileWithRecoverySupport step 5</pre>
+   * @throws IOException if a temporary file cannot be deleted
+   */
+  public static void recoverFileIfRequired(File finalFile) throws IOException {
+    File saving = new File(finalFile.getAbsoluteFile() + "." + Const.FILE_SAVING_FILE_EXTENSION);
+    File proof = new File(finalFile.getAbsoluteFile() + "." + Const.FILE_SAVED_PROOF_FILE_EXTENSION);
+    // No recovery required
+    if (!saving.exists() && !proof.exists()) {
+      return;
+    }
+    // Recovery after crash at saving step 1 and 2
+    if (finalFile.exists() && saving.exists() && !proof.exists()) {
+      Log.warn("Recover step 1 or 2");
+      deleteFile(saving);
+    }
+    // Recovery after crash at saving step 3
+    else if (finalFile.exists() && saving.exists() && proof.exists()) {
+      Log.warn("Recover step 3");
+      deleteFile(finalFile);
+      deleteFile(proof);
+      saving.renameTo(finalFile);
+    }
+    // Recovery after crash at saving step 4
+    else if (!finalFile.exists() && saving.exists() && proof.exists()) {
+      Log.warn("Recover step 4");
+      deleteFile(proof);
+      saving.renameTo(finalFile);
+    }
+    // Recovery after crash at saving step 5
+    else if (!finalFile.exists() && saving.exists() && !proof.exists()) {
+      Log.warn("Recover step 5");
+      saving.renameTo(finalFile);
+    }
+  }
+
+  /**
    * Copy recursively files and directories.
-   * 
-   * @param dst DOCUMENT_ME
-   * @param src DOCUMENT_ME
-   * 
-   * @throws IOException Signals that an I/O exception has occurred.
+   *
+   * @param src 
+   * @param dst 
    * @throws JajukException the jajuk exception
+   * @throws IOException Signals that an I/O exception has occurred.
    */
   public static void copyRecursively(final File src, final File dst) throws JajukException,
       IOException {
@@ -420,14 +479,13 @@ public final class UtilSystem {
     if (!file.exists() || !file.canRead()) {
       throw new JajukException(9, file.getAbsolutePath(), null);
     }
-
     FileUtils.copyFileToDirectory(file, directory);
   }
 
   /**
    * Create empty file.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    * 
    * @throws IOException Signals that an I/O exception has occurred.
    */
@@ -449,25 +507,15 @@ public final class UtilSystem {
    */
   public static void deleteDir(final File dir) throws IOException {
     Log.debug("Deleting: {{" + dir.getAbsolutePath() + "}}");
-    if (dir.isDirectory()) {
-      for (final File file : dir.listFiles()) {
-        if (file.isDirectory()) {
-          UtilSystem.deleteDir(file);
-        } else {
-          UtilSystem.deleteFile(file);
-        }
-      }
-      if (!dir.delete()) {
-        Log.warn("Could not delete directory " + dir);
-      }
-    } else {
-      UtilSystem.deleteFile(dir);
+    FileUtils.deleteDirectory(dir);
+    if (dir.exists()) {
+      throw new IOException("Directory" + dir.getAbsolutePath() + " still exists");
     }
     return;
   }
 
   /**
-   * Delete a file.
+   * Delete a file that exists.
    * 
    * @param file : source file
    * 
@@ -475,25 +523,27 @@ public final class UtilSystem {
    */
   public static void deleteFile(final File file) throws IOException {
     Log.debug("Deleting: {{" + file.getAbsolutePath() + "}}");
-    if (file.isFile() && file.exists()) {
-      if (!file.delete()) {
-        Log.warn("Could not delete file " + file);
-      }
-      // check that file has been really deleted (sometimes,
-      // we get no exception)
-      if (file.exists()) {
-        throw new IOException("File" + file.getAbsolutePath() + " still exists");
-      }
-    } else {// not a file, must have a problem
+    if (!file.isFile()) {
+      throw new IOException("File " + file.getAbsolutePath() + " is not a file");
+    }
+    if (!file.exists()) {
       throw new IOException("File " + file.getAbsolutePath() + " didn't exist");
     }
+    if (!file.delete()) {
+      Log.warn("Could not delete file " + file);
+    }
+    // check that file has been really deleted (sometimes,
+    // we get no exception)
+    if (file.exists()) {
+      throw new IOException("File" + file.getAbsolutePath() + " still exists");
+    }
     return;
   }
 
   /**
    * Get a file extension.
    * 
-   * @param file DOCUMENT_ME
+   * @param file 
    * 
    * @return the extension
    */
@@ -511,12 +561,10 @@ public final class UtilSystem {
    */
   public static String getExtension(final String filename) {
     int dotIndex = filename.lastIndexOf('.');
-
     // File without point
     if (dotIndex == -1) {
       return "";
     }
-
     if (dotIndex > 0) {
       return filename.substring(dotIndex + 1, filename.length());
     } else {
@@ -531,7 +579,7 @@ public final class UtilSystem {
    * <p>
    * uses nio api for performances
    * 
-   * @param fio DOCUMENT_ME
+   * @param fio 
    * 
    * @return the file checksum
    * 
@@ -588,7 +636,7 @@ public final class UtilSystem {
    * 
    * This code no more work with last JRE 6  under JNLP (it returns only partial URL)
    * 
-   * @param cClass DOCUMENT_ME
+   * @param cClass 
    * 
    * @return URL of jar we are executing
    */
@@ -601,7 +649,7 @@ public final class UtilSystem {
   }
 
   /**
-   * Gets the mplayer windows path.
+   * Gets the m player windows path.
    * 
    * @return MPlayer exe file
    */
@@ -626,27 +674,12 @@ public final class UtilSystem {
         // Extract file name from URL. URI returns jar path, its parent
         // is the bin directory and the right dir is the parent of bin
         // dir
-        if (SessionService.isIdeMode()) {
-          // If under dev, take mplayer exe file from the packaging
-          // directory
-          sPATH = "./src/packaging";
-        } else {
-          sPATH = new File(getJarLocation(Main.class).toURI()).getParentFile().getParentFile()
-              .getAbsolutePath();
-        }
+        sPATH = new File(getJarLocation(Main.class).toURI()).getParentFile().getParentFile()
+            .getAbsolutePath();
         // Add MPlayer file name
         file = new File(sPATH + '/' + Const.FILE_MPLAYER_WINDOWS_EXE);
         if (file.exists() && file.length() == Const.MPLAYER_WINDOWS_EXE_SIZE) {
           UtilSystem.mplayerPath = file;
-        } else {
-          // For bundle project, Jajuk should check if mplayer was
-          // installed along with aTunes. In this case, mplayer is
-          // found in sPATH\win_tools\ directory. Hence, changed sPATH
-          // Note that we don't test mplayer.exe size in this case
-          file = new File(sPATH + "/win_tools/" + Const.MPLAYER_WINDOWS_EXE_SIZE);
-          if (file.exists()) {
-            UtilSystem.mplayerPath = file;
-          }
         }
       } catch (Exception e) {
         Log.error(e);
@@ -666,7 +699,7 @@ public final class UtilSystem {
       return UtilSystem.mplayerPath;
     }
     // Search in /Applications first
-    File file = new File("/Applications/Jajuk.app/Contents/Resources/External_Binaries/"
+    File file = new File("/Applications/Jajuk.app/Contents/MacOS/"
         + Const.FILE_MPLAYER_OSX_EXE);
     if (file.canExecute() && file.length() == Const.MPLAYER_OSX_EXE_SIZE) {
       UtilSystem.mplayerPath = file;
@@ -703,7 +736,7 @@ public final class UtilSystem {
   /**
    * Gets the mplayer status.
    * 
-   * @param mplayerPATH DOCUMENT_ME
+   * @param mplayerPATH 
    * 
    * @return the mplayer status
    */
@@ -765,7 +798,7 @@ public final class UtilSystem {
   /**
    * Return only the name of a file from a complete URL.
    * 
-   * @param sPath DOCUMENT_ME
+   * @param sPath 
    * 
    * @return the only file
    */
@@ -778,7 +811,7 @@ public final class UtilSystem {
    * http
    * ://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/faq.html#211
    * 
-   * @param name DOCUMENT_ME
+   * @param name 
    * 
    * @return the resource
    */
@@ -810,8 +843,8 @@ public final class UtilSystem {
   /**
    * Checks if is descendant.
    * 
-   * @param file1 DOCUMENT_ME
-   * @param file2 DOCUMENT_ME
+   * @param file1 
+   * @param file2 
    * 
    * @return whether file1 is a file2 descendant
    */
@@ -950,7 +983,6 @@ public final class UtilSystem {
     } catch (final FileNotFoundException e) {
       throw new JajukException(9, path, e);
     }
-
     try {
       final BufferedReader input = new BufferedReader(fileReader);
       try {
@@ -960,7 +992,6 @@ public final class UtilSystem {
         while ((line = input.readLine()) != null) {
           strColl.append(line);
         }
-
         return strColl;
       } finally {
         // Close the bufferedReader
@@ -975,7 +1006,7 @@ public final class UtilSystem {
    * Open a file from current jar and return a string buffer with the file
    * content.
    * 
-   * @param sURL DOCUMENT_ME
+   * @param sURL 
    * 
    * @return StringBuilder - File content.
    * 
@@ -1005,13 +1036,12 @@ public final class UtilSystem {
       throw new JajukException(9, e);
     }
     return sb;
-
   }
 
   /**
    * Remove an extension from a file name.
    * 
-   * @param sFilename DOCUMENT_ME
+   * @param sFilename 
    * 
    * @return filename without extension
    */
@@ -1105,7 +1135,7 @@ public final class UtilSystem {
    * 
    * Inspired from an aTunes method
    * 
-   * @param directory DOCUMENT_ME
+   * @param directory 
    */
   public static void openInExplorer(File directory) {
     final File directoryToOpen;
@@ -1123,7 +1153,6 @@ public final class UtilSystem {
     } else {
       directoryToOpen = directory;
     }
-
     // Try to open the location using the forced explorer path of provided
     if (StringUtils.isNotBlank(Conf.getString(Const.CONF_EXPLORER_PATH))) {
       new Thread("Explorer Open Thread 1") {
@@ -1202,14 +1231,13 @@ public final class UtilSystem {
     if (cachedUserHomeDir != null) {
       return cachedUserHomeDir;
     }
-
     /**
      * We search first in USERPROFILE env directory before than user.home.
      * 
      * But we give priority to user.home if it already contains a suitable jajuk
      * collection to maintain backward compatibility
      * 
-     * See https://trac.jajuk.info/ticket/1473 and
+     * See #1473 and
      * http://bugs.sun.com/view_bug.do?bug_id=4787931
      **/
     if (StringUtils.isNotBlank(System.getenv("USERPROFILE"))) {
@@ -1234,8 +1262,8 @@ public final class UtilSystem {
       File fileConverter = SessionService.getConfFileByPath(Const.FILE_FILENAME_CONVERTER);
       if (!fileConverter.exists()
       // Test that the converter version has not been updated
-          // IMPORTANT ! Don't forget to update the CONVERTER_FILE_SIZE constant if you change the
-          // script !
+      // IMPORTANT ! Don't forget to update the CONVERTER_FILE_SIZE constant if you change the
+      // script !
           || (fileConverter.exists() && fileConverter.length() != CONVERTER_FILE_SIZE)) {
         FileWriter fw = new FileWriter(fileConverter);
         fw.write("@echo off\n");
@@ -1326,34 +1354,11 @@ public final class UtilSystem {
   /**
    * Are we running in a KDE environment ?
    * 
-   * We check it by using ps command + a grep searching 'kdeinit' process.
+   * We check it by using ps command + a grep searching 'ksmserver' process.
    * 
    * @return whether we are running in a KDE environment
    */
   public static boolean isUnderKDE() {
     return UtilSystem.UNDER_KDE;
   }
-
-  /**
-   * Attempt to acquire a file lock for given file.
-   * 
-   * @param file the file to lock
-   * 
-   * @return a FileLock or null if it can't be acquired
-   */
-  public static FileLock tryLockFile(File file) {
-    FileLock lock = null;
-    try {
-      FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
-      // Get an exclusive lock on the whole file
-      lock = channel.tryLock();
-      if (!lock.isValid()) {
-        throw new IOException("Lock invalid for : " + file.getAbsolutePath());
-      }
-    } catch (Exception e) {
-      Log.warn("Cannot acquire lock for file : " + file.getAbsolutePath());
-    }
-    return lock;
-  }
-
 }
diff --git a/src/main/java/org/jajuk/util/error/CannotRenameException.java b/src/main/java/org/jajuk/util/error/CannotRenameException.java
index 94bd6b6..c6e13af 100644
--- a/src/main/java/org/jajuk/util/error/CannotRenameException.java
+++ b/src/main/java/org/jajuk/util/error/CannotRenameException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,22 +16,21 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class CannotRenameException extends JajukException {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
   /**
    * constructor.
    * 
-   * @param code DOCUMENT_ME
+   * @param code 
    */
   public CannotRenameException(int code) {
     super(code);
@@ -46,5 +45,4 @@ public class CannotRenameException extends JajukException {
   public CannotRenameException(int code, Throwable pCause) {
     super(code, pCause);
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/error/JajukException.java b/src/main/java/org/jajuk/util/error/JajukException.java
index da8342b..7a4d852 100644
--- a/src/main/java/org/jajuk/util/error/JajukException.java
+++ b/src/main/java/org/jajuk/util/error/JajukException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
@@ -26,17 +26,15 @@ import org.jajuk.util.Messages;
  * JajukException.
  */
 public class JajukException extends Exception {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
-
   /** Error code. */
   private final int code;
 
   /**
    * JajukException constructor.
    * 
-   * @param code DOCUMENT_ME
+   * @param code 
    */
   public JajukException(int code) {
     this(code, null, null);
@@ -44,9 +42,9 @@ public class JajukException extends Exception {
 
   /**
    * JajukException constructor.
-   * 
+   *
+   * @param code 
    * @param pCause Original exception of the error.
-   * @param code DOCUMENT_ME
    */
   public JajukException(int code, Throwable pCause) {
     this(code, null, pCause);
@@ -85,5 +83,4 @@ public class JajukException extends Exception {
         + pMessage : Messages.getErrorMessage(code));
     this.code = code;
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/error/JajukRuntimeException.java b/src/main/java/org/jajuk/util/error/JajukRuntimeException.java
index 8b912da..a076a7d 100644
--- a/src/main/java/org/jajuk/util/error/JajukRuntimeException.java
+++ b/src/main/java/org/jajuk/util/error/JajukRuntimeException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
@@ -24,7 +24,6 @@ package org.jajuk.util.error;
  * JajukException runtime exception : to be thown in case of internal bug only.
  */
 public class JajukRuntimeException extends RuntimeException {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -33,38 +32,33 @@ public class JajukRuntimeException extends RuntimeException {
    */
   public JajukRuntimeException() {
     super();
-    // TODO Auto-generated constructor stub
   }
 
   /**
    * The Constructor.
    * 
-   * @param message DOCUMENT_ME
-   * @param cause DOCUMENT_ME
+   * @param message 
+   * @param cause 
    */
   public JajukRuntimeException(String message, Throwable cause) {
     super(message, cause);
-    // TODO Auto-generated constructor stub
   }
 
   /**
    * The Constructor.
    * 
-   * @param message DOCUMENT_ME
+   * @param message 
    */
   public JajukRuntimeException(String message) {
     super(message);
-    // TODO Auto-generated constructor stub
   }
 
   /**
    * The Constructor.
    * 
-   * @param cause DOCUMENT_ME
+   * @param cause 
    */
   public JajukRuntimeException(Throwable cause) {
     super(cause);
-    // TODO Auto-generated constructor stub
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/error/LyricsPersistenceException.java b/src/main/java/org/jajuk/util/error/LyricsPersistenceException.java
index 4371e3d..518b02c 100644
--- a/src/main/java/org/jajuk/util/error/LyricsPersistenceException.java
+++ b/src/main/java/org/jajuk/util/error/LyricsPersistenceException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
@@ -24,17 +24,15 @@ package org.jajuk.util.error;
  * Error in lyrics persistence.
  */
 public class LyricsPersistenceException extends Exception {
-
   /** Default serial UID. */
   private static final long serialVersionUID = 1L;
 
   /**
    * The Constructor.
    * 
-   * @param pMessage DOCUMENT_ME
+   * @param pMessage 
    */
   public LyricsPersistenceException(String pMessage) {
     super(pMessage);
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/error/NoneAccessibleFileException.java b/src/main/java/org/jajuk/util/error/NoneAccessibleFileException.java
index 67bc5bf..c2f66e1 100644
--- a/src/main/java/org/jajuk/util/error/NoneAccessibleFileException.java
+++ b/src/main/java/org/jajuk/util/error/NoneAccessibleFileException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,15 +16,14 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class NoneAccessibleFileException extends JajukException {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
@@ -46,5 +45,4 @@ public class NoneAccessibleFileException extends JajukException {
   public NoneAccessibleFileException(int code, Throwable pCause) {
     super(code, pCause);
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/error/TimeOutException.java b/src/main/java/org/jajuk/util/error/TimeOutException.java
index 1e83cd1..d655152 100644
--- a/src/main/java/org/jajuk/util/error/TimeOutException.java
+++ b/src/main/java/org/jajuk/util/error/TimeOutException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,22 +16,21 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TimeOutException extends JajukException {
-
   /** Generated serialVersionUID. */
   private static final long serialVersionUID = 1L;
 
   /**
    * Instantiates a new time out exception.
    * 
-   * @param code DOCUMENT_ME
+   * @param code 
    */
   public TimeOutException(int code) {
     super(code);
@@ -46,5 +45,4 @@ public class TimeOutException extends JajukException {
   public TimeOutException(int code, Throwable pCause) {
     super(code, pCause);
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/AnyFileFilter.java b/src/main/java/org/jajuk/util/filters/AnyFileFilter.java
index b1e61ed..293b559 100644
--- a/src/main/java/org/jajuk/util/filters/AnyFileFilter.java
+++ b/src/main/java/org/jajuk/util/filters/AnyFileFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -31,7 +31,6 @@ import org.jajuk.util.JajukFileFilter;
  * </p>.
  */
 public final class AnyFileFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static AnyFileFilter self = new AnyFileFilter();
 
diff --git a/src/main/java/org/jajuk/util/filters/AudioFilter.java b/src/main/java/org/jajuk/util/filters/AudioFilter.java
index 11c11c2..121791f 100644
--- a/src/main/java/org/jajuk/util/filters/AudioFilter.java
+++ b/src/main/java/org/jajuk/util/filters/AudioFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -32,7 +32,6 @@ import org.jajuk.util.UtilSystem;
  * Audio filter.
  */
 public final class AudioFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static AudioFilter self = new AudioFilter();
 
@@ -49,7 +48,6 @@ public final class AudioFilter extends JajukFileFilter {
    * Singleton constructor (protected for testing purposes).
    */
   private AudioFilter() {
-
   }
 
   /*
@@ -68,10 +66,8 @@ public final class AudioFilter extends JajukFileFilter {
         return false;
       }
     }
-
     final TypeManager mgr = TypeManager.getInstance();
     final String extension = UtilSystem.getExtension(f);
-
     // check extension is known
     if (TypeManager.getInstance().isExtensionSupported(extension)) {
       // check it is an audio file
@@ -88,7 +84,6 @@ public final class AudioFilter extends JajukFileFilter {
   @Override
   public String getDescription() {
     final StringBuilder s = new StringBuilder();
-
     for (final Type type : TypeManager.getInstance().getAllMusicTypes()) {
       s.append(type.getExtension());
       s.append(',');
diff --git a/src/main/java/org/jajuk/util/filters/DirectoryFilter.java b/src/main/java/org/jajuk/util/filters/DirectoryFilter.java
index 200c8e2..5a8ac35 100644
--- a/src/main/java/org/jajuk/util/filters/DirectoryFilter.java
+++ b/src/main/java/org/jajuk/util/filters/DirectoryFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -32,7 +32,6 @@ import org.jajuk.util.Messages;
  * </p>.
  */
 public final class DirectoryFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static DirectoryFilter self = new DirectoryFilter();
 
@@ -70,5 +69,4 @@ public final class DirectoryFilter extends JajukFileFilter {
   public String getDescription() {
     return Messages.getString("Item_Directory");
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/GIFFilter.java b/src/main/java/org/jajuk/util/filters/GIFFilter.java
index 244d919..f5ffd0d 100644
--- a/src/main/java/org/jajuk/util/filters/GIFFilter.java
+++ b/src/main/java/org/jajuk/util/filters/GIFFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * Gif filter.
  */
 public class GIFFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static GIFFilter self = new GIFFilter();
 
diff --git a/src/main/java/org/jajuk/util/filters/HTMLFilter.java b/src/main/java/org/jajuk/util/filters/HTMLFilter.java
index 5ac90fe..4901de2 100644
--- a/src/main/java/org/jajuk/util/filters/HTMLFilter.java
+++ b/src/main/java/org/jajuk/util/filters/HTMLFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * HTMLfilter.
  */
 public class HTMLFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static HTMLFilter self = new HTMLFilter();
 
@@ -45,5 +44,4 @@ public class HTMLFilter extends JajukFileFilter {
   private HTMLFilter() {
     super(new String[] { "html" });
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/ImageFilter.java b/src/main/java/org/jajuk/util/filters/ImageFilter.java
index fe1f5fe..21b3064 100644
--- a/src/main/java/org/jajuk/util/filters/ImageFilter.java
+++ b/src/main/java/org/jajuk/util/filters/ImageFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * Image filter.
  */
 public final class ImageFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static ImageFilter self = new ImageFilter();
 
diff --git a/src/main/java/org/jajuk/util/filters/JPGFilter.java b/src/main/java/org/jajuk/util/filters/JPGFilter.java
index 4401615..8cf3848 100644
--- a/src/main/java/org/jajuk/util/filters/JPGFilter.java
+++ b/src/main/java/org/jajuk/util/filters/JPGFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * jpg filter.
  */
 public class JPGFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static JPGFilter self = new JPGFilter();
 
@@ -45,5 +44,4 @@ public class JPGFilter extends JajukFileFilter {
   protected JPGFilter() {
     super(new String[] { "jpeg", "jpg" });
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/JajukPredicates.java b/src/main/java/org/jajuk/util/filters/JajukPredicates.java
index 8a25abd..e98348b 100644
--- a/src/main/java/org/jajuk/util/filters/JajukPredicates.java
+++ b/src/main/java/org/jajuk/util/filters/JajukPredicates.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,9 +16,8 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-
 package org.jajuk.util.filters;
 
 import java.util.Date;
@@ -38,29 +37,16 @@ import org.jajuk.util.Const;
  * </p>.
  */
 public class JajukPredicates {
-
   /**
-   * Age-filtering predicate Applied on tracks only.
+   * Age-filtering predicate
    */
   public static class AgePredicate implements Predicate {
-
-    /** DOCUMENT_ME. */
     private int iAge = 0;
 
-    /**
-     * Instantiates a new age predicate.
-     * 
-     * @param iAge DOCUMENT_ME
-     */
     public AgePredicate(int iAge) {
       this.iAge = iAge;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       if (!(o instanceof Track)) {
@@ -74,137 +60,87 @@ public class JajukPredicates {
       }
       return false;
     }
-
   }
 
   /**
    * Ready (mounted) filtering predicate Applied on files only.
    */
   public static class ReadyFilePredicate implements Predicate {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       return ((File) o).isReady();
     }
-
   }
 
   /**
    * Banned filtering predicate Applied against tracks only.
    */
   public static class BannedTrackPredicate implements Predicate {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       Track track = (Track) o;
       return !(track.getBooleanValue(Const.XML_TRACK_BANNED));
     }
-
   }
 
   /**
    * Banned filtering predicate Applied against files only.
    */
   public static class BannedFilePredicate implements Predicate {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       Track track = ((File) o).getTrack();
       return !(track.getBooleanValue(Const.XML_TRACK_BANNED));
     }
-
   }
 
   /**
    * Any file available predicate, applies against tracks only.
    */
   public static class AnyFileReady implements Predicate {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       Track track = ((File) o).getTrack();
       return track.getBestFile(true) != null;
     }
-
   }
 
   /**
    * Playlist predicate, filter playlists located on unmounted devices.
    */
   public static class ReadyPlaylistPredicate implements Predicate {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       return ((Playlist) o).isReady();
     }
-
   }
 
   /**
    * Ambience predicate on files, filter by provided ambience.
    */
   public static class AmbiencePredicate implements Predicate {
-
-    /** DOCUMENT_ME. */
     private final Ambience ambience;
 
     /**
      * Instantiates a new ambience predicate.
      * 
-     * @param ambience DOCUMENT_ME
+     * @param ambience 
      */
     public AmbiencePredicate(Ambience ambience) {
       this.ambience = ambience;
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       File tested = (File) o;
       return ambience.getGenres().contains(tested.getTrack().getGenre());
     }
-
   }
 
   /**
    * Not Video predicate on tracks, filter video files.
    */
   public static class NotVideoPredicate implements Predicate {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.commons.collections.Predicate#evaluate(java.lang.Object)
-     */
     @Override
     public boolean evaluate(Object o) {
       Track tested = (Track) o;
@@ -212,7 +148,5 @@ public class JajukPredicates {
       File fileTested = files.get(0);
       return !fileTested.getType().isVideo();
     }
-
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/JarFilter.java b/src/main/java/org/jajuk/util/filters/JarFilter.java
index 4dadd06..832779b 100644
--- a/src/main/java/org/jajuk/util/filters/JarFilter.java
+++ b/src/main/java/org/jajuk/util/filters/JarFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * Jar filter.
  */
 public class JarFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static JarFilter self = new JarFilter();
 
@@ -45,5 +44,4 @@ public class JarFilter extends JajukFileFilter {
   protected JarFilter() {
     super(new String[] { "jar" });
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/KnownTypeFilter.java b/src/main/java/org/jajuk/util/filters/KnownTypeFilter.java
index e7d4162..0dca46a 100644
--- a/src/main/java/org/jajuk/util/filters/KnownTypeFilter.java
+++ b/src/main/java/org/jajuk/util/filters/KnownTypeFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -31,22 +31,12 @@ import org.jajuk.util.UtilSystem;
  * Known type filter.
  */
 public final class KnownTypeFilter extends JajukFileFilter {
-
-  /** Self instance. */
   private static KnownTypeFilter self = new KnownTypeFilter();
 
-  /**
-   * Gets the instance.
-   * 
-   * @return singleton
-   */
   public static KnownTypeFilter getInstance() {
     return KnownTypeFilter.self;
   }
 
-  /**
-   * Singleton constructor (protected for testing purposes).
-   */
   private KnownTypeFilter() {
     super(Type.getExtensionsFromTypes(TypeManager.getInstance().getTypes()));
   }
@@ -58,12 +48,9 @@ public final class KnownTypeFilter extends JajukFileFilter {
    */
   @Override
   public boolean accept(final File f) {
-    // Force directories acceptation if user wants to navigate into
-    // directories
     if (f.isDirectory()) {
       return bShowDirectories;
     }
     return TypeManager.getInstance().isExtensionSupported(UtilSystem.getExtension(f));
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/NotAudioFilter.java b/src/main/java/org/jajuk/util/filters/NotAudioFilter.java
index baca34f..291e93a 100644
--- a/src/main/java/org/jajuk/util/filters/NotAudioFilter.java
+++ b/src/main/java/org/jajuk/util/filters/NotAudioFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -31,7 +31,6 @@ import org.jajuk.util.UtilSystem;
  * Not Audio file filter (must be a file).
  */
 public final class NotAudioFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static NotAudioFilter self = new NotAudioFilter();
 
diff --git a/src/main/java/org/jajuk/util/filters/PNGFilter.java b/src/main/java/org/jajuk/util/filters/PNGFilter.java
index 2f736f9..f187a6d 100644
--- a/src/main/java/org/jajuk/util/filters/PNGFilter.java
+++ b/src/main/java/org/jajuk/util/filters/PNGFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * Png filter.
  */
 public class PNGFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static PNGFilter self = new PNGFilter();
 
@@ -45,5 +44,4 @@ public class PNGFilter extends JajukFileFilter {
   protected PNGFilter() {
     super(new String[] { "png" });
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/PlaylistFilter.java b/src/main/java/org/jajuk/util/filters/PlaylistFilter.java
index eebdd63..2122bac 100644
--- a/src/main/java/org/jajuk/util/filters/PlaylistFilter.java
+++ b/src/main/java/org/jajuk/util/filters/PlaylistFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -32,7 +32,6 @@ import org.jajuk.util.UtilSystem;
  * Playlist filter.
  */
 public final class PlaylistFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static PlaylistFilter self = new PlaylistFilter();
 
@@ -65,7 +64,6 @@ public final class PlaylistFilter extends JajukFileFilter {
     } else {
       final String extension = UtilSystem.getExtension(f);
       final TypeManager mgr = TypeManager.getInstance();
-
       // check extension is known
       if (mgr.isExtensionSupported(extension)) {
         // check it is a playlist
diff --git a/src/main/java/org/jajuk/util/filters/ReportFilter.java b/src/main/java/org/jajuk/util/filters/ReportFilter.java
index e6c873c..625d22f 100644
--- a/src/main/java/org/jajuk/util/filters/ReportFilter.java
+++ b/src/main/java/org/jajuk/util/filters/ReportFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * Report filter (.html or XML file)
  */
 public class ReportFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static ReportFilter self = new ReportFilter();
 
@@ -45,5 +44,4 @@ public class ReportFilter extends JajukFileFilter {
   protected ReportFilter() {
     super(new String[] { "html", "xml" });
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/XMLFilter.java b/src/main/java/org/jajuk/util/filters/XMLFilter.java
index 8f446fb..fc0c3d7 100644
--- a/src/main/java/org/jajuk/util/filters/XMLFilter.java
+++ b/src/main/java/org/jajuk/util/filters/XMLFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -26,7 +26,6 @@ import org.jajuk.util.JajukFileFilter;
  * XMLfilter.
  */
 public class XMLFilter extends JajukFileFilter {
-
   /** Self instance. */
   private static XMLFilter self = new XMLFilter();
 
@@ -45,5 +44,4 @@ public class XMLFilter extends JajukFileFilter {
   protected XMLFilter() {
     super(new String[] { "xml" });
   }
-
 }
diff --git a/src/main/java/org/jajuk/util/filters/package.html b/src/main/java/org/jajuk/util/filters/package.html
index a2d66cd..925e1a3 100644
--- a/src/main/java/org/jajuk/util/filters/package.html
+++ b/src/main/java/org/jajuk/util/filters/package.html
@@ -2,6 +2,6 @@
 <html>
 <head></head>
 <body>
-  DOCUMENT_ME
+  
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/org/jajuk/util/log/Log.java b/src/main/java/org/jajuk/util/log/Log.java
index 57eee36..f8662d4 100644
--- a/src/main/java/org/jajuk/util/log/Log.java
+++ b/src/main/java/org/jajuk/util/log/Log.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.log;
 
@@ -37,39 +37,30 @@ import org.jajuk.util.error.JajukException;
  * Singleton.
  */
 public final class Log {
-
-  /** The Constant FONT_END.  DOCUMENT_ME */
+  /** The Constant FONT_END.   */
   private static final String FONT_END = "</font>";
-
-  /** The Constant LOGGER_APACHE_HTTPCLIENT.  DOCUMENT_ME */
+  /** The Constant LOGGER_APACHE_HTTPCLIENT.   */
   private static final String LOGGER_APACHE_HTTPCLIENT = "org.apache.commons.httpclient";
-
   // verbosity consts
-  /** The Constant FATAL.  DOCUMENT_ME */
+  /** The Constant FATAL.   */
   public static final int FATAL = 0;
-
-  /** The Constant ERROR.  DOCUMENT_ME */
+  /** The Constant ERROR.   */
   public static final int ERROR = 1;
-
-  /** The Constant WARNING.  DOCUMENT_ME */
+  /** The Constant WARNING.   */
   public static final int WARNING = 2;
-
-  /** The Constant INFO.  DOCUMENT_ME */
+  /** The Constant INFO.   */
   public static final int INFO = 3;
-
-  /** The Constant DEBUG.  DOCUMENT_ME */
+  /** The Constant DEBUG.   */
   public static final int DEBUG = 4;
-
   /** Verbosity level of the logger( between 1 and 5 ) <p> Default used at statup is INFO. */
   private static int verbosity = INFO;
-
   /** Jajuk logger. */
   private static Logger logger;
-
-  /** Debug traces spool. */
-  private static List<String> alSpool;
-
-  /** The Constant FULL_QUALIFIED_CLASS_NAME.  DOCUMENT_ME */
+  /** Anonymized Debug traces spool. */
+  private static List<String> spoolAnonymized;
+  /** Clear Debug traces spool. */
+  private static List<String> spoolClear;
+  /** The Constant FULL_QUALIFIED_CLASS_NAME.   */
   private static final String FULL_QUALIFIED_CLASS_NAME = Log.class.getName();
 
   /**
@@ -82,11 +73,11 @@ public final class Log {
           .getAbsolutePath());
       DOMConfigurator.configure(Const.FILE_LOG4J_CONF);
     } catch (Exception e) {
-      Log.stack(e);
+      e.printStackTrace();
     }
-
     logger = Logger.getLogger(Log.class.getName());
-    alSpool = new ArrayList<String>(Const.FEEDBACK_LINES);
+    spoolAnonymized = new ArrayList<String>(Const.FEEDBACK_LINES);
+    spoolClear = new ArrayList<String>(Const.FEEDBACK_LINES);
     // message for logging system start
     Log.info("******************JAJUK******************");
     Log.info("Version: " + Const.JAJUK_VERSION);
@@ -95,7 +86,7 @@ public final class Log {
   /**
    * Log a debug-level message.
    * 
-   * @param s DOCUMENT_ME
+   * @param s 
    */
   public static synchronized void debug(String s) {
     // Just display the message if Log is not yet enabled
@@ -109,9 +100,9 @@ public final class Log {
 
   /**
    * Debug.
-   * DOCUMENT_ME
    * 
-   * @param t DOCUMENT_ME
+   * 
+   * @param t 
    */
   public static void debug(Throwable t) {
     debug("", t);
@@ -119,10 +110,10 @@ public final class Log {
 
   /**
    * Debug.
-   * DOCUMENT_ME
    * 
-   * @param sInfosup DOCUMENT_ME
-   * @param t DOCUMENT_ME
+   * 
+   * @param sInfosup 
+   * @param t 
    */
   public static synchronized void debug(String sInfosup, Throwable t) {
     // Just make a print stake trace if Log is not yet enabled (example:
@@ -148,7 +139,7 @@ public final class Log {
   /**
    * Log a info-level message.
    * 
-   * @param s DOCUMENT_ME
+   * @param s 
    */
   public static synchronized void info(String s) {
     // Just display the message if Log is not yet enabled
@@ -163,7 +154,7 @@ public final class Log {
   /**
    * Log a warning-level message.
    * 
-   * @param s DOCUMENT_ME
+   * @param s 
    */
   public static synchronized void warn(String s) {
     // Just display the message if Log is not yet enabled
@@ -178,8 +169,8 @@ public final class Log {
   /**
    * Log a warning-level message with info sup.
    * 
-   * @param s DOCUMENT_ME
-   * @param sInfoSup DOCUMENT_ME
+   * @param s 
+   * @param sInfoSup 
    */
   public static synchronized void warn(String s, String sInfoSup) {
     String sOut = s + ": " + sInfoSup;
@@ -282,18 +273,14 @@ public final class Log {
       return;
     }
     spool(t);
-    if (t.getCause() != null) {
-      logger.log(FULL_QUALIFIED_CLASS_NAME, Level.ERROR, t.getMessage() + " / " + t.getCause(), t);
-    } else {
-      logger.log(FULL_QUALIFIED_CLASS_NAME, Level.ERROR, t.getMessage(), t);
-    }
+    logger.log(FULL_QUALIFIED_CLASS_NAME, Level.ERROR, t.getMessage() + " / " + t.getCause(), t);
   }
 
   /**
    * Log an error-level message.
    *
-   * @param code DOCUMENT_ME
-   * @param t DOCUMENT_ME
+   * @param code 
+   * @param t 
    */
   public static void error(int code, Throwable t) {
     error(code, null, t);
@@ -302,8 +289,8 @@ public final class Log {
   /**
    * Log an error-level message.
    * 
-   * @param sInfosup DOCUMENT_ME
-   * @param je DOCUMENT_ME
+   * @param sInfosup 
+   * @param je 
    */
   public static void error(String sInfosup, JajukException je) {
     error(je.getCode(), sInfosup, je);
@@ -312,7 +299,7 @@ public final class Log {
   /**
    * Log an error-level message.
    * 
-   * @param je DOCUMENT_ME
+   * @param je 
    */
   public static void error(JajukException je) {
     error(je.getCode(), null, je);
@@ -321,7 +308,7 @@ public final class Log {
   /**
    * Log a fatal error message.
    * 
-   * @param s DOCUMENT_ME
+   * @param s 
    */
   public static synchronized void fatal(String s) {
     // Just make a print stake trace if Log is not yet enabled (example:
@@ -346,7 +333,7 @@ public final class Log {
   /**
    * Sets the verbosity.
    * 
-   * @param newVerbosity DOCUMENT_ME
+   * @param newVerbosity 
    */
   public static void setVerbosity(int newVerbosity) {
     verbosity = newVerbosity;
@@ -382,7 +369,7 @@ public final class Log {
   /**
    * Convenient method to display stacks properly.
    * 
-   * @param e DOCUMENT_ME
+   * @param e 
    */
   public static void stack(Throwable e) {
     e.printStackTrace();
@@ -403,38 +390,53 @@ public final class Log {
   /**
    * Add this message in the memory spool.
    * 
-   * @param sMessage DOCUMENT_ME
+   * @param message 
    */
-  private synchronized static void spool(String sMessage) {
-    // we maz have to make some room
-    if (alSpool.size() >= Const.FEEDBACK_LINES) {
-      alSpool.remove(0);
+  private synchronized static void spool(String message) {
+    spoolWithAnonymization(message);
+    spoolInClear(message);
+  }
+
+  private static void spoolWithAnonymization(String message) {
+    if (spoolAnonymized.size() >= Const.FEEDBACK_LINES) {
+      spoolAnonymized.remove(0);
+    }
+    String anonymizedMessage = anonymize(message);
+    spoolAnonymized.add(anonymizedMessage);
+  }
+
+  private static void spoolInClear(String message) {
+    if (spoolClear.size() >= Const.FEEDBACK_LINES) {
+      spoolClear.remove(0);
     }
+    spoolClear.add(message);
+  }
 
+  /**
+   * Anonymize a string by replacing strings between braces by stars
+   * @param sMessage the string to anonymise
+   * @return anonymized string
+   */
+  private static String anonymize(String sMessage) {
     // anonymize standard labels (with {{xxx}})
     String sAnonymizedMessage = sMessage.replaceAll("\\{\\{.*\\}\\}", "***");
-
     // additionally anonymize Basic Player logs
     int pos = sAnonymizedMessage.indexOf("Player state changed: OPENING");
     if (pos != -1) {
       // cut away trailing stuff which is personal data
       sAnonymizedMessage = sAnonymizedMessage.substring(0, pos + 40);
     }
-    alSpool.add(sAnonymizedMessage);
+    return sAnonymizedMessage;
   }
 
   /**
    * Spool an exception with stack traces.
    * 
-   * @param e DOCUMENT_ME
+   * @param e 
    */
   private static void spool(Throwable e) {
-    if (e.getCause() != null) {
-      spool("<font color='red'>" + "[ERROR] " + e.getClass() + " / {{" + e.getMessage() + "}} / "
-          + e.getCause());
-    } else {
-      spool("<font color='red'>" + "[ERROR] " + e.getClass() + " / {{" + e.getMessage() + "}}");
-    }
+    spool("<font color='red'>" + "[ERROR] " + e.getClass() + " / {{" + e.getMessage() + "}} / "
+        + e.getCause());
     StackTraceElement[] ste = e.getStackTrace();
     for (StackTraceElement element : ste) {
       spool(element.toString());
@@ -448,8 +450,11 @@ public final class Log {
    * @return Spool traces
    */
   @SuppressWarnings("unchecked")
-  public static List<String> getSpool() {
-    return (List<String>) ((ArrayList<String>) alSpool).clone();
+  public static List<String> getSpool(boolean anonymized) {
+    if (anonymized) {
+      return (List<String>) ((ArrayList<String>) spoolAnonymized).clone();
+    } else {
+      return (List<String>) ((ArrayList<String>) spoolClear).clone();
+    }
   }
-
 }
diff --git a/src/main/java/org/qdwizard/ActionsPanel.java b/src/main/java/org/qdwizard/ActionsPanel.java
deleted file mode 100644
index 3db734f..0000000
--- a/src/main/java/org/qdwizard/ActionsPanel.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.qdwizard;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.GridLayout;
-import java.awt.RenderingHints;
-import java.awt.event.ActionListener;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.SwingConstants;
-
-/**
- * Action panel
- * <p>
- * contains a problem area where problems are displayed and a buttons area
- * (Previous, Next, Finish, Cancel).
- * 
- * @author Bertrand Florat
- * @created 1 may 2006
- */
-class ActionsPanel extends JPanel {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
-  /** Problem text area. */
-  JLabel jlProblem;
-
-  /** DOCUMENT_ME. */
-  JButton jbPrevious;
-
-  /** DOCUMENT_ME. */
-  JButton jbNext;
-
-  /** DOCUMENT_ME. */
-  JButton jbFinish;
-
-  /** DOCUMENT_ME. */
-  JButton jbCancel;
-
-  /** DOCUMENT_ME. */
-  private Color backgroundColor;
-
-  /** DOCUMENT_ME. */
-  private Color backgroundColorProblem;
-
-  /** Associated action listener. */
-  ActionListener al;
-
-  /**
-   * The Constructor.
-   * 
-   * @param al associated action listener
-   */
-  public ActionsPanel(ActionListener al) {
-    backgroundColor = Color.WHITE;
-    backgroundColorProblem = Color.WHITE;
-
-    // Problem panel
-    jlProblem = new JLabel();
-    jlProblem.setForeground(Color.RED);
-    jlProblem.setFont(new Font("Dialog", Font.BOLD, 12)); //$NON-NLS-1$
-    jlProblem.setHorizontalAlignment(SwingConstants.CENTER);
-
-    // Action buttons
-    JPanel jpButtons = new JPanel();
-    jpButtons.setLayout(new BoxLayout(jpButtons, BoxLayout.X_AXIS));
-    Dimension dimButtons = new Dimension(150, 20);
-    jbPrevious = new JButton("< " + Langpack.getMessage("Previous"));
-    jbPrevious.setPreferredSize(dimButtons);
-    jbPrevious.addActionListener(al);
-    jbPrevious.setActionCommand("Prev"); //$NON-NLS-1$
-
-    jbNext = new JButton(Langpack.getMessage("Next") + " >");
-    jbNext.addActionListener(al);
-    jbNext.setActionCommand("Next"); //$NON-NLS-1$
-    jbNext.setPreferredSize(dimButtons);
-
-    jbFinish = new JButton(Langpack.getMessage("Finish"));
-    jbFinish.addActionListener(al);
-    jbFinish.setActionCommand("Finish"); //$NON-NLS-1$
-    jbFinish.setPreferredSize(dimButtons);
-
-    jbCancel = new JButton(Langpack.getMessage("Cancel"));
-    jbCancel.addActionListener(al);
-    jbCancel.setActionCommand("Cancel"); //$NON-NLS-1$
-    jbCancel.setPreferredSize(dimButtons);
-
-    jpButtons.add(Box.createHorizontalStrut(10));
-    jpButtons.add(Box.createHorizontalGlue());
-    jpButtons.add(jbPrevious);
-    jpButtons.add(Box.createHorizontalStrut(5));
-    jpButtons.add(jbNext);
-    jpButtons.add(Box.createHorizontalStrut(10));
-    jpButtons.add(jbFinish);
-    jpButtons.add(Box.createHorizontalStrut(20));
-    jpButtons.add(jbCancel);
-    jpButtons.add(Box.createHorizontalStrut(10));
-    jpButtons.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
-
-    jpButtons.setOpaque(false);
-    jlProblem.setOpaque(false);
-    setOpaque(false);
-
-    // Main panel
-    setLayout(new GridLayout(2, 1));
-    add(jlProblem);
-    add(jpButtons);
-  }
-
-  /**
-   * Set buttons states.
-   *
-   * @param bPrevious DOCUMENT_ME
-   * @param bNext DOCUMENT_ME
-   * @param bFinish DOCUMENT_ME
-   * @param bCancel DOCUMENT_ME
-   */
-  void setState(boolean bPrevious, boolean bNext, boolean bFinish, boolean bCancel) {
-    jbPrevious.setEnabled(bPrevious);
-    jbFinish.setEnabled(bFinish);
-    jbNext.setEnabled(bNext);
-    jbCancel.setEnabled(bCancel);
-  }
-
-  /**
-   * Sets the problem.
-   * 
-   * @param problem the new problem
-   */
-  void setProblem(String problem) {
-    String sProblem = problem;
-    jlProblem.setText(sProblem);
-  }
-
-  /**
-   * Set the background color of the ActionPanel.
-   * 
-   * @param color DOCUMENT_ME
-   */
-  public void setBackgroundColor(Color color) {
-    this.backgroundColor = color;
-  }
-
-  /**
-   * Set the background color of the ActionPanel's Problem notification area.
-   * 
-   * @param color DOCUMENT_ME
-   */
-  public void setProblemBackgroundColor(Color color) {
-    this.backgroundColorProblem = color;
-  }
-
-  /**
-   * Set the background color of the ActionPanel's Problem notification area.
-   * 
-   * @param color DOCUMENT_ME
-   */
-  public void setProblemTextColor(Color color) {
-    jlProblem.setForeground(color);
-  }
-
-  /* (non-Javadoc)
-   * @see javax.swing.JComponent#paint(java.awt.Graphics)
-   */
-  @Override
-  public void paint(java.awt.Graphics g) {
-    Graphics2D g2D = (Graphics2D) g;
-    g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-    java.awt.Rectangle rect = getBounds();
-    g2D.setColor(backgroundColor);
-    g2D.fillRect(0, 0, rect.width, rect.height);
-
-    if ((jlProblem != null) && (jlProblem.getText() != null) && jlProblem.getText().length() > 0) {
-      rect = jlProblem.getBounds();
-      g2D.setColor(backgroundColorProblem);
-      g2D.fillRect(rect.x, rect.y, rect.width, rect.height);
-    }
-
-    super.paint(g);
-
-    g2D.setColor(java.awt.Color.LIGHT_GRAY);
-    g2D.drawLine(rect.x, 0, rect.width, 0);
-  }
-}
diff --git a/src/main/java/org/qdwizard/Header.java b/src/main/java/org/qdwizard/Header.java
deleted file mode 100644
index 49a18ac..0000000
--- a/src/main/java/org/qdwizard/Header.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.qdwizard;
-
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.GridLayout;
-import java.awt.Image;
-import java.awt.RenderingHints;
-
-import javax.swing.ImageIcon;
-import javax.swing.JPanel;
-
-/**
- * Screen Header
- * <p>
- * Contains a wizard title, a subtitle used to display the name of the current
- * screen and an optional background image
- * </p>.
- * 
- * @author Bertrand Florat
- * @created 1 may 2006
- */
-class Header extends JPanel {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
-  JPanel jta;
-
-  /** DOCUMENT_ME. */
-  Image backgroundImage;
-
-  /** DOCUMENT_ME. */
-  ImageIcon icon;
-
-  /** DOCUMENT_ME. */
-  String sTitleText;
-
-  /** DOCUMENT_ME. */
-  String sSubtitleText;
-
-  /**
-   * The Constructor.
-   */
-  public Header() {
-    setLayout(new GridLayout());
-    jta = new JPanel();
-    jta.setOpaque(true);
-    jta.setPreferredSize(new Dimension(0, 70));
-    add(jta);
-  }
-
-  /**
-   * Set the header title text.
-   * 
-   * @param sText DOCUMENT_ME
-   */
-  public void setTitleText(String sText) {
-    sTitleText = sText;
-  }
-
-  /**
-   * Set the header subtitle text.
-   * 
-   * @param sText DOCUMENT_ME
-   */
-  public void setSubtitleText(String sText) {
-    sSubtitleText = sText;
-  }
-
-  /**
-   * Set the header Image.
-   * 
-   * @param img DOCUMENT_ME
-   */
-  public void setImage(Image img) {
-    backgroundImage = img;
-  }
-
-  /**
-   * Set the header right-side icon.
-   * 
-   * @param icon DOCUMENT_ME
-   */
-  public void setIcon(ImageIcon icon) {
-    this.icon = icon;
-  }
-
-  /* (non-Javadoc)
-   * @see javax.swing.JComponent#paint(java.awt.Graphics)
-   */
-  @Override
-  public void paint(java.awt.Graphics g) {
-    super.paint(g);
-    Graphics2D g2D = (Graphics2D) g;
-    java.awt.Rectangle rect = getBounds();
-    g2D.setColor(java.awt.Color.WHITE);
-    g2D.fillRect(rect.x, rect.y, rect.width, rect.height);
-
-    if (backgroundImage != null) {
-      g2D.drawImage(backgroundImage, 0, 0, rect.width, rect.height, this);
-    }
-
-    if (icon != null) {
-      int h = icon.getIconHeight();
-      int w = icon.getIconWidth();
-      g2D.drawImage(icon.getImage(), rect.width - w - 10, (rect.height - h) / 2, w, h, this);
-    }
-
-    g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-    g2D.setColor(java.awt.Color.BLACK);
-    g2D.setFont(new Font("Dialog", Font.BOLD, 14));
-    g2D.drawString(sTitleText, 20, 25);
-
-    g2D.setFont(new Font("Dialog", Font.PLAIN, 13));
-    g2D.drawString(sSubtitleText, 20, 50);
-
-    g2D.setColor(java.awt.Color.BLACK);
-    g2D.drawLine(rect.x, rect.height - 1, rect.width, rect.height - 1);
-  }
-}
\ No newline at end of file
diff --git a/src/main/java/org/qdwizard/Langpack.java b/src/main/java/org/qdwizard/Langpack.java
deleted file mode 100644
index 049b96e..0000000
--- a/src/main/java/org/qdwizard/Langpack.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.qdwizard;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * This class includes all langpacks strings. Note that we don't use
- * ResourceBundle here to ease translation tasks (properties doesn't support
- * non-latin1 characters) and because QDwizard comes with very few strings
- */
-public class Langpack {
-
-  /** DOCUMENT_ME. */
-  private static List<String> defaults = Arrays.asList("Finish", "Cancel", "Previous", "Next");
-
-  // Strings content : "Finish", "Cancel", "Previous", "Next"
-  /** DOCUMENT_ME. */
-  static private Map<Locale, List<String>> strings = new HashMap<Locale, List<String>>(4);
-
-  /** static set of strings, can contain non-ISO8859 chars * */
-  static {
-    strings.put(new Locale("ca"), Arrays.asList("Finalitzar", "Cancelar", "Anterior", "Següent"));
-    strings.put(new Locale("cs"), Arrays.asList("Dokončit", "Storno", "Předchozí", "Další"));
-    strings.put(new Locale("de"), Arrays.asList("Fertig", "Abbrechen", "Zurück", "Weiter"));
-    strings.put(new Locale("en"), defaults);
-    strings.put(new Locale("es"), Arrays.asList("Finalizar", "Cancelar", "Anterior", "Siguiente"));
-    strings.put(new Locale("el"), Arrays.asList("Τέλος", "Ακύρωση", "Προηγούμενο", "Επόμενο"));
-    strings.put(new Locale("fr"), Arrays.asList("Terminé", "Annuler", "Précédent", "Suivant"));
-    strings.put(new Locale("gl"), Arrays.asList("Rematar", "Cancelar", "Anterior", "Seguinte"));
-    strings.put(new Locale("nl"), Arrays.asList("Afgerond", "Annuleren", "Vooropgaand",
-        "Aanstaande"));
-    strings.put(new Locale("ru"), Arrays.asList("Готово", "Отмена", "Назад", "Дальше"));
-    strings.put(new Locale("pt"), Arrays.asList("Terminar", "Cancelar", "Anterior", "Seguinte"));
-  }
-
-  /** Used locale for the wizard buttons, use English as a default *. */
-  private static Locale locale = new Locale("en");
-
-  /**
-   * private constructor for utility class with only static methods.
-   */
-  private Langpack() {
-    super();
-  }
-
-  /**
-   * Set the QDwizard locale.
-   * 
-   * @param locale DOCUMENT_ME
-   */
-  public static void setLocale(Locale locale) {
-    Langpack.locale = locale;
-  }
-
-  /**
-   * Return label for given key or null if not matching key is found.
-   * 
-   * @param key the key as a string using the default locale
-   * 
-   * @return label for given key or null if not matching key is found
-   */
-  public static String getMessage(String key) {
-    List<String> labels = strings.get(locale);
-    // If the local is unknown, use default one
-    if (labels == null) {
-      labels = defaults;
-    }
-    int index = defaults.indexOf(key);
-    return labels.get(index);
-  }
-}
diff --git a/src/main/java/org/qdwizard/Screen.java b/src/main/java/org/qdwizard/Screen.java
deleted file mode 100644
index 4fcc2a2..0000000
--- a/src/main/java/org/qdwizard/Screen.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.qdwizard;
-
-import java.util.Map;
-
-import javax.swing.JPanel;
-import javax.swing.SwingUtilities;
-
-/**
- * A wizard screen
- * <ul>
- * <li>For each wizard page, create a public Screen class. You have to
- * implement initUI(), getDescription() and getName() abstract methods.</li>
- * <li>getName() method should return the step name and getDescription() the
- * step description (return null if no description needed).</li>
- * <li>initUI() method contains graphical code for your screen. This method is
- * automatically called from screen constructor so don't call it.</li>
- * </ul>
- * 
- * @author Bertrand Florat
- * @created 1 may 2006
- */
-public abstract class Screen extends JPanel {
-
-  /** Generated serialVersionUID. */
-  private static final long serialVersionUID = 1L;
-
-  /** DOCUMENT_ME. */
-  private final ScreenState state;
-
-  /** DOCUMENT_ME. */
-  public Map<String, Object> data;
-
-  /** DOCUMENT_ME. */
-  private Wizard wizard;
-
-  /**
-   * Construct a screen.
-   */
-  public Screen() {
-    data = Wizard.data;
-    state = new ScreenState(true, true, true, false, null);
-    initUI();
-  }
-
-  /**
-   * Give here the step name.
-   * 
-   * @return screen name
-   */
-  @Override
-  abstract public String getName();
-
-  /**
-   * Screen description (optional).
-   * 
-   * @return screen description
-   */
-  abstract public String getDescription();
-
-  /**
-   * Can finish.
-   * DOCUMENT_ME
-   * 
-   * @return true if...
-   */
-  boolean canFinish() {
-    // Can finish only if none problem
-    return state.getCanFinish() && (state.getProblem() == null);
-  }
-
-  /**
-   * Set whether the finish button should be enabled.
-   * 
-   * @param b DOCUMENT_ME
-   */
-  public void setCanFinish(boolean b) {
-    state.setCanFinish(b);
-    notifyGUI();
-  }
-
-  /**
-   * Can go next.
-   * DOCUMENT_ME
-   * 
-   * @return true if...
-   */
-  boolean canGoNext() {
-    // if screen is last one, cannot go further
-    return state.getCanGoNext() && !state.getCanFinish() && (state.getProblem() == null);
-  }
-
-  /**
-   * Can cancel.
-   * DOCUMENT_ME
-   * 
-   * @return true if...
-   */
-  public boolean canCancel() {
-    return state.getCanCancel();
-  }
-
-  /**
-   * Can go previous.
-   * DOCUMENT_ME
-   * 
-   * @return true if...
-   */
-  boolean canGoPrevious() {
-    return state.getCanGoPrevious();
-  }
-
-  /**
-   * Set whether the next button should be enabled.
-   * 
-   * @param b DOCUMENT_ME
-   */
-  void setCanGoNext(boolean b) {
-    state.setCanGoNext(b);
-    notifyGUI();
-  }
-
-  /**
-   * Set whether the previous button should be enabled.
-   * 
-   * @param b DOCUMENT_ME
-   */
-  void setCanGoPrevious(boolean b) {
-    state.setCanGoPrevious(b);
-    notifyGUI();
-  }
-
-  /**
-   * Set whether the cancel (or System menu close) button should be enabled.
-   * 
-   * @param b DOCUMENT_ME
-   */
-  public void setCanCancel(boolean b) {
-    state.setCanCancel(b);
-    notifyGUI();
-  }
-
-  /**
-   * Set a problem (set to null if problem is fixed).
-   * 
-   * @param sProblem Problem string or null if no more problem
-   */
-  public void setProblem(String sProblem) {
-    state.setProblem(sProblem);
-    notifyGUI();
-  }
-
-  /**
-   * Get current problem.
-   * 
-   * @return the current problem
-   */
-  public String getProblem() {
-    return state.getProblem();
-  }
-
-  /**
-   * UI creation.
-   */
-  abstract public void initUI();
-
-  /**
-   * Called by wizard before the screen is displayed. This happens only in
-   * forward mode, which means onEnter won't be called when you return to a
-   * screen via the previous button.
-   */
-  public void onEnter() {
-    // required by interface, but nothing to do here...
-  }
-
-  /**
-   * Called by wizard before the screen is left. This happens only in forward
-   * mode, which means onLeave won't be called when you leave the screen via the
-   * previous button.
-   * <p>
-   * 
-   * @return return true if the Wizard should display the next screen
-   * return false if the Wizard should stay on the current screen
-   */
-  public boolean onNext() {
-    return true;
-  }
-
-  /**
-   * Called by wizard when the wizard is being canceled. Use this function to
-   * clean up (like stop any threads that this Screen might have created)
-   */
-  public void onCancelled() {
-    // required by interface, but nothing to do here...
-  }
-
-  /**
-   * Called by wizard when the wizard is closing because the Finish button was
-   * pressed. Use this function to clean up (like stop any threads that this
-   * Screen might have created)
-   */
-  public void onFinished() {
-    // required by interface, but nothing to do here...
-  }
-
-  /**
-   * access to wizard instance.
-   * 
-   * @return the wizard
-   */
-  public Wizard getWizard() {
-    return wizard;
-  }
-
-  /**
-   * Sets the wizard.
-   * 
-   * @param wizard the new wizard
-   */
-  protected void setWizard(Wizard wizard) {
-    this.wizard = wizard;
-  }
-
-  /**
-   * Notify gui.
-   * DOCUMENT_ME
-   */
-  private void notifyGUI() {
-    SwingUtilities.invokeLater(new Runnable() {
-
-      @Override
-      public void run() {
-        Screen.this.wizard.updateGUI();
-      }
-
-    });
-  }
-
-}
diff --git a/src/main/java/org/qdwizard/ScreenState.java b/src/main/java/org/qdwizard/ScreenState.java
deleted file mode 100644
index 76b883b..0000000
--- a/src/main/java/org/qdwizard/ScreenState.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.qdwizard;
-
-/**
- * A screen state:
- * <ul>
- * <li>can cancel ?</li>
- * <li>can finish ?</li>
- * <li>can go next ?</li>
- * <li>can go previous ?</li>
- * </ul>.
- */
-public class ScreenState {
-
-  /** DOCUMENT_ME. */
-  private boolean bCanFinish;
-
-  /** Can Go Next. */
-  private boolean bCanGoNext;
-
-  /** Can Go Previous. */
-  private boolean bCanGoPrevious;
-
-  /** Can Cancel. */
-  private boolean bCanCancel;
-
-  /** Problem. */
-  private String sProblem;
-
-  /**
-   * Construct a ScreenState.
-   */
-  public ScreenState() {
-    this(false, false, false, false, null);
-  }
-
-  /**
-   * Construct a ScreenState.
-   * 
-   * @param bCanGoNext next button is enabled
-   * @param bCanGoPrevious previous button is enabled
-   * @param bCanCancel cancel button is enabled
-   * @param bCanFinish cancel button is enabled
-   * @param sProblem problem text
-   */
-  public ScreenState(boolean bCanGoNext, boolean bCanGoPrevious, boolean bCanCancel,
-      boolean bCanFinish, String sProblem) {
-    this.bCanGoNext = bCanGoNext;
-    this.bCanGoPrevious = bCanGoPrevious;
-    this.bCanCancel = bCanCancel;
-    this.bCanFinish = bCanFinish;
-    this.sProblem = sProblem;
-  }
-
-  /**
-   * Gets the can finish.
-   * 
-   * @return Finish button enabled
-   */
-  public boolean getCanFinish() {
-    return bCanFinish;
-  }
-
-  /**
-   * Set whether the finish button should be enabled.
-   * 
-   * @param bCanFinish DOCUMENT_ME
-   */
-  public void setCanFinish(boolean bCanFinish) {
-    this.bCanFinish = bCanFinish;
-  }
-
-  /**
-   * Gets the can go next.
-   * 
-   * @return Next button enabled
-   */
-  public boolean getCanGoNext() {
-    return bCanGoNext;
-  }
-
-  /**
-   * Set whether the next button should be enabled.
-   * 
-   * @param bCanGoNext DOCUMENT_ME
-   */
-  public void setCanGoNext(boolean bCanGoNext) {
-    this.bCanGoNext = bCanGoNext;
-  }
-
-  /**
-   * Gets the can go previous.
-   * 
-   * @return Previous button enabled
-   */
-  public boolean getCanGoPrevious() {
-    return bCanGoPrevious;
-  }
-
-  /**
-   * Set whether the previous button should be enabled.
-   * 
-   * @param bCanGoPrevious DOCUMENT_ME
-   */
-  public void setCanGoPrevious(boolean bCanGoPrevious) {
-    this.bCanGoPrevious = bCanGoPrevious;
-  }
-
-  /**
-   * Gets the can cancel.
-   * 
-   * @return Cancel button enabled
-   */
-  public boolean getCanCancel() {
-    return bCanCancel;
-  }
-
-  /**
-   * Set whether the cancel (or System menu close) button should be enabled.
-   * 
-   * @param bCanCancel DOCUMENT_ME
-   */
-  public void setCanCancel(boolean bCanCancel) {
-    this.bCanCancel = bCanCancel;
-  }
-
-  /**
-   * Gets the problem.
-   * 
-   * @return Problem button enabled
-   */
-  public String getProblem() {
-    return sProblem;
-  }
-
-  /**
-   * Set a problem (set to null if problem is fixed).
-   * 
-   * @param sProblem Problem string or null if no more problem
-   */
-  public void setProblem(String sProblem) {
-    this.sProblem = sProblem;
-    setCanGoNext(sProblem == null);
-  }
-
-}
diff --git a/src/main/java/org/qdwizard/Wizard.java b/src/main/java/org/qdwizard/Wizard.java
deleted file mode 100644
index 39c5b37..0000000
--- a/src/main/java/org/qdwizard/Wizard.java
+++ /dev/null
@@ -1,674 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.qdwizard;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Frame;
-import java.awt.Image;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ComponentEvent;
-import java.awt.event.ComponentListener;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowListener;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.WindowConstants;
-
-import org.jajuk.ui.widgets.JajukJDialog;
-import org.jajuk.util.log.Log;
-
-/**
- * A Wizard dialog displaying one to many screens
- * <ul>
- * <li>Create a class that extends Wizard. You have to implement
- * getPreviousScreen(), getNextScreen() and finish() abstract methods</li>
- * <li> Displaying the wizard:</li>
- * 
- * <pre>
- * MyWizard wizard = new MyWizard(String sName,Class initial,
- * ImageIcon icon,Frame parentWindow,
- * Locale locale,int iHSize,int iVSize);
- * wizard.show();
- * </pre>
- * 
- * <li>finish() method implements actions to be done at the end of the wizard</li>
- * <li>getPreviousScreen() and getNextScreen() have to return previous or next
- * screen class. Example:</li>
- * 
- * <pre>
- * public Class getNextScreen(Class screen) {
- * if (ActionSelectionPanel.class.equals(getCurrentScreen())) {
- * String sAction = (String) data.get(KEY_ACTION);
- * if (ActionSelectionPanel.ACTION_CREATION.equals(sAction)) {
- * return TypeSelectionPanel.class;
- * } else if (ActionSelectionPanel.ACTION_DELETE.equals(sAction)) {
- * return RemovePanel.class;
- * }
- * }
- * }
- * </pre>
- * 
- * </ul>
- * 
- * @author Bertrand Florat
- * @created 1 may 2006
- */
-public abstract class Wizard implements ActionListener, WindowListener {
-
-  /** Wizard name. */
-  private String sName;
-
-  /** Current screen. */
-  private Screen current;
-
-  /** Wizard left side icon. */
-  private ImageIcon icon;
-
-  /** Wizard data. */
-  protected final static Map<String, Object> data = new HashMap<String, Object>(10);
-
-  /** Wizard header. */
-  private Header header;
-
-  /** Wizard action Panel. */
-  private ActionsPanel actions;
-
-  /** Wizard dialog. */
-  private JDialog dialog;
-
-  /** Parent window. */
-  private Frame parentWindow;
-
-  /** Screens instance repository. */
-  private Map<Class<? extends Screen>, Screen> hmClassScreens = new HashMap<Class<? extends Screen>, Screen>(
-      10);
-
-  /** Default Wizard size. */
-  protected static final int DEFAULT_H_SIZE = 700;
-
-  /** The Constant DEFAULT_V_SIZE.  DOCUMENT_ME */
-  protected static final int DEFAULT_V_SIZE = 500;
-
-  /** The Constant DEFAULT_H_LAYOUT_PADDING.  DOCUMENT_ME */
-  protected static final int DEFAULT_H_LAYOUT_PADDING = 5;
-
-  /** The Constant DEFAULT_V_LAYOUT_PADDING.  DOCUMENT_ME */
-  protected static final int DEFAULT_V_LAYOUT_PADDING = 5;
-
-  /** Was the Wizard Canceled?. */
-  private boolean bCancelled;
-
-  /** Layout Padding. */
-  private int layoutHPadding = DEFAULT_H_LAYOUT_PADDING;
-
-  /** DOCUMENT_ME. */
-  private int layoutVPadding = DEFAULT_V_LAYOUT_PADDING;
-
-  /**
-   * Wizard constructor.
-   * 
-   * @param sName Wizard name displayed in dialog title
-   * @param initial Initial screen class
-   * @param icon Wizard icon (null if no icon)
-   * @param backgroundImage background image
-   * @param parentWindow wizard parent window
-   * @param locale Wizard locale
-   * @param iHSize Horizontal size
-   * @param iVSize Vertical size
-   * @param iLayoutHPadding Horizontal layout padding
-   * @param iLayoutVPadding Vertical layout padding
-   */
-  @SuppressWarnings("unchecked")
-  public Wizard(String sName, Class initial, ImageIcon icon, Image backgroundImage,
-      Frame parentWindow, Locale locale, int iHSize, int iVSize, int iLayoutHPadding,
-      int iLayoutVPadding) {
-    bCancelled = false;
-    this.sName = sName;
-    this.parentWindow = parentWindow;
-    if (locale != null) {
-      Langpack.setLocale(locale);
-    } else {
-      Langpack.setLocale(Locale.getDefault());
-    }
-    this.icon = icon;
-    this.layoutHPadding = iLayoutHPadding;
-    this.layoutVPadding = iLayoutVPadding;
-    createUI();
-    header.setImage(backgroundImage);
-    setScreen(initial);
-    current.onEnter();
-    dialog.setSize(iHSize, iVSize);
-  }
-
-  /**
-   * Wizard constructor.
-   * 
-   * @param sName Wizard name displayed in dialog title
-   * @param initial Initial screen class
-   * @param icon Wizard icon (null if no icon)
-   * @param parentWindow wizard parent window
-   * @param locale Wizard locale
-   * @param iHSize Horizontal size
-   * @param iVSize Vertical size
-   */
-  @SuppressWarnings("unchecked")
-  public Wizard(String sName, Class initial, ImageIcon icon, Frame parentWindow, Locale locale,
-      int iHSize, int iVSize) {
-    bCancelled = false;
-    this.sName = sName;
-    this.parentWindow = parentWindow;
-    if (locale != null) {
-      Langpack.setLocale(locale);
-    } else {
-      Langpack.setLocale(Locale.getDefault());
-    }
-    this.icon = icon;
-    createUI();
-    setScreen(initial);
-    current.onEnter();
-    dialog.setSize(iHSize, iVSize);
-  }
-
-  /**
-   * Wizard constructor.
-   * 
-   * @param sName Wizard name displayed in dialog title
-   * @param initial Initial screen class
-   * @param icon Wizard icon (null if no icon)
-   * @param backgroundImage Wizard header background (null if no image)
-   * @param parentWindow wizard parent window
-   * @param locale Wizard locale
-   */
-  public Wizard(String sName, Class<? extends Screen> initial, ImageIcon icon,
-      Image backgroundImage, Frame parentWindow, Locale locale) {
-    this(sName, initial, icon, backgroundImage, parentWindow, locale, DEFAULT_H_SIZE,
-        DEFAULT_V_SIZE, DEFAULT_H_LAYOUT_PADDING, DEFAULT_V_LAYOUT_PADDING);
-  }
-
-  /**
-   * Wizard constructor.
-   * 
-   * @param sName Wizard name displayed in dialog title
-   * @param initial Initial screen class
-   * @param icon Wizard icon (null if no icon)
-   * @param parentWindow wizard parent window
-   * @param locale Wizard locale
-   */
-  public Wizard(String sName, Class<? extends Screen> initial, ImageIcon icon, Frame parentWindow,
-      Locale locale) {
-    this(sName, initial, icon, null, parentWindow, locale, DEFAULT_H_SIZE, DEFAULT_V_SIZE,
-        DEFAULT_H_LAYOUT_PADDING, DEFAULT_V_LAYOUT_PADDING);
-  }
-
-  /**
-   * Wizard constructor (uses default locale).
-   * 
-   * @param sName Wizard name displayed in dialog title
-   * @param initial Initial screen class
-   * @param icon Wizard icon (null if no icon)
-   * @param backgroundImage Wizard header background (null if no image)
-   * @param parentWindow wizard parent window
-   */
-  public Wizard(String sName, Class<? extends Screen> initial, ImageIcon icon,
-      Image backgroundImage, Frame parentWindow) {
-    this(sName, initial, icon, backgroundImage, parentWindow, Locale.getDefault());
-  }
-
-  /**
-   * Wizard constructor (uses default locale).
-   * 
-   * @param sName Wizard name displayed in dialog title
-   * @param initial Initial screen class
-   * @param icon Wizard icon (null if no icon)
-   * @param parentWindow wizard parent window
-   */
-  public Wizard(String sName, Class<? extends Screen> initial, ImageIcon icon, Frame parentWindow) {
-    this(sName, initial, icon, null, parentWindow, Locale.getDefault());
-  }
-
-  /**
-   * Show.
-   * DOCUMENT_ME
-   */
-  public void show() {
-    dialog.setVisible(true);
-  }
-
-  /**
-   * access to the JDialog of the wizard, in case we need it (for instance to
-   * set a glass pane when waiting).
-   * 
-   * @return the wizard dialog
-   */
-  public JDialog getDialog() {
-    return dialog;
-  }
-
-  /**
-   * UI manager.
-   */
-  private void createUI() {
-    dialog = new JajukJDialog(parentWindow, true);// modal
-    // Set default size
-    dialog.setSize(DEFAULT_H_SIZE, DEFAULT_V_SIZE);
-    dialog.setTitle(sName);
-    header = new Header();
-    actions = new ActionsPanel(this);
-    dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
-    dialog.addWindowListener(this);
-    display();
-    dialog.setLocationRelativeTo(parentWindow);
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
-   */
-  @Override
-  public void actionPerformed(ActionEvent ae) {
-    dialog.setCursor(new Cursor(Cursor.WAIT_CURSOR));
-    try {
-      // Previous required. Note that the previous button is enabled only
-      // if the user can go previous
-      if (ae.getActionCommand().equals("Prev")) { //$NON-NLS-1$
-        setScreen(getPreviousScreen(current.getClass()));
-      } else if (ae.getActionCommand().equals("Next")) { //$NON-NLS-1$
-        current.onNext();
-        setScreen(getNextScreen(current.getClass()));
-        current.onEnter();
-      } else if (ae.getActionCommand().equals("Cancel")) { //$NON-NLS-1$
-        current.onCancelled();
-        data.clear();
-        bCancelled = true;
-        onCancel();
-        dialog.dispose();
-      } else if (ae.getActionCommand().equals("Finish")) { //$NON-NLS-1$
-        current.onFinished();
-        finish();
-        dialog.dispose();
-      }
-    } finally {
-      dialog.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
-    }
-  }
-
-  /**
-   * Set the screen to display a a class.
-   * 
-   * @param screenClass DOCUMENT_ME
-   */
-  private void setScreen(Class<? extends Screen> screenClass) {
-    Screen screen = null;
-    try {
-      // If the class is an clear point, we clean up all previous screens
-      if (Arrays.asList(screenClass.getInterfaces()).contains(ClearPoint.class)) {
-        clearScreens();
-        screen = screenClass.newInstance();
-      }
-      // otherwise, try to get a screen from buffer or create it if needed
-      else {
-        if (!hmClassScreens.containsKey(screenClass)) {
-          screen = screenClass.newInstance();
-          hmClassScreens.put(screenClass, screen);
-        }
-        screen = hmClassScreens.get(screenClass);
-      }
-    } catch (InstantiationException e) {
-      Log.error(e);
-      throw new RuntimeException("setScreen " + screenClass + " caused " + e.toString(), e);
-    } catch (IllegalAccessException e) {
-      Log.error(e);
-      throw new RuntimeException("setScreen " + screenClass + " caused " + e.toString(), e);
-    }
-
-    current = screen;
-    current.setWizard(this);
-    current.setCanGoPrevious((getPreviousScreen(screenClass) != null));
-    current.setCanGoNext((getNextScreen(screenClass) != null));
-    String sDesc = screen.getDescription();
-    if (sDesc != null) {
-      header.setTitleText(screen.getName());
-      header.setSubtitleText(sDesc);
-    } else {
-      header.setTitleText(screen.getName());
-      header.setSubtitleText("");
-    }
-    display();
-  }
-
-  /**
-   * Called at each screen refresh.
-   */
-  private void display() {
-    ((JPanel) dialog.getContentPane()).removeAll();
-    dialog.setLayout(new BorderLayout(layoutHPadding, layoutVPadding));
-    if (icon != null) {
-      final JLabel jlIcon = new JLabel(icon);
-      dialog.add(jlIcon, BorderLayout.WEST);
-      // Add a listener to resize left side image if wizard window is
-      // resized
-      jlIcon.addComponentListener(new ComponentListener() {
-
-        @Override
-        public void componentShown(ComponentEvent e) {
-          // nothing to do here
-        }
-
-        /* (non-Javadoc)
-         * @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent)
-         */
-        @Override
-        public void componentResized(ComponentEvent e) {
-          Wizard.this.icon = getResizedImage(icon, jlIcon.getWidth(), jlIcon.getHeight());
-          jlIcon.setIcon(Wizard.this.icon);
-          jlIcon.setVisible(true);
-          // Display icon new size, useful to create an image with
-          // right default size
-          System.out.println("Icon new size : " + jlIcon.getIcon().getIconWidth() + "x"
-              + jlIcon.getIcon().getIconHeight());
-        }
-
-        @Override
-        public void componentMoved(ComponentEvent e) {
-          // nothing to do here
-        }
-
-        @Override
-        public void componentHidden(ComponentEvent e) {
-          // nothing to do here
-        }
-
-      });
-    }
-    dialog.add(actions, BorderLayout.SOUTH);
-    JScrollPane jsp = new JScrollPane(header);
-    jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
-    jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
-    jsp.setBorder(BorderFactory.createEmptyBorder());
-
-    dialog.add(jsp, BorderLayout.NORTH);
-    if (current != null) {
-      dialog.add(current, BorderLayout.CENTER);
-    }
-
-    dialog.getRootPane().setDefaultButton(actions.jbNext);
-
-    ((JPanel) dialog.getContentPane()).revalidate();
-    dialog.getContentPane().repaint();
-  }
-
-  /**
-   * Set the header image.
-   * 
-   * @param img DOCUMENT_ME
-   */
-  public void setHeaderImage(Image img) {
-    header.setImage(img);
-  }
-
-  /**
-   * Set the header icon.
-   * 
-   * @param icon DOCUMENT_ME
-   */
-  public void setHeaderIcon(ImageIcon icon) {
-    header.setIcon(icon);
-  }
-
-  /**
-   * Set the background color of the ActionPanel.
-   * 
-   * @param color DOCUMENT_ME
-   */
-  public void setActionsBackgroundColor(Color color) {
-    actions.setBackgroundColor(color);
-  }
-
-  /**
-   * Set the background color of the ActionPanel's Problem notification area.
-   * 
-   * @param color DOCUMENT_ME
-   */
-  public void setProblemBackgroundColor(Color color) {
-    actions.setProblemBackgroundColor(color);
-  }
-
-  /**
-   * Gets the previous screen.
-   * 
-   * @param screen DOCUMENT_ME
-   * 
-   * @return previous screen class
-   */
-  abstract public Class<? extends Screen> getPreviousScreen(Class<? extends Screen> screen);
-
-  /**
-   * Clear screens history.
-   */
-  public final void clearScreens() {
-    hmClassScreens.clear();
-  }
-
-  /**
-   * Gets the next screen.
-   * 
-   * @param screen DOCUMENT_ME
-   * 
-   * @return next screen class
-   */
-  abstract public Class<? extends Screen> getNextScreen(Class<? extends Screen> screen);
-
-  /**
-   * Get current screen.
-   * 
-   * @return current screen class
-   */
-  public Class<? extends Screen> getCurrentScreen() {
-    return this.current.getClass();
-  }
-
-  /**
-   * Refresh buttons and problems. Called asynchronously by the screens or by
-   * the wizard itself.
-   */
-  public void updateGUI() {
-    boolean bPrevious = current.canGoPrevious();
-    boolean bNext = current.canGoNext();
-    boolean bFinish = current.canFinish();
-    boolean bCancel = current.canCancel();
-    actions.setState(bPrevious, bNext, bFinish, bCancel);
-    actions.setProblem(current.getProblem());
-  }
-
-  /**
-   * Finish action. Called when user clicks on "finish"
-   */
-  abstract public void finish();
-
-  /**
-   * Called when user clicks on "cancel". Override it if you want to do
-   * something in cancel such as display a confirmation dialog.
-   * <p>
-   * 
-   * @return return true if the Wizard should continue to close
-   * return false if the Wizard should abort the cancellation
-   */
-  public boolean onCancel() {
-    return true;
-  }
-
-  /**
-   * Icon resizing.
-   * 
-   * @param img DOCUMENT_ME
-   * @param iNewWidth DOCUMENT_ME
-   * @param iNewHeight DOCUMENT_ME
-   * 
-   * @return resized icon
-   */
-  private static ImageIcon getResizedImage(ImageIcon img, int iNewWidth, int iNewHeight) {
-    if (img == null) {
-      return null;
-    }
-    ImageIcon iiNew = new ImageIcon();
-    Image image = img.getImage();
-    Image scaleImg = image.getScaledInstance(iNewWidth, iNewHeight, Image.SCALE_AREA_AVERAGING);
-    iiNew.setImage(scaleImg);
-    return iiNew;
-  }
-
-  /* (non-Javadoc)
-   * @see java.awt.event.WindowListener#windowClosing(java.awt.event.WindowEvent)
-   */
-  @Override
-  public void windowClosing(WindowEvent windowEvent) {
-    // if cancel is disabled, then don't call the onCancel function and
-    // don't dispose
-    if (current.canCancel() && onCancel()) {
-      bCancelled = true;
-      dialog.dispose();
-    }
-  }
-
-  /**
-   * Called when the wizard dialog opens. Override it if you want notification
-   * of this event.
-   * 
-   * @param windowEvent DOCUMENT_ME
-   */
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.WindowListener#windowOpened(java.awt.event.WindowEvent)
-   */
-  @Override
-  public void windowOpened(WindowEvent windowEvent) {
-    // nothing to do here
-  }
-
-  /**
-   * Called when the wizard dialog is closed. Override it if you want
-   * notification of this event.
-   * <p>
-   * <b>caution:</b> You must always call super.windowClosed(windowEvent)
-   * within the override function to ensure that the Wizard closes completely.
-   * 
-   * @param windowEvent DOCUMENT_ME
-   */
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.WindowListener#windowClosed(java.awt.event.WindowEvent)
-   */
-  @Override
-  public void windowClosed(WindowEvent windowEvent) {
-    // nothing to do here
-  }
-
-  /**
-   * Called when the wizard dialog is iconified. Override it if you want
-   * notification of this event.
-   * 
-   * @param windowEvent DOCUMENT_ME
-   */
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.WindowListener#windowIconified(java.awt.event.WindowEvent)
-   */
-  @Override
-  public void windowIconified(WindowEvent windowEvent) {
-    // nothing to do here
-  }
-
-  /**
-   * Called when the wizard dialog is deiconified. Override it if you want
-   * notification of this event.
-   * 
-   * @param windowEvent DOCUMENT_ME
-   */
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.WindowListener#windowDeiconified(java.awt.event.WindowEvent)
-   */
-  @Override
-  public void windowDeiconified(WindowEvent windowEvent) {
-    // nothing to do here
-  }
-
-  /**
-   * Called when the wizard dialog is activated. Override it if you want
-   * notification of this event.
-   * 
-   * @param windowEvent DOCUMENT_ME
-   */
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.WindowListener#windowActivated(java.awt.event.WindowEvent)
-   */
-  @Override
-  public void windowActivated(WindowEvent windowEvent) {
-    // nothing to do here
-  }
-
-  /**
-   * Called when the wizard dialog is deactivated. Override it if you want
-   * notification of this event.
-   * 
-   * @param windowEvent DOCUMENT_ME
-   */
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.awt.event.WindowListener#windowDeactivated(java.awt.event.WindowEvent)
-   */
-  @Override
-  public void windowDeactivated(WindowEvent windowEvent) {
-    // nothing to do here
-  }
-
-  /**
-   * Was cancelled.
-   * DOCUMENT_ME
-   * 
-   * @return true if...
-   */
-  public boolean wasCancelled() {
-    return bCancelled;
-  }
-
-}
diff --git a/src/main/java/org/qdwizard/package.html b/src/main/java/org/qdwizard/package.html
deleted file mode 100644
index a2d66cd..0000000
--- a/src/main/java/org/qdwizard/package.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head></head>
-<body>
-  DOCUMENT_ME
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/resources/icons/16x16/webradio_16x16.png b/src/main/resources/icons/16x16/webradio_16x16.png
index e7a510c..b0dd32e 100644
Binary files a/src/main/resources/icons/16x16/webradio_16x16.png and b/src/main/resources/icons/16x16/webradio_16x16.png differ
diff --git a/src/main/java/org/jajuk/util/log/jajuk-log4j-conf.xml b/src/main/resources/jajuk-log4j-conf.xml
similarity index 100%
rename from src/main/java/org/jajuk/util/log/jajuk-log4j-conf.xml
rename to src/main/resources/jajuk-log4j-conf.xml
diff --git a/src/main/java/org/jajuk/i18n/jajuk.properties b/src/main/resources/org/jajuk/i18n/jajuk.properties
similarity index 85%
rename from src/main/java/org/jajuk/i18n/jajuk.properties
rename to src/main/resources/org/jajuk/i18n/jajuk.properties
index a1dcf77..4eb0934 100644
--- a/src/main/java/org/jajuk/i18n/jajuk.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk.properties
@@ -2,9 +2,9 @@
 <body><![CDATA[
 #Jajuk English langpack. 
 #Author: Bertrand Florat
-#Copyright 2003-2011 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
+#Copyright 2003-2012 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
 #REFERENCE
-#$Revision$
+#
  
 #--- Generic labels ---
 # DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -31,9 +31,7 @@ Hide=Don't show again
 Path=Please select a path
 Later=Later
 Default=Default
-All=All
 YestoAll=Yes to All
-Maximize=Maximize
 Purge=Purge
 
 #--- Wizard Strings --- 
@@ -57,7 +55,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
 Type.mac=Monkey's Audio format
 Type.radio=Web Radio
 Type.video=Video
@@ -68,7 +65,6 @@ unknown_artist=Unknown
 unknown_album=Unknown
 unknown_genre=Unknown
 unknown_year=Unknown
-unknown_album-artist=Unknown
 
 various_artist=Various artist
 
@@ -80,35 +76,32 @@ Confirmation_exit=Do you really want to exit Jajuk?
 Confirmation_delete=Warning! You're about to delete the following file(s) from your disk, are you sure ?
 Confirmation_void_refresh=Warning! You're about to access a void device. Under Unix, make sure the device is mounted or you will loose jajuk information on this device. Are you sure?
 Confirmation_remove_device=Do you really want to remove this device?
-Confirmation_delete_cover=Do you really want to delete this cover from your disk ?
-Confirmation_delete_files=Do you really want to delete these files from your disk ?
-Confirmation_delete_dirs=Do you really want to delete these directories from your disk ?
+Confirmation_delete_cover=Do you really want to delete definitely this cover from your disk ?
+Confirmation_delete_files=Do you really want to delete definitely these files from your disk ?
+Confirmation_delete_dirs=Do you really want to delete definitely these directories from your disk ?
 Confirmation_clear_history=Do you really want to clear the history?
 Confirmation_reset_ratings=Do you really want to reset all track ratings to zero ?
 Confirmation_refactor_files=Do you really want to rename these selected file(s) ?
 Confirmation_restore_all=A full views restore requires a Jajuk restart, do you want to quit now ?
-Confirmation_defaults_radios=This will erase all radio stations you have previously created, are you sure ?
-Confirmation_delete_empty_dirs=The following directories are empty. Do you want to delete them?
+Confirmation_delete_empty_dirs=The following directories are empty. Do you want to delete them definitely ?
 Confirmation_file_overwrite=This file already exists. Do you want to overwrite this file?
-Confirmation_file_number=file(s) will be deleted.
-Confirmation_alarm_stop=Are you sure you want to stop this alarm?
+Confirmation_file_number=file(s) will be deleted  definitely.
 Confirmation_defaults=Note this will reset all tabs options to default values (and not only the current one), are you sure ?
 Confirmation_reset_preferences=Do you really want to reset tracks preferences ?
+Confirmation_reset_ratings_overwrite=Any rating found in the imported file will overwrite the current rating of this file in this installation of Jajuk. Are you sure you want to do this?
+Confirmation_tag_write=One or more tags are about to be actually written on disk. Are you sure ?
 
 Device_type.directory=Directory
 Device_type.file_cd=Music Files CD
-Device_type.audio_cd=Audio CD
 Device_type.extdd=External Hard Disk
 Device_type.player=Digital Audio Player
 Device_type.network_drive=Network Drive
-Device_type.remote=Remote (Not implemented)
 
 Perspective_Description_Simple=Simple
 Perspective_Description_Files=Files
 Perspective_Description_Tracks=Tracks
 Perspective_Description_Configuration=Config
 Perspective_Description_Statistics=Stats
-Perspective_Description_Help=Help
 Perspective_Description_Display=Display
 Perspective_Description_Albums=Albums
 Perspective_Description_Info=Information
@@ -143,7 +136,7 @@ Property_rate=Rate
 Property_files=Files
 Property_hits=Hits
 Property_filename=File
-Property_date=Date
+Property_date=Creation Date
 Property_added=Discovery date
 Property_parent=Parent directory
 Property_device=Device
@@ -168,6 +161,11 @@ Property_pf=Preference
 Property_tpt=Total play time (secs)
 Property_ban=Banned
 Property_disc_id=DiscID
+Property_keywords=Keywords
+Property_label=Description
+Property_bitrate=Bitrate (kbps)
+Property_frequency=Frequency (Hz)
+Property_origin=Origin
 
 Language_desc_en=English
 Language_desc_fr=French
@@ -200,17 +198,13 @@ Error.017=Error parsing playlist
 Error.018=No accessible tracks can be found
 Error.019=An existing device already has this name
 Error.020=IO error copying file. The disk may be full
-Error.021=URL field is mandatory. Ex: 'd:\music' under MS Windows, '/home/foo/music' under Unix 
-Error.022=Name field is mandatory. Ex: 'Hard drive', 'CD ROCK' 
 Error.023=Cannot launch start-up track
 Error.024=Cannot write file
 Error.025=One of the files you want to read is on an unmounted device 
 Error.026=Error registering players
 Error.027=Synchronization aborted
 Error.028=Error saving playlist
-Error.029=An existing device is a parent directory of this device, has the same path, or is a child directory
 Error.030=Too many connection failures. Jajuk has stopped searching for online covers
-Error.101=Device doesn't exist or is not reachable
 Error.102=Error
 Error.103=Error reading tag information
 Error.104=Error writing tag information
@@ -218,43 +212,36 @@ Error.105=Resource Bundle key not found
 Error.106=Uncaught exception
 Error.107=Device already refreshing or synchronizing
 Error.108=Perspective file parsing error
-Error.109=Player or tag implementation class not reachable
 Error.110=This property name is reserved by the Jajuk internal system. Please choose another one
 Error.111=Device already mounted
 Error.112=Cannot mount device
 Error.113=Cannot store user configuration
 Error.114=Cannot read user configuration
-Error.118=Error processing event request
 Error.119=No history file or error parsing it
 Error.120=Cannot access the device: it is either not mounted, currently refreshing, or synchronizing
 Error.121=Device is in use and cannot be unmounted
 Error.122=Error in FIFO
-Error.123=Error setting theme
-Error.124=Jajuk is already running. Only one Jajuk instance can run at a time
 Error.125=Device already unmounted
 Error.126=Seeking not supported by this audio format
 Error.127=No novelties found within specified time limit. You can set the time limit in the preferences view
 Error.128=Current track is the very first one of the collection. No previous track is available
-Error.129=Error loading cover image
 Error.131=Cannot delete file
 Error.133=Your collection file was corrupted for an unknown reason. Jajuk managed to restore a backup file
 Error.134=Cannot rename file
 Error.135=File does not exist
 Error.136=Operation failed
 Error.137=Wrong format
-Error.138=Some files mapped by these tracks are located on unmounted devices and thus have not changed. 
 Error.140=Invalid string: it should not contain & ' " < or > characters
 Error.141=This playlist is located on an unmounted or refreshing device and is not available
 Error.142=This playlist maps non-existing tracks or tracks located outside Jajuk known devices. These tracks have been ignored.
 Error.143=Device location not reachable
 Error.144=Error parsing DJ
 Error.145=Cannot commit DJ
-Error.146=<html>The current organizer pattern is wrong.<br/>Valid items are: %artist (Artist name); %album_artist (Album Artist); %title (Track title); %album (Album name);<br/> %n (Track leading zero); %genre (track genre); %year (year); %disc (disc number)<br/> and the pattern must contain at least one slash</html> 
+Error.146=<html>The current organizer pattern is wrong.<br/>Valid items are: %artist (Artist name); %album_artist (Album Artist); %title (Track title); %album (Album name);<br/> %n (Track leading zero); %genre (track genre); %year (year); %disc (disc number)<br/> %CUSTOM_PROPERTY_NAME<br/> and the pattern must contain at least one slash</html> 
 Error.147=Some files could not be moved (see details for more informations)
 Error.148=Year field is unknown
 Error.149=Album field is unknown
 Error.150=Artist field is unknown
-Error.151=Track Title field is unknown
 Error.152=Track field is unknown
 Error.153=Genre field is unknown
 Error.154=Cannot rename file, check wrong character in file name or tags
@@ -267,27 +254,24 @@ Error.160=File not moved, source and target filename are equals.
 Error.161=Cannot write to directory, check permissions
 Error.162=This custom property already exist
 Error.163=Error restoring default views
-Error.164=No accessible tracks can be found for ambience :
 Error.165=Wrong collection path, the directory cannot be found or is not writable
 Error.166=Empty album, cannot grab cover
 Error.167=Could not create report
-Error.168=No duplicate files found
-Error.169=Operation failed. Note that this operation requires an Internet connection to grab the radio station list.
-Error.170=Error playing webradio
 Error.171=No synchronization source yet defined for this device, set it using device configuration dialog (in Device view, click on the device).
 Error.172=Currently played file and its parent directories can not be deleted nor changed
-Error.173=Error encountered while deleting the following directories:
 Error.174=Error accessing Freedb website, check your network link 
-Error.175=Operation canceled
 Error.176=Error generating playlist
 Error.177=Please enter a valid time in (HH24:MM:SS) format
 Error.179=Cannot open system file explorer, try to set a path to it in Preference view / Advanced tab
 Error.180=Error while copying files
+Error.181=Could not find the specified file
+Error.182=Cannot access to specified configuration path, we use the user home path instead. If required, change it in the "Preferences" view, "Advanced" tab
+Error.183=The field cannot be empty
+Error.184=Wrong value : refreshing interval can be 0 or a number >= 0.5
 
 #Warnings
 Warning.0=MPlayer not found. Some audio and video formats (flac, wma, aac, mpg2 ... ) will be disabled. If MPlayer is already installed, please set manually its path in Preferences view/Advanced tab.
 Warning.1=Wrong MPlayer release, MPlayer1.0Pre8 and upper is required. Some audio formats will be disabled. 
-Warning.2=Looks that somebody else is currently using the current jajuk collection. Last user to quit will overwrite configuration (options, rates...). 
 Warning.3=Mplayer cannot be downloaded. If you are behind an HTTP proxy, please configure it in the Preferences view / Network tab and restart Jajuk. 
 Warning.4=Mplayer is required to listen web radios 
 Warning.5=Destination directory already exist, some files may be overwriten, are you sure ? 
@@ -296,7 +280,7 @@ Warning.7=Jajuk detected a need for deep refresh due to upgrade. Do you want to
 
 #--- Strings by class ---
 ParameterView.0=History duration: 
-ParameterView.2=Set the time in days to keep a history of tracks played. Enter -1 if you don't want any history and 0 if you want a permanent history.
+ParameterView.2=Set the time in days to keep a history of tracks played. Enter -1 if you want a permanent history and 0 if you don't want any history.
 ParameterView.3=Clear history
 ParameterView.4=Clear history
 ParameterView.8=History/Ratings
@@ -318,8 +302,6 @@ ParameterView.29=Before exiting Jajuk
 ParameterView.30=Ask before exiting Jajuk
 ParameterView.33=Options
 ParameterView.35=Hides tracks located on unmounted devices
-ParameterView.36=Restart when the end of the collection is reached
-ParameterView.37=Restart the entire collection when the end is reached in continue mode
 ParameterView.38=Language:
 ParameterView.42=Select the interface language
 ParameterView.43=Theme: 
@@ -339,8 +321,6 @@ ParameterView.85=Apply
 ParameterView.86=Restore defaults
 ParameterView.87=Preferences
 ParameterView.98=Patterns
-ParameterView.99=Perform a deep tag scan
-ParameterView.100=<html>Force Jajuk to re-read the actual id3 tags.<p>This can be useful to refresh tags modified using another program.</p></html>
 ParameterView.101=Use parent directory name as album name
 ParameterView.102=If checked, the parent directory name will be used as the album name for tracks where the ID3 tag cannot be used. 
 ParameterView.109=Preferences saved
@@ -352,10 +332,7 @@ ParameterView.114=Use Regular expressions (Regexp format) in table filters. Exam
 ParameterView.115=Advanced
 ParameterView.116=Backup collection file
 ParameterView.117=Check this if you want to backup your collection file to collection-<date>.xml files
-ParameterView.118=Backup size (MB)
 ParameterView.119=Backup size (MB)
-ParameterView.120=Collection charset
-ParameterView.121=Collection charset. UTF-16 is optimized for Asian languages and UTF-8 is optimized for European languages.
 ParameterView.129=Time limit of novelties (days):
 ParameterView.130=Time limit of novelties in days: all tracks added within this number of days are shown in the novelties playlist
 ParameterView.131=Best of track
@@ -382,18 +359,12 @@ ParameterView.158=High (search mandatory grouped words)
 ParameterView.159=Covers
 ParameterView.160=Connection timeout (seconds)
 ParameterView.161=Connection timeout in seconds: A remote operation fails if a peer does not reply in this time.
-ParameterView.162=Transfer timeout (seconds) 
-ParameterView.163=Data transfer timeout (seconds): A remote operation fails if the required data is not completely downloaded in this time.
 ParameterView.164=Before removing a device
 ParameterView.165=Ask before removing a device
 ParameterView.166=Shuffle covers
 ParameterView.167=Display a random cover
-ParameterView.169=Prefetch covers
-ParameterView.170=Prefetch all available covers when possible
 ParameterView.171=Before deleting a cover from disk
 ParameterView.172=Ask before deleting a cover from disk
-ParameterView.177=Number of visible planned tracks
-ParameterView.178=The number of planned tracks to be shown in the playlist
 ParameterView.179=Push on selection
 ParameterView.180=When checked, double clicking a track or selecting an item pushes into the queue
 ParameterView.181=Push on drag & drop
@@ -405,9 +376,9 @@ ParameterView.189=Before resetting ratings
 ParameterView.190=Cross fade duration (seconds)
 ParameterView.191=The number of seconds to cross fade between tracks
 ParameterView.192=File organizer :
-ParameterView.193=<html>Available patterns : %artist (Artist name);<br>%album_artist (Album artist, if not defined artist name is used);<br>%title (Track title); %album (Album name); %n (Track); %genre (track Genre); <br>%year (year); %disc (disc number)</html>
+ParameterView.193=<html>Available patterns : %artist (Artist name);<br>%album_artist (Album artist, if not defined artist name is used);<br>%title (Track title); %album (Album name); %n (Track); %genre (track Genre); <br>%year (year); %disc (disc number) ; %CUSTOM_PROPERTY_NAME</html>
 ParameterView.194=Before organizing files
-ParameterView.195=Animation view :
+ParameterView.195=Title view :
 ParameterView.196=Enable Hotkeys
 ParameterView.197=Enable some keystrokes like F8 to work even when Jajuk has not the focus
 ParameterView.198=Some changes will be effective only at the next Jajuk start-up
@@ -418,7 +389,7 @@ ParameterView.202=The username used on Last.FM
 ParameterView.203=Last.FM password
 ParameterView.204=The password used on Last.FM
 ParameterView.205=Mplayer arguments
-ParameterView.206=Additional MPlayer arguments like '-ao esd', '-ao arts' or '-novideo (to prevent playing videos)' for ie
+ParameterView.206=<html>Additional MPlayer arguments like '-ao esd', '-ao arts' <br>or '-novideo (to prevent playing videos)' for ie<br>Beware that sound manipulation options are ignored if using the Bit-Perfect option</html>
 ParameterView.207=Jajuk configuration path
 ParameterView.208=Set the directory containing Jajuk configuration (default is user home directory)
 ParameterView.209=Jajuk configuration path has been changed for the current user (previous collection has been kept in the old location). Jajuk will now be closed and can be restarted.
@@ -440,7 +411,7 @@ ParameterView.223=Fonts size
 ParameterView.224=Set text font size
 ParameterView.225=GUI
 ParameterView.226=Modes
-ParameterView.228=Show album popups
+ParameterView.228=Show large tooltips when hovering over albums
 ParameterView.229=Catalog view preferences
 ParameterView.233=Theme will be fully applied at next Jajuk startup
 ParameterView.234=Check for Jajuk updates
@@ -456,15 +427,13 @@ ParameterView.243=<html>Set here the mplayer full path with executable (spaces a
 ParameterView.244=Discovery date = File date 
 ParameterView.245=<html>If checked, jajuk considers audio files system date as the discovery date<br/>Requires deep refreshes to be taken into account</html>
 ParameterView.246=Perspective bar icons size  (pixels)
-ParameterView.247=Destination path contains an existing Jajuk workspace. The workspace has been switched to this path for the current user (previous workspace has been kept in the old location). Jajuk will now be closed and can be restarted.
+ParameterView.247=Destination path contains an existing Jajuk configuration. The configuration has been switched to this path for the current user (previous configuration has been kept in the old location). Jajuk will now be closed and can be restarted.
 ParameterView.248=Frame title :
 ParameterView.249=Reset preferences
 ParameterView.250=Reset user-defined preferences
 ParameterView.251=History successfully reseted
 ParameterView.252=Ratings and playtimes successfully reseted
 ParameterView.253=Preferences successfully reseted
-ParameterView.254=Use Windows short names
-ParameterView.255=[Windows 32 bits only] If checked, force mplayer to use audio file names in short windows way to fix on issue for some locales
 ParameterView.256=Standard cover file names
 ParameterView.257=Jajuk recognizes standard covers files whose filename contains this text (without extension). Several values separated by ';' can be provided. Example : "Folder;front".
 ParameterView.260=Save covers Windows Explorer friendly
@@ -473,25 +442,43 @@ ParameterView.262=Use audio normalization
 ParameterView.263=Maximizes the volume without distorting the sound
 ParameterView.264=Disable any Internet access from Jajuk
 ParameterView.265=Disable any Internet access from Jajuk (LastFM, covers or lyrics download...).
-ParameterView.266=Drop played tracks from queue
-ParameterView.267=All tracks are dropped which are before the current played in the queue
 ParameterView.268=Proxy configuration
 ParameterView.269=Explorer executable path
 ParameterView.270=Path to the executable used as external file explorer
 ParameterView.271=Show Systray
 ParameterView.272=If checked, jajuk can be managed from the notification area (not all operating systems are supported)
-ParameterView.273=Mirrow Cover 
+ParameterView.273=Mirrow cover 
 ParameterView.274=If checked, the cover will be tilted and mirrowed 
-ParameterView.275=Track change notification :
+ParameterView.275=Notification Popup on track change :
 ParameterView.276=Select the type of notification at track change (a toast is a notification popup that appears briefly on the screen and disappears by itself) 
-ParameterView.277=Notification pattern :
-ParameterView.278=This pattern set the text to be displayed by notifiers at track change
+ParameterView.277=Balloon pattern :
+ParameterView.278=This pattern set the text to be displayed by balloon notifier at track change
 ParameterView.279=Information pattern :
 ParameterView.280=This pattern set the text to be displayed in the information view (lower part of the screen)
 ParameterView.281=Minimize to tray
 ParameterView.282=If checked, Jajuk main main window will be shown in the systray only when minimized, no more in the taskbar
+ParameterView.283=Mirrow cover in fullscreen mode
+ParameterView.284=If checked, the cover will be tilted and mirrowed in fullscreen mode
+ParameterView.285=Enable bit-perfect
+ParameterView.286=<html>Disable the mixer (sound volume) and any other option that could affect <br>sound quality like audio normalization.<br>Use your OS mixer to change volume or mute once enabled.</html>   
+ParameterView.287=Sound
+ParameterView.288=Enable Title view animation effect
+ParameterView.289=Title view options
+ParameterView.290=Show splash screen at startup
+ParameterView.291=Show splash screen at startup in main Window mode (it is always disabled in slimbar or full screen mode) 
+ParameterView.292=Display a popup with album details when moving mouse over albums tables or thumbnails.
+ParameterView.301=Show videos
+ParameterView.302=If unset, jajuk don't display video-types files (startup required).
+ParameterView.303=Systray click forces display
+ParameterView.304=Clicking on the systray force window display to front (default behavior shows/hides the window)
+ParameterView.305=Preserve files dates
+ParameterView.306=Preserve files "last modification date" when setting tags
+ParameterView.307=Manual ratings
+ParameterView.308=Don't rely on automatic rating system based on play time and preferences but set a rating directly using preference level.
+ParameterView.309=Before writing one or more tags
+ParameterView.310=Reset "Don't show again" choices
+ParameterView.311=This makes possible to show again the choices you asked to hide.
 
-Main.21=Confirmation
 Main.22=Checking/Downloading MPlayer
 
 Player.0=Waiting for audio line (occupied)
@@ -509,6 +496,7 @@ Device.44=Entering
 Device.45=Copying [
 Device.46=Converting [
 Device.47=] to [
+Device.48= file or playlist references dropped
 
 FIFO.4=). Do you want to try to mount it ?
 FIFO.10=Now Playing: 
@@ -540,7 +528,7 @@ DeviceWizard.52=Select a source device
 DeviceWizard.53=Refresh device every
 #limited string size
 DeviceWizard.54=min
-DeviceWizard.55=Wrong value : refreshing interval can be 0 or a number >= 0.5.
+# Next is DeviceWizard.56
 
 JajukJMenuBar.0=File
 JajukJMenuBar.1=Open file
@@ -572,11 +560,10 @@ JajukJMenuBar.28=Tools
 JajukJMenuBar.29=Smart
 JajukJMenuBar.30=Repeat all
 JajukJMenuBar.31=Karaoke
-# next two lines are only used in development/test mode, translation is therefore optional 
+# Next two lines are only used in development/test mode, translation is therefore optional 
 JajukJMenuBar.32=Call a full GC (test mode only)
 JajukJMenuBar.33=Perform a manual commit of the collection data (test mode only)
 
-
 PlaylistFileItem.1=Novelties
 PlaylistFileItem.2=New playlist
 PlaylistFileItem.3=Bookmarks
@@ -592,8 +579,6 @@ CommandJPanel.1=[Ctrl-t] Repeat mode: Play tracks in a loop
 CommandJPanel.2=[Ctrl-h] Shuffle mode: Play randomly selected tracks
 CommandJPanel.3=Continue mode: Continue to play planned tracks when finished
 CommandJPanel.4=Intro mode: Play only a part of each track. Time and offset can be set in the Preferences view
-CommandJPanel.5=Play a shuffle selection from the entire collection
-CommandJPanel.6=Play your own favorite tracks
 CommandJPanel.8=<html>[F9] Play previous track in current selection<br/>Right click replays current track<br/>Shift+click launches previous album<br/>Ctrl+click replays current album</html>
 CommandJPanel.9=<html>[F10] Play next track in current selection<br/>Shift+click launches next album</html>
 CommandJPanel.10=<html>[Alt-gr F9] Fast rewind in current track<br/>Shift+click for replay</html>
@@ -606,41 +591,34 @@ CommandJPanel.19=Manage Ambiences
 CommandJPanel.20=Track by track
 CommandJPanel.21=Shuffle album by album
 CommandJPanel.22=Album by album
-CommandJPanel.23=Click to clear search
-CommandJPanel.24=Configure web radios
 CommandJPanel.25=Turn on the radio
 CommandJPanel.26=Repeat all mode: Play queue in a loop
 CommandJPanel.27=Karaoke mode, hide voices from played track (applies only to next track to be launched)
 
 InformationJPanel.5=Total queue time remaining [Nb of tracks remaining]
-InformationJPanel.6=Track bitrate
 InformationJPanel.7=Current track progression
 # %xxx are patterns, don't translate them !
 InformationJPanel.8=%title by %artist on %album
 # Keep next label short
 InformationJPanel.9=<No selection>
 
-
 AbstractPlaylistEditorView.0=Title
 AbstractPlaylistEditorView.1=Location
 AbstractPlaylistEditorView.2=Run this playlist
 AbstractPlaylistEditorView.3=Save this playlist
-AbstractPlaylistEditorView.4=Add an item to this playlist
 AbstractPlaylistEditorView.5=Remove item
 AbstractPlaylistEditorView.6=Move up
 AbstractPlaylistEditorView.7=Move down
 AbstractPlaylistEditorView.9=Erase this playlist
 AbstractPlaylistEditorView.10=Add a random track to this playlist
 AbstractPlaylistEditorView.15=Playlists
-AbstractPlaylistEditorView.17=You are about to update the following playlists:
 AbstractPlaylistEditorView.18=Track in queue
 AbstractPlaylistEditorView.19=Repeated track
 AbstractPlaylistEditorView.20=Planned track
-AbstractPlaylistEditorView.21=Playlist track
 AbstractPlaylistEditorView.22=Playlist saved
 AbstractPlaylistEditorView.27=Prepare Party
-AbstractPlaylistEditorView.28=folder created successfully in
 AbstractPlaylistEditorView.29=Playing track
+AbstractPlaylistEditorView.30=Shuffle the playlist
 
 StatView.0=Others
 StatView.1=Genres
@@ -687,7 +665,6 @@ TracksTreeView.41=less than two years
 TracksTreeView.42=less than five years
 TracksTreeView.43=less than ten years
 TracksTreeView.44=less than three months
-TracksTreeView.45=Year
 
 CoverView.2=Delete this cover from disk
 CoverView.3=Cover
@@ -695,13 +672,10 @@ CoverView.4=Previous image from disk and/or the web if the auto-cover option is
 CoverView.5=Next image from the disk and/or the web if the auto-cover option is checked
 CoverView.6=<html><p>Save cover with its original name</p><p>With CTRL: Save cover as...</p></html>
 CoverView.8=Use this cover as the default cover for this album
-CoverView.9=covers
 CoverView.10=Save cover as
 CoverView.11=Cover saved
-CoverView.12=Album 
-CoverView.13=Title
 
-AnimationView.0=Animation
+AnimationView.0=Title
 
 FilesTreeView.0=Files tree
 FilesTreeView.3=Copy
@@ -711,14 +685,11 @@ FilesTreeView.7=Delete
 FilesTreeView.14=Desynchronize
 FilesTreeView.15=Resynchronize
 FilesTreeView.16=Create Playlist
-FilesTreeView.17=Copy
-FilesTreeView.18=Cut
 FilesTreeView.28=Mount
 FilesTreeView.29=Unmount
 FilesTreeView.30=Force refresh
 FilesTreeView.31=Synchronize
 FilesTreeView.32=Test
-FilesTreeView.33=Create playlists
 FilesTreeView.40=Copy
 FilesTreeView.41=Cut
 FilesTreeView.42=Paste
@@ -746,9 +717,6 @@ TracksTableView.16=Push next
 AbstractTableView.0=Filter:
 AbstractTableView.1=Property to filter
 AbstractTableView.3=Value used by the filter
-AbstractTableView.4=Apply filter
-AbstractTableView.5=Clear the filter
-AbstractTableView.6=Apply an advanced filter
 AbstractTableView.7=contains:
 AbstractTableView.8=Any
 AbstractTableView.10=(Not available)
@@ -758,39 +726,16 @@ AboutView.7=About
 AboutView.8=License
 AboutView.9=System
 AboutView.10=About
-AboutView.11=<html>Copyright 2003-2011<br/>Jajuk team</html>"
+AboutView.11=<html>Copyright 2003-2012<br/>Jajuk team</html>"
 
-PhysicalPlaylistRepositoryView.0=Play
-PhysicalPlaylistRepositoryView.1=Edit
 PhysicalPlaylistRepositoryView.2=Save as
-PhysicalPlaylistRepositoryView.3=Delete
-PhysicalPlaylistRepositoryView.4=Properties
-PhysicalPlaylistRepositoryView.6=Physical Playlists
-PhysicalPlaylistRepositoryView.8=Smart
 PhysicalPlaylistRepositoryView.9=Playing Queue
-PhysicalPlaylistRepositoryView.10=Current queue: drag and drop tracks to play
-PhysicalPlaylistRepositoryView.11=New
-PhysicalPlaylistRepositoryView.12=New playlist: drag and drop tracks add them to the playlist
-PhysicalPlaylistRepositoryView.13=Bookmarks
-PhysicalPlaylistRepositoryView.14=Bookmark playlist: drag and drop tracks to bookmark
-PhysicalPlaylistRepositoryView.15=Best of
-PhysicalPlaylistRepositoryView.16=Best of playlist: contains the most listened to tracks
-PhysicalPlaylistRepositoryView.17=Novelties
-PhysicalPlaylistRepositoryView.18=Novelties playlist: contains the newest tracks
-PhysicalPlaylistRepositoryView.19=Prepare Party
 
 FilesTableView.0=Files table
 FilesTableView.15=Play Directory
-#Dev: do not use ID = 16, next label is FilesTableView.17 
 
-DeviceView.0=Add a device
 DeviceView.1=Remove an unmounted device (does not delete anything from disk)
 DeviceView.2=Selected device properties
-DeviceView.3=Mount selected device
-DeviceView.4=Unmount selected device
-DeviceView.5=Test selected device availability
-DeviceView.6=Force refresh of selected device
-DeviceView.7=Synchronize selected device
 DeviceView.8=Mount
 DeviceView.9=Unmount
 DeviceView.10=Test
@@ -828,19 +773,12 @@ JajukWindow.26=[Ctrl-p] Pause/Resume
 JajukWindow.27=[Ctrl-s] Stop
 JajukWindow.31=Play the newest tracks from the collection
 JajukWindow.32=Finish playing the current album
-JajukWindow.33=[Ctrl-UP/DOWN] Volume
-JajukWindow.34=Position
-JajukWindow.35=Playing:
 JajukWindow.36=Current Ambience:
 JajukWindow.37=No Ambience set
-#Do not use JajukWindow.38, next is JajukWindow.39
-JajukWindow.39=Now playing 
 JajukWindow.40=Extra Tags Configuration
 JajukWindow.41=Opens a dialog to configure the activated extra tags
 
 JajukDonate.1=Donate
-JajukDonate.2=Jajuk project infrastructure needs funds, learn more on our budget page.
-JajukDonate.3=Budget
 JajukDonate.4=If you want to support Jajuk, please make a donation.
 
 ActiveTagsWizard.1=Available Tags
@@ -852,30 +790,25 @@ SimpleDeviceWizard.0=Quick Device Creation
 FirstTimeWizard.0=Quick start
 FirstTimeWizard.1=<html><p><br/>Welcome! This wizard assists you in building your music collection</p></html>
 FirstTimeWizard.2=<html>Please select your music location</html>
-FirstTimeWizard.4=Show help right now
 FirstTimeWizard.5=Please choose a directory
 FirstTimeWizard.6=Advanced preferences
-FirstTimeWizard.7=Set Jajuk workspace directory:
+FirstTimeWizard.7=Set Jajuk configuration directory:
 FirstTimeWizard.8=Selected directory: 
 FirstTimeWizard.9=None
 
-HelpView.2=Help
 
 DownloadManager.0=<html>Jajuk needs your HTTP proxy password to grab covers.<br/>If you don't want them, please change your settings in the Covers tab of the Preferences view.<br/>If you don't have any proxy, please change your settings in the Network tab of the Preferences view.</html>
-DownloadManager.1=Password required
 
-PropertiesWizard.0=Item properties
 PropertiesWizard.1=Property
 PropertiesWizard.2=Value
-PropertiesWizard.3=Editable?
 PropertiesWizard.4=Link
 PropertiesWizard.6=Selection
-PropertiesWizard.7=Type
 PropertiesWizard.8=Successfully updated property
-PropertiesWizard.9=No editable property for this selection
 PropertiesWizard.10=properties have been set
 PropertiesWizard.11=Writing tag to:
 PropertiesWizard.12=Link to given element properties details
+PropertiesWizard.13=Copy
+PropertiesWizard.14=Copy value to the system clipboard
 
 NewPropertyWizard.0=Create Custom Property
 NewPropertyWizard.3=(*)Type
@@ -897,15 +830,12 @@ SplashScreen.2=Starting music engine
 SplashScreen.3=Launching graphical interface 
 
 CatalogView.0=Albums Catalog
-#Note: CatalogView.2 label musn't be much larger than in English for correct display in 800x600
+#Next line : Respect English size
 CatalogView.2=Display albums without cover
 CatalogView.3=Refresh the catalog
 CatalogView.4=Thumbnail size:
 CatalogView.5=Created thumbnail for:
 CatalogView.7=Select a cover
-CatalogView.8=No cover found
-CatalogView.9=Previous
-CatalogView.10=Next
 CatalogView.11=Page:
 CatalogView.12=Display previous thumbnails page
 CatalogView.13=Display next thumbnails page
@@ -929,22 +859,16 @@ WikipediaView.8=Loading
 WikipediaView.9=Failed to load information from Wikipedia
 WikipediaView.10=Cannot search for unknown artist.
 
-
 TipOfTheDayView.0=Tip of the Day
 TipOfTheDayView.1=Did you know...?
 TipOfTheDayView.2=Show at Start-Up?
 
-CDDBWizard.0=Accept
 CDDBWizard.1=File name
 CDDBWizard.2=Current Track Title
 CDDBWizard.3=Current Album Title
 CDDBWizard.4=Proposed Track Title
 CDDBWizard.5=Proposed Album Name :
-CDDBWizard.6=Done! Found 
-CDDBWizard.7=possible matches
 CDDBWizard.12=No match found!
-CDDBWizard.14=This directory does not contain any files
-CDDBWizard.16=Genre:
 CDDBWizard.17=Found exact match!
 CDDBWizard.18=Matches
 CDDBWizard.19=Get Tags Online
@@ -961,11 +885,7 @@ DigitalDJWizard.6=DJ name (*)
 DigitalDJWizard.8=Minimum number of stars:
 DigitalDJWizard.9=Cross fade (seconds):
 DigitalDJWizard.10=Tracks played only once
-DigitalDJWizard.11=Drop
-DigitalDJWizard.12=From Genres
-DigitalDJWizard.13=To Genres
 DigitalDJWizard.14=Genres selection (multiple selections allowed)
-DigitalDJWizard.15=Number of tracks
 DigitalDJWizard.16=Do you want to...
 DigitalDJWizard.17=Create a new DJ?
 DigitalDJWizard.18=Change an exiting DJ?
@@ -1033,7 +953,7 @@ PreparePartyWizard.5=Please define constraints
 PreparePartyWizard.6=DJs
 PreparePartyWizard.7=Ambiences
 PreparePartyWizard.8=Playlists
-PreparePartyWizard.9=Random Tracks
+PreparePartyWizard.9=Random tracks
 PreparePartyWizard.10=Max. tracks
 PreparePartyWizard.11=How many tracks to include at maximum.
 PreparePartyWizard.12=Max. size (MB)
@@ -1080,6 +1000,7 @@ Ambience.13=Latin
 
 DebugLogAction.0=Debug traces listing
 DebugLogAction.1=Refresh
+DebugLogAction.2=Copy to clipboard
 
 CopyClipboardAction.0=Copy address to clipboard
 
@@ -1109,7 +1030,6 @@ ReportAction.19=Jump to:
 ActionMove.0=Paste
 
 ActionRefresh.0=Force refresh
-ActionRefresh.1=Refreshing directory
 
 RenameAction.0=Rename
 RenameAction.1=Please enter the new name for this file:
@@ -1130,29 +1050,14 @@ ActionDelete.0=Files deleted
 ActionDelete.1=Directories deleted
 
 FindDuplicateTracksAction.0=No duplicate tracks found.
-FindDuplicateTracksAction.1=Duplicate tracks found
 FindDuplicateTracksAction.2=Find duplicate tracks
 FindDuplicateTracksAction.3=List of duplicate tracks found
 FindDuplicateTracksAction.4=Select all duplicate tracks
 
-RefreshDialog.0=Preparing device refresh...
 RefreshDialog.1=Refreshing device
 RefreshDialog.2=Refreshing device: 
 RefreshDialog.3=Cleaning up old files
 
-RadioWizard.0=Please select or create a web radio
-RadioWizard.1=Manage web radios
-RadioWizard.2=New
-RadioWizard.3=Delete
-RadioWizard.4=Defaults
-RadioWizard.5=A web radio with this name already exist
-RadioWizard.6=Web Radio name
-RadioWizard.7=Web Radio Wizard
-RadioWizard.8=URL
-RadioWizard.9=Name
-RadioWizard.10=Wrong URL
-RadioWizard.11=Name and URL are mandatory
-
 UpdateManager.0=A new Jajuk release (
 UpdateManager.1=) has been detected, you can download it from http://jajuk.info
 UpdateManager.2=No available new release found so far
@@ -1171,7 +1076,6 @@ AlbumsTableView.0=Albums table
 AlbumsTableView.1=Nb of tracks
 
 AlarmClock.0=Set alarm
-#Next value : 6
 
 AlarmDialog.0=Time (HH24:MM:SS)
 AlarmDialog.1=Hour
@@ -1179,12 +1083,12 @@ AlarmDialog.2=Minutes
 AlarmDialog.3=Seconds
 AlarmDialog.4=Alarm action
 AlarmDialog.5=Select alarm action
-#Next value : 11
 
 ShowPropertiesAction.0=Display item properties
 
 QueueView.1=Void the queue
 QueueView.2=Scroll table automatically to the current played track
+QueueView.3=Stop playing at the end of the current track 
 
 JajukSlimWindow.0=Show/hide Jajuk slimbar
 
@@ -1220,6 +1124,24 @@ Notificator.track_change.track_title=Track launched :
 SyncTreeTableAction.0=Synchronize tree and table view
 SyncTreeTableAction.1=<html>Synchronize tree and table views<br/>When used against a tree view, selecting an item in a table view will expand and scroll the item in tree.<br/>When used in a table view, selecting an item in a tree view will filter the table accordingly.</html>
 
+ShowCurrentlyPlayingAction.0=Show in the notification area which title is currently playing 
+ShowCurrentlyPlayingAction.1=If enabled in the configuration, this action will show a system-dependent notification window which shows information about the currently playing track. 
+
+ExportRatingsAction.1=Export ratings
+ExportRatingsAction.2=Write ratings of all tracks to a file so you can import it to another installation of Jajuk that has the same files
+ExportRatingsAction.3=Please chose the XML file to export ratings to 
+
+ImportRatingsAction.1=Import ratings
+ImportRatingsAction.2=Read in ratings that were exported from another installation of Jajuk. The rating of all matching files will be updated.
+ImportRatingsAction.3=Please chose the XML file from where ratings should be imported
+
+WebRadioView.0=Web Radios
+WebRadioView.1=Webradio
+WebRadioView.2=Origin
+WebRadioView.8=New webradio
+WebRadioView.10=Reload presets
+WebRadioView.11=Reload presets webradios from Jajuk website (keep custom keywords).
+
 TipOfTheDay.0=   Tip 0:  you can replay the current track from the beginning with [Shift+click] on the Rewind button  
 TipOfTheDay.1=   Tip 1:  you can replay the current album from its first track with [CTRL+click]  on the "Play previous" button 
 TipOfTheDay.2=   Tip 2:  you can add shuffle items to playlists using the ? button in the playlist editor  
@@ -1251,6 +1173,9 @@ TipOfTheDay.27=   Tip 27:  you can add any view in any perspective using the "Vi
 TipOfTheDay.28=   Tip 28:  you can launch a wikipedia page in you default browser using the "Launch address in default browser" icon <a href="../images/3/30/Launch_16x16.png" title="Image:launch_16x16.png" class="internal"> <img src='../images/3/30/Launch_16x16.png' alt="Image:launch_16x16.png"/> </a>   
 TipOfTheDay.29=   Tip 29:  Jajuk supports web radios <a href="../images/9/9d/Webradio_32x32.png" title="Image:webradio_32x32.png" class="internal"> <img src='../images/9/9d/Webradio_32x32.png' alt="Image:webradio_32x32.png"/> </a>   
 TipOfTheDay.30=   Tip 30:  Jajuk can be remote-controlled by using D-Bus if available on the current platform (i.e. not on Windows). This allows to use multimedia keys on the keyboard to control Jajuk. Look at the online manual for more information.    
+TipOfTheDay.31=   Tip 31:  Try the audio normalization from Preference view / Sound tab to keep sound level equal among tracks
+TipOfTheDay.32=   Tip 32:  You can export tracks and generate playlists from your collection thanks the Prepare Party feature
+TipOfTheDay.33=   Tip 33:  A single left click over the cover picture in the Cover View switches from 3D to 2D display.
 
 ]]></body>
 
diff --git a/src/main/java/org/jajuk/i18n/jajuk_ca.properties b/src/main/resources/org/jajuk/i18n/jajuk_ca.properties
similarity index 89%
rename from src/main/java/org/jajuk/i18n/jajuk_ca.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_ca.properties
index 98bb4e9..94225da 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_ca.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_ca.properties
@@ -4,7 +4,7 @@
 #Escrito por : Josep Carles Collazos
 #Copyright 2004,2005,2006 Josep Carles Collazos, this is part of Jajuk distributed under the GPL V2 license
 #FROM en 4213
-#$Revision$
+#
 
 #--- Generic labels ---
 #DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -32,9 +32,7 @@ By=by
 On=on
 Later=Després
 Default=Defecte
-All=Tot
 YestoAll=Si a tot
-Maximize=Maximitzar
 Purge=Limpiar
 
 #--- Wizard Strings --- 
@@ -58,7 +56,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
 Type.mac=Monkey's Audio format
 Type.radio=Web Radio
 Type.video=Video
@@ -85,11 +82,9 @@ Confirmation_clear_history=Vols realment netejar l'històric ?
 Confirmation_reset_ratings=Vols realment inicialitzar les puntuacions de pista a zero ?
 Confirmation_refactor_files=Vols realment renombrar el(els) següent(s) fitxers ?
 Confirmation_restore_all=Una restauració de les vistas necessita reiniciar Jajuk, vols sortir ?
-Confirmation_defaults_radios=S'esborraran totes les emisores de ràdio que has creat prèviament, estàs segur ?
 Confirmation_delete_empty_dirs=Els següents directoris estan buits. Vols esborrar-los ?
 Confirmation_file_overwrite=Aquest arxiu ja existeix. Vols sobreescriure aquest arxiu ?
 Confirmation_file_number=arxiu(s) seran esborrats.
-Confirmation_alarm_stop=Estàs segur que vols parar aquesta alarma ?
 Confirmation_defaults=Això tornarà a les opcions per defecte totes les pestanyes ( no només aquesta) , estàs segur ?
 Confirmation_rebuild_thumbs=Això recrearà les miniatures de tots els teus àlbums, pot durar alguns minuto per a grans col·leccions.  estàs segur ?
 Confirmation_reset_preferences=Segur que vols resetejar les preferències de pistes ?  
@@ -106,7 +101,6 @@ Perspective_Description_Files=Arxius
 Perspective_Description_Tracks=Pistes
 Perspective_Description_Configuration=Configuració
 Perspective_Description_Statistics=Estadístiques
-Perspective_Description_Help=Ajuda
 Perspective_Description_Display=Visualització
 Perspective_Description_Albums=Àlbums
 Perspective_Description_Info=Informació
@@ -189,17 +183,13 @@ Error.017=Error analitzant la playlist
 Error.018=No es troba cap pista accessible
 Error.019=Existeix un dispossitiu amb aquest nom
 Error.020=Error de E/S, verifica l'espai en disc
-Error.021=El camp Url és obligatori. Ex: 'd:\music' a MS Windows, '/home/foo/music' a Unix
-Error.022=El camp Nom és obligatori. Ex: 'Disc Dur', 'CD ROCK'
 Error.023=No es pot llençar la pista inicial
 Error.024=No es pot escriure el fitxer
 Error.025=Un dels fitxers que vols llegir està en un dispositiu desmontat
 Error.026=Error registrant reproductors
 Error.027=Sincronització abortada
 Error.028=Error gravant playlist
-Error.029=Un dispositiu existent és un directorio para d'aquest dispositiu, te el mateix path o és un directori fill
 Error.030=Massa connexions fallades, Jajuk ha parat de buscar caràtulas a la xarxa
-Error.101=El dispossitiu no existeix o no està disponible
 Error.102=Error
 Error.103=Error llegint información de tags
 Error.104=Error escribint informació de tags
@@ -207,31 +197,25 @@ Error.105=Resource Bundle key no trobada
 Error.106=Excepció no capturada
 Error.107=El dispositiu ja s'està refrescant o sincronitzant
 Error.108=Error a l'anàlisi del fitxer de perspectiva
-Error.109=Reproductor o classe de implementació de tag no accessible
 Error.110=Aquest nom de propietat està reservat per Jajuk internal system, si et plau, tria un altre nom
 Error.111=Dispositiu ja montat
 Error.112=No es pot montar el dispositiu
 Error.113=No es pot guardar la configuració de l'usuari
 Error.114=No es pot llegir la configuració de l'usuari
-Error.118=Error processant petició d'event
 Error.119=Error analitzant fitxer d' historial o no existeix
 Error.120=No se puede acceder al dispositivo : està montat, refrescant-se o be sincronitzant-se
 Error.121=El dispositiu està en us i no pot ésser desmontat
 Error.122=Error en FIFO
-Error.123=Error establint tema
-Error.124=Otra sessió trobada. Només es pot llençar una instància de Jajuk a la vegada
 Error.125=Dispositiu ja montat
 Error.126=Cerca no soportada per aquest format d'audio
 Error.127=No hi ha novetats durant temps especificat, el pots canviar a la vista de preferències
 Error.128=Aquesta pista és la primera de la col·lecció, no hay pistas anteriores
-Error.129=Error carregant imatge de caràtula
 Error.131=No es pot es borrar el fitxer
 Error.133=L'arxiu de la col.lecció està corrupte per una raó desconeguda, jajuk s'encarregarà de restaurar un fitxer de backup
 Error.134=No es pot renombrar l'arxiu
 Error.135=L'arxiu no existeix
 Error.136=Operació fallida
 Error.137=Format Erroni
-Error.138=Alguns arxius referenciats per aquestes pistes estàn localitzades en un despositiu desmuntat i no canviaran.
 Error.140=Cadena errònia: no hauria de contenir els caràcteres & ' " < o >
 Error.141=Aquesta playlist està situada en un dispositiu desmontat, pel que no estarà disponible
 Error.142=Aquesta playlist conté algunes pistes fora de dispositius coneguts que seràn ignorades
@@ -243,7 +227,6 @@ Error.147=Alguns arxius no poden ser moguts (veure detalls per més informació)
 Error.148=El camp Year és desconegut
 Error.149=El camp Album és desconegut
 Error.150=El camp Artist és desconegut
-Error.151=El camp TrackName és desconegut
 Error.152=El camp TrackOrder és desconegut
 Error.153=El camp Style és desconegut
 Error.154=No es pot renombrar l'arxiu, revisa algun caràcter erroni al nom de l'arxiu o a les tags
@@ -256,18 +239,12 @@ Error.160=Arxiu no mogut. El font i el destí eren el mateix
 Error.161=No es pot escriure al directori, comprovar permisos
 Error.162=Aquesta propietat d'usuari ja existeix
 Error.163=Error restaurant les vistes per defecte
-Error.164=No hi ha pistes accesibles per a l'ambient :
 Error.165=Error al path de la col.lecció, el directori o no existeix o no te permisos d'escriptura
 Error.166=Album buit, no es pot capturar la caràtula
 Error.167=No es pot crear l'informe
-Error.168=No s'ha trobat arxius duplicats
-Error.169=Operació amb errors. Tenir en compte que aquesta operació requereix una connexió a internet per obtenir la llista d'emisores de ràdio.
-Error.170=Error reproduint webradio
 Error.171=No s'ha definit una font de sincronització per a aquest dispossitiu, assigna-la utilitzant l'assistent de configuració de dispossitius (A la vista de Dispossitiu, clickar sobre el dispossitiu).
 Error.172=S'ha trobat un error mentre s'esborraba el següent arxiu(s):
-Error.173=S'ha trobat un error mentre s'esborraba el següent directori(s):
 Error.174=Error accedint a la web de Freedb , revisa la teva conexió de xarxa 
-Error.175=Operació cancelada
 
 
 #Warnings
@@ -280,7 +257,7 @@ Warning.5=El directori de destí ja existeix, alguns arxius es sobreescriuiràn,
 
 #--- Strings by class ---
 ParameterView.0=Duració d l'historial:
-ParameterView.2=Canvia el temps en dias que vols guardar traces de pistes escoltades. Canviar a -1 si no vols veure cap historial i 0 si vols tenir historial permanent
+ParameterView.2=Canvia el temps en dias que vols guardar traces de pistes escoltades. Canviar a 0 si no vols veure cap historial i -1 si vols tenir historial permanent
 ParameterView.3=Esborrar historial
 ParameterView.4=Esborrar historial
 ParameterView.8=Historial/Valoracions
@@ -302,8 +279,6 @@ ParameterView.29=Abans de sortir de Jajuk
 ParameterView.30=Preguntar en sortir de Jajuk
 ParameterView.33=Opcions
 ParameterView.35=Oculta pistes situades en dispositius desmontatats
-ParameterView.36=Reiniciar quan s'arriba al final de la col·lecció
-ParameterView.37=Reinicia la col·lecció quan s'arriba al final en mode continu
 ParameterView.38=Idioma:
 ParameterView.42=Idioma de la interfaç
 ParameterView.43=Tema :
@@ -323,8 +298,6 @@ ParameterView.85=Aplicar
 ParameterView.86=Restaurar valors per defecte
 ParameterView.87=Preferències
 ParameterView.98=Patrons
-ParameterView.99=Executar un recorregut profun per les tags
-ParameterView.100=<html>Forçar a Jajuk a rellegir les id3 tags actuals.<p>Això pot ser util per refrescar les tags que s'hagin modificat utilitzant un altre programa</html>
 ParameterView.101=Utilitzar directori pare com a nom d'àlbum
 ParameterView.102=Jajuk utilitza el directori pare com el nom d'un àlbum per a una pista si no pot obtenir-ho de les id3 tags
 ParameterView.109=Preferències gravades
@@ -336,7 +309,6 @@ ParameterView.114=Usar expresions regulars (Format Regexp) en los filtros de las
 ParameterView.115=Avançada
 ParameterView.116=Backup del arxiu de col·lecció
 ParameterView.117=Marcar si vols fer backup de la teva col.lecció a l'arxiu collection-<date>.xml
-ParameterView.118=Tamany de Backup (Mb)
 ParameterView.119=Tamany de Backup (Mb) (Mb)
 ParameterView.120=Charset de la col·lecció
 ParameterView.121=Charset de la col·lecció. UTF-16 està optimitzat per a idiomes asiàtics y UTF-8 està optimitzat per a idiomes europeos.
@@ -368,15 +340,11 @@ ParameterView.158=Alta
 ParameterView.159=Caràtules
 ParameterView.160=Timeout de Conexió (seg)
 ParameterView.161=Timeout de Conexió in segons : l'operació falla si l'altre part no contesta en aquest temps
-ParameterView.162=Timout de transferència (seg).
-ParameterView.163=Timeout de transferència (seg) : l'operació falla si les dades no s'han descarregat en aquest temps
 ParameterView.164=Abans d'eliminar un dispositiu
 ParameterView.165=Preguntar abans d'eliminar un dispositiu
 ParameterView.166=Barrejar caràtules
 ParameterView.167=Mostrar una caràtula aleatòria
 ParameterView.168=Artista
-ParameterView.169=Precarregar caràtules
-ParameterView.170=Precarregar totes les caràtules disponibles quan sigui possible
 ParameterView.171=Abans d'esborrar físicament una caràtula
 ParameterView.172=Preguntar abans d'esborrar físicament una caràtula
 ParameterView.177=Número visible de pistes planificades
@@ -454,7 +422,6 @@ ParameterView.251=Històric resetejat correctament
 ParameterView.252=Valoracions i temps de reproducció resetejats correctament
 ParameterView.253=Preferències resetejades correctament
 
-Main.21=Confirmació
 Main.22=Descarregant MPlayer
 
 Player.0=Esperant per la línea d'audio (ocupada)
@@ -548,8 +515,6 @@ CommandJPanel.1=Mode repetició: Reprodueix una pista en bucle
 CommandJPanel.2=Mode aleatori: Reprodueix aleatòriament les pistes sel·leccionades
 CommandJPanel.3=Mode continu: Continua reproduïnt les pistas següents quan acaba
 CommandJPanel.4=Mode Introducció: Reprodueix un fragment de les pistes. Inici i temps es poden canviar des de la vista de paràmetres
-CommandJPanel.5=Reproduïr una selecció aleatòria de la col·lecció sencera
-CommandJPanel.6=Reproduïr pistas favoritas
 CommandJPanel.7=So off
 CommandJPanel.8=<html>Reproduïr pista anterior a la selecció actual<br>Mays+Botó esquerra llença l'àlbum posterior</html>
 CommandJPanel.9=<html>Reproduïr pista següent a la selecció actual<br>Mays+Botó esquerra llença l'àlbum anterior</html>
@@ -566,12 +531,9 @@ CommandJPanel.19=Administrar Ambients
 CommandJPanel.20=Pista per pista
 CommandJPanel.21=Àlbum per àlbum
 CommandJPanel.22=Àlbum per àlbum
-CommandJPanel.23=Click per a netejar la cerca
-CommandJPanel.24=Configurar web radios
 CommandJPanel.25=Engegar la radio
 
 InformationJPanel.5=Temps total de la cua reproduïr [Nb de pistes restants]
-InformationJPanel.6=Bitrate de pista
 InformationJPanel.7=Progressió de pista actual
 #song name BY artist ON album name
 InformationJPanel.8=%title per %artist a %album
@@ -580,21 +542,17 @@ AbstractPlaylistEditorView.0=Títol
 AbstractPlaylistEditorView.1=Localització
 AbstractPlaylistEditorView.2=Reproduïr aquesta playlist
 AbstractPlaylistEditorView.3=Gravar esta playlist
-AbstractPlaylistEditorView.4=Afegir element a aquesta playlist
 AbstractPlaylistEditorView.5=Esborrar element d'aquesta playlist
 AbstractPlaylistEditorView.6=Moure amunt
 AbstractPlaylistEditorView.7=Moure avall
 AbstractPlaylistEditorView.9=Esborrar aquesta playlist
 AbstractPlaylistEditorView.10=Afegir una pista aleatòria a aquesta playlist
 AbstractPlaylistEditorView.15=Playlists
-AbstractPlaylistEditorView.17=Estàs a punt de les següents playlists :
 AbstractPlaylistEditorView.18=Pista en cua
 AbstractPlaylistEditorView.19=Pista repetida
 AbstractPlaylistEditorView.20=Pista planificada
-AbstractPlaylistEditorView.21=Pista de playlist
 AbstractPlaylistEditorView.22=Playlist gravada
 AbstractPlaylistEditorView.27=Preparar Fiesta
-AbstractPlaylistEditorView.28=directori creat amb èxit
 
 StatView.0=Altres
 StatView.1=Géneres
@@ -639,7 +597,6 @@ TracksTreeView.41=menys de dos anys
 TracksTreeView.42=menys de cinc anys
 TracksTreeView.43=menys de deu anys
 TracksTreeView.44=menys de tres messs
-TracksTreeView.45=Any
 
 CoverView.2=Esborrar del disc aquesta caràtula
 CoverView.3=Caràtula
@@ -648,11 +605,8 @@ CoverView.5=Imatge següent del disc i/o de la Web si l'opció d'Auto-Caràtula
 CoverView.6=Gravar caràtula amb el seu nom original
 CoverView.7=Gravar caràtula com ...
 CoverView.8=Utilitzar aquesta caràtula com la caràtula per defecte d'aquest àlbum
-CoverView.9=caràtules
 CoverView.10=Gravar caràtula com
 CoverView.11=Caràtula gravada
-CoverView.12=Àlbum
-CoverView.13=Títol
 
 AnimationView.0=Animació
 
@@ -664,14 +618,11 @@ FilesTreeView.7=Esborrar
 FilesTreeView.14=Desincronitzar
 FilesTreeView.15=Resincronitzar
 FilesTreeView.16=Crear Playlist
-FilesTreeView.17=Copiar
-FilesTreeView.18=Tallar
 FilesTreeView.28=Montar
 FilesTreeView.29=Desmontar
 FilesTreeView.30=Forçar Refrescar
 FilesTreeView.31=Sincronitzar
 FilesTreeView.32=Provar
-FilesTreeView.33=Crear playlists
 FilesTreeView.40=Copiar
 FilesTreeView.41=Tallar
 FilesTreeView.42=Enganxar
@@ -698,9 +649,6 @@ TracksTableView.15=Afegir a Favorits
 AbstractTableView.0=Filtre:
 AbstractTableView.1=Propietat a filtrar
 AbstractTableView.3=Valor utilitzat pel filtre
-AbstractTableView.4=Aplicar filtre
-AbstractTableView.5=Netejar el filtre
-AbstractTableView.6=Aplicar filtre avançat
 AbstractTableView.7=conté:
 AbstractTableView.8=Qualsevol
 AbstractTableView.10=(No disponible)
@@ -711,36 +659,15 @@ AboutView.8=Llicència
 AboutView.9=Sistema
 AboutView.10=Sobre
 
-PhysicalPlaylistRepositoryView.0=Reproduïr
-PhysicalPlaylistRepositoryView.1=Editar
 PhysicalPlaylistRepositoryView.2=Guardar com
-PhysicalPlaylistRepositoryView.3=Esborrar
-PhysicalPlaylistRepositoryView.4=Propietats
-PhysicalPlaylistRepositoryView.6=Playlists físiques
-PhysicalPlaylistRepositoryView.8=Intel.ligents
 PhysicalPlaylistRepositoryView.9=Encuar
-PhysicalPlaylistRepositoryView.10=Cua actual: drag and drop una pista cap a ella para Reproduïr
-PhysicalPlaylistRepositoryView.11=Nova
-PhysicalPlaylistRepositoryView.12=Nova playlist: drag and drop una pista cap a ella para aàadir fitxers
-PhysicalPlaylistRepositoryView.13=Favorits
-PhysicalPlaylistRepositoryView.14=Afegir playlist a Favorits: drag and drop una pista cap a ella per guardar-la
-PhysicalPlaylistRepositoryView.15=BestOf
-PhysicalPlaylistRepositoryView.16=Best of playlist : conté les millors pistes
-PhysicalPlaylistRepositoryView.17=Novetats
-PhysicalPlaylistRepositoryView.18=Playlist de Novetatas: conté les pistes més noves de la col.lecció
 
 FilesTableView.0=Taula d'arxius
 FilesTableView.15=Reproduïr un directori
 #Dev: do not use ID = 16, next label is FilesTableView.17 
 
-DeviceView.0=Afegir un dispositiu
 DeviceView.1=Eliminar un dispositiu desmontat (no esborra res del disc)
 DeviceView.2=Propietats del dispositiu sel·leccionat
-DeviceView.3=Montar dispositiu sel·leccionat
-DeviceView.4=Desmontar dispositiu sel·leccionat
-DeviceView.5=Probar disponibilidad del dispositiu sel·leccionat
-DeviceView.6=Forçar refrescar dispositiu sel·leccionat
-DeviceView.7=Sincronizar dispositiu sel·leccionat
 DeviceView.8=Montar
 DeviceView.9=Desmontar
 DeviceView.10=Provar
@@ -781,9 +708,6 @@ JajukWindow.29=Pista anterior. Amb el ratolí, botó esquerra +[Mays]: àlbum an
 JajukWindow.30=Pista següent. Amb el ratolí, botó esquerra +[Mays]: àlbum següent.
 JajukWindow.31=Reproduïr novetats de la col·lecció entera
 JajukWindow.32=Continuar àlbum: acabar de reproduïr aquest àlbum
-JajukWindow.33=Volum
-JajukWindow.34=Posició
-JajukWindow.35=Reproduïnt:
 JajukWindow.36=Ambient actual:
 JajukWindow.37=Sense Ambient seleccionat
 #Do not use JajukWindow.38, next is JajukWindow.39 
@@ -794,25 +718,18 @@ FirstTimeWizard.0=Inici ráapid
 FirstTimeWizard.1=<html><p><br>Benvingut! Aquest assistent t'ajudará en la creació de la teva col.lecció.</p></html>
 FirstTimeWizard.2=<html>Selecciona la localització de la música</html>
 FirstTimeWizard.3=<html>Vols obtenir les caràtules online<br>(es pot obrir una connexió a internet automàticament) ?</html>
-FirstTimeWizard.4=Mostrar la ajuda ara ?
 FirstTimeWizard.5=Si us plau, esculliu un directori
 FirstTimeWizard.6=Preferències avançades
 FirstTimeWizard.7=Establir directori d'àrea de treball de Jajuk :
 
-HelpView.2=Ajuda
 
 DownloadManager.0=<html>Jajuk necessita la contrasenya del teu proxy HTTP per a descarregar caràtules<br>Si no las vols, si us plau,  canvia la teva configuració a la pestanya Caràtules de la vista de Preferències<br>Si no tens proxy, canvia els ajustos a la pestanya de Xarxa de la vista de Preferències</html>
-DownloadManager.1=Contrasenya necessària
 
-PropertiesWizard.0=Propietats de ...
 PropertiesWizard.1=Propietat
 PropertiesWizard.2=Valor
-PropertiesWizard.3=Editable?
 PropertiesWizard.4=Enllaç
 PropertiesWizard.6=Selecció
-PropertiesWizard.7=Tipus
 PropertiesWizard.8=Propietat canviada correctament
-PropertiesWizard.9=Propietat no editable per aquesta selecció
 PropertiesWizard.10=Les propietats s' han canviat
 PropertiesWizard.11=Actualitzant  tag a:
 PropertiesWizard.12=Enllaça un element donat Link a unes propietats donades
@@ -843,9 +760,6 @@ CatalogView.3=Refrescar catàleg
 CatalogView.4=Tamany de miniatures:
 CatalogView.5=Creada miniatura per:
 CatalogView.7=Seleccionar caràtula
-CatalogView.8=Cap caràtula trobada
-CatalogView.9=Anterior
-CatalogView.10=Següent
 CatalogView.11=Pàgina:
 CatalogView.12=Mostar pàgina anterior de miniatures
 CatalogView.13=Mostar pàgina següent de miniatures
@@ -868,17 +782,12 @@ TipOfTheDayView.0=Consell del dia
 TipOfTheDayView.1=Sabies... ?
 TipOfTheDayView.2=Mostrar a l'inici ?
 
-CDDBWizard.0=Aceptar
 CDDBWizard.1=Arxiu
 CDDBWizard.2=Nom de pista actual
 CDDBWizard.3=Nom d'àlbum actual
 CDDBWizard.4=Nom de pista proposat
 CDDBWizard.5=Nom d'àlbum proposat :
-CDDBWizard.6=Fet ! Trobat
-CDDBWizard.7=possibles coincidències
 CDDBWizard.12=No trobada cap coincidència !
-CDDBWizard.14=Aquest directori no conté cap arxiu
-CDDBWizard.16=Estil:
 CDDBWizard.17=Trobada coincidència exacta !
 CDDBWizard.18=Coincidències
 CDDBWizard.19=Obtenir Tags Online
@@ -896,11 +805,7 @@ DigitalDJWizard.7=Utilitzar puntuacions
 DigitalDJWizard.8=Nivell de puntuació:
 DigitalDJWizard.9=Cross fade (seg):
 DigitalDJWizard.10=Pistes només reproduïdes una vegada
-DigitalDJWizard.11=Tirar
-DigitalDJWizard.12=Des d'Estils
-DigitalDJWizard.13=A Estils
 DigitalDJWizard.14=Selecció d'Estils (Es poden fer seleccions múltiples)
-DigitalDJWizard.15=Número de pistes
 DigitalDJWizard.16=¿ Vols ?
 DigitalDJWizard.17=¿ Crear un nou DJ ?
 DigitalDJWizard.18=¿ Canviar un DJ existent ?
@@ -1008,7 +913,6 @@ ReportAction.19=Anar a:
 ActionMove.0=Enganxar
 
 ActionRefresh.0=Forçar Refrescar
-ActionRefresh.1=Refrescant directori
 
 RenameAction.0=Renombrar
 RenameAction.1=Si et plau, entra el nou nom per a aquest arxiu:
@@ -1026,24 +930,10 @@ ActionDelete.1=Directoris eliminats
 FindDuplicateFilesAction.0=No s'han trobat arxius duplicats.
 FindDuplicateFilesAction.1=Arxius duplicats trobats
 
-RefreshDialog.0=Preparando actualización de dispositivo...
 RefreshDialog.1=Actualizando dispositivo
 RefreshDialog.2=Actualizando dispositivo: 
 RefreshDialog.3=Limpiando los archivos antiguos
 
-RadioWizard.0=Selecciona o crea una web radio
-RadioWizard.1=Administrar web radios
-RadioWizard.2=Nova
-RadioWizard.3=Esborrar
-RadioWizard.4=Per defecte
-RadioWizard.5=Una web radio amb aquest nom ja existeix
-RadioWizard.6=Nom de Web Radio
-RadioWizard.7=Assistent de Web Radio
-RadioWizard.8=URL
-RadioWizard.9=Nom
-RadioWizard.10=URL incorrecta
-RadioWizard.11=Nom i URL són obligatoris
-
 UpdateManager.0=Una nova versió de Jajuk (
 UpdateManager.1=) s'ha trobat, es pot descarregar de http://jajuk.info
 UpdateManager.2=No hi ha nova versió per ara
diff --git a/src/main/java/org/jajuk/i18n/jajuk_cs.properties b/src/main/resources/org/jajuk/i18n/jajuk_cs.properties
similarity index 90%
rename from src/main/java/org/jajuk/i18n/jajuk_cs.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_cs.properties
index 28078d6..b433a8b 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_cs.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_cs.properties
@@ -31,9 +31,7 @@ Hide=Příště nezobrazovat
 Path=Zvolte prosím cestu
 Later=Později
 Default=Výchozí
-All=Vše
 YestoAll=Ano všem
-Maximize=Maximalizovat
 Purge=Vyčistit
 
 #--- Wizard Strings --- 
@@ -57,7 +55,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
 Type.mac=Monkey's Audio format
 Type.radio=Web Radio
 Type.video=Video
@@ -68,7 +65,6 @@ unknown_artist=Neznámý
 unknown_album=Neznámé
 unknown_genre=Neznámý
 unknown_year=Neznámý
-unknown_album-artist=Neznámý
 
 various_artist=Various artist
 
@@ -87,11 +83,9 @@ Confirmation_clear_history=Opravdu chcete odstranit historii?
 Confirmation_reset_ratings=Opravdu chcete nastavit hodnocení všech skladeb na nulu ?
 Confirmation_refactor_files=Opravdu chcete přejmenovat vybraný soubor(y) ?
 Confirmation_restore_all=Kompletní obnovení náhledů vyžaduje restart Jajuku. Chcete aplikaci ukončit ?
-Confirmation_defaults_radios=Budou odstraněny všechny dříve vytvořené stanice rádia. Jste si jist ?
 Confirmation_delete_empty_dirs=Následující adresář je prázdný. Chcete jej odstranit ?
 Confirmation_file_overwrite=Tento soubor již existuje. Chcete jej přepsat ?
 Confirmation_file_number=soubor(y) bude odstraněn.
-Confirmation_alarm_stop=Opravdu chcete zastavit tento alarm?
 Confirmation_defaults=Nastavení všech voleb záložek bude změněno na výchozí hodnoty (nikoliv pouze aktuálních). Jste si jist ?
 Confirmation_rebuild_thumbs=Budou obnoveny všechny miniatury všech Vašich alb, což může u velké kolekce chvíli trvat. Jste si jist ?  
 Confirmation_reset_preferences=Opravdu obnovit předvolby skladeb ?
@@ -109,7 +103,6 @@ Perspective_Description_Files=Soubory
 Perspective_Description_Tracks=Skladby
 Perspective_Description_Configuration=Nastavení
 Perspective_Description_Statistics=Statistiky
-Perspective_Description_Help=Nápověda
 Perspective_Description_Display=Zobrazit
 Perspective_Description_Albums=Alba
 Perspective_Description_Info=Informace
@@ -200,17 +193,13 @@ Error.017=Chyba analýzy playlistu
 Error.018=Nelze nalézt dostupné skladby
 Error.019=Existující zařízení tento název již má
 Error.020=IO chyba kopírování souboru. Možná je plný disk
-Error.021=URL pole je povinné. Např: 'd:\music' v MS Windows, '/home/foo/music' v Unixu 
-Error.022=Pole Název je povinné. Např: 'Hard drive', 'CD ROCK' 
 Error.023=Nelze přehrát skladbu po spuštění
 Error.024=Nelze zapisovat do souboru
 Error.025=Jeden ze souborů, který chcete načíst je na odpojeném zařízení 
 Error.026=Chyba registrace přehrávačů
 Error.027=Synchronizace přerušena
 Error.028=Chyba uložení playlistu
-Error.029=Existující zařízení je nadřazený adresář tohoto zařízení, má stejnou cestu, nebo je podřízený adresář
 Error.030=Příliš mnoho spojení selhalo. Jajuk přerušil online hledání obalů
-Error.101=Zařízení neexistuje, nebo je nedostupné
 Error.102=Chyba
 Error.103=Chyba načítání informací tagu
 Error.104=Chyba zápisu informací tagu
@@ -218,31 +207,25 @@ Error.105=Klíč Resource Bundle nenalezen
 Error.106=Neznámá vyjímka
 Error.107=Zařízení se již obnovuje, nebo synchronizuje
 Error.108=Chyba analýzy prohlíženého souboru
-Error.109=Přehrávač, nebo implementační třída tagu je nedostupná
 Error.110=Tento název vlastnosti je vyhrazen interním systémem Jajuku. Zvolte prosím jiný
 Error.111=Zařízení je již připojeno
 Error.112=Zařízení nelze připojit
 Error.113=Nemohu uložit uživatelské nastavení
 Error.114=Nemohu načíst uživatelské nastavení
-Error.118=Chyba zpracování požadavku události
 Error.119=Soubor historie neexistuje, nebo chyba syntaxe
 Error.120=K zařízení nelze přistupovat: buď není připojeno, právě se obnovuje nebo synchronizuje
 Error.121=Zařízení je používáno a nelze jej odpojit
 Error.122=Chyba FIFO
-Error.123=Chyba nastavení tématu
-Error.124=Jajuk je již spuštěn. Současně může být spuštěna pouze jedna instance programu
 Error.125=Zařízení je již odpojeno
 Error.126=Hledání s tímto audio formátem není podporováno
 Error.127=Pro zadaný časový úsek nebyly nalezeny žádné novinky. Časový limit můžete nastavit v okně Předvolby
 Error.128=Aktuální skladba je vůbec první v kolekci. Předchozí skladba není dostupná
-Error.129=Chyba načítání obrázku obalu
 Error.131=Soubor nelze odstranit
 Error.133=Soubor s Vaší kolekcí byl poškozen z neznámého důvodu. Jajuk zajistil obnovení ze záložního souboru
 Error.134=Soubor nelze přejmenovat
 Error.135=Soubor neexistuje
 Error.136=Úloha selhala
 Error.137=Neplatný formát
-Error.138=Některé soubory mapované těmito skladbami jsou umístěné na odpojeném zařízení a proto nebyly změněny. 
 Error.140=Neplatný řetězec: nesmí obsahovat znaky & ' " < nebo >
 Error.141=Tento playlist je umístěn na odpojeném nebo obnovujícím se zařízení a proto je nedostupný
 Error.142=Tento playlist odkazuje na neexistující skladby, nebo na skladby umístěné na Jajuku neznámé zařízení. Tyto skladby budou ignorovány.
@@ -254,7 +237,6 @@ Error.147=Některé soubory nelze přesunout (pro více informací si přečtět
 Error.148=Pole Rok je neznámé
 Error.149=Pole Album je neznámé
 Error.150=Pole Umělec je neznámé
-Error.151=Název skladby je neznámý
 Error.152=Pole Skladba je neznámé
 Error.153=Pole Žánr je neznámé
 Error.154=Soubor nelze přejmenovat. Zkontrolujte zakázané znaky v názvu souboru nebo tagu.
@@ -267,22 +249,17 @@ Error.160=Soubor nebyl přesunut. Název zdrojového a cílového souboru jsou s
 Error.161=Do adresáře nelze zapisovat, zkontrolujte oprávnění.
 Error.162=Tato uživatelská vlastnost již existuje
 Error.163=Chyba obnovení výchozího vzhledu
-Error.164=Pro tento hudební styl nelze nalézt dostupné skladby :
 Error.165=Neplatná cesta kolekce. Adresář nelze nalézt, nebo do něj nelze zapisovat
 Error.166=Prázdné album, obal nelze získat
 Error.167=Zprávu nelze vytvořit
-Error.168=Nenalezeny žádné duplicitní soubory
-Error.169=Úloha selhala. Pozor, tato úloha potřebuje pro získání seznamu stanic rádia připojení k internetu.
-Error.170=Chyba přehrávání webového rádia
 Error.171=Pro toto zařízení není momentálně nastaven zdroj synchronizace. Nastavte jej pomocí průvodce nastavením zařízení (v okně Zařízení klikněte na Nové zařízení).
 Error.172=Při odstraňování následujících souborů se vyskytla chyba:
-Error.173=Při odstraňování následujících adresářů se vyskytla chyba:
 Error.174=Chyba přístupu na webovou stránku Freedb. Ověřte Vaše síťové připojení 
-Error.175=Úloha zrušena
 Error.176=Chyba při vytváření playlistu
 Error.177=Zadejte prosím platný čas ve formátu (HH24:MM:SS)
 Error.179=Systémový správce souborů nelze otevřít, zkuste nastavit cestu v okně Předvolby na záložce Pokročilé
 Error.180=Chyba při kopírování souborů
+Error.184=Neplatná hodnota : interval obnovení může být 0 nebo číslo >= 0.5.
 
 #Warnings
 Warning.0=MPlayer nenalezen. Některé audio a video formáty (flac, wma, aac, mpg2 ... ) byly zakázány. Pokud je již MPlayer nainstalován, nastavte prosím ručně cestu v okně Předvolby na záložce Pokročilé.
@@ -297,7 +274,7 @@ Warning.7=Jajuk zjistil, že je potřeba obnovit zařízení kvůli aktualizaci.
 
 #--- Strings by class ---
 ParameterView.0=Délka historie: 
-ParameterView.2=Nastavení počtu dnů zachování historie přehrávaných skladeb. Zadejte -1 pokud nechcete historii žádnou, nebo 0 pokud má být historie stálá.
+ParameterView.2=Nastavení počtu dnů zachování historie přehrávaných skladeb. Zadejte 0 pokud nechcete historii žádnou, nebo -1 pokud má být historie stálá.
 ParameterView.3=Smazat historii
 ParameterView.4=Smazat historii
 ParameterView.8=Historie / Hodnocení
@@ -319,8 +296,6 @@ ParameterView.29=Před ukončením Jajuku
 ParameterView.30=Dotázat se před ukončením Jajuku
 ParameterView.33=Možnosti
 ParameterView.35=Nezobrazí skladby na odpojených zařízeních
-ParameterView.36=Obnovit po dosažení konce kolekce
-ParameterView.37=Po dosažení konce obnoví celou kolekci v módu Opakovat
 ParameterView.38=Jazyk:
 ParameterView.42=Vyberte jazykové rozhraní
 ParameterView.43=Téma: 
@@ -340,8 +315,6 @@ ParameterView.85=Použít
 ParameterView.86=Obnovit výchozí
 ParameterView.87=Předvolby
 ParameterView.98=Předlohy
-ParameterView.99=Provést důkladné skenování tagů
-ParameterView.100=<html>Přinutí Jajuk znovu načíst aktuální id3 tagy.<p>To může být užitečné k aktualizaci tagů upravených jiným programem.</p></html>
 ParameterView.101=Použít název nadřazeného adresáře jako název alba
 ParameterView.102=Pokud je volba vybrána, název nadřazeného adresáře bude použit jako název alba pro skladby, které nepoužívají ID3 tag. 
 ParameterView.109=Předvolby uloženy
@@ -353,7 +326,6 @@ ParameterView.114=Používání regulárních výrazů (formát Regexp) v tabulc
 ParameterView.115=Pokročilé
 ParameterView.116=Zálohovat soubor kolekce
 ParameterView.117=Vyberte, pokud si přejete zálohovat Vaší kolekci do souboru Kolekce-<datum>.xml
-ParameterView.118=Velikost zálohy (MB)
 ParameterView.119=Velikost zálohy (MB)
 ParameterView.120=Znaková sada kolekce
 ParameterView.121=Znaková sada kolekce. UTF-16 je optimalizovaná pro Asijské jazyky a UTF-8 pro Evropské jazyky.
@@ -383,14 +355,10 @@ ParameterView.158=Vysoká (hledá přesné slovní spojení)
 ParameterView.159=Obaly
 ParameterView.160=Časový limit spojení (sekund)
 ParameterView.161=Časový limit spojení v sekundách: Vzdálená úloha selhala, pokud druhá strana v této době neodpoví.
-ParameterView.162=Časový limit přenosu (sekund) 
-ParameterView.163=Časový limit přenosu (sekund): Vzdálená úloha selhala, pokud nejsou požadovaná data v této době kompletně stažena.
 ParameterView.164=Před odstraněním zařízení
 ParameterView.165=Dotáže se před odstraněním zařízení
 ParameterView.166=Náhodné obaly
 ParameterView.167=Zobrazí náhodný obal
-ParameterView.169=Načíst obaly
-ParameterView.170=Pokud možno, načte s předstihem všechny dostupné obaly
 ParameterView.171=Před odstraněním obalu z disku
 ParameterView.172=Dotáže se před odstraněním obalu z disku
 ParameterView.177=Počet viditelných plánovaných skladeb
@@ -464,8 +432,6 @@ ParameterView.250=Obnoví uživatelsky definované předvolby
 ParameterView.251=Historie úspěšně obnovena
 ParameterView.252=Hodnocení a čas přehrávání úspěšně obnoveny
 ParameterView.253=Předvolby úspěšně obnoveny
-ParameterView.254=Použít zkratky Windows
-ParameterView.255=[Pouze Windows 32 bit] Pokud je volby vybrána, vynutí mplayer použití názvů souborů ve zkrácené cestě Windows k pevnému určení některého umístění
 ParameterView.256=Výchozí názvy souborů obalů
 ParameterView.257=Jajuk vyhledá soubor s obrázkem obalu jejihož název obsahuje tento text jako výchozí obal (<filename>;<filename>;...)
 ParameterView.260=Uložit obaly vhodně pro průzkumník Windows
@@ -494,7 +460,6 @@ ParameterView.282=Pokud je volba vybrána, bude minimalizované hlavní okno Jaj
 
 
 
-Main.21=Potvzení
 Main.22=Stahuji MPlayer
 
 Player.0=Čekám na linku audio (je obsazená)
@@ -541,7 +506,6 @@ DeviceWizard.52=Vybrat zdroj zařízení
 DeviceWizard.53=Obnovit zařízení po
 #limited string size
 DeviceWizard.54=min
-DeviceWizard.55=Neplatná hodnota : interval obnovení může být 0 nebo číslo >= 0.5.
 
 JajukJMenuBar.0=Soubor
 JajukJMenuBar.1=Otevřít soubor
@@ -591,8 +555,6 @@ CommandJPanel.1=[Ctrl-t] Opakovat: Přehrává skladby ve smyčce
 CommandJPanel.2=[Ctrl-h] Náhodně: Přehrává náhodně vybrané skladby
 CommandJPanel.3=Pokračovat: Přehrává plánované skladby až do konce
 CommandJPanel.4=Úryvky: Přehraje pouze část z každé skladby. Čas a začátek lze nastavit v náhledu Nastavení
-CommandJPanel.5=Přehraje náhodný výběr z celé kolekce
-CommandJPanel.6=Přehraje Vaše oblíbené skladby
 CommandJPanel.8=<html>[F9] Předchozí: přehraje předchozí skladbu ve výběru<br />Shift + kliknutí spustí předchozí album<br />Ctrl + kliknutí znovu přehraje aktuální album</html>
 CommandJPanel.9=<html>[F10] Další: přehraje další skladbu ve výběru<br />Shift + kliknutí spustí další album</html>
 CommandJPanel.10=<html>[Alt-gr F9] Zpět: rychle zpět v aktuální skladbě<br />Shift + kliknutí pro opakování</html>
@@ -605,14 +567,11 @@ CommandJPanel.19=Spravovat hudební styly
 CommandJPanel.20=Skladbu za skladbou
 CommandJPanel.21=Náhodně album za albem
 CommandJPanel.22=Album za albem
-CommandJPanel.23=Klikněte pro smazání vyhledávání
-CommandJPanel.24=Nastavit webová rádia
 CommandJPanel.25=Zapnout rádio
 CommandJPanel.26=Režim Opakovat vše: Přehrává frontu ve smyčce
 CommandJPanel.27=Režim Karaoke, utlumí hlasy z přehrávané skladby (použít lze pouze na skladbu následují po přehrávané)
 
 InformationJPanel.5=Celkový zbývající čas fronty [počet zbývajících skladeb]
-InformationJPanel.6=Bitový tok skladby
 InformationJPanel.7=Průběh aktuální skladby
 # %xxx are patterns, don't translate them !
 InformationJPanel.8=%title z %artist v %album
@@ -624,21 +583,17 @@ AbstractPlaylistEditorView.0=Název
 AbstractPlaylistEditorView.1=Umístění
 AbstractPlaylistEditorView.2=Spustit tento playlist
 AbstractPlaylistEditorView.3=Uložit tento playlist
-AbstractPlaylistEditorView.4=Přidat položku do playlistu
 AbstractPlaylistEditorView.5=Odstranit položku z playlistu
 AbstractPlaylistEditorView.6=Nahoru
 AbstractPlaylistEditorView.7=Dolů
 AbstractPlaylistEditorView.9=Smazat tento playlist
 AbstractPlaylistEditorView.10=Přidat náhodnou skladbu do playlistu
 AbstractPlaylistEditorView.15=Playlisty
-AbstractPlaylistEditorView.17=Chystáte se aktualizovat následující playlisty:
 AbstractPlaylistEditorView.18=Skladba ve frontě
 AbstractPlaylistEditorView.19=Opakovaná skladba
 AbstractPlaylistEditorView.20=Plánovaná skladba
-AbstractPlaylistEditorView.21=Název Playlistu
 AbstractPlaylistEditorView.22=Playlist uložen
 AbstractPlaylistEditorView.27=Připravit párty
-AbstractPlaylistEditorView.28=adresář vytvořen v
 
 StatView.0=Ostatní
 StatView.1=Žánry
@@ -685,7 +640,6 @@ TracksTreeView.41=méně než 2 roky
 TracksTreeView.42=méně než 5 let
 TracksTreeView.43=méně než 10 let
 TracksTreeView.44=méně než 3 měsíce
-TracksTreeView.45=Rok
 
 CoverView.2=Odstranit obal z disku
 CoverView.3=Obal
@@ -693,11 +647,8 @@ CoverView.4=Předchozí obrázek z disku a/nebo webu, pokud je vybrána volba Au
 CoverView.5=Další obrázek z disku a/nebo webu, pokud je vybrána volba Automatický obal
 CoverView.6=<html><p>Uložit obal s původním názvem</p><p>S CTRL: Uložit obal jako...</p></html>
 CoverView.8=Použít tento obal jako výchozí pro toto album
-CoverView.9=obaly
 CoverView.10=Uložit obal jako
 CoverView.11=Obal uložen
-CoverView.12=Album 
-CoverView.13=Název
 
 AnimationView.0=Animace
 
@@ -709,14 +660,11 @@ FilesTreeView.7=Odstranit
 FilesTreeView.14=Desynchronizovat
 FilesTreeView.15=Znovu synchronizovat
 FilesTreeView.16=Vytvořit playlist
-FilesTreeView.17=Kopírovat
-FilesTreeView.18=Vyjmout
 FilesTreeView.28=Připojit
 FilesTreeView.29=Odpojit
 FilesTreeView.30=Vynutit obnovení
 FilesTreeView.31=Synchronizovat
 FilesTreeView.32=Testovat
-FilesTreeView.33=Vytvořit playlisty
 FilesTreeView.40=Kopírovat
 FilesTreeView.41=Vyjmout
 FilesTreeView.42=Vložit
@@ -744,9 +692,6 @@ TracksTableView.16=Přehrát další
 AbstractTableView.0=Filtr:
 AbstractTableView.1=Vlastnosti filtrování
 AbstractTableView.3=Hodnota použitá filtrem
-AbstractTableView.4=Použít filtr
-AbstractTableView.5=Odstranit filtr
-AbstractTableView.6=Použít pokročilý filtr
 AbstractTableView.7=Obsahuje:
 AbstractTableView.8=Žádný
 AbstractTableView.10=(Nedostupné)
@@ -756,39 +701,17 @@ AboutView.7=O programu
 AboutView.8=Licence
 AboutView.9=Systém
 AboutView.10=O programu
-AboutView.11=<html>Copyright 2003-2011<br>Jajuk team</html>"
+AboutView.11=<html>Copyright 2003-2012<br>Jajuk team</html>"
 
-PhysicalPlaylistRepositoryView.0=Přehrát
-PhysicalPlaylistRepositoryView.1=Upravit
 PhysicalPlaylistRepositoryView.2=Uložit jako
-PhysicalPlaylistRepositoryView.3=Odstranit
-PhysicalPlaylistRepositoryView.4=Vlastnosti
-PhysicalPlaylistRepositoryView.6=Fyzické playlisty
-PhysicalPlaylistRepositoryView.8=Přehrávání
 PhysicalPlaylistRepositoryView.9=Přehrávání fronty
-PhysicalPlaylistRepositoryView.10=Aktuální fronta: přetáhněte skladby k přehrávání
-PhysicalPlaylistRepositoryView.11=Nový
-PhysicalPlaylistRepositoryView.12=Nový playlist: přetáhněte skladby pro přidání do playlistu
-PhysicalPlaylistRepositoryView.13=Záložky
-PhysicalPlaylistRepositoryView.14=Playlist záložek: přetáhněte skladby do záložky
-PhysicalPlaylistRepositoryView.15=Nejlepší od
-PhysicalPlaylistRepositoryView.16=Nejlepší z playlistu: obsahuje nejposlouchanější skladby
-PhysicalPlaylistRepositoryView.17=Novinky
-PhysicalPlaylistRepositoryView.18=Playlist novinek: obsahuje nejnovější skladby
-PhysicalPlaylistRepositoryView.19=Připravit párty
 
 FilesTableView.0=Tabulka souborů
 FilesTableView.15=Přehrát adresář
 #Dev: do not use ID = 16, next label is FilesTableView.17 
 
-DeviceView.0=Přidat zařízení
 DeviceView.1=Odstranit nepřipojené zařízení (z disku nic nemazat)
 DeviceView.2=Vlastnosti vybraného zařízení
-DeviceView.3=Připojit vybrané zařízení
-DeviceView.4=Odpojit vybrané zařízení
-DeviceView.5=Testovat dostupnost vybraného zařízení
-DeviceView.6=Vynutit obnovení vybraného zařízení
-DeviceView.7=Synchronizovat vybrané zařízení
 DeviceView.8=Připojit
 DeviceView.9=Odpojit
 DeviceView.10=Testovat
@@ -826,13 +749,9 @@ JajukWindow.26=[Ctrl-p] Pozastavit/Pokračovat
 JajukWindow.27=[Ctrl-s] Zastavit
 JajukWindow.31=Přehraje nejnovější skladby z kolekce
 JajukWindow.32=Dokončí přehrávání aktuálního alba
-JajukWindow.33=[Ctrl-UP/DOWN] Hlasitost
-JajukWindow.34=Pozice
-JajukWindow.35=Přehrávání:
 JajukWindow.36=Aktuální hudební styl:
 JajukWindow.37=Žádný hudební styl
 #Do not use JajukWindow.38, next is JajukWindow.39 
-JajukWindow.39=Právě přehrávám 
 JajukWindow.40=Nastavení dodatečných tagů
 JajukWindow.41=Otevře dialog pro nastavení aktivovaných dodatečných tagů
 
@@ -850,27 +769,20 @@ SimpleDeviceWizard.0=Rychlé vytvoření zařízení
 FirstTimeWizard.0=Rychlý start
 FirstTimeWizard.1=<html><p><br>Vítejte! Tento průvodce Vám pomůže sestavit Vaši hudební kolekci</p></html>
 FirstTimeWizard.2=<html>Zvolte prosím umístění vašich hudebních souborů</html>
-FirstTimeWizard.4=Zobrazit nápovědu nyní
 FirstTimeWizard.5=Vyberte prosím adresář
 FirstTimeWizard.6=Pokročilé předvolby
 FirstTimeWizard.7=Nastavit pracovní adresář Jajuku:
 FirstTimeWizard.8=Vybraný adresář: 
 FirstTimeWizard.9=Žádný
 
-HelpView.2=Nápověda
 
 DownloadManager.0=<html>Jajuk potřebuje Vaše heslo HTTP proxy, aby mohl získat obaly.<br>Pokud si to nepřejete, změňte Vaše nastavení na záložce Obaly v okně Předvolby.<br>Pokud nemáte proxy, změňte Vaše nastavení na záložce Síť v okně Předvolby.</html>
-DownloadManager.1=Požadováno heslo
 
-PropertiesWizard.0=Vlastnosti položky
 PropertiesWizard.1=Vlastnost
 PropertiesWizard.2=Hodnota
-PropertiesWizard.3=Upravitelné?
 PropertiesWizard.4=Odkaz
 PropertiesWizard.6=Výběr
-PropertiesWizard.7=Typ
 PropertiesWizard.8=Vlastnost aktualizována
-PropertiesWizard.9=Vlastnost výběru nelze upravit
 PropertiesWizard.10=vlastnosti byly nastaveny
 PropertiesWizard.11=Zapisuji tag do:
 PropertiesWizard.12=Odkaz pro zadání základních detailů vlastností
@@ -901,9 +813,6 @@ CatalogView.3=Obnovit katalog
 CatalogView.4=Velikost miniatur:
 CatalogView.5=Miniatury vytvořeny pro:
 CatalogView.7=Vybrat obal
-CatalogView.8=Žádný obal nenalezen
-CatalogView.9=Předchozí
-CatalogView.10=Další
 CatalogView.11=Stránka:
 CatalogView.12=Zobrazit předchozí stránku miniatur
 CatalogView.13=Zobrazit další stránku miniatur
@@ -931,17 +840,12 @@ TipOfTheDayView.0=Tip dne
 TipOfTheDayView.1=Věděli jste...?
 TipOfTheDayView.2=Zobrazit po spuštění?
 
-CDDBWizard.0=Přijmout
 CDDBWizard.1=Název souboru
 CDDBWizard.2=Název aktuální skladby
 CDDBWizard.3=Název aktuálního alba
 CDDBWizard.4=Navrhovaný název skladby
 CDDBWizard.5=Navrhovaný název alba :
-CDDBWizard.6=Hotovo! Nalezeno 
-CDDBWizard.7=možných shod
 CDDBWizard.12=Žádná shoda nenalezena!
-CDDBWizard.14=Tento adresář neobsahuje žádné soubory
-CDDBWizard.16=Žánr:
 CDDBWizard.17=Nalezena přesná shoda!
 CDDBWizard.18=Shody
 CDDBWizard.19=Získat tagy online
@@ -958,11 +862,7 @@ DigitalDJWizard.6=Název DJ (*)
 DigitalDJWizard.8=Minimální počet hvězdiček:
 DigitalDJWizard.9=Prolnutí (sekund):
 DigitalDJWizard.10=Skladby přehrát pouze jednou
-DigitalDJWizard.11=Zrušit
-DigitalDJWizard.12=Od žánru
-DigitalDJWizard.13=Po žánr
 DigitalDJWizard.14=Výběr žánrů (vícenásobný výběr povolen)
-DigitalDJWizard.15=Počet skladeb
 DigitalDJWizard.16=Přejete si...
 DigitalDJWizard.17=Vytvořit nový DJ?
 DigitalDJWizard.18=Upravit existující DJ?
@@ -1108,7 +1008,6 @@ ReportAction.19=Přejít na:
 ActionMove.0=Vložit
 
 ActionRefresh.0=Vynutit obnovení
-ActionRefresh.1=Obnovuji adresář
 
 RenameAction.0=Přejmenovat
 RenameAction.1=Zadejte prosím nový název tohoto souboru:
@@ -1129,27 +1028,22 @@ ActionDelete.0=Soubory smazány
 ActionDelete.1=Adresáře smazány
 
 FindDuplicateTracksAction.0=Nenalezeny žádné duplicitní skladby
-FindDuplicateTracksAction.1=Nalezeny duplicitní skladby
 FindDuplicateTracksAction.2=Vyhledat duplicitní skladby
 FindDuplicateTracksAction.3=Nalezen seznam duplicitních skladeb
 FindDuplicateTracksAction.4=Vybrat všechny duplicitní skladby
 
-RefreshDialog.0=Připravuji obnovení zařízení...
 RefreshDialog.1=Obnovení zařízení
 RefreshDialog.2=Obnovení zařízení: 
 RefreshDialog.3=Odstraňuji staré soubory
 
-RadioWizard.0=Prosím vyberte nebo vytořte webové rádio
 RadioWizard.1=Spravovat webová rádia
 RadioWizard.2=Nové
 RadioWizard.3=Odstranit
 RadioWizard.4=Výchozí
 RadioWizard.5=Webové rádio s tímto názvem již existuje
-RadioWizard.6=Název webového rádia
 RadioWizard.7=Průvodce webovým rádiem
 RadioWizard.8=URL
 RadioWizard.9=Název
-RadioWizard.10=Neplatná URL
 RadioWizard.11=Název a URL jsou povinné
 
 UpdateManager.0=Nová verze Jajuk (
diff --git a/src/main/java/org/jajuk/i18n/jajuk_de.properties b/src/main/resources/org/jajuk/i18n/jajuk_de.properties
similarity index 88%
rename from src/main/java/org/jajuk/i18n/jajuk_de.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_de.properties
index 1d26475..9bb0251 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_de.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_de.properties
@@ -2,9 +2,9 @@
 <body><![CDATA[
 #Deutsches Jajuk Sprachpaket.
 #Autor : Gerhard Dietrichsteiner
-#Copyright 2003-2011 Gerhard Dietrichsteiner and Dominik Stadler, this is part of Jajuk distributed under the GPL V2 license
-#FROM en 6168
-#$Revision$
+#Copyright 2003-2012 Gerhard Dietrichsteiner and Dominik Stadler, this is part of Jajuk distributed under the GPL V2 license
+#FROM en 2012-07-05 23:34:27
+#
  
 # --- Generic labels ---
 # DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -31,9 +31,7 @@ Hide=Nicht mehr anzeigen
 Path=Bitte Pfad auswählen
 Later=Später
 Default=Standard
-All=Alle
 YestoAll=Ja zu allen
-Maximize=Maximieren
 Purge=Entfernen
 
 #--- Wizard Strings ---
@@ -57,7 +55,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
 Type.mac=Monkey's Audio format
 Type.radio=Web Radio
 Type.video=Video
@@ -86,13 +83,12 @@ Confirmation_clear_history=Wollen Sie die Historie wirklich löschen?
 Confirmation_reset_ratings=Wollen Sie die Titel-Bewertungen wirklich zurücksetzen?
 Confirmation_refactor_files=Sollen die selektierten Dateien wirklich umbenannt werden?
 Confirmation_restore_all=Wenn Sie alle Ansichten zurücksetzen wollen, muss Jajuk neu gestartet werden. Möchten Sie Jajuk jetzt beenden?
-Confirmation_defaults_radios=Hiermit werden alle Radiostationen gelöscht, die Sie bisher angelegt haben. Möchten Sie fortfahren?
 Confirmation_delete_empty_dirs=Die folgenden Verzeichnisse sind leer. Wollen Sie diese löschen?
 Confirmation_file_overwrite=Diese Datei existiert bereits. Wollen Sie diese Datei überschreiben?
 Confirmation_file_number=Datei(en) werden gelöscht.
-Confirmation_alarm_stop=Soll dieser Alarm wirklich gestoppt werden?
 Confirmation_defaults=Dadurch werden all Tab-Einstellungen auf Standardwerte zurückgesetzt (nicht nur die aktuelle Ansicht). Sind Sie sicher?
 Confirmation_reset_preferences=Wollen Sie wirklich alle Titelvorgaben zurücksetzen?
+Confirmation_reset_ratings_overwrite=Dieser Vorgang wird die Bewertung für jeden Track, der in der importierten Datei aufscheint, ersetzen. Sind Sie sicher? 
 
 Device_type.directory=Verzeichnis
 Device_type.file_cd=Musikdateien CD
@@ -107,7 +103,6 @@ Perspective_Description_Files=Dateien
 Perspective_Description_Tracks=Titel
 Perspective_Description_Configuration=Konfiguration
 Perspective_Description_Statistics=Statistiken
-Perspective_Description_Help=Hilfe
 Perspective_Description_Display=Player
 Perspective_Description_Albums=Alben
 Perspective_Description_Info=Information
@@ -142,7 +137,7 @@ Property_rate=Bewertung
 Property_files=Dateien
 Property_hits=Treffer
 Property_filename=Datei
-Property_date=Datum
+Property_date=Erstellungsdatum
 Property_added=Discovery Datum
 Property_parent=Übergeordnetes Verzeichnis
 Property_device=Quelle
@@ -167,6 +162,11 @@ Property_pf=Einstellungen
 Property_tpt=Gesamtspielzeit (Sek)
 Property_ban=Ausgeschlossen
 Property_disc_id=DiscID
+Property_keywords=Schlüsselwörter
+Property_label=Beschreibung
+Property_bitrate=Bitrate (kbps)
+Property_frequency=Frequenz (Hz)
+Property_origin=Herkunft
 
 Language_desc_en=Englisch
 Language_desc_fr=Französisch
@@ -199,17 +199,13 @@ Error.017=Fehler beim Analysieren der Playlist
 Error.018=Kein Titel dieser Playlist kann geöffnet werden
 Error.019=Eine existierende Quelle besitzt bereits diesen Namen
 Error.020=I/O Fehler beim Kopieren der Datei, überprüfen Sie ob genug Speicher auf der Festplatte frei ist
-Error.021=URL Feld muss angegeben werden. Bsp: 'd:\music' unter MS Windows, '/home/foo/music' unter Unix
-Error.022=Feldname muss angegeben werden. Bsp: 'Festplatte', 'ROCK CD'
 Error.023=Kann Starttitel nicht abspielen
 Error.024=Datei kann nicht geschrieben werden
 Error.025=Eine der zu lesenden Dateien befindet sich in einer inaktiven Quelle
 Error.026=Fehler beim Registrieren der Player
 Error.027=Synchronisation abgebrochen
 Error.028=Fehler beim Speichern der Playlist
-Error.029=Eine existierende Quelle ist ein übergeordneter Ordner dieser Quelle, hat den gleichen Pfad oder ist ein untergeordneter Ordner
 Error.030=Zu viele fehlgeschlagene Verbindungen. Jajuk sucht keine Online Covers mehr.
-Error.101=Die Quelle existiert nicht oder kann nicht erreicht werden
 Error.102=Fehler
 Error.103=Fehler beim Lesen der Etikett (id3 tag) Information
 Error.104=Fehler beim Schreiben der Etikett (id3 tag) Information
@@ -217,43 +213,36 @@ Error.105=Resource Bundle Schlüssel nicht gefunden
 Error.106=Unbekannte Ausnahme
 Error.107=Wird bereits aktualisiert oder synchronisiert
 Error.108=Fehler beim Analysieren der Ansichten Datei
-Error.109=Player oder Etikett Klasse nicht auffindbar
 Error.110=Dieser Eigenschaftsname ist für Jajuk reserviert, bitte wählen Sie einen anderen Namen
 Error.111=Die Quelle ist bereits aktiv
 Error.112=Quelle kann nicht aktiviert werden
 Error.113=Benutzereinstellungen können nicht gespeichert werden
 Error.114=Benutzereinstellungen können nicht gelesen werden
-Error.118=Fehler beim Verarbeiten eines Event Requests
 Error.119=Fehler beim Analysieren der Historien Datei oder fehlende Historien Datei
 Error.120=Auf die Quelle kann nicht zugegriffen werden: sie ist entweder nicht aktiv, oder sie wird gerade aktualisiert oder synchronisiert
 Error.121=Die Quelle ist in Verwendung und kann nicht deaktiviert werden
 Error.122=Fehler im FIFO
-Error.123=Fehler beim Setzen des Designs
-Error.124=Jajuk läuft bereits -- Sie können Jajuk nicht mehrmals ausführen.
 Error.125=Quelle ist bereits deaktiviert
 Error.126=Suchen wird von diesem Audio Format nicht unterstützt
 Error.127=Keine neuen Titel in der angegebenen Zeitgrenze, Sie können diesen Wert in den Einstellungen setzen
 Error.128=Das derzeitige Lied ist das erste in der Kollektion, es sind keine davorliegenden Lieder verfügbar
-Error.129=Fehler beim Laden des Covers
 Error.131=Datei kann nicht gelöscht werden
 Error.133=Ihre Kollektionsdatei war fehlerhaft. Jajuk hat die fehlerhafte Datei durch eine Sicherung ersetzt.
 Error.134=Datei kann nicht umbenannt werden
 Error.135=Datei existiert nicht
 Error.136=Operation fehlgeschlagen
 Error.137=Falsches Format
-Error.138=Einige zu diesem Titel gehörigen Dateien sind auf einer nicht aktivierten Quelle und wurden daher nicht geändert.
 Error.140=Ungültiger Text: die Zeichen & ' " < oder > sollten nicht vorkommen
 Error.141=Diese Playlist befindet sich auf einer deaktivierten oder sich gerade aktualisierenden Quelle und ist daher nicht verfügbar
 Error.142=Diese Playlist beinhaltet nicht existierende Titel oder Titel außerhalb der bekannten Quellen. Diese Titel wurden ignoriert.
 Error.143=Quelle nicht auffindbar
 Error.144=Fehler beim Lesen des DJ
 Error.145=Kann DJ nicht speichern
-Error.146=<html>Das aktuelle Muster ist ungültig.<br/>Gültige Werte sind: %artist (Artist); %album_artist (Album Artist); %title (Titelname); %album (Albumname);<br/> %n (führende Null); %genre (Genre); %year (Jahr); %disc (CD-Nummer)<br/> und das Muster muss mindestens einen Schrägstrich enthalten</html>
+Error.146=<html>Das aktuelle Muster ist ungültig.<br/>Gültige Werte sind: %artist (Artist); %album_artist (Album Artist); %title (Titelname); %album (Albumname);<br/> %n (führende Null); %genre (Genre); %year (Jahr); %disc (CD-Nummer) ; %EIGENSCHAFT_NAME<br/> und das Muster muss mindestens einen Schrägstrich enthalten</html>
 Error.147=Einige Dateien konnten nicht verschoben werden (siehe Details für nähere Information)
 Error.148=Feld Jahr ist unbekannt
 Error.149=Feld Album ist unbekannt
 Error.150=Feld Artist ist unbekannt
-Error.151=Feld Titelname ist unbekannt
 Error.152=Feld Titel ist unbekannt
 Error.153=Feld Stil ist unbekannt
 Error.154=Datei kann nicht umbenannt werden, bitte auf ungültige Zeichen in Dateinamen oder Tags überprüfen
@@ -266,23 +255,19 @@ Error.160=Datei nicht kopiert, Quell- und Zieldateiname sind gleich.
 Error.161=Kann nicht in Verzeichnis schreiben, bitte Zugriffsrechte überprüfen
 Error.162=Diese spezielle Eigenschaft existiert bereits
 Error.163=Fehler beim Wiederherstellen der Standard-Ansichten
-Error.164=Keine Titel gefunden für Umgebung:
 Error.165=Ungültiges Musikverzeichnis - es kann nicht gefunden werden oder ist nicht beschreibbar.
 Error.166=Leeres Album - kann kein Cover suchen
 Error.167=Konnte keinen Bericht erstellen
-Error.168=Keine doppelten Dateien gefunden
-Error.169=Aktion fehlgeschlagen. Bitte beachten Sie, dass diese Aktion eine Internetverbindung benötigt, um eine Liste von Radiostationen zu laden.
-Error.170=Fehler beim Abspielen des Webradios
 Error.171=Für diese Quelle wurde noch keine Synchronisationsquelle definiert. Definieren Sie diese bitte in der Quellen-Konfiguration (auf die Quelle in der Quellen-Ansicht klicken).
 Error.172=Dateien, die gerade Abgespielt werden, und die dazugehöriugen Verzeichnisse können nicht gelöscht oder verändert werden.
-Error.173=Es ist ein Fehler beim Löschen der folgenden Verzeichnisse aufgetreten:
 Error.174=Fehler beim Zugriff auf die Freedb-Webseite, bitte überprüfen Sie Ihre Netzwerkverbindung
-Error.175=Aktion abgebrochen
 Error.176=Fehler beim Generieren der Playlist
 Error.177=Bitte eine gültige Zeit im Format HH24:MM:SS eingeben.
 Error.178=Vollbildmodus wird von ihrem System nicht untersützt.
 Error.179=Kann den Systemdateiexplorer nicht öffnen, bitte setzten sie einen Pfad in den Einstellungen (Erweitert)
 Error.180=Fehler beim Kopieren der Dateien
+Error.181=Die angegebene Datei konnte nicht gefunden werden.
+Error.184=Falscher Wert: Das Intervall für die Aktualisieren kann nur 0 oder eine Nummer größer oder gleich 0,5 sein
 
 #Warnings
 Warning.0=MPlayer wurde nicht gefunden. Einige Audio- und Videoformate werden deaktiviert (flac, wma, aac, mpg2, ...). Falls MPlayer installiert ist und verwendet werden soll, müssen Sie den Pfad zu MPlayer manuell in der Konfigurations-Ansicht unter Einstellungen/Erweitert eingeben.
@@ -296,7 +281,7 @@ Warning.7=Jajuk hat festgestellt, dass aufgrund einer neuen Version eine Aktuali
 
 #--- Strings by class ---
 ParameterView.0=Zeitraum der Historie:
-ParameterView.2=Legen Sie hier fest, wieviele Tage sich das System die angehörten Titel merkt. -1 schaltet diese Funktion aus, 0 setzt die Historie auf unendlich.
+ParameterView.2=Legen Sie hier fest, wieviele Tage sich das System die angehörten Titel merkt. 0 schaltet diese Funktion aus, -1 setzt die Historie auf unendlich.
 ParameterView.3=Historie löschen
 ParameterView.4=Die aktuelle Historie löschen
 ParameterView.8=Historie/Bewertungen
@@ -318,8 +303,6 @@ ParameterView.29=Bevor Jajuk beendet wird
 ParameterView.30=Vor dem Beenden von Jajuk eine Bestätigung einholen
 ParameterView.33=Optionen
 ParameterView.35=Blendet Titel aus, die sich in inaktiven Quellen befinden
-ParameterView.36=Neustart am Ende der Kollektion
-ParameterView.37=Die Kollektion noch einmal von vorne weg abspielen, wenn das Ende im Modus Fortsetzen erreicht wird
 ParameterView.38=Sprache:
 ParameterView.42=Wählen Sie die gewünschte Sprache der Benutzeroberfläche
 ParameterView.43=Design:
@@ -339,8 +322,6 @@ ParameterView.85=Übernehmen
 ParameterView.86=Standard wiederherstellen
 ParameterView.87=Einstellungen
 ParameterView.98=Muster
-ParameterView.99=Etiketten komplett lesen
-ParameterView.100=<html>Zwinge Jajuk dazu, alle Etiketten (id3 tags) neu zu lesen.<p>Das kann nützlich sein, wenn die Etiketten mit einem anderen Programm geändert wurden.</html>
 ParameterView.101=Stammverzeichnis als Albumnamen
 ParameterView.102=Wenn für einen Titel kein Album Name im Etikett (id3 tag) gefunden werden kann, soll der Name des Verzeichnisses verwendet werden.
 ParameterView.109=Einstellungen gespeichert
@@ -352,7 +333,6 @@ ParameterView.114=Regular Expressions verwenden (Regexp Format)
 ParameterView.115=Erweitert
 ParameterView.116=Backup der Kollektionsdatei:
 ParameterView.117=Aktivieren Sie diesen Punkt, wenn die Kollektionsdatei auf collection-<datum>.xml Dateien gesichert werden soll
-ParameterView.118=Backup Größe (MB)
 ParameterView.119=Backup Größe in Megabyte
 ParameterView.120=Kodierung der Kollektionsdatei:
 ParameterView.121=Wählen Sie eine Kodierung: UTF-16 eignet sich für asiatische Sprachen, UTF-8 ist für europäische Sprachen ausgelegt.
@@ -382,14 +362,10 @@ ParameterView.158=Hohe Genauigkeit (zwingende Wortgruppen)
 ParameterView.159=Covers
 ParameterView.160=Verbindung Timeout (sec):
 ParameterView.161=Timeout der Verbindung in Sekunden: die Aktion schlägt fehl, wenn in dieser Zeit keine Antwort zurückkommt
-ParameterView.162=Übertragung Timeout (sec).
-ParameterView.163=Timeout der Datenübertragung in Sekunden: die Aktion schlägt fehl, wenn ein Download in dieser Zeit nicht fertig wird
 ParameterView.164=Vor Löschen einer Quelle
 ParameterView.165=Bestätigung vor dem Löschen einer Quelle einholen
 ParameterView.166=Covers mischen
 ParameterView.167=Covers werden durchgemixt und zufällig eines angezeigt
-ParameterView.169=Covers vorausladen
-ParameterView.170=Wenn möglich, alle verfügbaren Covers sofort herunterladen um sie später schnell verfügbar zu haben
 ParameterView.171=Vor Löschen eines Covers
 ParameterView.172=Bestätigung einholen bevor ein Cover endgültig gelöscht wird
 ParameterView.177=Anzahl an geplanten Titeln:
@@ -405,7 +381,7 @@ ParameterView.189=Vor dem Zurücksetzen der Bewertungen
 ParameterView.190=Überblendung (Sek.)
 ParameterView.191=Dauer der Überblendung zwischen zwei Titeln in Sekunden
 ParameterView.192=Dateiorganisator:
-ParameterView.193=Verfügbare Platzhalter: %artist (Artist); %album_artist (Album Artist, wenn dieser nicht definiert ist, wird der Track-Artist verwendet); %title (Titelname); %album (Album); %n (Nummer); %genre (Genre); %year (Jahr); %disc (CD-Nummer)
+ParameterView.193=Verfügbare Platzhalter: %artist (Artist); %album_artist (Album Artist, wenn dieser nicht definiert ist, wird der Track-Artist verwendet); %title (Titelname); %album (Album); %n (Nummer); %genre (Genre); %year (Jahr); %disc (CD-Nummer); %EIGENSCHAFT_NAME
 ParameterView.194=Vor dem Organisieren der Dateien
 ParameterView.195=Animationssicht:
 ParameterView.196=Hotkeys aktivieren
@@ -418,7 +394,7 @@ ParameterView.202=Der Benutzername für den Daten an Last.FM geschickt werden
 ParameterView.203=Last.FM Passwort:
 ParameterView.204=Das Passwort zu diesem Benutzernamen
 ParameterView.205=Mplayer Argumente:
-ParameterView.206=Zusätzliche MPlayer Argumente wie '-ao esd', '-ao arts' oder '-novideo' (zum Beispiel um das Abspielen von Videos zu unterbinden)
+ParameterView.206=<html>Zusätzliche MPlayer Argumente wie '-ao esd', '-ao arts' <br/>oder '-novideo' (zum Beispiel um das Abspielen von Videos zu unterbinden)<br/>Bitte beachten Sie, dass manche Sound-Optionen ignoriert werden, wenn Bit-Perfect ausgewählt ist</html>
 ParameterView.207=Jajuk Arbeitsverzeichnis:
 ParameterView.208=Setzt das Verzeichnis wo Jajuk seine Konfiguration speichert (Standard: home Verzeichnis des Benutzers)
 ParameterView.209=Das Jajuk Arbeitsverzeichnis wurde geändert (das alte Arbeitsverzeichnis wurde nicht gelöscht). Jajuk wird nun beendet und kann anschließend neu gestartet werden.
@@ -440,7 +416,7 @@ ParameterView.223=Schriftgröße:
 ParameterView.224=Schriftgröße festlegen
 ParameterView.225=GUI
 ParameterView.226=Modi
-ParameterView.228=Album Popups anzeigen
+ParameterView.228=Große Tooltips anzeigen, wenn die Maus über einem Album verweilt
 ParameterView.229=Katalog Ansicht Einstellungen
 ParameterView.233=Das Design wird erst beim nächsten Start von Jajuk verwendet
 ParameterView.234=Nach Updates suchen
@@ -456,17 +432,15 @@ ParameterView.243=<html>Vollständiger Pfad zu MPlayer inkl. ausführbarer Datei
 ParameterView.244=Dateidatum = Entdeckungsdatum
 ParameterView.245=<html>Durch diese Option verwendet Jajuk das Dateidatum als Entdeckungsdatum.<br/>Ein kompletter Refresh ist nötig um die Änderungen sichtbar zu machen</html>
 ParameterView.246=Icon-Größe in der Ansicht-Übersicht (in Pixel)
-ParameterView.247=Der Zielpfad enthält einen bestehenden Arbeitsbereich für Jajuk. Der Arbeitsbereich wurde für den atuellen Benutzer auf dieses Verzeichnis gewechselt (Der vorherige Arbeitsbereich ist an der ursprünglichen Position gesichert). Jajuk wird nun beendet und kann anschließend neu gestartet werden.
+ParameterView.247=Der Zielpfad enthält eine bestehende Konfiguration für Jajuk. Die Konfiguratoin wurde für den atuellen Benutzer auf dieses Verzeichnis gewechselt (Die vorherige Konfiguration ist an der ursprünglichen Position gesichert). Jajuk wird nun beendet und kann anschließend neu gestartet werden.
 ParameterView.248=Titel:
 ParameterView.249=Einstellungen zurücksetzen
 ParameterView.250=Benutzereinstellungen zurücksetzen
 ParameterView.251=Verlauf wurde geleert
 ParameterView.252=Bewertungen und Abspielzeiten wurden zurückgesetzt
 ParameterView.253=Einstellungen wurden zurückgesetzt
-ParameterView.254=Kurze Windows-Namen verwenden
-ParameterView.255=[Windows 32 bits] Wenn Sie diese Option auswählen, wird MPlayer gezwungen, kürzere Dateinamen zu verwenden, dadurch können Probleme mit einigen Sprachversionen vermieden werden
 ParameterView.256=Dateinamen für Standard-Cover
-ParameterView.257=Jajuk sucht nach einer Coverbilddatei, deren Name diesen Text beinhaltet und verwendet dieses als Standard (<filename>;<filename>;...)
+ParameterView.257=Jajuk sucht nach einer Coverbilddatei, deren Name diesen Text beinhaltet und verwendet dieses als Standard (mehrere Muster können mit Strichpunkt angegeben werden, <filename>;<filename>;...)
 ParameterView.260=Album-Cover im Windows Explorer Format speichern
 ParameterView.261=Heruntergeladene Cover werden als folder.jpg/png/... gespeichert, damit der Windows Explorer diese als Ordner-Icon verwendet.
 ParameterView.262=Verwende Audionormalisierung
@@ -482,7 +456,7 @@ ParameterView.271=Zeige Taskleistensymbol
 ParameterView.272=wenn aktiviert, dann können viele Funktionen von Jajuk über das Taskleistensymbol aufgerufen werden
 ParameterView.273=Cover spiegeln 
 ParameterView.274=wenn aktiviert, dann wird das Cover gekippt und gespiegelt
-ParameterView.275=Titeländerung:
+ParameterView.275=Hinweis-Popup bei Titeländerung:
 ParameterView.276=Wählen sie die Art der Benachrichtigung bei Titeländerungen aus (Der "toast" ist ein Nachrichten-Popup welches kurz angezeigt wird und anschließend von selbst wieder verschwindet) 
 ParameterView.277=Muster für Blasen-Benachrichtungen:
 ParameterView.278=Dieses Muster bestimmt den Text der in der Blasen-Benachrichtigung bei Titeländerungen angezeigt wird
@@ -490,8 +464,28 @@ ParameterView.279=Informationsmuster:
 ParameterView.280=Dieses Muster bestimmt den Text der in der Informationsansicht angezeigt wird (im unteren Bereich des Fensters)
 ParameterView.281=In den Systemtray minimieren
 ParameterView.282=Erlaubt, das Hauptfenster bei Minimierung nur mehr im Systemtray und nicht mehr in der Taskbar anzuzeigen
+ParameterView.283=Cover im Vollbildmodus spiegeln
+ParameterView.284=wenn aktiviert, dann wird das Cover im Vollbildmodus gekippt und gespiegelt
+ParameterView.285=Bit-Perfect aktivieren
+ParameterView.286=<html>Deaktiviert Mixer-Einstellung und andere Optionen in mplayer durch die <br/>die Audio-Qualität beeinträchtigt werden könnte.<br/> Sobald diese Option eingeschaltet ist, benutzen Sie bitte die Mixer-Funktion des Betriebssystems, um die Lautstärke zu regeln.</html>  
+ParameterView.287=Sound
+ParameterView.288=Titel in Titel-Ansicht animieren
+ParameterView.289=Einstellungen für die Titel-Ansicht
+ParameterView.290=Begrüßungsbild zu Beginn zeigen
+ParameterView.291=Begrüßungsbild zu Beginn im Hauptfenster anzeigen (nicht anzeigen wenn im Slimbar- oder Vollbildmodus gestartet wird) 
+ParameterView.292=Ein Pop-up-Menü mit Album-Details anzeigen, wenn die Maus über Album-Tabellen oder -Miniaturbilder bewegt wird 
+ParameterView.301=Videos anzeigen
+ParameterView.302=When diese Option abgewählt wird, zeigt Jajuk Video-Dateien nicht mehr (Neustart nötig).
+ParameterView.303=Mausclick auf Systray-Icon zeigt das Hauptfenster
+ParameterView.304=Ein Mausclick auf das Systray-Icon erzwingt die Anzeige des Hauptfensters (Standardmäßig wechselt Mausklick zwischen Anzeige/Verstecken)
+ParameterView.305=Dateidatum beibehalten
+ParameterView.306=Das Datum der letzten Änderung von Audio-Dateien wird beim Setzen von Tags beibehalten
+ParameterView.307=Manuelle Bewertungen
+ParameterView.308=Nicht auf automatische Bewertungen auf Basis der Abspielzeit und Vorgaben vertrauen, sondern Bewertungen direkt über das Kontextmenü setzen.
+ParameterView.309=Bevor Tags geschrieben werden
+ParameterView.310=Gespeicherte "Nicht mehr anzeigen" Vermerke löschen
+ParameterView.311=Zeigt Dialoge wieder, bei denen Sie "Nicht mehr anzeigen" ausgewählt haben.
 
-Main.21=Bestätigung
 Main.22=MPlayer wird geprüft/heruntergeladen
 
 Player.0=Warte auf Audio-Ressource (in Verwendung)
@@ -509,6 +503,7 @@ Device.44=Gehe in
 Device.45=Kopiere [
 Device.46=Konvertiere [
 Device.47=] nach [
+Device.48= Verweise auf Datei oder Playlist entfernt
 
 FIFO.4=). Möchten Sie es aktivieren ?
 FIFO.10=Spiele jetzt:
@@ -540,7 +535,6 @@ DeviceWizard.52=Wählen Sie eine Synchronisations-Quelle
 DeviceWizard.53=Quelle aktualisieren alle
 #limited string size
 DeviceWizard.54=Min
-DeviceWizard.55=Falscher Wert: Das Intervall für die Aktualisieren kann nur 0 oder eine Nummer größer oder gleich 0,5 sein.
 
 JajukJMenuBar.0=Datei
 JajukJMenuBar.1=Datei öffnen
@@ -591,8 +585,6 @@ CommandJPanel.1=[Strg-t] Titel wiederholen: aktuellen Titel in einer Schleife sp
 CommandJPanel.2=[Strg-h] Wiedergabeliste mischen: Titel in zufälliger Reihenfolge spielen
 CommandJPanel.3=Wiedergabeliste fortsetzen: Setzt am Ende mit nächstem Titel fort
 CommandJPanel.4=Titel anspielen: Spielt von jedem Titel nur einen Teil. Offset und Länge können in der Konfigurations-Ansicht eingestellt werden.
-CommandJPanel.5=Eine gemischte Auswahl der gesamten Kollektion spielen
-CommandJPanel.6=Ihre eigenen Lieblingstitel spielen
 CommandJPanel.8=<html>[F9] Den vorherigen Titel der aktuellen Auswahl spielen<br/>Rechter Mausklick spielt das aktuelle Stück nocheinmal<br/>Shift+Klick startet das vorherige Album</html>
 CommandJPanel.9=<html>[F10] Den nächsten Titel der aktuellen Auswahl spielen<br/>Shift+Klick startet nächstes Album</html>
 CommandJPanel.10=<html>[AltGr F9] Schnelles Zurückspielen im aktuellen Titel<br/>Shift+Klick um aktuellen Titel neu zu starten</html>
@@ -606,15 +598,12 @@ CommandJPanel.19=Umgebungen verwalten
 CommandJPanel.20=Titel für Titel
 CommandJPanel.21=Album für Album mischen
 CommandJPanel.22=Album für Album
-CommandJPanel.23=Klicken um Suche zurückzusetzen
-CommandJPanel.24=Web Radios konfigurieren
 CommandJPanel.25=Radio einschalten
 CommandJPanel.26=Wiedergabeliste wiederholen
 CommandJPanel.27=Karaoke, Gesang von Track entfernen (findet erst beim nächsten abgespielten Track Anwendung)
 
 
 InformationJPanel.5=Restliche Laufzeit der Wiedergabeliste [Anzahl an verbleibender Titel]
-InformationJPanel.6=Bitrate des Titels
 InformationJPanel.7=Fortschritt des aktuellen Titels
 #song name BY artist ON album name
 InformationJPanel.8=%title von %artist aus dem Album "%album"
@@ -624,22 +613,19 @@ AbstractPlaylistEditorView.0=Titel
 AbstractPlaylistEditorView.1=Ort
 AbstractPlaylistEditorView.2=Diese Playlist spielen
 AbstractPlaylistEditorView.3=Playlist speichern
-AbstractPlaylistEditorView.4=Einen Titel zu dieser Playlist hinzufügen
 AbstractPlaylistEditorView.5=Titel entfernen
 AbstractPlaylistEditorView.6=Titel nach vorne schieben
 AbstractPlaylistEditorView.7=Titel nach hinten schieben
 AbstractPlaylistEditorView.9=Diese Playlist löschen
 AbstractPlaylistEditorView.10=Einen zufälligen Titel zu dieser Playlist hinzufügen
 AbstractPlaylistEditorView.15=Playlists
-AbstractPlaylistEditorView.17=Sie sind dabei, die folgenden Playlist-Dateien zu speichern:
 AbstractPlaylistEditorView.18=Titel in Wiedergabeliste
 AbstractPlaylistEditorView.19=Wiederholter Titel
 AbstractPlaylistEditorView.20=Geplanter Titel
-AbstractPlaylistEditorView.21=Playlist Titel
 AbstractPlaylistEditorView.22=Playlist gespeichert
 AbstractPlaylistEditorView.27=Party zusammenstellen
-AbstractPlaylistEditorView.28=Verzeichnis wurde erzeugt in
 AbstractPlaylistEditorView.29=Aktueller Titel
+AbstractPlaylistEditorView.30=Die Playlist zufällig ordnen
 
 StatView.0=Andere
 StatView.1=Verteilung der Musikrichtungen
@@ -686,7 +672,6 @@ TracksTreeView.41=weniger als zwei Jahre
 TracksTreeView.42=weniger als fünf Jahre
 TracksTreeView.43=weniger als zehn Jahre
 TracksTreeView.44=weniger als drei Monate
-TracksTreeView.45=Jahr
 
 CoverView.2=Dieses Cover permanent löschen
 CoverView.3=Cover
@@ -694,13 +679,10 @@ CoverView.4=Vorheriges Bild (von der Festplatte und aus dem Web, wenn automatisc
 CoverView.5=Nächstes Bild (von der Festplatte und aus dem Web, wenn automatische Covers aktiviert sind)
 CoverView.6=<html><p>Cover unter Originalnamen speichern</p><p>Mit Strg: Cover speichern unter...</p></html>
 CoverView.8=Dieses Cover als Default für dieses Album verwenden
-CoverView.9=Covers
 CoverView.10=Cover speichern unter
 CoverView.11=Cover gespeichert
-CoverView.12=Album
-CoverView.13=Titel
 
-AnimationView.0=Animation
+AnimationView.0=Titel
 
 FilesTreeView.0=Dateibaum
 FilesTreeView.3=Kopieren
@@ -710,14 +692,11 @@ FilesTreeView.7=Löschen
 FilesTreeView.14=Desynchronisieren
 FilesTreeView.15=Erneut synchronisieren
 FilesTreeView.16=Playlist erstellen
-FilesTreeView.17=Kopieren
-FilesTreeView.18=Ausschneiden
 FilesTreeView.28=Aktivieren
 FilesTreeView.29=Deaktivieren
 FilesTreeView.30=Aktualisieren erzwingen
 FilesTreeView.31=Synchronisieren
 FilesTreeView.32=Testen
-FilesTreeView.33=Playlists erstellen
 FilesTreeView.40=Kopieren
 FilesTreeView.41=Ausschneiden
 FilesTreeView.42=Einfügen
@@ -745,9 +724,6 @@ TracksTableView.16=Als Nächstes abspielen
 AbstractTableView.0=Filter:
 AbstractTableView.1=Zu filternde Eigenschaft
 AbstractTableView.3=Wert des Filters (wonach gefiltert wird)
-AbstractTableView.4=Filter anwenden
-AbstractTableView.5=Filter löschen
-AbstractTableView.6=Einen erweiterten Filter anwenden
 AbstractTableView.7=enthält:
 AbstractTableView.8=Irgendetwas
 AbstractTableView.10=(Nicht verfügbar)
@@ -757,39 +733,17 @@ AboutView.7=Über Jajuk
 AboutView.8=Lizenz
 AboutView.9=System
 AboutView.10=Über Jajuk
-AboutView.11=<html>Copyright 2003-2011<br/>Jajuk team</html>"
+AboutView.11=<html>Copyright 2003-2012<br/>Jajuk team</html>"
 
-PhysicalPlaylistRepositoryView.0=Spielen
-PhysicalPlaylistRepositoryView.1=Editieren
 PhysicalPlaylistRepositoryView.2=Speichern unter
-PhysicalPlaylistRepositoryView.3=Löschen
-PhysicalPlaylistRepositoryView.4=Eigenschaften
-PhysicalPlaylistRepositoryView.6=Playlists
-PhysicalPlaylistRepositoryView.8=Smart
 PhysicalPlaylistRepositoryView.9=Aktuelle Wiedergabeliste
-PhysicalPlaylistRepositoryView.10=Aktuelle Wiedergabeliste: verwenden Sie Drag and Drop um Elemente abzuspielen
-PhysicalPlaylistRepositoryView.11=Neu
-PhysicalPlaylistRepositoryView.12=Neue Playlist: fügen Sie mit Drag and Drop Dateien hinzu
-PhysicalPlaylistRepositoryView.13=Bookmarks
-PhysicalPlaylistRepositoryView.14=Bookmark Playlist: verwenden Sie Drag and Drop um Titel hinzuzufügen
-PhysicalPlaylistRepositoryView.15=Best of
-PhysicalPlaylistRepositoryView.16=Best of Playlist: enthält Ihre Lieblingstitel
-PhysicalPlaylistRepositoryView.17=Neuheiten
-PhysicalPlaylistRepositoryView.18=Neuheiten Playlist: enthält die neuesten Titel
-PhysicalPlaylistRepositoryView.19=Party zusammenstellen
 
 FilesTableView.0=Dateien Tabelle
 FilesTableView.15=Verzeichnis spielen
 #Dev: do not use ID = 16, next label is FilesTableView.17
 
-DeviceView.0=Quelle hinzufügen
 DeviceView.1=Quelle entfernen (es wird nichts physikalisch gelöscht)
 DeviceView.2=Eigenschaften der ausgewählten Quelle
-DeviceView.3=Ausgewählte Quelle aktivieren
-DeviceView.4=Ausgewählte Quelle deaktivieren
-DeviceView.5=Testen ob die ausgewählte Quelle verfügbar ist
-DeviceView.6=Ausgewählte Quelle jetzt aktualisieren
-DeviceView.7=Ausgewählte Quelle synchronisieren
 DeviceView.8=Aktivieren
 DeviceView.9=Deaktivieren
 DeviceView.10=Verfügbarkeit testen
@@ -827,13 +781,9 @@ JajukWindow.26=[Ctrl-p] Pause/Spielen
 JajukWindow.27=[Ctrl-s] Stopp
 JajukWindow.31=Neue Titel der gesamten Kollektion spielen
 JajukWindow.32=das aktuelle Album weiterspielen
-JajukWindow.33=[Ctrl-Auf/Ab] Lautstärke
-JajukWindow.34=Position
-JajukWindow.35=Spiele:
 JajukWindow.36=Aktuelle Umgebung:
 JajukWindow.37=Keine Umgebung aktiv
 #Do not use JajukWindow.38, next is JajukWindow.39
-JajukWindow.39=Aktueller Titel 
 JajukWindow.40=Extra-Tags Konfigurieren
 JajukWindow.41=Öffnet ein Fenster zum Einstellen der aktivierten Tags
 
@@ -851,30 +801,25 @@ SimpleDeviceWizard.0=Schnell eine Quelle anlegen
 FirstTimeWizard.0=Schnellstart
 FirstTimeWizard.1=<html><b>Willkommen! Dieser Assistent wird Ihnen beim Erstellen Ihrer Kollektion helfen.</b></html>
 FirstTimeWizard.2=<html>Wählen Sie hier Ihr Musikverzeichnis</html>
-FirstTimeWizard.4=Hilfe jetzt anzeigen
 FirstTimeWizard.5=Bitte wählen Sie ein Verzeichnis
 FirstTimeWizard.6=Erweiterte Einstellungen
 FirstTimeWizard.7=Jajuk Arbeitsverzeichnis:
 FirstTimeWizard.8=Gewähltes Verzeichnis: 
 FirstTimeWizard.9=Keines
 
-HelpView.2=Hilfe
 
 DownloadManager.0=<html>Jajuk benötigt ihr HTTP proxy Passwort um Covers zu laden<br/>Wenn Sie keine Covers laden möchten, ändern Sie bitte die Einstellungen in der Konfiguration<br/>Wenn Sie keinen Proxy verwenden möchten, ändern sie die Einstellung im Punkt Netwerk in der Konfiguration.</html>
-DownloadManager.1=Passwort wird benötigt
 
-PropertiesWizard.0=Element Eigenschaften
 PropertiesWizard.1=Eigenschaft
 PropertiesWizard.2=Wert
-PropertiesWizard.3=Editierbar?
 PropertiesWizard.4=Link
 PropertiesWizard.6=Auswahl
-PropertiesWizard.7=Typ
 PropertiesWizard.8=Eigenschaft erfolgreich aktualisiert
-PropertiesWizard.9=Keine editierbare Eigenschaft für diese Auswahl
 PropertiesWizard.10=Eigenschaften wurden gesetzt
 PropertiesWizard.11=Schreibe tag nach:
 PropertiesWizard.12=Verknüpfung zu Einstellungsdetails des Elements
+PropertiesWizard.13=Kopieren
+PropertiesWizard.14=Den Wert in das Clipboard kopieren
 
 NewPropertyWizard.0=Eigenschaft anlegen
 NewPropertyWizard.3=(*)Typ
@@ -902,9 +847,6 @@ CatalogView.3=Miniaturbilder neu erzeugen
 CatalogView.4=Miniaturbild-Größe:
 CatalogView.5=Erstellte Miniaturbild für:
 CatalogView.7=Cover auswählen
-CatalogView.8=Kein Cover gefunden
-CatalogView.9=Vorheriges
-CatalogView.10=Nächstes
 CatalogView.11=Seite:
 CatalogView.12=Vorherige Vorschauseite anzeigen
 CatalogView.13=Nächste Vorschauseite anzeigen
@@ -932,17 +874,12 @@ TipOfTheDayView.0=Tipp des Tages
 TipOfTheDayView.1=Haben Sie gewusst... ?
 TipOfTheDayView.2=Beim Start anzeigen?
 
-CDDBWizard.0=Akzeptieren
 CDDBWizard.1=Dateiname
 CDDBWizard.2=Aktueller Titelname
 CDDBWizard.3=Aktueller Albumname
 CDDBWizard.4=Vorgeschlagener Titelname
 CDDBWizard.5=Vorgeschlagener Albumname:
-CDDBWizard.6=Fertig! Habe
-CDDBWizard.7=mögliche Treffer gefunden
 CDDBWizard.12=Keine Treffer gefunden!
-CDDBWizard.14=Dieses Verzeichnis enthält keine Datei
-CDDBWizard.16=Genre:
 CDDBWizard.17=Exakten Treffer gefunden!
 CDDBWizard.18=Treffer
 CDDBWizard.19=Tags Online holen
@@ -959,11 +896,7 @@ DigitalDJWizard.6=DJ Name(*):
 DigitalDJWizard.8=Minimale Anzahl Sterne:
 DigitalDJWizard.9=Überblendung (Sekunden):
 DigitalDJWizard.10=Titel nur einmal spielen
-DigitalDJWizard.11=Entfernen
-DigitalDJWizard.12=Von Genres
-DigitalDJWizard.13=Zu Genres
 DigitalDJWizard.14=Genres-Auswahl (Mehrfachauswahl erlaubt)
-DigitalDJWizard.15=Anzahl an Titeln
 DigitalDJWizard.16=Welche Aktion möchten Sie ausführen?
 DigitalDJWizard.17=Einen neuen DJ erstellen
 DigitalDJWizard.18=Einen bestehenden DJ editieren
@@ -1081,6 +1014,7 @@ Ambience.13=Latin
 
 DebugLogAction.0=Debug-Info Auflistung
 DebugLogAction.1=Aktualisieren
+DebugLogAction.2=In das Clipboard kopieren
 
 CopyClipboardAction.0=Adresse in Zwischenablage kopieren
 
@@ -1110,7 +1044,6 @@ ReportAction.19=Springe zu:
 ActionMove.0=Einfügen
 
 ActionRefresh.0=Aktualisieren erzwingen
-ActionRefresh.1=Aktualisiere Verzeichnis
 
 RenameAction.0=Umbenennen
 RenameAction.1=Bitte geben Sie den neuen Namen für diese Datei ein:
@@ -1131,29 +1064,14 @@ ActionDelete.0=Dateien wurden gelöscht
 ActionDelete.1=Verzeichnisse wurden gelöscht
 
 FindDuplicateTracksAction.0=Keine doppelten Titel gefunden.
-FindDuplicateTracksAction.1=Doppelte Titel gefunden
 FindDuplicateTracksAction.2=Doppelte Titel finden
 FindDuplicateTracksAction.3=Liste der gefundenen doppelten Titel
 FindDuplicateTracksAction.4=Alle doppelten Titel auswählen
 
-RefreshDialog.0=Bereite Quellenaktualisierung vor...
 RefreshDialog.1=Aktualisiere Quelle
 RefreshDialog.2=Aktualisiere Quelle:
 RefreshDialog.3=Räume alte Dateien auf
 
-RadioWizard.0=Bitte wählen oder erstellen Sie ein Web Radio
-RadioWizard.1=Web Radios verwalten
-RadioWizard.2=Neu
-RadioWizard.3=Löschen
-RadioWizard.4=Standard
-RadioWizard.5=Ein Web Radio mit diesem Namen ist bereits vorhanden
-RadioWizard.6=Web Radio Name
-RadioWizard.7=Web Radio Assistent
-RadioWizard.8=URL
-RadioWizard.9=Name
-RadioWizard.10=Falsche URL
-RadioWizard.11=Name und URL sind zwingend nötig
-
 UpdateManager.0=Ein neues Jajuk Release (
 UpdateManager.1=) wurde gefunden, Sie können es hier herunterladen http://jajuk.info
 UpdateManager.2=Kein neues Release gefunden
@@ -1186,6 +1104,7 @@ ShowPropertiesAction.0=Element-Eigenschaften anzeigen
 
 QueueView.1=Wiedergabeliste leeren
 QueueView.2=Scrolle automatisch zum aktuell gespielten Track
+QueueView.3=Das Abspielen nach dem aktuellen Lied beenden  
 
 JajukSlimWindow.0=Schlankes Jajuk anzeigen/verstecken
 
@@ -1197,8 +1116,8 @@ BanSelectionAction.1=Diesen Titel ausschließen, dadurch wird er nicht mehr auto
 UnBanSelectionAction.0=Entsperren
 UnBanSelectionAction.1=Titel entsperren so dass sie wieder vorgeschlagen werden
 
-OpenExplorerAction.0=Mit explorer öffnen
-OpenExplorerAction.1=Verzeichnis mit externen Explorer öffnen
+OpenExplorerAction.0=Im Datei-Browser öffnen
+OpenExplorerAction.1=Verzeichnis mit externen Datei-Browser öffnen
 
 Preference.0=<html>Eine persönliche Vorliebe für den Titel setzen<br/>Diese wird bei der endgültigen Bewertung in betracht gezogen</html>
 Preference.1=Müll
@@ -1219,24 +1138,28 @@ Notificator.track_change.webradio_title=Internetradio gestartet:
 Notificator.track_change.track_title=Titel gestartet:
 
 SyncTreeTableAction.0=Baumansicht und Tabellenansicht synchronisieren
-SyncTreeTableAction.1=<html>Baumansichten und Tabellenansichten synchronisieren<br>Eine Auswahl in der Baumansicht wählt das gleiche Element in der Tabellenansicht aus.<br>Eine Auswahl in der Tabellenansicht zweigt das gleiche Element in der Baumansicht an.</html>
-
-# TipOfTheDay are automatically generated with the Jajuk Manual.
-#    To change tip of the day use page: http://jajuk.info/index.php/Tip_of_the_day
-
-
-
-
-
-
-
-
-
+SyncTreeTableAction.1=<html>Baumansichten und Tabellenansichten synchronisieren<br/>Eine Auswahl in der Baumansicht wählt das gleiche Element in der Tabellenansicht aus.<br/>Eine Auswahl in der Tabellenansicht zweigt das gleiche Element in der Baumansicht an.</html>
 
+ShowCurrentlyPlayingAction.0=Den aktuell gespielten Titel im Benachrichtigungs-Bereich anzeigen
+ShowCurrentlyPlayingAction.1=Wenn die Option ausgewählt ist, wird eine betriebssystem-abhängige Benachrichtigung über das aktuell abgespielte Lied angezeigt.
 
+WebRadioView.0=Internet-Radios
+WebRadioView.1=Internetradio
+WebRadioView.2=Herkunft
+WebRadioView.8=Neues Internetradio
+WebRadioView.10=Voreinstellungen neu laden
+WebRadioView.11=Voreingestellte Internetradios von der Jajuk Website neu laden (eigene Einstellungen bleiben erhalten)
 
+ExportRatingsAction.1=Bewertungen exportieren
+ExportRatingsAction.2=Schreibt die Bewertungen aller Tracks in eine Datei um sie in eine andere Installation von Jajuk einspielen zu können. 
+ExportRatingsAction.3=Bitte wählen sie die XML Datei, in die die Bewertungen exportiert werden sollen. 
 
+ImportRatingsAction.1=Bewertungen importieren
+ImportRatingsAction.2=Lädt die angegebene Datei und ersetzt die Bewertung für alle Tracks die in der aktuellen Installation von Jajuk vorhanden sind.  
+ImportRatingsAction.3=Bitte wählen sie die XML Datei, aus der die Bewertungen importiert werden sollen.
 
+# TipOfTheDay are automatically generated with the Jajuk Manual.
+#    To change tip of the day use page: http://jajuk.info/index.php/Tip_of_the_day
 
 TipOfTheDay.0=Tip 0: Sie können mit einem schnellen [Shift]+Klick auf die Zurückspielen Schaltfläche den gerade gespielten Titel neu starten.
 TipOfTheDay.1=Tip 1: Sie können mit einem [Ctrl]+Klick auf die Voriges Schaltfläche zum ersten Titel des Albums zurückspringen.
@@ -1268,7 +1191,10 @@ TipOfTheDay.26=Tip 26: Sie können selbst festlegen, wo Jajuk Ihre Daten speiche
 TipOfTheDay.27=Tip 27: Sie können jedes Fenster in jede Ansicht einfügen. Öffnen Sie dazu das Menü "Fenster" in der Jajuk Menüleiste.
 TipOfTheDay.28=Tip 28: Sie können eine Wikipedia-Seite in Ihrem Default-Web-Browser mit folgendem Icon starten <a href=../images/3/30/Launch_16x16.png title=Image:launch_16x16.png class=internal> <img src=../images/3/30/Launch_16x16.png alt=Image:launch_16x16.png/> </a>
 TipOfTheDay.29=Tip 29: Jajuk unterstützt Web Radios <a href="../images/9/9d/Webradio_32x32.png" title="Image:webradio_32x32.png" class="internal"> <img src='../images/9/9d/Webradio_32x32.png' alt="Image:webradio_32x32.png"/> </a>
-TipOfTheDay.31=Tip 30: Jajuk kann mithilfe von D-Bus ferngesteuert werden, falls die aktuelle Platform dies unterstützt (nicht unter Windows). Dies erlaubt die Verwendung von Multimedia Tasten auf der Tastatur. Das Online-Handbuch enthält weitere Hinweise zu diesem Thema. 
+TipOfTheDay.30=Tip 30: Jajuk kann mithilfe von D-Bus ferngesteuert werden, falls die aktuelle Platform dies unterstützt (nicht unter Windows). Dies erlaubt die Verwendung von Multimedia Tasten auf der Tastatur. Das Online-Handbuch enthält weitere Hinweise zu diesem Thema. 
+TipOfTheDay.31=Tip 31: Die Einstellung zur Audio-Normalisierung versucht, die Lautstärke der verschiedenen Tracks anzugleichen.
+TipOfTheDay.32=Tip 32: Lieder-Zusammenstellungen können mithilfe der "Party zusammenstellen"-Funktionalität exportiert werden.  
+TipOfTheDay.33=Tip 33: Ein Klick auf das Album-Cover in der Cover-Ansicht wechselt zwischen 3D und 2D Ansicht.
 
 ]]></body>
 
diff --git a/src/main/java/org/jajuk/i18n/jajuk_el.properties b/src/main/resources/org/jajuk/i18n/jajuk_el.properties
similarity index 78%
rename from src/main/java/org/jajuk/i18n/jajuk_el.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_el.properties
index 69aa54a..8b2fa9d 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_el.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_el.properties
@@ -1,1143 +1,1192 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<body><![CDATA[
-#Jajuk Greek langpack.
-#Written by : Eleftherios Spyromitros Xioufis
-#Copyright 2008 The Jajuk Team, this is part of Jajuk distributed under the GPL V2 license
-#FROM en 4181
-#$Revision: $
- 
-#--- Generic labels ---
-# DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
-# YOU PROBABLY DON'T WANT TO CREATE A LABEL HERE, CREATE ONE ONLY IF VERY GENERICAL 
-# AND USED MANY TIMES  
-Info=Πληροφορίες
-Warning=Προσοχή
-Error=Σφάλμα
-Ok=OK
-Cancel=Ακύρωση
-Close=Κλείσιμο
-Stop=Διακοπή
-Save=Αποθήκευση
-Apply=Εφαρμογή
-Delete=Διαγραφή
-Details=Λεπτομέρειες
-Yes=Ναι
-No=Όχι
-Success=Διαδικασία Επιτυχής
-Sort=Ταξινόμηση βάση:
-Option=Παρακαλώ επιλέξτε:
-Help=Βοήθεια
-Hide=Να μην εμφανιστεί ξανά
-Path=Παρακαλώ επιλέξτε μονοπάτι
-Later=Αργότερα
-Default=Προεπιλογή
-All=Όλα
-YestoAll=Ναι σε όλα
-Maximize=Μεγιστοποίηση
-Purge=Οριστική Διαγραφή
-
-#--- Wizard Strings --- 
-#These strings are used in the context of a basic wizard
-Wizard_Next=Επόμενο
-Wizard_Prev=Προηγούμενο
-Wizard_Finish=Τέλος
-
-# --- General Strings ---
-Type=Τύπος
-Type.mp3=Mpeg layer 3
-Type.playlist=Playlist
-Type.ogg=Ogg Vorbis
-Type.wav=Audio WAVE/SPEEX
-Type.au=Sun Audio
-Type.aiff=Apple Audio Interchange
-Type.flac=Free Lossless Audio Codec
-Type.mpc=MusePack
-Type.wma=Windows Media Audio
-Type.ape=Monkey's Audio format
-Type.aac=Advanced Audio Coding
-Type.real=Real Audio
-Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
-Type.mac=Monkey's Audio format
-Type.radio=Web Radio
-Type.video=Video
-Type.wavpack=WavPack
-
-unknown=Άγνωστο
-unknown_artist=Άγνωστος
-unknown_album=Άγνωστο
-unknown_genre=Άγνωστο
-unknown_year=Άγνωστο
-
-Note.0=Ο Jajuk εντόπισε μία νέα  κύρια έκδοση.Επιλέχθηκαν οι προεπιλεγμένες οπτικές! 
-Note.1=Το σύστημα βαθμολόγησης του Jajuk άλλαξε (βλέπε Jajuk online βοήθεια -> Σελίδα συστήματος βαθμολόγησης). Οι προηγούμενες βαθμολογίες έχουν μετατραπεί σε μία κλίμακα από 0 έως 100 αλλά συνιστούμε να επαναφέρετε όλες τις βαθμολογίες από την οπτική Προτιμήσεις -> καρτέλα Ιστορικό (προσοχή: όλες οι βαθμολογίες τα χαθούν) 
-
-#Οι απαντήσεις πρέπει να είναι: ναι / όχι / ακύρο
-Confirmation_exit=Θέλετε πραγματικά να κλείσετε το Jajuk?
-Confirmation_delete=Προσοχή! Πρόκειται να διαγράψετε το/τα παρακάτω αρχεί(ο/α) απο το δίσκο, είστε βέβαιος ?
-Confirmation_void_refresh=Προσοχή! Πρόκειται να προσπελάσετε μία κενή συσκευή.Στο Unix, βεβαιωθείτε ότι η συσκεύη είναι ενεργοποιημένη διαφορετικά θα χάσετε τις πληροφορίες του Jajuk για τη συσκευή αυτή . Είστε σίγουρος?
-Confirmation_remove_device=Θέλετε σίγουρα να απομακρύνετε αυτή τη συσκευή?
-Confirmation_delete_cover=Θέλετε σίγουρα να διαγράψετε αυτή την πρόσοψη από το δίσκο?
-Confirmation_delete_files=Θέλετε σίγουρα να διαγράψετε αυτά τα αρχεία από το δίσκο?
-Confirmation_delete_dirs=Θέλετε σίγουρα να διαγράψετε αυτά τους καταλόγους από το δίσκο? 
-Confirmation_clear_history=Θέλετε σίγουρα να καθαρίσετε το ιστορικό?
-Confirmation_reset_ratings=Θέλετε σίγουρα να επαναφέρετε όλα τις βαθμολογίες στο μηδέν?
-Confirmation_refactor_files=Θέλετε σίγουρα να μετονομάσετε το/τα επιλεγμέν(ο/α) αρχεί(ο/α)?
-Confirmation_restore_all=Η πλήρης επαναφορά των προβολών απαιτεί επανεκκίνηση του Jajuk, θέλετε quit ?
-Confirmation_defaults_radios=Αυτό θα διαγράψει όλους τους ραδιοφωνικούς σταθμούς που δημιουργήσατε προηγουμένως, είστε βέβαιος ?
-Confirmation_delete_empty_dirs=Οι επόμενοι κατάλογοι είναι άδειοι. Θέλετε να τους διαγράψετε?
-Confirmation_file_overwrite=Αυτό το αρχείο υπάρχει ήδη. Θέλετε να αντικαταστήσετε αυτό το αρχείο?
-Confirmation_file_number=αρχεία θα διαγραφούν.
-Confirmation_alarm_stop=Θέλετε σίγουρα να σταματήσετε αυτόν το συναγερμό?
-Confirmation_defaults=Προσέξτε ότι έτσι θα επαναφερθούν όλες οι καρτέλες στις προεπιλεγμένες τιμές (και όχι μόνο η τρέχουσα), είστε βέβαιος ?
-Confirmation_rebuild_thumbs=Αυτό θα αναδημιουργήσει τις μικρογραφίες όλων των άλμουμ σας, μπορεί να διαρκέσει αρκετά λεπτά για μεγάλες συλλογές. Είστε βέβαιος ?  
-Confirmation_reset_preferences=Θέλετε σίγουρα να επαναφέρετε τις προτιμήσεις των κομματιών ?
-
-Device_type.directory=Φάκελος
-Device_type.file_cd=CD αρχείων μουσικής
-Device_type.audio_cd=CD Ήχου
-Device_type.extdd=Εξωτερικός Σκληρός Δίσκος
-Device_type.player=Συσκευή Αναπαραγωγής
-Device_type.network_drive=Συσκευή δικτύου
-Device_type.remote=Απομακρυσμένο (Μη υλοποιημένο)
-
-Perspective_Description_Simple=Απλή	
-Perspective_Description_Files=Αρχεία
-Perspective_Description_Tracks=Κομμάτια
-Perspective_Description_Configuration=Ρύθμιση
-Perspective_Description_Statistics=Στατιστικά
-Perspective_Description_Help=Βοήθεια
-Perspective_Description_Display=Αναπαραγωγή
-Perspective_Description_Albums=Άλμπουμ
-Perspective_Description_Info=Πληροροφορίες
-Perspective_Description_Playlists=Λίστες αναπαραγωγής
-
-Item_Playlist_File=λίστας αναπαραγωγής
-Item_Track=Τίτλος
-Item_Album=Άλμπουμ
-Item_Artist=Καλλιτέχνης
-Item_Genre=Είδος
-Item_Device=Συσκευή
-Item_File=Αρχείο
-Item_Directory=Φάκελος
-Item_Year=Έτος
-
-Property_id=Id
-Property_name=Όνομα
-Property_type=Τύπος
-Property_url=Url
-Property_mount_point=Σημείο ενεργοποίησης
-Property_auto_refresh=Αυτόματη Ανανέωση
-Property_auto_mount=Αυτόματη ενεργοποίηση
-Property_album=Άλμπουμ
-Property_style=Είδος
-Property_author=Καλλιτέχνης
-Property_length=Διάρκεια
-Property_year=Έτος
-Property_rate=Αξιολόγηση
-Property_files=Αρχεία
-Property_hits=Hits
-Property_filename=Αρχείο
-Property_date=Ημερομηνία
-Property_added=Ημερομηνία Εύρεσης
-Property_parent=Κατάλογος Γονέας
-Property_device=Συσκευή
-Property_directory=Φάκελος
-Property_track=Κομμάτι
-Property_size=Μέγεθος (MB)
-Property_quality=Ποιότητα
-Property_hashcode=Hashcode(Κωδικός Κατακερματισμού)
-Property_playlist_files=λίστες αναπαραγωγής
-Property_comment=Σχόλιο
-Property_order=Κομμάτι
-Property_path=Πλήρες μονοπάτι
-Property_tracks=Κομμάτια
-Property_file_date=Ημερομηνία Αρχείου
-Property_Format_Number=Αριθμός
-Property_Format_String=Αλφαριθμητικό
-Property_Format_Boolean=Δυαδικός
-Property_Format_Float=Πραγματικός
-Property_Format_Date=Ημερομηνία
-Property_Format_URL=Url
-Property_pf=Προτίμηση
-Property_tpt=Συνολικός χρόνος αναπαραγωγής (secs)
-Property_ban=Απαγορευμένο
-
-Language_desc_en=Αγγλικά
-Language_desc_fr=Γαλλικά
-Language_desc_de=Γερμανικά
-Language_desc_it=Ιταλικά
-Language_desc_sv=Σουηδικά
-Language_desc_nl=Ολλανδικά
-Language_desc_zh=Κινέζικα
-Language_desc_es=Ισπανικά
-Language_desc_ca=Καταλονικά
-Language_desc_ko=Κορεατικά
-Language_desc_el=Ελληνικά
-Language_desc_ru=Ρωσικά
-Language_desc_gl=Γαλικιανά
-
-#--- Error codes ---
-Error.000=Άγνωστο σφάλμα
-Error.005=Σφάλμα ανάλυσης αρχείου συλλογής
-Error.007=Σφάλμα αναπραγωγής αρχείου, ίσως ο MPlayer δεν ξεκίνησε την αναπαραγωγή πριν το timeout, timeout: 
-Error.008=Σφάλμα παύσης αχείου
-Error.009=Αδύνατη η ανάγνωση του αρχείου
-Error.010=Αδύνατη η εύρεση αρχείου συσχετισμένου με αυτό το κομμάτι σε ενεργοποιημένη συσκευή
-Error.011=Τεχνικό Σφάλμα κατά την ενεργοποίηση της συσκευής ή κενή συσκευή
-Error.012=Τεχνικό Σφάλμα when απενεργοποίηση της συσκευής, πιθανώς χρησιμοποιείται από άλλη εφαρμογή
-Error.013=Αδύνατη η απομάκρυνση της συσκευής: είτε ενεργοποιείται είτε ανανεώνεται αυτή τη στιγμή
-Error.016=Αδύνατη η προσπέλαση της συσκευής. Παρακαλώ εισάγετε το σημείο ενεργοποίησης της συσκευής. Πχ: '/cdrom' στο Unix,'e:' στα MS Windows
-Error.017=Σφάλμα ανάλυσης λίστας αναπαραγωγής
-Error.018=Δεν μπορούν να βρεθούν προσβάσιμα κομμάτια
-Error.019=Μία υπάρχουσα συσκευή έχει ήδη αυτό το όνομα
-Error.020=Σφάλμα IO κατά την αντιγραφή του αρχείου. Ίσως ο δίσκος είναι γεμάτος
-Error.021=Το πεδίο URL είναι υποχρεωτικό. Πχ: 'd:\music' στα MS Windows, '/home/foo/music' στο Unix 
-Error.022=Το πεδίο Όνομα είναι υποχρεωτικό. Πχ: 'Σκληρός Δίσκος', 'CD ROCK' 
-Error.023=Αδύνατη η εκτέλεση  του κομματιού εκκίνησης
-Error.024=Αδύνατη η εγγραφή του αρχείου
-Error.025=Ένα από τα αρχεία που θέλετε να διαβάσετε είναι σε απενεργοποιημένη συσκευή
-Error.026=Σφάλμα καταχώρησης των players
-Error.027=Ο συγχρονισμός εγκαταλήφθηκε
-Error.028=Σφάλμα αποθήκευσης λίστας αναπαραγωγής
-Error.029=Μία υπάρχουσα συσκευή είναι κατάλογος γονέας αυτής της συσκευής, έχει το ίδιο μονοπάτι, ή είναι κατάλογος παιδί
-Error.030=Υπερβολικές αποτυχίες σύνδεσης. Ο Jajuk έχει σταματήσει την αναζήτηση online εξωφύλλων
-Error.101=Η συσκευή δεν υπάρχει  ή δεν είναι προσβάσιμη
-Error.102=Σφάλμα
-Error.103=Σφάλμα ανάγνωσης πληροφοριών ετικέτας
-Error.104=Σφάλμα εγγραφής πληροφοριών ετικέτας 
-Error.105=Δε βρέθηκε Resource Bundle key
-Error.106=Μη συλληφθείσα εξαίρεση
-Error.107=Η συσκευή ήδη ανανεώνεται ή συγχρονίζεταισ
-Error.108=Σφάλμα ανάλυσης αρχείου Οπτικής
-Error.109=Η κλάση υλοποίησης του player η της ετικέτας είναι μη προσβάσιμη
-Error.110=Το όνομα αυτής της ιδιότητας είναι δεσμευμένο από το εσωτερικό σύστημα του Jajuk. Παρακαλώ διαλέξτε άλλο
-Error.111=Η συσκευή είναι ήδη ενεργοποιμένη
-Error.112=Η συσκευή δεν μπορεί να ενεργοποιηθεί
-Error.113=Δεν είναι δυνατή η αποθήκευση των ρυθμίσεων του χρήστη
-Error.114=Δεν είναι δυνατή η ανάγνωση των ρυθμίσεων του χρήστη
-Error.118=Σφάλμα κατά την επεξεργασία του αιτήματος γεγονότος
-Error.119=Σφάλμα κατά την ανάλυση του αρχείου ιστορικού ή το αρχείο δεν υπάρχει
-Error.120=Δεν είναι δυνατή η πρόσβαση στη συσκευή: είτε δεν είναι ενεργοποιμένη, είτε ανανεώνεται, είτε συγχρονίζεται
-Error.121=Η συσκευή είναι σε χρήση και δεν μπορεί να απενεργοποιηθεί
-Error.122=Σφάλμα FIFO
-Error.123=Σφάλμα ρύθμισης εμφάνισης-αίσθησης
-Error.124=Το Jajuk τρέχει ήδη. Μόνο ένα στιγμιότυπο του Jajuk μπορεί να τρέχει κάθε στιγμή.
-Error.125=Η συσκευή είναι ήδη απενεργοποιμένη
-Error.126=Η αναζήτηση δεν υποστηρίζεται από αυτή τη μορφή ήχου
-Error.127=Δεν βρέθηκαν καινούργια κομμάτια για το επιλεγμένο χρονικό όριο. Μπορείτε να ορίσετε το χρονικό όριο στην Προβολή Προτιμήσεις
-Error.128=Το τρέχον κομμάτι είναι το πρώτο της συλλογής. Δεν υπάρχει προηγούμενο κομμάτι
-Error.129=Σφάλμα κατά την φόρτωση εικόνας εξωφύλλου
-Error.131=Δεν είναι δυνατή η διαγραφή του αρχείου
-Error.133=Το αρχείο συλλογής σας διεκόπει για άγνωστο λόγο. Το Jajuk κατάφερε να επαναφέρει ένα εφεδρικό αρχείο
-Error.134=Δεν είναι δυνατή η μετονομασία του αρχείου
-Error.135=Το αρχείο δεν υπάρχει	
-Error.136=Η ενέργεια απέτυχε
-Error.137=Λάθος μορφή
-Error.138=Κάποια αρχεία που αντιστοιχίζονται με αυτά τα κομμάτια βρίσκονται σε απενεργοποιμένες συσκευές και συνεπώς δεν έχουν αλλάξει. 
-Error.140=Μη έγκυρο αλφαριθμητικό: δεν πρέπει να περιέχει τους χαρακτήρες & ' " < ή > 
-Error.141=Αυτή η λίστα αναπαραγωγής βρίσκεται σε απενεργοποιμένη η ανανεούμενη συσκευή και δεν είναι διαθέσιμη
-Error.142=Αυτή η λίστα αναπαραγωγής δείχνει σε μη-υπάρχοντα κομμάτια ή κομμάτια που βρίσκονται εκτός γνωστών συσκευών. Τα κομμάτια αυτά έχουν παραλειφθεί.
-Error.143=Μη προσβάσιμη τοποθεσία συσκευής
-Error.144=Σφάλμα ανάλυσης DJ
-Error.145=Αδύνατη η εκτέλεση του DJ
-Error.146=<html>Το τρέχον μοτίβο του organizer είναι λάθος.<br>Έγκυρες τιμές είναι: %artist (όνομα Καλλιτέχνη); %title (τίτλος Κομματιού); %album (όνομα album);<br> %n (Track leading zero); %genre (είδος κομματιού); %year (Έτος)<br> και το μοτίβο πρέπει να περιέχει τουλάχιστον ένα shash</html>
-Error.147=Κάποια αρχεία δεν μετακινήθηκαν (δείτε τις λεπτομέρειες για περισσότερες πληροφορίες)
-Error.148=Το πεδίο Έτους είναι άγνωστο
-Error.149=Το πεδίο Άλμπουμ είναι άγνωστο
-Error.150=Το πεδίο Καλλιτέχνη είναι άγνωστο
-Error.151=Το πεδίου Τίτλου Κομματιού είναι άγνωστο
-Error.152=Το πεδίου Κομματιού είναι άγνωστο
-Error.153=Το πεδίου Είδους είναι άγνωστο
-Error.154=Δεν είναι δυνατή η μετονομασία του αρχείου, ελέγξτε για λάθος χαρακτήρα στο όνομα του αρχείου ή τις ετικέτες
-Error.155=Σφάλαμα κατά το retagging των αρχείων, ελέγξτε τα δικαιώματα πρόσβασης
-Error.156=Κενή Συλλογή
-Error.157=Λάθος DJ, παρακαλώ επιλέξτε ή δημιουργήστε DJ από το κουμπί DJ της Προβολής Ελέγχου 
-Error.158=Οι περιορισμοί του DJ δεν μπορούν να ληφθούν υπ'όψιν ή δεν υπάρχει διαθέσιμο κομμάτι
-Error.159=Το συσχετισμένο περριβάλλον έχει διαγραφεί
-Error.160=Το αρχείο δε μετακινήθηκε, το όνομα αρχείου πηγής και στόχου είναι ίδια.
-Error.161=Αδύνατη η εγγράφη στον κατάλογο, ελέγξτε τις άδειες πρόσβασης
-Error.162=Αυτή η εξατομικευμένη ιδιότητα υπάρχει ήδη
-Error.163=Σφάλμα στην επαναφορά των προεπιλεγμένων Προβολών
-Error.164=Δε βρέθηκαν προσβάσιμα κομμάτια για το περιβάλλον :
-Error.165=Λάθος μονοπάτι για τη συλλογή, ο φάκελος δεν μπορεί να βρεθεί η δεν επιτρέπεται η εγγραφή
-Error.166=Κενό άλμπουμ, αδύνατυ η λήψη εξώφυλλου
-Error.167=Αδύνατη η δημιουργία αναφοράς
-Error.168=Δε βρέθηκαν όμοια (duplicate) αρχεία
-Error.169=Η ενέργεια απέτυχε. Σημειώστε ότι αυτή η ενέργεια απαιτεί σύνδεση Internet για τη λήψη της λίστας σταθμών.
-Error.170=Σφάλμα αναπαραγωγής webradio
-Error.171=Δεν έχει οριστεί πηγή συγχρονισμού για αυτήν τη συσκευή, ορίστε την χρησιμοποιώντας τον οδηγό ρύθμισης συσκευών (στην εμφάνιση Συσκευές, κάντε click στη συσκευή).
-Error.172=Ανέκυψε σφάλμα κατά τη διαγραφή των ακόλουθων αρχείων:
-Error.173=Ανέκυψε σφάλμα κατά τη διαγραφή των ακόλουθων καταλόγων:
-Error.174=Σφάλμα κατά την πρόσβαση στην ιστοσελίδα του Freedb, ελένξτε τη σύνδεση  με το δίκτυο 
-Error.175=Η λειτουργία ακυρώθηκε
-Error.176=Εσφαλμένη μορφή, η προτίμηση πρέπει να επιλεχθεί μεταξύ -3 και 3
-Error.177=Παρακαλώ εισάγετε έγκυρο χρόνο στη μορφή (ΩΩ24:ΛΛ:ΔΔ)
-
-
-#Warnings
-Warning.0=Ο MPlayer δε βρέθηκε. Κάποιες μορφές ήχου (flac, wma, aac, mpg2 ... ) θα απενεργοποιηθούν. Αν ο MPlayer είναι ήδη εγκατεστημενός, παρακαλώ ορίστε το μονοπάτι του στην προβλή Προτιμήσεις/καρτέλα Για προχωρημένους.
-Warning.1=Λάθος έκδοση του MPlayer, MPlayer1.0Pre8 ή ανώτερος απαιτείται. Κάποια μορφές ήχου θα απενεργοποιηθούν. Παρακαλώ δείτε τις οδηγίες εγκατάστασης στο http://jajuk.sourceforge.net/installation.html για να διορθώσετε αυτό το πρόβλημα. 
-Warning.2=Φαίνεται ότι κάποιος άλλος χρησιμοποιεί αυτήν τη στιγμή την τρέχουσα συλλογή του jajuk. Last user to quit will overwrite configuration (options, rates...). 
-Warning.3=Αδύνατο το download του Mplayer. Αν βρίσκεστε πίσω από HTTP proxy, παρακαλώ ρυθμίστε το στην προβολή Προτιμήσεις / καρτέλα Δίκτυο και επανεκκινήστε το Jajuk. 
-Warning.4=Ο Mplayer απαιτείται για να ακούσετε web radios 
-Warning.5=Ο φάκελος προορισμού υπάρχει ήδη, κάποια αρχεία ενδέχεται να επανεγγραφούν, είστε σίγουρος ? 
-
-#--- Strings by class ---
-ParameterView.0=Διάρκεια Ιστορικού: 
-ParameterView.2=Ρυθμίστε το χρόνο σε μέρες που θα διατηρείται ιστορικό των κομματιών που παίχτηκαν. Δώστε -1 αν δε θέλετε καθόλου ιστορικό και 0 αν θέλετε μόνιμο ιστορικό.
-ParameterView.3=Καθαρισμός Ιστορικού
-ParameterView.4=Καθαρισμός Ιστορικού
-ParameterView.8=Ιστορικό/Βαθμολογίες
-ParameterView.9=Αναπαραγωγή:
-ParameterView.10=Τίποτα
-ParameterView.11=Δε θα παίζεται μουσική όταν ξεκινάει ο Jajuk
-ParameterView.12=Τελευταίο κομμάτι από την αρχή
-ParameterView.13=Αναπαραγωγή του τελευταίου κομματιού από την αρχή 
-ParameterView.14=Τυχαίο κομμάτι
-ParameterView.15=Αναπαραγωγή ενός τυχαίου κομματιού από ολόκληρη τη συλλογή
-ParameterView.16=Κομμάτι:
-ParameterView.17=Διαλέξτε ένα αρχείο για ανπαραγωγή κατά το ξεκίνημα
-ParameterView.18=Διαλέξτε ένα αρχείο για ανπαραγωγή κατά το ξεκίνημα. Αρχίστε την πληκτρολόγηση για να δείτε μία φιλτραρισμένη λίστα.
-ParameterView.19=Ξεκίνημα
-ParameterView.26=Επιβεβαιώσεις
-ParameterView.27=Πριν τη φυσική διαγραφή ενός αρχείου
-ParameterView.28=Ερώτηση πριν τη φυσική διαγραφή ενός αρχείου
-ParameterView.29=Πριν την έξοδο από το Jajuk
-ParameterView.30=Ερώτηση πριν την έξοδο από το Jajuk
-ParameterView.33=Επιλογές
-ParameterView.35=Απόκρυψη κομματιών που βρίσκονται σε απενεργοποιμένες συσκευές
-ParameterView.36=Επανεκκίνηση όταν φτάσει στο τέλος της συλλογής
-ParameterView.37=Επανεκκίνηση όλης τη συλλογής όταν φτάσει στο τέλος στην κατάσταση λειτουργίας Συνέχιση
-ParameterView.38=Γλώσσα:
-ParameterView.42=Επιλέξτε τη γλώσσα διασύνδεσης 
-ParameterView.43=Θέμα: 
-ParameterView.44=<html>Διαλέξτε θέμα<p>(Μπορεί να απαιτήσει επανεκκίνηση του jajuk ώστε να ανανεωθεί)</html>
-ParameterView.46=Επίπεδο Log: 
-ParameterView.47=Καταστροφικό
-ParameterView.48=Σφάλμα
-ParameterView.49=Προειδοποίηση
-ParameterView.50=Πληροφορίες
-ParameterView.51=Αποσφαλμάτωση
-ParameterView.52=Jajuk verbosity: Καταστροφικό: εμφανίζει μόνο κρίσιμα σφάλματα, Σφάλμα: +εμφανίζει σφάλματα, Πληροφορίες: +εμφανίζει μυνήματα πληροφοριών, Προειδοποίηση: +εμφανίζει προειδοποιήσεις, Αποσφαλμάτωση: οποιοδήποτε μύνημα
-ParameterView.59=Θέση εκκίνησης εισαγωγής (%): 
-ParameterView.60=Θέση εισαγωγής μέσα στο κομμάτι in % από 0 (αρχή κομματιού) έως 99 (τέλος κομματιού)
-ParameterView.61=Μήκος εισαγωγής (δευτερόλεπτα): 
-ParameterView.62=Μήκος εισαγωγής (σε δευτερόλεπτα)
-ParameterView.85=Εφαρμογή
-ParameterView.86=Επαναφορά Προεπιλογών
-ParameterView.87=Προτιμήσεις
-ParameterView.98=Patterns
-ParameterView.99=Διεξαγωγή ανίχνευσης ετικέτας σε βάθος
-ParameterView.100=<html>Εξαναγκασμός του Jajuk να ξαναδιαβάσει τις πραγματικές id3 ετικέτες.<p>Αυτό μπορεί να είναι χρήσιμο στην ανανέωση ετικετών που τροποποιήθηκαν χρησιμοποιώντας άλλο πρόγραμμα.</p></html>
-ParameterView.101=Χρήση του ονόματος του καταλόγου γονέα ως ονόματος άλμπουμ
-ParameterView.102=Αν επιλεγεί, το όνομα του καταλόγου γονέα θα χρησιμοποιηθεί ως το όνομα του άλμπουμ για τα κομμάτια των οποίων η ID3 ετικέτα δεν μπορέι να χρησιμοποιηθεί. 
-ParameterView.109=Οι επιλογές αποθηκεύτηκαν
-ParameterView.110=Οι επιλογές πήραν τις προεπιλεγμένες τιμές
-ParameterView.111=Μέγεθος της λίστας αναπαραγωγής καλύτερων:
-ParameterView.112=Δώστε τον αριθμό των κομματιών στη λίστα αναπαραγωγής καλύτερων (από 1 έως 100)
-ParameterView.113=Χρήση κανονικών εκφράσεων στα φίλτρα 
-ParameterView.114=Χρήση κανονικών εκφράσεων (Regexp μορφή) στα φίτρα πινάκων. Παράδειγμα: .*κάτι.*
-ParameterView.115=Για προχωρημένους
-ParameterView.116=Εφεδικό αντίγραφο αρχείου συλλογής
-ParameterView.117=Επιλέξτε αυτό αν θέλετε να δημιουργήσετε εφεδρικά αντίγραφα του αρχείου συλλογής σας στα αρχεία collection-<date>.xml 
-ParameterView.118=Μέγεθος εφεδρικού αντίγραφου (MB)
-ParameterView.119=Μέγεθος εφεδρικού αντίγραφου (MB)
-ParameterView.120=Σύνολο χαρακτήρων της συλλογής
-ParameterView.121=Σύνολο χαρακτήρων της συλλογής. Το UTF-16 είναι καλύτερο για Ασιατικές γλώσσες και το UTF-8 για Ευρωπαικές γλώσσες.
-ParameterView.129=Χρονικό όριο καινούργιων κομματιών (μέρες):
-ParameterView.130=Χρονικό όριο καινούργιων κομματιών σε μέρες: όλα τα κομμάτια που προστίθενται μετάξύ αυτού του αριθμού των ημερών εμφανίζονται στη λίστα αναπαραγωγής καινούργιων κομματιών
-ParameterView.131=Καλύτερο κομμάτι
-ParameterView.132=Αναπαραγωγή ενός από τα αγαπημένα σας κομμάτια στο ξεκίνημα
-ParameterView.133=Καινούργιο κομμάτι
-ParameterView.134=Αναπαραγωγή ενός καινούργιου κομματιού από τη συλλογή σας στο ξεκίνημα
-ParameterView.135=Τελευταίο κομμάτι από την τελευταία θέση
-ParameterView.136=Αναπαραγωγή του κομματιού που παίχτηκε τελευταίο από τη θέση που σταμάτησε
-ParameterView.139=Δίκτυο
-ParameterView.142=Proxy user name
-ParameterView.143=Proxy login name χρησιμοποιείται για πιστοποίηση αυθεντικότητας
-ParameterView.144=Proxy host name
-ParameterView.145=Proxy host name ή διεύθυνση IP 
-ParameterView.146=Proxy θύρα
-ParameterView.147=Proxy TCP-IP θύρα (συχνά 3128)
-ParameterView.148=Online Λήψη εξωφύλλων 
-ParameterView.149=Χρησιμοποιείστε το αυτόματο εξώφυλλο για να κατεβάσετε εξώφυλλα από άλμπουμ από το Διαδίκτυο (αν απαιτείται, ρυθμίστε τον proxy στην καρτέλα δικτύου)
-ParameterView.150=Μέγεθος εξωφύλλων
-ParameterView.151=Μέγεθος εξωφύλλων που κατεβαίβηκαν
-ParameterView.155=Ακρίβεια αναζήτησης. Όσο μεγαλύτερη είναι η ακίβεια, τόσο λιγότερες λανθασμένες εικόνες εξωφύλλων θα παίρνετε.
-ParameterView.156=Χαμηλή (αναζήτηση όλων των λέξεων)
-ParameterView.157=Μέτρια (αναζήτηση ομαδοποιημένων λέξεων)
-ParameterView.158=Υψηλή (αναζήτηση mandatory ομαδοποιημένων λέξεων) 
-ParameterView.159=Εξώφυλλα
-ParameterView.160=Χρονικό όριο σύνδεσης(δευτερόλεπτα)
-ParameterView.161=Χρονικό όριο σύνδεσης σε δευτερόλεπτα: Μία απομακρυσμένη ενέργεια αποτυγχάνει αν ένας peer δεν ανταποκριθεί σε αυτόν το χρόνο.
-ParameterView.162=Χρονικό όριο μεταφοράς(δευτερόλεπτα) 
-ParameterView.163=Χρονικό όριο μεταφοράς σε δευτερόλεπτα: Μία απομακρυσμένη ενέργεια αποτυγχάνει αν τα απαιτούμενα δεδομένα δεν έχουν κατέβει πλήρως σε αυτόν το χρόνο.
-ParameterView.164=Πριν την αφαίρεση μίας συσκευής
-ParameterView.165=Ερώτηση πριν την αφαίρεση μίας συσκευής
-ParameterView.166=Τυχαία εξώφυλλα
-ParameterView.167=Εμφάνιση ενός τυχαίου εξωφύλλου
-ParameterView.169=Προαποθήκευση εξωφύλλων
-ParameterView.170=Προαποθήκευση όλων των διαθέσιμων εξωφύλλων όποτε είναι δυνατό
-ParameterView.171=Πριν τη διαγραφή ενός εξωφύλλου από το δίσκο
-ParameterView.172=Ερώτηση πριν τη διαγραφή ενός εξωφύλλου από το δίσκο
-ParameterView.177=Αριθμός των προγραμματισμένων κομματιών που είναι ορατά
-ParameterView.178=Ο αριθμός των προγραμματισμένων κομματιών που θα εμφανιστούν στη λίστα αναπαραγωγής
-ParameterView.179=Προώθηση με επιλογή
-ParameterView.180=Αν επιλεγεί, κάνοντας διπλό κλικ σε ένα κομμάτι της συλλογής αυτό προστίθεται στη λίστα αναπαραγωγής
-ParameterView.181=Προώθηση με drag & drop
-ParameterView.182=Αν επιλεγεί, τα κομμάτια της συλλογής μπορούν με drag and drop να προστεθούν στη λίστα αναπαραγωγής
-ParameterView.183=Συγχρονισμός Προβολής Δέντρου και Πίνακα
-ParameterView.184=Αν επιλεγεί, η Προβολή Πίνακα θα δείχνει μόνο κομμάτια που επιλέγονται στην Προβολή Δέντρου
-ParameterView.185=Εμφάνιση μπαλονιού κατά την εκκίνηση ενός κομματιού
-ParameterView.186=Επανεκκίνηση αξιολογήσεων
-ParameterView.187=Επαναφορά των αξιολογήσεων όλων των κομματιών στο μηδέν
-ParameterView.188=Πριν το σβήσιμο του ιστορικού
-ParameterView.189=Πριν την επαναφορά των αξιολογήσεων
-ParameterView.190=Διάρκεια επικάλυψης-σβησίματος (δευτερόλεπτα)
-ParameterView.191=Ο αριθμός των δευτερολέπτων επικάλυψης-σβησίματος μεταξύ των κομματιών
-ParameterView.192=Πρότυπο του οργανωτή αρχείων
-ParameterView.193=Διαθέσιμα πρότυπα :%artist (Όνομα καλλιτέχνη); %title (Τίτλος κομματιού); %album (Όνομα άλμπουμ); %n (Track leading zero); %genre (Κατηγορία κομματιού); %year (Έτος)
-ParameterView.194=Πριν την οργάνωση των αρχείων
-ParameterView.195=Προβολή Κινούμενων Εικόνων:
-ParameterView.196=Ενεργοποίηση Θερμών Πλήκτρων
-ParameterView.197=Κάνει κάποια πλήκτρα όπως το F8 να λειτουργούν ακόμη και αν το Jajuk δεν είναι στο επίκεντρο
-ParameterView.198=Κάποιες αλλαγές θα ενεργοποιηθούν μόνο στο επόμενο η ξεκίνημα του Jajuk
-ParameterView.199=Scrobble my listening
-ParameterView.200=Αυτή η επιλογή στέλνει πληροφορίες στο Last.fm
-ParameterView.201=Last.FM όνομα-χρήστη
-ParameterView.202=Το όνομα χρήστη που χρησιμοποιείται στο Last.FM
-ParameterView.203=Last.FM κωδικός-πρόσβασης
-ParameterView.204=Ο κωδικός πρόσβασης που χρησιμοποιείται στο Last.FM
-ParameterView.205=Ορίσματα του MPlayer 
-ParameterView.206=Πρόσθετα ορίσματα του MPlayer όπως '-ao esd' ή '-ao arts' ή '-novideo (για να εμποδιστεί η αναπαραγωγή video)' για παράδειγμα
-ParameterView.207=Jajuk home path
-ParameterView.208=Ορισμός του φακέλου που περιέχει τη διαμόρφωση του  Jajuk (προεπιλεγμένο: <home>/.jajuk)
-ParameterView.209=Το μονοπάτι του Jajuk configuration έχει αλλάξει για τον τρέχοντα χρήστη (η προηγούμενη συλλογή έχει διατηρηθεί στην παλιά θέση). Το Jajuk μπορεί τώρα να επανεκκινηθεί.
-ParameterView.210=Αν το cross fade δε λειτουργεί, προσπαθείστε να προσθέσετε <-ao esd> στο Gnome ή <-ao arts> στο KDE στο πεδίο πρόσθετων παραμέτρων στη μηχανή Ήχου( Προβολή Προτιμήσεις / Καρτέλα Για Προχωρημένους).
-ParameterView.211=Μικρό μόνο
-ParameterView.212=Μικρό και μεσαίο
-ParameterView.213=Μεσαίο μόνο
-ParameterView.214=Μεσαίο και μεγάλο
-ParameterView.215=Μεγάλο μόνο
-ParameterView.216=Αναζήτηση χρησιμοποιώντας το όνομα του καλλιτέχνη
-ParameterView.217=Αναζήτηση χρησιμοποιώντας το όνομα του άλμπουμ
-ParameterView.218=Αναζήτηση χρησιμοποιώντας το όνομα του κομματιού
-ParameterView.219=Μεταβλητές περιβάλλοντος
-ParameterView.220=Ορισμός των μεταβλητών περιβάλλοντος που χρησιμοποιούνται από τον audio player (ARTS_SERVER στο KDE ή ESPEAKER στο Gnome για παράδειγμα). μορφή: var1=xx var2=yyy... 
-#Respect English size for next item
-ParameterView.221=Μέγεθος Σελίδας προβολής κατάλογος (0: όλα σε μία)
-ParameterView.222=Ορισμός του αριθμού των άλμπουμ ανά σελίδα στην προβολή κατάλογος. 0: εμφάνιση όλων των εξωφύλλων σε μία σελίδα.
-ParameterView.223=Μέγεθος γραμματοσειρών
-ParameterView.224=Ορισμός του μεγέθους των γραμματοσειρών κειμένου
-ParameterView.225=GUI
-ParameterView.226=Λειτουργίες
-ParameterView.228=Εμφάνιση album popups
-ParameterView.229=Προτιμήσεις προβολής καταλόγου
-ParameterView.233=Το θέμα θα εφαρμοστεί στο επόμενο ξεκίνημα του Jajuk 
-ParameterView.234=Έλεγχος για ανανεωμένες εκδόσεις του Jajuk 
-ParameterView.235=Last.FM
-ParameterView.236=No Proxy
-ParameterView.237=HTTP proxy
-ParameterView.238=SOCKS proxy
-ParameterView.239=Proxy password
-ParameterView.240=Enable Last.FM information queries
-ParameterView.241=Αν επιλεγεί, το Jajuk θα λάβει ποικίλες πληροφορίες για άλμπουμ και άλλα από το website του Last.FM (βλέπε Προβολή Πρόταση(suggestion) 
-ParameterView.242=Μονοπάτι του Mplayer
-ParameterView.243=<html>Ορίστε εδώ το πλήρες μονοπάτι με το εκτελέσιμο του mplayer (επιτρέπονται τα κενά)<br>Παράδειγμα: /Applications/MPlayer OSX.app/Contents/Resources/External_Binaries/mplayer_intel.app/Contents/MacOS/mplayer</html>
-ParameterView.244=ημερομηνία Ανακάλυψης = ημερομηνία Αρχείου 
-ParameterView.245=<html>Αν επιλεγεί, το jajuk θεωρεί ως ημερομηνία ανακάλυψης την ημερομηνία συστήματος των αρχείων ήχου<br>Απαιτεί να ληφθούν υπόψη  οι deep ανανεώσεις</html>
-ParameterView.246=Μέγεθος εικονιδίων της μπάρας Οπτικών (σε pixels)
-ParameterView.247=Το μονοπάτι προορισμού περιέχει ένα υπάρχον Jajuk workspace. Το workspace έχει μεταφερθεί σε αυτό το μονοπάτι για τον τρέχοντα χρήστη (το προηγούμενο workspace έχει διατηρηθεί στην παλιά θέση). Το jajuk μπορεί τώρα να επανεκκινηθεί.
-ParameterView.248=Τίτλος πλαισιού :
-ParameterView.249=Επαναφορά προτιμήσεων
-ParameterView.250=Επαναφορά ορισμένων από το χρήστη προτιμήσεων
-ParameterView.251=Το ιστορικό επαναφέρθηκε με επιτυχία
-ParameterView.252=Οι βαθμολογίες και ο αριθμός αναπραγωγών επαναφέρθηκαν με επιτυχία
-ParameterView.253=Οι προτιμήσεις επαναφέρθηκαν με επιτυχία
-
-Main.21=Επιβεβαίωση
-Main.22=Downloading MPlayer
-
-Player.0=Αναμονή για γραμμή ήχου (κατειλλημένη)
-
-Device.25=] ανανεώθηκε σε 
-Device.27= νέα αρχεία
-Device.31=Συγχρονισμός [
-Device.33=Ο συγχρονισμός έγινε σε 
-Device.35= δημιουργηθέντα αρχεία (
-Device.36= MB) 
-Device.41=Συγχροισμός [
-Device.42=]  Αντιγραφή [
-Device.43= μη αναγνώσιμες ετικέτες
-Device.44=Είσοδος(Entering)
-
-FIFO.4=). Θέλετε να προσπαθήσετε να το ενεργοποιήσετε ?
-FIFO.10=Παίζει τώρα: 
-FIFO.13= Kbps
-FIFO.14=Παίζει τώρα Web Radio:
-
-HistoryItem.0=dd/MM/yy HH:mm
-
-DeviceWizard.0=Ρύθμιση Συσκευής
-DeviceWizard.1=Τύπος Συσκευής(*): 
-DeviceWizard.2=Όνομα Συσκευής(*): 
-DeviceWizard.3=Τοποθεσία Συσκευής(*): 
-DeviceWizard.4=Unix mount point (προαιρετικό): 
-DeviceWizard.7=Πραγματοποίηση στιγμιαίας ανανέωσης
-DeviceWizard.8=Αυτόματη ενεργοποίηση στο ξεκίνημα
-DeviceWizard.10=Συγχρονισμένη με: 
-DeviceWizard.11=Συγχρονισμός μονής κατεύθυνσης
-DeviceWizard.12=Όλα τα νέα αρχεία που βρίσκονται στη συσκευή-πηγή αντιγράφονται σε αυτή τη συσκευή. Τίποτα δε γράφεται στη συσκευή-πηγή.
-DeviceWizard.13=Αμφίδρομος συγχρονισμός
-DeviceWizard.14=Όλα τα νέα αρχεία που βρίσκονται στη μία συσκευή αντιγράφονται στην άλλη
-DeviceWizard.43=Παρακαλώ επιλέξτε κατάλογο
-DeviceWizard.44=Η συσκευή δημιουργήθηκε
-DeviceWizard.45=Παρακαλώ δώστε ένα όνομα στη συσκευή. Πχ: CD A, Laptop...
-DeviceWizard.46=Παρακαλώ δώστε την τοποθεσία της συσκευής. Πχ: d:\music στα Windows, /home/foo/music στο Unix
-DeviceWizard.48=<html>Επιλέξτε αυτό αν θέλετε να πραγματοποιήσετε μία άμεση ανανέωση της συσκευής (προτείνεται). <p>Σημειώστε ότι αυτή η διαδικασία μπορεί να διαρκέσει αρκετά για μεγάλες συσκευές.</p></html>
-DeviceWizard.49=<html>Επιλέξτε αυτό αν θέλετε να ενεργοποιήσετε αυτόματα τη συσκευή όταν το Jajuk ξεκινάει. <p>Προτείνεται για καταλόγους στον τρέχοντα σκληρό δίσκο, αλλά όχι για CDs.</p></html>
-DeviceWizard.50=<html>Δώστε το διάστημα σε λεπτά για την αυτόματη αναζήτηση νέων αρχείων (0: καθόλου αναζήτηση, 0.5 λεπτά είναι το ελάχιστο interval)</html>
-DeviceWizard.51=Διαλέξτε αυτό αν θέλετε να συγχρονίσετε αυτή τη συσκευή με μία άλλη
-DeviceWizard.52=Διαλέξτε συσκευή-πηγή
-DeviceWizard.53=Ανανέωση της συσκευής κάθε
-#limited string size
-DeviceWizard.54=λεπ.
-
-JajukJMenuBar.0=Αρχείο
-JajukJMenuBar.1=Άνοιγμα αρχείου
-JajukJMenuBar.3=Έξοδος
-JajukJMenuBar.5=Ιδιότητες
-JajukJMenuBar.6=Δημιουργία εξατομικευμένης ιδιότητας
-JajukJMenuBar.7=Διαγραφή εξατομικευμένης ιδιότητας
-JajukJMenuBar.8=Προβολές
-JajukJMenuBar.9=Λειτουργίες
-JajukJMenuBar.10=Επανάληψη
-JajukJMenuBar.11=Τυχαία σειρά
-JajukJMenuBar.12=Συνέχιση
-JajukJMenuBar.13=Εισαγωγή
-JajukJMenuBar.14=Βοήθεια
-JajukJMenuBar.15=Περιεχόμενα της Βοήθειας
-JajukJMenuBar.16=About
-JajukJMenuBar.17=Επαναφορά προεπιλεγμένων Προβολών
-JajukJMenuBar.18=Οδηγός Συσκευής
-JajukJMenuBar.19=Αναφορά σφάλματος ή αιτήματος χαρακτηριστικού-γνωρίσματος
-JajukJMenuBar.20=Συμβουλή της Ημέρας
-JajukJMenuBar.21=Ρυθμίσεις
-JajukJMenuBar.22=Προτιμήσεις
-JajukJMenuBar.23=Εμφάνιση ιχνών αποσφαλμάτωσης
-JajukJMenuBar.24=Εμφάνιση μόνο των διαθέσιμων κομματιών 
-JajukJMenuBar.25=Εμφάνιση Προβολής
-JajukJMenuBar.26=Επαναφορά Προβολών(σε όλες τις οπτικές)
-JajukJMenuBar.27=Έλεγχος για ανανεωμένες εκδόσεις του Jajuk
-JajukJMenuBar.28=Εργαλεία
-JajukJMenuBar.29=Έξυπνες Λειτουργίες
-
-PlaylistFileItem.1=Kαινούργια
-PlaylistFileItem.2=Νέα λίστα αναπαραγωγής
-PlaylistFileItem.3=Bookmarks
-PlaylistFileItem.4=Καλύτερα
-PlaylistFileItem.5=Τρέχουσα ουρά
-
-JajukFileChooser.0=Επιλογέας αρχείου
-
-SearchBox.0=Διεξαγωγή αναζήτησης μεταξύ κομματιών, καλλιτεχνών, ειδών, καταλόγων...
-
-CommandJPanel.0=Εμφάνιση ιστορικού αναπαραγωγής
-CommandJPanel.1=Κατάσταση λειτουργίας Επανάληψη: Αναπαράγει τα κομμάτια σε κύκλο
-CommandJPanel.2=Κατάσταση λειτουργίας Τυχαία Σειρά: Παίζει τυχαία επιλεγμένα κομμάτια
-CommandJPanel.3=Κατάσταση λειτουργίας Συνέχιση: Συνεχίζει με την αναπαραγωγή προγραμματισμένων κομματιών όταν τελειώσει
-CommandJPanel.4=Κατάσταση λειτουργίας Εισαγωγή: Παίζει μόνο ένα μέρος κάθε κομματιού. Ο χρόνος και η σχετική απόσταση μπορούν να οριστούν στην Προβολή Προτιμήσεις
-CommandJPanel.5=Αναπαραγωγή μιας τυχαίας επιλογής από ολόκληρη τη συλλογή
-CommandJPanel.6=Αναπαραγωγή των δικών σας αγαπημένων κομματιών
-CommandJPanel.7=Σίγαση
-CommandJPanel.8=<html>ναπαραγωγή του προηγούμενου κομματιού στη τρέχουσα επιλογή<br />Shift+click εκκινεί το προηγούμενο άλμπουμ</html>
-CommandJPanel.9=<html>Αναπαραγωγή του επόμενου κομματιού στη τρέχουσα επιλογή<br />Shift+click εκκινεί το επόμενο άλμπουμ</html>
-CommandJPanel.10=<html>Γρήγορη επαναφορά στο τρέχον κομμάτι<br />Shift+click για επανάληψη</html>
-CommandJPanel.11=Παύση / Συνέχιση τρέχοντος κομματιού
-CommandJPanel.12=Διακοπή
-CommandJPanel.13=Γρήγορα μπροστά στο τρέχον κομμάτι
-CommandJPanel.14=Ένταση
-CommandJPanel.15==<html>Κάντε click εδώ για να αλλάξετε τη μορφή εμφάνισης του χρόνου</html> 
-CommandJPanel.16=Launch DJ selection
-CommandJPanel.17=Διαχείριση των DJs
-CommandJPanel.18=Εκκίνηση προεπιλεγμένου DJ 
-CommandJPanel.19=Διαχείρηση των Περιβαλλόντων
-CommandJPanel.20=Κομμάτι - κομμάτι
-CommandJPanel.21=Ανακάτεμα Άλμπουμ - άλμπουμ
-CommandJPanel.22=Άλμπουμ - άλμπουμ
-CommandJPanel.23=Κάντε Click to clear search
-CommandJPanel.24=Διαμόρφωση των web ραδιοφώνων
-CommandJPanel.25=Άνοιγμα του ραφιοφώνου
-
-InformationJPanel.5=Συνολικός χρόνος αναπραγωγής μουσικής 
-InformationJPanel.6=Βitrate κομματιού
-InformationJPanel.7=Πρόοδος τρέχοντος κομματιού 
-#song name BY artist ON album name
-InformationJPanel.8=%title από %artist στο %album
-
-AbstractPlaylistEditorView.0=Τίτλος
-AbstractPlaylistEditorView.1=Τοποθεσία
-AbstractPlaylistEditorView.2=Τρέξτε αυτήν τη λίστα αναπαραγωγής 
-AbstractPlaylistEditorView.3=Αποθηκεύστε αυτήν τη λίστα αναπαραγωγής
-AbstractPlaylistEditorView.4=Προσθέστε ένα item σε αυτήν τη λίστα αναπαραγωγής 
-AbstractPlaylistEditorView.5=Διαγράψτε ένα item από αυτήν τη λίστα αναπαραγωγής 
-AbstractPlaylistEditorView.6=Μετακινήστε το επιλεγμένο κομμάτι επάνω
-AbstractPlaylistEditorView.7=Μετακινήστε το επιλεγμένο κομμάτι κάτω
-AbstractPlaylistEditorView.9=Διαγράψτε αυτήν τη λίστα αναπαραγωγής
-AbstractPlaylistEditorView.10=Προσθέστε ένα τυχαίο κομμάτι σε αυτήν τη λίστα αναπαραγωγής
-AbstractPlaylistEditorView.15=Λίστες αναπαραγωγής
-AbstractPlaylistEditorView.17=Πρόκειται να ανανεώσετε τις ακόλουθες λίστες αναπαραγωγής:
-AbstractPlaylistEditorView.18=Κομμάτι στην ουρά
-AbstractPlaylistEditorView.19=Επαναλαμβανόμενο κομμάτι
-AbstractPlaylistEditorView.20=Προγραμματισμένο κομμάτι
-AbstractPlaylistEditorView.21=Κομμάτι λίστας αναπαραγωγής
-AbstractPlaylistEditorView.22=Αποθήκευση λίστας αναπαραγωγής
-AbstractPlaylistEditorView.27=Προετοιμασία Party
-AbstractPlaylistEditorView.28=ο φάκελος δημιουργήθηκε επιτυχώς στο
-
-StatView.0=Άλλα
-StatView.1=Είδη
-StatView.2=Δεν υπάρχουν διαθέσιμα δεδομένα
-StatView.3=Άλλα
-StatView.4=Μέγεθος ανά συσκευή (Gb)
-StatView.5=Δεν υπάρχουν διαθέσιμα δεδομένα
-StatView.7=Μέγεθος συλλογής ανά μήνα
-StatView.8=Μήνες
-StatView.9=Μέγεθος (Gb)
-StatView.10=Δεν υπάρχουν διαθέσιμα δεδομένα
-StatView.12=Συνολικός αριθμός κομματιών ανά μήνα
-StatView.13=Μήνες
-StatView.14=Αριθμός κομματιών
-StatView.15=Δεν υπάρχουν διαθέσιμα δεδομένα
-StatView.16=Στατιστικά
-StatView.24=Παλιότερα
-
-CDScanView.0=Ετικέτα CD: 
-CDScanView.1=Ετικέτα CD. Πχ: CD1, ROCK...
-CDScanView.2=Ετικέτα CD. Πχ: CD1, ROCK...
-CDScanView.3=Τοποθεσία CD: 
-CDScanView.4=Τοποθεσία που βρίσκεται το CD. Πχ: '/cdrom' στο Unix, 'e:' στα MS Windows...
-CDScanView.5=Τοποθεσία που βρίσκεται το CD. Πχ: '/cdrom' στο Unix, 'e:' στα MS Windows...
-CDScanView.6=Σάρωση
-CDScanView.12=Σαρωτής CD
-CDScanView.18=Σαρώνει το CD και προσθέτει όλα τα μουσικά αρχεία στη συλλογή
-CDScanView.19=Διαλέξτε την τοποθεσία του CD
-
-TracksTreeView.0=Δέντρο Κομματιών
-TracksTreeView.27=Συλλογή
-TracksTreeView.31= κομμάτια
-TracksTreeView.33=Δημιουργία αναφοράς
-TracksTreeView.34=Λήψη ετικετών Online
-TracksTreeView.35=Ημερομηνία ανακάλυψης
-TracksTreeView.36=λιγότερο από μία εβδομάδα
-TracksTreeView.37=λιγότερο από ένα μήνα
-TracksTreeView.38=λιγότερο από έξι μήνες
-TracksTreeView.39=παλιότερο
-TracksTreeView.40=λιγότερο από ένα έτος
-TracksTreeView.41=λιγότερο από δύο έτη
-TracksTreeView.42=λιγότερο από πέντε έτη
-TracksTreeView.43=λιγότερο από δέκα έτη
-TracksTreeView.44=λιγότερο από τρεις μήνες
-TracksTreeView.45=Έτος
-
-CoverView.2=Διαγραφή αυτού του εξωφύλλου από το δίσκο 
-CoverView.3=Εξώφυλλο
-CoverView.4=Προηγούμενη εικόνα από το δίσκο και/ή το web αν η επιλογή αυτόματο-εξώφυλλο είναι επιλεγμένη
-CoverView.5=Επόμενη εικόνα από το δίσκο και/ή το web αν η επιλογή αυτόματο-εξώφυλλο είναι επιλεγμένη
-CoverView.6=Αποθήκευση εξωφύλλου με το πραγματικό του όνομα
-CoverView.8=Χρήση αυτού του  cover εξωφύλλου σαν το επιλεγμένο εξώφυλλο για αυτό το άλμπουμ
-CoverView.9=Εξώφυλλα
-CoverView.10=Αποθήκευση εξωφύλλου ως
-CoverView.11=Το εξώφυλλο αποθηκεύτηκε 
-CoverView.12=Άλμπουμ 
-CoverView.13=Τίτλος
-
-AnimationView.0=Κινούμενες Εικόνες
-
-FilesTreeView.0=Δέντρο Αρχείων
-FilesTreeView.3=Αντιγραφή
-FilesTreeView.4=Αποκοπή
-FilesTreeView.5=Επικόλληση
-FilesTreeView.7=Διαγραφή
-FilesTreeView.14=Αποσυγχρονισμός
-FilesTreeView.15=Επανασυγχρονισμός
-FilesTreeView.16=Δημιουργία λίστας αναπαραγωγής
-FilesTreeView.17=Αντιγραφή
-FilesTreeView.18=Αποκοπή
-FilesTreeView.28=Ενεργοποίηση
-FilesTreeView.29=Απενεργοποίηση
-FilesTreeView.30=Εξαναγκασμένη ανανέωση
-FilesTreeView.31=Συγχρονισμός
-FilesTreeView.32=Έλεγχος
-FilesTreeView.33=Δημιουργία λιστών αναπαραγωγής
-FilesTreeView.40=Αντιγραφή
-FilesTreeView.41=Αποκοπή
-FilesTreeView.42=Επικόλληση
-FilesTreeView.47=Συλλογή
-FilesTreeView.52= αρχεία: 
-FilesTreeView.53= GB
-FilesTreeView.54= MB
-FilesTreeView.55=Ρύθμιση συσκευής
-FilesTreeView.59=Θέλετε να διεξάγετε γρήγορη ή σε βάθος (επανανάγνωση ετικετών) αναζήτηση?
-FilesTreeView.60=Γρήγορη
-FilesTreeView.61=Σε βάθος
-FilesTreeView.62=Οργάνωση αρχείων
-
-TracksTableView.0=Πίνακας κομματιών
-TracksTableView.7=Αναπαραγωγή
-TracksTableView.8=Προώθηση
-TracksTableView.9=Τυχαία αναπαραγωγή
-TracksTableView.10=Επανάληψη
-TracksTableView.11=Αναπαραγωγή Άλμπουμ
-TracksTableView.12=Αναπαραγωγή Καλλιτέχνη
-TracksTableView.14=Ιδιότητες
-TracksTableView.15=Προσθήκη στα αγαπημένα
-
-AbstractTableView.0=Φίλτρο:
-AbstractTableView.1=Ιδιότητα για φιλτράρισμα
-AbstractTableView.3=Τιμή που χρησιμοποιείται από το φίλτρο
-AbstractTableView.4=Εφαρμογή φίλτρου
-AbstractTableView.5=Καθαρισμός του φίλτρου
-AbstractTableView.6=Εφαρμογή προχωρημένου φίλτρου
-AbstractTableView.7=περιέχει:
-AbstractTableView.8=Οτιδήποτε
-AbstractTableView.10=(Μη διαθέσιμο)
-AbstractTableView.11=Κάνει τον πίνακα τροποποιήσιμο
-
-AboutView.7=About
-AboutView.8=Άδεια
-AboutView.9=Σύστημα
-AboutView.10=About
-
-PhysicalPlaylistRepositoryView.0=Αναπαραγωγή
-PhysicalPlaylistRepositoryView.1=Επεξεργασία
-PhysicalPlaylistRepositoryView.2=Αποθήκευση ως
-PhysicalPlaylistRepositoryView.3=Διαγραφή
-PhysicalPlaylistRepositoryView.4=Ιδιότητες
-PhysicalPlaylistRepositoryView.6=Φυσικές Λίστες αναπαραγωγής
-PhysicalPlaylistRepositoryView.8=Έξυπνη
-PhysicalPlaylistRepositoryView.9=Ουρά αναπαραγωγής
-PhysicalPlaylistRepositoryView.10=Τρέχουσα ουρά: σύρετε και αφήστε κομμάτια για αναπαραχθούν
-PhysicalPlaylistRepositoryView.11=Νέα
-PhysicalPlaylistRepositoryView.12=Νέα λίστα αναπαραγωγής: σύρετε και αφήστε κομμάτια για να τα προσθέσετε στη λίστα αναπαραγωγής
-PhysicalPlaylistRepositoryView.13=Bookmarks
-PhysicalPlaylistRepositoryView.14=Bookmark λίστα αναπαραγωγής: σύρετε και αφήστε κομμάτια to bookmark
-PhysicalPlaylistRepositoryView.15=Καλύτερα
-PhysicalPlaylistRepositoryView.16=Λίστα αναπαραγωγής Καλύτερα: περιέχει τα κομμάτια που ακούτε περισσότερο
-PhysicalPlaylistRepositoryView.17=Καινούργια
-PhysicalPlaylistRepositoryView.18=Λίστα αναπαραγωγής Καινούργια: περιέχει τα νεότερα κομμάτια
-PhysicalPlaylistRepositoryView.19=Προετοιμασία Party
-
-FilesTableView.0=Πίνακας Αρχείων
-FilesTableView.15=Αναπαραγωγή καταλόγου
-#Dev: do not use ID = 16, next label is FilesTableView.17 
-
-DeviceView.0=Προσθήκη συσκευής
-DeviceView.1=Απομάκρυνση απενεργοποιμένης συσκευής (δε διαγράφει τίποτα από το δίσκο)
-DeviceView.2=Ιδιότητες επιλεγμένης συσκευής
-DeviceView.3=Ενεργοποίηση επιλεγμένης συσκευής
-DeviceView.4=Απενεργοποίηση επιλεγμένης συσκευής
-DeviceView.5=Έλεγχος διαθεσιμότητας επιλεγμένης συσκευής
-DeviceView.6=Εξαναγκασμένη ανανέωση της επιλεγμένης συσκευής
-DeviceView.7=Συγχρονισμός επιλεγμένης συσκευής
-DeviceView.8=Ενεργοποίηση
-DeviceView.9=Απενεργοποίηση
-DeviceView.10=Έλεγχος
-DeviceView.11=Εξαναγκασμένη ανανέωση
-DeviceView.12=Συγχρονισμός
-DeviceView.13=Απομάκρυνση συσκευής
-DeviceView.14=Ρύθμιση
-DeviceView.17=Νέα
-DeviceView.18=Προσθήκη συσκευής
-DeviceView.21=Αυτή η συσκευή είναι διαθέσιμη 
-DeviceView.22=Αυτή η συσκευή είναι απροσπέλαστη
-DeviceView.23=Συσκευές
-
-JajukWindow.1=Ήχος
-JajukWindow.2=Σίγαση
-JajukWindow.3=Jajuk
-JajukWindow.4=Έξοδος
-JajukWindow.5=About Jajuk
-JajukWindow.6=Τυχαία αναπαραγωγή
-JajukWindow.7=Αναπαραγωγή των Καλύτερων
-JajukWindow.10=Παύση
-JajukWindow.11=Διακοπή
-JajukWindow.12=Αναπαραγωγή
-JajukWindow.13=Προηγούμενο 
-JajukWindow.14=Επόμενο
-JajukWindow.15=Αναπαραγωγή Καινούργιων
-JajukWindow.16=Συνέχιση Άλμουμ
-JajukWindow.17=Jajuk: Advanced Jukebox
-JajukWindow.18=Έτοιμο για αναπαραγωγή
-JajukWindow.19=Σίγαση/Ήχος
-JajukWindow.21=Έξοδος
-JajukWindow.22=About Jajuk
-JajukWindow.23=Αναπαραγωγή τυχαίων κομματιών από τη συλλογή
-JajukWindow.24=Αναπαραγωγή των πιο δημοφιλών κομματιών της συλλογής
-JajukWindow.26=Αναπαραγωγή/Παύση
-JajukWindow.27=Διακοπή
-JajukWindow.29=Προηγούμενο Κομμάτι - left-click+[SHIFT]= προηγούμενο άλμπουμ.
-JajukWindow.30=Επόμενο Κομμάτι - left-click+[SHIFT]= επόμενο άλμπουμ.
-JajukWindow.31=Αναπαραγωγή των νεότερων κομματιών της συλλογής
-JajukWindow.32=Συνέχιση Άλμπουμ: Finish playing the current album
-JajukWindow.33=Ένταση
-JajukWindow.34=Θέση
-JajukWindow.35=Παίζει:
-JajukWindow.36=Τρέχον Περιβάλλον:
-JajukWindow.37=Δεν έχει οριστεί Περιβάλλον 
-#Do not use JajukWindow.38, next is JajukWindow.39 
-
-SimpleDeviceWizard.0=Γρήγορη δημιουργία συσκευής
-
-FirstTimeWizard.0=Γρήγορο ξεκίνημα
-FirstTimeWizard.1=<html><b>Καλώς Ήρθατε! Αυτός ο οδηγός θα σας βοηθήσει στη δημιουργία της μουσικής σας συλλογής.</b></html>
-FirstTimeWizard.2=<html>Παρακαλώ επιλέξτε την τοποθεσία της μουσικής σας</html>
-FirstTimeWizard.4=Εμφάνιση βοήθειας τώρα
-FirstTimeWizard.5=Παρακαλώ επιλέξτε κατάλογο
-FirstTimeWizard.6=Προχωρημένες προτιμήσεις
-FirstTimeWizard.7=Ορισμός του φακέλου που περιέχει το χώρο-εργασίας του Jajuk :
-
-HelpView.2=Βοήθεια
-
-DownloadManager.0=<html>Το Jajuk χρειάζεται τον κωδικό πρόσβασης του HTTP proxy σας για να λάβει εξώφυλλα.<br>Αν δεν τα θέλετε, παρακαλώ αλλάξτε τις ρυθμίσεις σας στην καρτέλα Εξώφυλλα της Προβολής Προτιμήσεις.<br>Αν δεν έχετε proxy, παρακαλώ αλλάξτε τις ρυθμίσεις σας στην καρτέλα Δίκτυο της Προβολής Προτιμήσεις.</html>
-DownloadManager.1=Απαιτείται Κωδικός Πρόσβασης
-
-PropertiesWizard.0=Ιδιότητες αντικειμένου
-PropertiesWizard.1=Ιδιότητα
-PropertiesWizard.2=Τιμή
-PropertiesWizard.3=Τροποποιήσιμη?
-PropertiesWizard.4=Σύνδεσμος
-PropertiesWizard.6=Επιλογή
-PropertiesWizard.7=Τύπος
-PropertiesWizard.8=Επιτυχώς ενημερομένη ιδιότητα
-PropertiesWizard.9=Δεν υπάρχει τροποποιήσιμη ιδιότητα για αυτήν την επιλογή
-PropertiesWizard.10=οι ιδιότητες έχουν οριστεί
-PropertiesWizard.11=Εγγραφή ετικέτας σε:
-PropertiesWizard.12=Σύνδεσμος στις ιδιότητες του δοθέντος στοιχείου
-
-NewPropertyWizard.0=Δημιουργία Εξατομικευμένης Ιδιότητας
-NewPropertyWizard.3=(*)Τύπος
-NewPropertyWizard.4=Μορφή
-NewPropertyWizard.5=Προεπιλεγμένη τιμή
-
-CustomPropertyWizard.0=(*)Αντικείμενο
-CustomPropertyWizard.1=(*)Όνομα Εξατομικευμένης Ιδιότητας
-
-RemovePropertyWizard.0=Διαγραφή Εξατομικευμένης Ιδιότητας
-
-QualityFeedbackWizard.20=Ένα νέο παράθυρο θα ανοίξει τώρα για να υποβάλετε το ticket σας στον εξωτερικό σας πλοηγό(browser). Τα τελευταία σας anonymized traces έχουν ήδη προωθηθεί στο clipboard σας, παρακαλώ επικολλήστε τα στο πεδίο περιγραφής(description field) αν είναι αναφορά σφάλματος (αυτό θα αυξήσει σε μεγάλο βαθμό τις πιθανότητες διόρθωσης του προβλήματός σας).
-
-IncRateAction.0=Αύσηση της αξιολόγησης του τρέχοντος κομματιού
-
-SplashScreen.0=Αρχικοί έλεγχοι
-SplashScreen.1=Φόρτωμα συλλογής
-SplashScreen.2=Εκκίνηση της μηχανής μουσικής
-SplashScreen.3=Εκκίνηση της διασύνδεσης γραφικών
-
-CatalogView.0=Κατάλογος εξωφύλλων
-#Note: CatalogView.2 label musn't be much larger than in english for correct display in 800x600
-CatalogView.2=Εμφάνιση των άλμπουμ χωρίς εξώφυλλο
-CatalogView.3=Ανανέωση του καταλόγου
-CatalogView.4=Μέγεθος μικρογραφίας:
-CatalogView.5=Δημιουργήθηκε μικρογραφία για:
-CatalogView.7=Λήψη εξωφύλλων online
-CatalogView.8=Δε βρέθηκε εξώφυλλο
-CatalogView.9=Προηγούμενη
-CatalogView.10=Επόμενη
-CatalogView.11=Σελίδα:
-CatalogView.12=Εμφάνιση προηγούμενης σελίδας μικρογραφιών
-CatalogView.13=Εμφάνιση επόμενης σελίδας μικρογραφιών
-CatalogView.14=Επιλέξτε σελίδα μικρογραφιών προς εμφάνιση
-CatalogView.15=Μέγεθος Μικρογραφιών:
-CatalogView.16=άλμπουμ
-CatalogView.17=/σελίδα
-CatalogView.18=Επιλογή εξωφύλλου
-CatalogView.19=Αναδόμηση μικρογραφιών
-CatalogView.20=Εμφάνιση λεπτομέρειας
-
-WikipediaView.0=Wikipedia
-WikipediaView.1=Επιλέξτε γλώσσα:
-WikipediaView.3=Δε βρέθηκε αποτέλεσμα
-WikipediaView.5=Αναζήτηση με το όνομα Καλλιτέχνη
-WikipediaView.6=Αναζήτηση με το όνομα Άλμπουμ
-WikipediaView.7=Αναζήτηση με βάση τον τίτλο
-
-
-TipOfTheDayView.0=Συμβουλή της ημέρας
-TipOfTheDayView.1=Ήξερες...?
-TipOfTheDayView.2=Εμφάνιση στο ξεκίνημα?
-
-CDDBWizard.0=Αποδοχή
-CDDBWizard.1=Όνομα αρχείου
-CDDBWizard.2=Τίτλος τρέχοντος Κομματιού
-CDDBWizard.3=Τίτλος τρέχοντος Άλμπουμ 
-CDDBWizard.4=Προτεινόμενος Τίτλος Κομματιού 
-CDDBWizard.5=Προτεινόμενος Τίτλος Άλμπουμ :
-CDDBWizard.6=Έγινε! Βρέθηκε
-CDDBWizard.7=πιθανές ταυτίσεις
-CDDBWizard.12=Δε βρέθηκε ταύτιση!
-CDDBWizard.14=Αυτός ο κατάλογος δεν περιέχει αρχεία
-CDDBWizard.16=Κατηγορία:
-CDDBWizard.17=Βρέθηκε αποτέλεσμα που ταυτίζεται ακριβώς!
-CDDBWizard.18=Ταύτιση/Ταυτίσεις
-CDDBWizard.19=Λήψη ετικετών Online
-
-RefactorWizard.0=Το αρχείο μετακινήθηκε : 
-
-DigitalDJWizard.0=Επιλέξτε τη μορφή του νέου DJ
-DigitalDJWizard.1=Προγραμματισμός βασισμένος σε μεταβάσεις (ROCK -> POP)
-DigitalDJWizard.2=Προγραμματισμός βασισμένος σε ποσοστά (20% JAZZ, 30% ROCK)
-DigitalDJWizard.3=Προγραμματισμός βασισμένος σε περιβάλλον (Soft, Party...)
-DigitalDJWizard.4=Οδηγός Ψηφιακού DJ
-DigitalDJWizard.5=Γενική Ρύθμιση του DJ
-DigitalDJWizard.6=Όνομα του DJ (*)
-DigitalDJWizard.8=Ελάχιστος αριθμός αστεριών:
-DigitalDJWizard.9=Επικάλυψη-σβήσιμο (δευτερόλεπτα):
-DigitalDJWizard.10=Τα κομμάτια παίζονται μόνο μία φορά
-DigitalDJWizard.11=Drop
-DigitalDJWizard.12=Από Είδη
-DigitalDJWizard.13=Σε Είδη
-DigitalDJWizard.14=Επιλογή ειδών (επιτρέπονται οι πολλαπλές επιλογές)
-DigitalDJWizard.15=Αριθμός κομματιών
-DigitalDJWizard.16=Θέλεις...
-DigitalDJWizard.17=Να δημιουργήσεις καινούργιο DJ?
-DigitalDJWizard.18=Να αλλάξεις έναν υπάρχοντα DJ?
-DigitalDJWizard.19=Να διαγράψεις έναν DJ?
-DigitalDJWizard.20=Νέος DJ βασισμένος σε μεταβάσεις 
-#limited string size
-DigitalDJWizard.21=Διαγραφή 
-#limited string size
-DigitalDJWizard.22=Προέλευση 
-#limited string size
-DigitalDJWizard.23=Προορισμός
-#limited string size
-DigitalDJWizard.24=Nb
-#limited string size
-DigitalDJWizard.25=Αρχίζει με:
-DigitalDJWizard.26=Παρακαλώ δημιουργείστε τουλάχιστον μία μετάβαση
-#limited string size
-DigitalDJWizard.27=Επιλογή ειδών
-#limited string size
-DigitalDJWizard.28=%
-DigitalDJWizard.29=Νέος DJ βασισμένος σε ποσοστά
-DigitalDJWizard.30=Παρακαλώ δημιουργείστε τουλάχιστον ένα ποσοστό
-DigitalDJWizard.31=Νέος DJ βασισμένος σε περιβάλλον
-DigitalDJWizard.32=Νέο
-DigitalDJWizard.33=Δημιουργία νέου περιβάλλοντος
-DigitalDJWizard.34=Διαγραφή
-DigitalDJWizard.35=Διαγραφή επιλεγμένου περιβάλλοντος
-DigitalDJWizard.36=Όνομα του Περιβάλλοντος
-DigitalDJWizard.37=Όνομα
-DigitalDJWizard.38=Παρακαλώ δημιουργείστε τουλάχιστον ένα περιβάλλον
-DigitalDJWizard.39=Παρακαλώ συμπληρώστε το όνομα του περιβάλλοντος και επιλέξτε τα είδη του περιβάλλοντος
-DigitalDJWizard.40=Παρακαλώ διαλέξτε έναν DJ
-DigitalDJWizard.41=Παρακαλώ δώστε ένα όνομα στον DJ
-DigitalDJWizard.42=Ένας DJ με αυτό το όνομα υπάρχει ήδη
-DigitalDJWizard.43=Αλλαγή DJ
-DigitalDJWizard.44=Διαλέξτε τον DJ που θα ρυθμίσετε
-DigitalDJWizard.45=Επιλογή ενέργειας
-DigitalDJWizard.46=Επιλογή τύπου DJ
-DigitalDJWizard.47=Παρακαλώ διαλέξτε ή δημιουργείστε περιβάλλον
-DigitalDJWizard.48=Γενικά Χαρακτηριστικά
-DigitalDJWizard.49=Παρακαλώ συμπληρώστε τα γενικά χαρακτηριστικά του DJ
-DigitalDJWizard.50=Παρακαλώ ορίστε ποσοστά
-DigitalDJWizard.51=Διαγραφή DJ
-DigitalDJWizard.52=Παρακαλώ ορίστε μεταβάσεις
-DigitalDJWizard.53=Ελάχιστος αριθμός αστεριών αξιολόγησης για τα κομμάτια που επιλέγονται (1: όλα τα κομμάτια)
-DigitalDJWizard.54=Διάρκει επικάλυψης-σβησίματος ανάμεσα στα κομμάτια
-DigitalDJWizard.55=Αν επιλεγεί θα περιέχεται κάθε κομμάτι μόνο μία φορά
-DigitalDJWizard.56=Οδηγός Περιβαλλόντων
-DigitalDJWizard.57=Διαχείριση των περιβάλλονόντων
-DigitalDJWizard.58=Επιλογή περιβάλλοντος:
-DigitalDJWizard.59=Το άθροισμα όλων των ποσοστών πρέπει να είναι < 100 %
-DigitalDJWizard.60=Υπάρχον όνομα περιβάλλοντος
-DigitalDJWizard.61=Διαγραφή DJ
-#limited string size
-DigitalDJWizard.62=Προεπιλογές
-DigitalDJWizard.63=Προσθήκη προεπιλεγμένων περιβαλλόντων
-DigitalDJWizard.64=Οτιδήποτε
-DigitalDJWizard.66=Επιλογή προεπιλεγμένου Περιβάλλοντος 
-
-#--- Tips of day ---
-
-Ambience.0=Rock/Pop
-Ambience.1=Rap
-Ambience.2=HardRock
-Ambience.3=Techno
-Ambience.4=Electro
-Ambience.5=Classical
-Ambience.6=Soft
-Ambience.7=Party
-Ambience.8=Jazz
-Ambience.9=World
-Ambience.10=Others
-Ambience.11=Folk/Oldies
-Ambience.12=Inde
-Ambience.13=Latin
-
-DebugLogAction.0=Καταγραφή ιχνών αποσφαλμάτωσης
-DebugLogAction.1=Ανανέωση
-
-CopyClipboardAction.0=Αντιγραφή διεύθυνσης στο clipboard
-
-LaunchInBrowserAction.0=Άνοιγμα διεύθυνσης στον προεπιλεγμένο browser
-
-ReportAction.0=Αναφορά επιτυχούς δημιουργίας 
-ReportAction.1=Μουσική Αναφορά Jajuk
-ReportAction.2=Παρακαλώ λάβετε υπ'όψην το περιβάλλον και μην εκτυπώνετε αν δεν είναι απολύτως απαραίτητο
-ReportAction.3=Λίστα Άλμπουμ
-ReportAction.4=Κομμάτια ανά άλμπουμ
-ReportAction.5=Λίστα καλλιτεχνών
-ReportAction.6=Άλμπουμ ανά καλλιτέχνες
-ReportAction.7=Λίστα είδος
-ReportAction.8=Άμλπουμ ανά είδος
-ReportAction.9=Artists/ άλμπουμ ανά είδος
-ReportAction.10=Λίστα φακέλων
-ReportAction.11=Αρχεία ανά φάκελο
-ReportAction.12=Όνομα αρχείου	
-ReportAction.13=Όνομα κομματιού
-ReportAction.14=Λίστα συσκευών
-ReportAction.15=Φάκελοι ανά συσκευή
-ReportAction.16=Φάκελοι/ αρχεία
-ReportAction.17=συλλογή
-ReportAction.18=Artists/ άλμπουμ/ κομμάτια ανά genre
-ReportAction.19=Μεταπήδηση σε:
-
-ActionMove.0=Επικόλληση
-
-ActionRefresh.0=Εξαναγκασμένη ανανέωση
-ActionRefresh.1=Ανανέωση του καταλόγου
-
-RenameAction.0=Μετονομασία
-RenameAction.1=Παρακαλώ εισάγετε το νέο όνομα για αυτό το αρχείο:
-RenameAction.2=PΠαρακαλώ εισάγετε το νέο όνομα για αυτόν τον κατάλογο:
-
-NewFolderAction.0=Νέος Φάκελος
-NewFolderAction.1=Παρακαλώ εισάγετε το όνομα του νέου Φακέλου:
-NewFolderAction.2=Υπάρχει ήδη Φάκελος με αυτό το όνομα.
-
-LyricsView.0=Στίχοι
-
-ActionDelete.0=Τα αρχεία διαγράφηκαν
-ActionDelete.1=Οι κατάλογοι διαγράφηκαν
-
-FindDuplicateTracksAction.0=Δε βρέθηκαν διπλά (όμοια) κομμάτια.
-FindDuplicateTracksAction.1=Βρέθηκαν διπλά (όμοια) κομμάτια
-FindDuplicateTracksAction.2=Εύρεση διπλών (όμοιων) κομματιών
-FindDuplicateTracksAction.3=Λίστα διπλών (όμοιων) κομματιών που βρέθηκαν
-FindDuplicateTracksAction.4=Επιλογή όλων των  διπλών (όμοιων) κομματιών
-
-RefreshDialog.0=Προετοιμασία ανανέωσης συσκευής...
-RefreshDialog.1=Ανανέωση συσκεής σε εξέλιξη
-RefreshDialog.2=Ανανέωση συσκεής σε εξέλιξη: 
-RefreshDialog.3=Καθάρισμα παλαιών αρχείων
-
-RadioWizard.0=Παρακαλώ επιλέξτε ή δημιουργείστε ραδιόφωνο web 
-RadioWizard.1=Διαχείριση ραδιοφώνων web 
-RadioWizard.2=Νέο
-RadioWizard.3=Διαγραφή
-RadioWizard.4=Προεπιλογές
-RadioWizard.5=Ένα ραδιόφωνο web με αυτό το όνομα υπάρχει ήδη
-RadioWizard.6=Όνομα ραδιοφώνου web		
-RadioWizard.7=Οδηγός ραδιοφώνου web
-RadioWizard.8=URL
-RadioWizard.9=Όνομα
-RadioWizard.10=Λάθος URL
-RadioWizard.11=Το όνομα και το URL είναι απαραίτητα
-
-UpdateManager.0=Μία νέα έκδοση του Jajuk (
-UpdateManager.1=) έχει εντοπιστεί, μπορείτε να την κατεβάσετε από http://jajuk.info
-UpdateManager.2=Δεν βρέθηκε καμία διαθέσιμη νέα έκδοση έως τώρα
-
-LastFmManager.0=Παρακαλώ προσέξτε ότι η υποστήριξη του Last.FM είναι απενεργοποιημένη. Αν θέλετε να ενεργοποιήσετε το Last.FM , ορίστε το Last.FM login και password στην προβολή Προτιμήσεις / καρτέλα Last.FM . 
-
-SuggestionView.0=Προτάσεις
-SuggestionView.1=Προτιμόμενα
-SuggestionView.2=Νεότερα
-SuggestionView.3=Άλλα άλμπουμ
-SuggestionView.4=Παρόμοιοι καλλιτέχνες
-SuggestionView.5=Ακούγονται σπάνια
-SuggestionView.7=<html><b>Τίποτα για εμφάνιση</b><br><br><i>Οι πληροφορίες του Last.FM εμφανίζονται μόνο αν:<ul><li>Πάιζει ένα κομμάτι</li><li>Είναι γνωστός ο artist του κομματιού που παίζεται (σωστό tag)</li><li>Η επιλογή "Ενεργοποίση των Last.FM information queries" είναι επιλεγμένη στην προβολή Προτιμήσεις / καρτέλα Last.FM </li></ul></i></html>
-
-AbstractThumbnail.0=Άνοιγμα σελίδας LAST.FM
-
-AlbumsTableView.0=Πίνακας άλμπουμ
-AlbumsTableView.1=Αριθμός κομματιών
-
-AlarmClock.0=Ορισμός νέου συναγερμού
-AlarmClock.1=Εμφάνιση συναγερμών που έχουν οριστεί
-AlarmClock.2=Δεν έχουν οριστεί συναγερμοί
-AlarmClock.3=Συναγερμός
-AlarmClock.4=Ο χρόνος έχει ήδη παρέλθει !
-AlarmClock.5=Μήνυμα υπενθύμισης για σας:
-
-AlarmDialog.0=Χρόνος (ΩΩ24:ΛΛ:ΔΔ)
-AlarmDialog.1=Ώρα
-AlarmDialog.2=Λεπτά
-AlarmDialog.3=Δευτερόλεπτα
-AlarmDialog.4=Ενέργεια συναγερμού
-AlarmDialog.5=Επιλογή ενέργειας συναγερμού
-AlarmDialog.6=Μήνυμα:
-AlarmDialog.7=Ορισμός μηνύματος υπενθύμισης
-AlarmDialog.8=Ημερησίως
-AlarmDialog.9=Ορισμός συναγερμού ημερησίως.
-
-ShowPropertiesAction.0=Εμφάνιση ιδιοτήτων αντικειμένου
-
-QueueView.1=Ακύρωση της ουράς
-
-JajukSlimWindow.0=Εμφάνιση/απόκρυψη του Jajuk slimbar
-
-BanSelectionAction.0=Αποκλεισμός
-BanSelectionAction.1=Αποκλεισμός του αντικειμένου έτσι ώστε να μην επιλεγεί ξανά
-
-UnBanSelectionAction.0=Άρση αποκελισμού
-UnBanSelectionAction.1=Άρετε τον αποκλεισμό αντικειμένων έτσι ώστε να μπορούν να προταθούν ξανά
-
-Preference.0=<html>Ορισμός προσωπικής επιλογής για το τρέχον κομμάτιbr>Λαμβάνεται υπόψη για τον υπολογισμό της τελικής βαθμολογίας</html>
-Preference.1=Σκουπίδι
-Preference.2=Χαμηλό
-Preference.3=Μέτριο
-Preference.4=Καλό
-Preference.5=Εξαιρετικό
-Preference.6=Κλασσικό
-Preference.7=Επιλογές...
-Preference.8=Χωρίς επιλογή
-
-# TipOfTheDay are automatically generated with the Jajuk Manual.
-#    To change tip of the day use page: http://jajuk.info/index.php/Tip_of_the_day
-TipOfTheDay.0=   Tip 0:  μπορείς να ξαναπαίξεις το τρέχον κομμάτι από την αρχή με [Shift+click] στο κουμπί επαναφοράς
-TipOfTheDay.1=   Tip 1:  μπορείς να ξαναπαίξεις το τρέχον άλμπουμ από το πρώτο του κομμάτι με [Shift+click]
-TipOfTheDay.2=   Tip 2:  μπορείς να προσθέσεις τυχαία κομμάτια σε λίστες αναπαραγωγής χρησιμοποιώντας το κουμπί ? στον επεξεργαστή λίστας αναπαραγωγής
-TipOfTheDay.3=   Tip 3:  μπορείς λάβεις εξώφυλλα online ακόμη και πίσω από proxy server χρησιμοποιώντας την καρτέλα Δίκτυο της Προβολής Προτιμήσεις
-TipOfTheDay.4=   Tip 4:  το Jajuk περιέχει ένα slimbar (Maximize κουμπί στην πάνω αριστερή πλευρά του μενού) για τον έλεγχο της αναπαραγωγής, το οποίο καταλαμβάνει λίγο μόνο χώρο στην επιφάνεια εργασίας
-TipOfTheDay.5=   Tip 5:  μπορείς να κρύψεις τα μη διαθέσιμα κομμάτια επιλέγοντας "Εμφάνιση μόνο ενεργοποιημένων συσκευών" στην καρτέλα Επιλογές της Προβολής Προτιμήσεις
-TipOfTheDay.6=   Tip 6:  μπορείς να πραγματοποιήσεις σχεδόν κάθε λειτουργία του Jajuk χρησιμοποιώντας το πληκτρολόγιο
-TipOfTheDay.7=   Tip 7:  μπορείς να σύρεις και να αφήσεις αντικείμενα από Δενδρικές Προβολές στον επεξεργαστή λίστας αναπαραγωγής και στην αποθήκη λιστών αναπαραγωγής
-TipOfTheDay.8=   Tip 8:  μπορείς να ακούσεις εισαγωγές κομματιών χρησιμοποιώντας την κατάσταση λειτουργίας Εισαγωγή
-TipOfTheDay.9=   Tip 9:  μπορείς ρυθμίσεις την διάρκεια επικάλυψης-σβησίματος στην καρτέλα Επιλογές της Προβολής Προτιμήσεις
-TipOfTheDay.10=   Tip 10:  το Jajuk μπορεί να χρησιμοποιηθεί σαν προχωρημένο ξυπνητήρι με τη χρήση του χαρακτηριστικού Συναγερμός το οποίο είναι διαθέσιμο από το μενού Εργαλεία
-TipOfTheDay.11=   Tip 11:  μπορείς να ελέγξεις της κύριες λειτουργίες του Jajuk χρησιμοποιώντας μόνο the tray (Linux & Windows)?
-TipOfTheDay.12=   Tip 12:  το Θέμα του Jajuk μπορεί να διαμορφωθεί από την καρτέλα GUI της Προβολής Προτιμήσεις
-TipOfTheDay.13=   Tip 13:  μπορείς να ρυθμίσεις τη συμπεριφορά του διπλού-click και του drag and drop (προώθηση και αναπαραγωγή) στην καρτέλα Επιλογές της Προβολής Προτιμήσεις
-TipOfTheDay.14=   Tip 14:  τα "προγραμματισμένα" κομμάτια του Jajuk είναι κομμάτια που θα αναπαραχθούν μετά τις τρέχουσες επιλογές κομματιών
-TipOfTheDay.15=   Tip 15:  η διασύνδεση γραφικών του Jajuk είναι πλήρως dockable και ότι μπορείς να σύρεις και να αφήσεις Προβολές ώστε να τις οργανώσεις ξανά
-TipOfTheDay.16=   Tip 16:  μπορείς να πάρεις το συνολικό αριθμό αρχείων και κομματιών επιλέγοντας τον κόμβο "Συλλογή" στην Προβολή Φυσικού ή Λογικού Δέντρου
-TipOfTheDay.17=   Tip 17:  μπορείς να λάβεις ετικέτες online με τη λειτουργία "Λήψη ετικετών online" σε καταλόγους στην Προβολή Φυσικού Δέντρου
-TipOfTheDay.18=   Tip 18:  η μπάρα ιστορικού του Jajuk (κάτω μέρος του παραθύρου) εμφανίζει όλα τα κομμάτια που παίχτηκαν προηγουμένως
-TipOfTheDay.19=   Tip 19:  yμπορείς να πραγματοποιήσεις γρήγορες αναζητήσεις χρησιμοποιώντας το κουτί Αναζήτησης (κάτω μέρος του παραθύρου)
-TipOfTheDay.20=   Tip 20:  μπορείς να αναφέρεις σφάλματα ή αιτήματα λειτουργίας-χαρακτηριστικού χρησιμοποιώντας τον οδηγό ποιότητας (Βοήθεια -> Αναφορά θέματος)
-TipOfTheDay.21=   Tip 21:  οι DJs του Jajuk μπορούν να δημιουργήσουν έξυπνες λίστες αναπαραγωγής ακολουθώντας τους κανόνες σου
-TipOfTheDay.22=   Tip 22:  μπορείς να λάβεις τους στίχους κομματιώνμ χρησιμοποιώντας την "Προβολή Στίχοι"
-TipOfTheDay.23=   Tip 23:  η προβολή Προτάσεις προβάλλει πληροφορίες του LAST.FM όπως παρόμοιους καλλιτέχνες
-TipOfTheDay.24=   Tip 24:  μπορείς να ορίσεις μία εικόνα background της επιλογής σου στην προβολή Προτιμήσεις / καρτέλα GUI  
-TipOfTheDay.25=   Tip 25:  μπορείς να προβάλεις/αποκρύψεις unmounted συσκευές με ένα click στη μενού μπάρα "Ρυθμίσεις"
-TipOfTheDay.26=   Tip 26:  τώρα μπορείς να επιλέξεις κατάλογο για τα δεδομένα του Jajuk (όπως έναν εξωτερικό δίσκο) για να διατηρήσεις τα δεδομένα και τις προτιμήσεις σε οποιονδήποτε υπολογιστή (βλέπε  καρτέλα "Προχωρημένοι" στην προβολή Προτιμήσεις) ?
-TipOfTheDay.27=   Tip 27:  μπορείς να προσθέσεις οποιαδήποτε προβολή σε οποιαδήποτε οπτική χρησιμοποιώντας τη menu μπάρα "Προβολές"
-TipOfTheDay.28=   Tip 28:  you can launch a wikipedia page in you default browser using the "Launch address in default browser" icon <a href="../images/3/30/Launch_16x16.png" title="Image:launch_16x16.png" class="internal"> <img src='../images/3/30/Launch_16x16.png' alt="Image:launch_16x16.png"/> </a>   
-TipOfTheDay.29=   Tip 29:  Jajuk supports web radios <a href="../images/9/9d/Webradio_32x32.png" title="Image:webradio_32x32.png" class="internal"> <img src='../images/9/9d/Webradio_32x32.png' alt="Image:webradio_32x32.png"/> </a>   
-
-
-]]></body>
-
+<?xml version='1.0' encoding='UTF-8'?>
+<body><![CDATA[
+#Jajuk Greek langpack.
+#Written by : Stylianos (Stelios) Ntilis
+#Based on previous work of Eleftherios Spyromitros Xioufis 
+#Translated from en version 1.10.3 released: 2012.9.28
+#Copyright 2003-2012 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
+#REFERENCE
+#
+ 
+#--- Generic labels ---
+# DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
+# YOU PROBABLY DON'T WANT TO CREATE A LABEL HERE, CREATE ONE ONLY IF VERY GENERICAL 
+# AND USED MANY TIMES  
+Info=Πληροφορίες
+Warning=Προσοχή
+Error=Σφάλμα
+Ok=OK
+Cancel=Ακύρωση
+Close=Κλείσιμο
+Stop=Διακοπή
+Save=Αποθήκευση
+Apply=Εφαρμογή
+Delete=Διαγραφή
+Details=Λεπτομέρειες
+Yes=Ναι
+No=Όχι
+Success=Διαδικασία Επιτυχής
+Sort=Ταξινόμηση βάση:
+Option=Παρακαλώ επιλέξτε:
+Help=Βοήθεια
+Hide=Να μην εμφανιστεί ξανά
+Path=Παρακαλώ επιλέξτε μονοπάτι
+Later=Αργότερα
+Default=Προεπιλογή
+YestoAll=Ναι σε όλα
+Purge=Οριστική Διαγραφή
+
+#--- Wizard Strings --- 
+#These strings are used in the context of a basic wizard
+Wizard_Next=Επόμενο
+Wizard_Prev=Προηγούμενο
+Wizard_Finish=Τέλος
+
+# --- General Strings ---
+Type=Τύπος
+Type.mp3=Mpeg layer 3
+Type.playlist=Playlist
+Type.ogg=Ogg Vorbis
+Type.wav=Audio WAVE/SPEEX
+Type.au=Sun Audio
+Type.aiff=Apple Audio Interchange
+Type.flac=Free Lossless Audio Codec
+Type.mpc=MusePack
+Type.wma=Windows Media Audio
+Type.ape=Monkey's Audio format
+Type.aac=Advanced Audio Coding
+Type.real=Real Audio
+Type.mp2=Mpeg Layer 2
+Type.mac=Monkey's Audio format
+Type.radio=Web Radio
+Type.video=Video
+Type.wavpack=WavPack
+
+unknown=Άγνωστο
+unknown_artist=Άγνωστος
+unknown_album=Άγνωστο
+unknown_genre=Άγνωστο
+unknown_year=Άγνωστο
+
+various_artist=Various artist
+
+Note.0=Ο Jajuk εντόπισε μία νέα  κύρια έκδοση.Επιλέχθηκαν οι προεπιλεγμένες οπτικές! 
+Note.1=Το σύστημα βαθμολόγησης του Jajuk άλλαξε (βλέπε Jajuk online βοήθεια -> Σελίδα συστήματος βαθμολόγησης). Οι προηγούμενες βαθμολογίες έχουν μετατραπεί σε μία κλίμακα από 0 έως 100 αλλά συνιστούμε να επαναφέρετε όλες τις βαθμολογίες από την οπτική Προτιμήσεις -> καρτέλα Ιστορικό (προσοχή: όλες οι βαθμολογίες τα χαθούν) 
+
+#Write confirmation so replies are: yes / no / cancel
+Confirmation_exit=Θέλετε πραγματικά να κλείσετε το Jajuk?
+Confirmation_delete=Προσοχή! Πρόκειται να διαγράψετε το/τα παρακάτω αρχεί(ο/α) απο το δίσκο, είστε βέβαιος ?
+Confirmation_void_refresh=Προσοχή! Πρόκειται να προσπελάσετε μία κενή συσκευή.Στο Unix, βεβαιωθείτε ότι η συσκεύη είναι ενεργοποιημένη διαφορετικά θα χάσετε τις πληροφορίες του Jajuk για τη συσκευή αυτή . Είστε σίγουρος?
+Confirmation_remove_device=Θέλετε σίγουρα να απομακρύνετε αυτή τη συσκευή?
+Confirmation_delete_cover=Θέλετε σίγουρα να διαγράψετε αυτή την πρόσοψη από το δίσκο?
+Confirmation_delete_files=Θέλετε σίγουρα να διαγράψετε αυτά τα αρχεία από το δίσκο?
+Confirmation_delete_dirs=Θέλετε σίγουρα να διαγράψετε αυτά τους καταλόγους από το δίσκο? 
+Confirmation_clear_history=Θέλετε σίγουρα να καθαρίσετε το ιστορικό?
+Confirmation_reset_ratings=Θέλετε σίγουρα να επαναφέρετε όλα τις βαθμολογίες στο μηδέν?
+Confirmation_refactor_files=Θέλετε σίγουρα να μετονομάσετε το/τα επιλεγμέν(ο/α) αρχεί(ο/α)?
+Confirmation_restore_all=Η πλήρης επαναφορά των προβολών απαιτεί επανεκκίνηση του Jajuk, θέλετε quit ?
+Confirmation_delete_empty_dirs=Οι επόμενοι κατάλογοι είναι άδειοι. Θέλετε να τους διαγράψετε?
+Confirmation_file_overwrite=Αυτό το αρχείο υπάρχει ήδη. Θέλετε να αντικαταστήσετε αυτό το αρχείο?
+Confirmation_file_number=αρχεία θα διαγραφούν.
+Confirmation_defaults=Προσέξτε ότι έτσι θα επαναφερθούν όλες οι καρτέλες στις προεπιλεγμένες τιμές (και όχι μόνο η τρέχουσα), είστε βέβαιος ?
+Confirmation_reset_preferences=Θέλετε σίγουρα να επαναφέρετε τις προτιμήσεις των κομματιών ?
+Confirmation_reset_ratings_overwrite=Οποιαδήποτε βαθμολογία βρεθεί σε εισηγμένο αρχείο θα αντικαταστήσει την τωρινή βαθμολογία του αρχείου σε αυτή την εγκατάσταση του Jajuk. Είστε σίγουρος πως θέλετε να το κάνετε;
+Confirmation_tag_write=Μία ή περισσότερες ετικέτες θα γραφτούν στο δίσκο. Είστε σίγουρος;
+
+Device_type.directory=Φάκελος
+Device_type.file_cd=CD αρχείων μουσικής
+Device_type.extdd=Εξωτερικός Σκληρός Δίσκος
+Device_type.player=Συσκευή Αναπαραγωγής
+Device_type.network_drive=Συσκευή δικτύου
+
+Perspective_Description_Simple=Απλή	
+Perspective_Description_Files=Αρχεία
+Perspective_Description_Tracks=Κομμάτια
+Perspective_Description_Configuration=Ρύθμιση
+Perspective_Description_Statistics=Στατιστικά
+Perspective_Description_Display=Αναπαραγωγή
+Perspective_Description_Albums=Άλμπουμ
+Perspective_Description_Info=Πληροροφορίες
+Perspective_Description_Playlists=Λίστες αναπαραγωγής
+
+Item_Playlist_File=λίστας αναπαραγωγής
+Item_Track=Τίτλος
+Item_Album=Άλμπουμ
+Item_Artist=Καλλιτέχνης
+Item_Genre=Είδος
+Item_Device=Συσκευή
+Item_File=Αρχείο
+Item_Directory=Φάκελος
+Item_Year=Έτος
+Item_AlbumArtist=Άλμπουμ-Καλλιτέχνης
+
+Property_id=Id
+Property_name=Όνομα
+Property_type=Τύπος
+Property_url=Url
+Property_mount_point=Σημείο ενεργοποίησης
+Property_auto_refresh=Αυτόματη Ανανέωση
+Property_auto_mount=Αυτόματη ενεργοποίηση
+Property_album=Άλμπουμ
+Property_style=Είδος
+Property_author=Καλλιτέχνης
+Property_album_artist=Καλλιτέχνης Άλμπουμ
+Property_disc_number=Δίσκος#
+Property_length=Διάρκεια
+Property_year=Έτος
+Property_rate=Αξιολόγηση
+Property_files=Αρχεία
+Property_hits=Hits
+Property_filename=Αρχείο
+Property_date=Ημερομηνία
+Property_added=Ημερομηνία Εύρεσης
+Property_parent=Κατάλογος Γονέας
+Property_device=Συσκευή
+Property_directory=Φάκελος
+Property_track=Κομμάτι
+Property_size=Μέγεθος (MB)
+Property_quality=Ποιότητα
+Property_hashcode=Hashcode(Κωδικός Κατακερματισμού)
+Property_playlist_files=λίστες αναπαραγωγής
+Property_comment=Σχόλιο
+Property_order=Κομμάτι
+Property_path=Πλήρες μονοπάτι
+Property_tracks=Κομμάτια
+Property_file_date=Ημερομηνία Αρχείου
+Property_Format_Number=Αριθμός
+Property_Format_String=Αλφαριθμητικό
+Property_Format_Boolean=Δυαδικός
+Property_Format_Float=Πραγματικός
+Property_Format_Date=Ημερομηνία
+Property_Format_URL=Url
+Property_pf=Προτίμηση
+Property_tpt=Συνολικός χρόνος αναπαραγωγής (secs)
+Property_ban=Απαγορευμένο
+Property_disc_id=DiscID
+Property_keywords=Λέξεις κλειδιά
+Property_label=Περιγραφή
+Property_bitrate=Bitrate (kbps)
+Property_frequency=Frequency (Hz)
+Property_origin=Origin
+
+Language_desc_en=Αγγλικά
+Language_desc_fr=Γαλλικά
+Language_desc_de=Γερμανικά
+Language_desc_it=Ιταλικά
+Language_desc_sv=Σουηδικά
+Language_desc_nl=Ολλανδικά
+Language_desc_zh=Κινέζικα
+Language_desc_es=Ισπανικά
+Language_desc_ca=Καταλονικά
+Language_desc_ko=Κορεατικά
+Language_desc_el=Ελληνικά
+Language_desc_ru=Ρωσικά
+Language_desc_gl=Γαλικιανά
+Language_desc_cs=Τσέχικα
+Language_desc_pt=Πορτογαλικά
+
+#--- Error codes ---
+Error.000=Άγνωστο σφάλμα
+Error.005=Σφάλμα ανάλυσης αρχείου συλλογής
+Error.007=Σφάλμα αναπραγωγής αρχείου, ίσως ο MPlayer δεν ξεκίνησε την αναπαραγωγή πριν το timeout, timeout: 
+Error.008=Σφάλμα παύσης αχείου
+Error.009=Αδύνατη η ανάγνωση του αρχείου
+Error.010=Αδύνατη η εύρεση αρχείου συσχετισμένου με αυτό το κομμάτι σε ενεργοποιημένη συσκευή
+Error.011=Τεχνικό Σφάλμα κατά την ενεργοποίηση της συσκευής ή κενή συσκευή
+Error.012=Τεχνικό Σφάλμα when απενεργοποίηση της συσκευής, πιθανώς χρησιμοποιείται από άλλη εφαρμογή
+Error.013=Αδύνατη η απομάκρυνση της συσκευής: είτε ενεργοποιείται είτε ανανεώνεται αυτή τη στιγμή
+Error.016=Αδύνατη η προσπέλαση της συσκευής. Παρακαλώ εισάγετε το σημείο ενεργοποίησης της συσκευής. Πχ: '/cdrom' στο Unix,'e:' στα MS Windows
+Error.017=Σφάλμα ανάλυσης λίστας αναπαραγωγής
+Error.018=Δεν μπορούν να βρεθούν προσβάσιμα κομμάτια
+Error.019=Μία υπάρχουσα συσκευή έχει ήδη αυτό το όνομα
+Error.020=Σφάλμα IO κατά την αντιγραφή του αρχείου. Ίσως ο δίσκος είναι γεμάτος
+Error.023=Αδύνατη η εκτέλεση  του κομματιού εκκίνησης
+Error.024=Αδύνατη η εγγραφή του αρχείου
+Error.025=Ένα από τα αρχεία που θέλετε να διαβάσετε είναι σε απενεργοποιημένη συσκευή
+Error.026=Σφάλμα καταχώρησης των players
+Error.027=Ο συγχρονισμός εγκαταλήφθηκε
+Error.028=Σφάλμα αποθήκευσης λίστας αναπαραγωγής
+Error.030=Υπερβολικές αποτυχίες σύνδεσης. Ο Jajuk έχει σταματήσει την αναζήτηση online εξωφύλλων
+Error.102=Σφάλμα
+Error.103=Σφάλμα ανάγνωσης πληροφοριών ετικέτας
+Error.104=Σφάλμα εγγραφής πληροφοριών ετικέτας 
+Error.105=Δε βρέθηκε Resource Bundle key
+Error.106=Μη συλληφθείσα εξαίρεση
+Error.107=Η συσκευή ήδη ανανεώνεται ή συγχρονίζεταισ
+Error.108=Σφάλμα ανάλυσης αρχείου Οπτικής
+Error.110=Το όνομα αυτής της ιδιότητας είναι δεσμευμένο από το εσωτερικό σύστημα του Jajuk. Παρακαλώ διαλέξτε άλλο
+Error.111=Η συσκευή είναι ήδη ενεργοποιμένη
+Error.112=Η συσκευή δεν μπορεί να ενεργοποιηθεί
+Error.113=Δεν είναι δυνατή η αποθήκευση των ρυθμίσεων του χρήστη
+Error.114=Δεν είναι δυνατή η ανάγνωση των ρυθμίσεων του χρήστη
+Error.119=Σφάλμα κατά την ανάλυση του αρχείου ιστορικού ή το αρχείο δεν υπάρχει
+Error.120=Δεν είναι δυνατή η πρόσβαση στη συσκευή: είτε δεν είναι ενεργοποιμένη, είτε ανανεώνεται, είτε συγχρονίζεται
+Error.121=Η συσκευή είναι σε χρήση και δεν μπορεί να απενεργοποιηθεί
+Error.122=Σφάλμα FIFO
+Error.125=Η συσκευή είναι ήδη απενεργοποιμένη
+Error.126=Η αναζήτηση δεν υποστηρίζεται από αυτή τη μορφή ήχου
+Error.127=Δεν βρέθηκαν καινούργια κομμάτια για το επιλεγμένο χρονικό όριο. Μπορείτε να ορίσετε το χρονικό όριο στην Προβολή Προτιμήσεις
+Error.128=Το τρέχον κομμάτι είναι το πρώτο της συλλογής. Δεν υπάρχει προηγούμενο κομμάτι
+Error.131=Δεν είναι δυνατή η διαγραφή του αρχείου
+Error.133=Το αρχείο συλλογής σας διεκόπει για άγνωστο λόγο. Το Jajuk κατάφερε να επαναφέρει ένα εφεδρικό αρχείο
+Error.134=Δεν είναι δυνατή η μετονομασία του αρχείου
+Error.135=Το αρχείο δεν υπάρχει	
+Error.136=Η ενέργεια απέτυχε
+Error.137=Λάθος μορφή
+Error.140=Μη έγκυρο αλφαριθμητικό: δεν πρέπει να περιέχει τους χαρακτήρες & ' " < ή > 
+Error.141=Αυτή η λίστα αναπαραγωγής βρίσκεται σε απενεργοποιμένη η ανανεούμενη συσκευή και δεν είναι διαθέσιμη
+Error.142=Αυτή η λίστα αναπαραγωγής δείχνει σε μη-υπάρχοντα κομμάτια ή κομμάτια που βρίσκονται εκτός γνωστών συσκευών. Τα κομμάτια αυτά έχουν παραλειφθεί.
+Error.143=Μη προσβάσιμη τοποθεσία συσκευής
+Error.144=Σφάλμα ανάλυσης DJ
+Error.145=Αδύνατη η εκτέλεση του DJ
+Error.146=<html>Το τρέχον μοτίβο του organizer είναι λάθος.<br>Έγκυρες τιμές είναι: %artist (όνομα Καλλιτέχνη); %title (τίτλος Κομματιού); %album (όνομα album);<br> %n (Track leading zero); %genre (είδος κομματιού); %year (Έτος)<br> και το μοτίβο πρέπει να περιέχει τουλάχιστον ένα shash</html>
+Error.147=Κάποια αρχεία δεν μετακινήθηκαν (δείτε τις λεπτομέρειες για περισσότερες πληροφορίες)
+Error.148=Το πεδίο Έτους είναι άγνωστο
+Error.149=Το πεδίο Άλμπουμ είναι άγνωστο
+Error.150=Το πεδίο Καλλιτέχνη είναι άγνωστο
+Error.152=Το πεδίου Κομματιού είναι άγνωστο
+Error.153=Το πεδίου Είδους είναι άγνωστο
+Error.154=Δεν είναι δυνατή η μετονομασία του αρχείου, ελέγξτε για λάθος χαρακτήρα στο όνομα του αρχείου ή τις ετικέτες
+Error.155=Σφάλαμα κατά το retagging των αρχείων, ελέγξτε τα δικαιώματα πρόσβασης
+Error.156=Κενή Συλλογή
+Error.157=Λάθος DJ, παρακαλώ επιλέξτε ή δημιουργήστε DJ από το κουμπί DJ της Προβολής Ελέγχου 
+Error.158=Οι περιορισμοί του DJ δεν μπορούν να ληφθούν υπ'όψιν ή δεν υπάρχει διαθέσιμο κομμάτι
+Error.159=Το συσχετισμένο περριβάλλον έχει διαγραφεί
+Error.160=Το αρχείο δε μετακινήθηκε, το όνομα αρχείου πηγής και στόχου είναι ίδια.
+Error.161=Αδύνατη η εγγράφη στον κατάλογο, ελέγξτε τις άδειες πρόσβασης
+Error.162=Αυτή η εξατομικευμένη ιδιότητα υπάρχει ήδη
+Error.163=Σφάλμα στην επαναφορά των προεπιλεγμένων Προβολών
+Error.165=Λάθος μονοπάτι για τη συλλογή, ο φάκελος δεν μπορεί να βρεθεί η δεν επιτρέπεται η εγγραφή
+Error.166=Κενό άλμπουμ, αδύνατυ η λήψη εξώφυλλου
+Error.167=Αδύνατη η δημιουργία αναφοράς
+Error.171=Δεν έχει οριστεί πηγή συγχρονισμού για αυτήν τη συσκευή, ορίστε την χρησιμοποιώντας τον οδηγό ρύθμισης συσκευών (στην εμφάνιση Συσκευές, κάντε click στη συσκευή).
+Error.172=Ανέκυψε σφάλμα κατά τη διαγραφή των ακόλουθων αρχείων:
+Error.174=Σφάλμα κατά την πρόσβαση στην ιστοσελίδα του Freedb, ελένξτε τη σύνδεση  με το δίκτυο 
+Error.176=Εσφαλμένη μορφή, η προτίμηση πρέπει να επιλεχθεί μεταξύ -3 και 3
+Error.177=Παρακαλώ εισάγετε έγκυρο χρόνο στη μορφή (ΩΩ24:ΛΛ:ΔΔ)
+Error.179=Αδυναμία ανοίγματος εξερευνητή αρχείων, προσπαθήστε να ορίσετε τη διαδρομή του από προβολή Προτιμήσεις / Καρτέλα για προχωρημένους
+Error.180=Σφάλμα κατά την αντιγραφή αρχείων
+Error.181=Αδυναμία εύρεσης του καθορισμένου αρχείου
+Error.184=Λάθος τιμή: ο ρυθμός ανανέωσης πρέπει να είναι 0 ή >= 0.5
+
+#Warnings
+Warning.0=Ο MPlayer δε βρέθηκε. Κάποιες μορφές ήχου (flac, wma, aac, mpg2 ... ) θα απενεργοποιηθούν. Αν ο MPlayer είναι ήδη εγκατεστημενός, παρακαλώ ορίστε το μονοπάτι του στην προβλή Προτιμήσεις/καρτέλα Για προχωρημένους.
+Warning.1=Λάθος έκδοση του MPlayer, MPlayer1.0Pre8 ή ανώτερος απαιτείται. Κάποια μορφές ήχου θα απενεργοποιηθούν. Παρακαλώ δείτε τις οδηγίες εγκατάστασης στο http://jajuk.sourceforge.net/installation.html για να διορθώσετε αυτό το πρόβλημα. 
+Warning.2=Φαίνεται ότι κάποιος άλλος χρησιμοποιεί αυτήν τη στιγμή την τρέχουσα συλλογή του jajuk. Last user to quit will overwrite configuration (options, rates...). 
+Warning.3=Αδύνατο το download του Mplayer. Αν βρίσκεστε πίσω από HTTP proxy, παρακαλώ ρυθμίστε το στην προβολή Προτιμήσεις / καρτέλα Δίκτυο και επανεκκινήστε το Jajuk. 
+Warning.4=Ο Mplayer απαιτείται για να ακούσετε web radios 
+Warning.5=Ο φάκελος προορισμού υπάρχει ήδη, κάποια αρχεία ενδέχεται να επανεγγραφούν, είστε σίγουρος ? 
+Warning.6=Κανένα κομμάτι δεν είναι διαθέσιμο προς αναπαραγωγή (Προσπαθήστε να προσαρτύσετε μερικές συσκευές ή να αλλάξετε ατμόσφαιρα)
+Warning.7=Ο Jajuk εντόπισε ανάγκη για βαθειά ανανέωση λόγω αναβάθμισης. Θέλετε να γίνει τώρα; (μπορείτε να το πραγματοποιήσετε οποιαδήποτε στιγμή από τις Συσκευές)
+
+#--- Strings by class ---
+ParameterView.0=Διάρκεια ιστορικού:
+ParameterView.2=Ορισμός του χρόνου σε ημέρες προς διατήρηση ιστορικού των κομματιών που παίχτηκαν. Εισάγετε 0 αν δεν θέλετε διατήρηση ιστορικού και -1 αν θέλετε μόνιμο ιστορικό.
+ParameterView.3=Καθαρισμός ιστορικού
+ParameterView.4=Καθαρισμός ιστορικού
+ParameterView.8=Ιστορικό/Βαθμολογίες
+ParameterView.9=Αναπαραγωγή:
+ParameterView.10=Τίποτα
+ParameterView.11=Καμία αναπαραγωγή κομματιού όταν ξεκινάει ο Jajuk
+ParameterView.12=Τελευταίο κομμάτι από την αρχή
+ParameterView.13=Αναπαραγωγή τελευταίου κομματιού από την αρχή
+ParameterView.14=Τυχαίο κομμάτι
+ParameterView.15=Αναπαραγωγή τυχαίου κομματιού από ολόκληρη την συλλογή
+ParameterView.16=Κομμάτι/ραδιόφωνο :
+ParameterView.17=Επιλέξετε αρχείο να αναπαράγεται κατά την εκκίνηση
+ParameterView.18=Επιλέξετε αρχείο να αναπαράγεται κατά την εκκίνηση. Αρχίσετε την πληκτρολόγηση να δείτε φιλτραρισμένη λίστα.
+ParameterView.19=Εκκίνηση
+ParameterView.26=Επιβεβαιώσεις
+ParameterView.27=Πριν τη φυσική διαγραφή του αρχείου
+ParameterView.28=Ερώτηση pριν τη φυσική διαγραφή του αρχείου
+ParameterView.29=Πριν την έξοδο του Jajuk
+ParameterView.30=Ερώτηση πριν την έξοδο του Jajuk
+ParameterView.33=Επιλογές
+ParameterView.35=Κρύβει τα κομμάτια που βρίσκονται σε μη-προσαρτιμένες συσκευές
+ParameterView.38=Γλώσσα:
+ParameterView.42=Επιλογή γλώσσας διεπαφής
+ParameterView.43=Θέμα: 
+ParameterView.44=<html>Επιλογή θέματος<p>(Ίσως χρειάζεται επανεκκίνηση ο jajuk)</html>
+ParameterView.46=Επίπεδο καταγραφής: 
+ParameterView.47=Καταστροφικό
+ParameterView.48=Σφάλμα
+ParameterView.49=Προειδοποίηση
+ParameterView.50=Πληροφορίες
+ParameterView.51=Αποσφαλμάτωση
+ParameterView.52=Jajuk verbosity: Καταστροφικό: εμφανίζει μόνο κρίσιμα σφάλματα, Σφάλμα: +εμφανίζει σφάλματα, Πληροφορίες: +εμφανίζει μυνήματα πληροφοριών, Προειδοποίηση: +εμφανίζει προειδοποιήσεις, Αποσφαλμάτωση: οποιοδήποτε μύνημα
+ParameterView.59=Θέση εκκίνησης εισαγωγής (%): 
+ParameterView.60=Θέση εισαγωγής μέσα στο κομμάτι in % από 0 (αρχή κομματιού) έως 99 (τέλος κομματιού)
+ParameterView.61=Μήκος εισαγωγής (δευτερόλεπτα): 
+ParameterView.62=Μήκος εισαγωγής (σε δευτερόλεπτα)
+ParameterView.85=Εφαρμογή
+ParameterView.86=Επαναφορά Προεπιλογών
+ParameterView.87=Προτιμήσεις
+ParameterView.98=Patterns
+ParameterView.101=Χρήση του ονόματος του καταλόγου γονέα ως ονόματος άλμπουμ
+ParameterView.102=Αν επιλεγεί, το όνομα του καταλόγου γονέα θα χρησιμοποιηθεί ως το όνομα του άλμπουμ για τα κομμάτια των οποίων η ID3 ετικέτα δεν μπορέι να χρησιμοποιηθεί. 
+ParameterView.109=Οι επιλογές αποθηκεύτηκαν
+ParameterView.110=Οι επιλογές πήραν τις προεπιλεγμένες τιμές
+ParameterView.111=Μέγεθος της λίστας αναπαραγωγής καλύτερων:
+ParameterView.112=Δώστε τον αριθμό των κομματιών στη λίστα αναπαραγωγής καλύτερων (από 1 έως 100)
+ParameterView.113=Χρήση κανονικών εκφράσεων στα φίλτρα 
+ParameterView.114=Χρήση κανονικών εκφράσεων (Regexp μορφή) στα φίτρα πινάκων. Παράδειγμα: .*κάτι.*
+ParameterView.115=Για προχωρημένους
+ParameterView.116=Εφεδικό αντίγραφο αρχείου συλλογής
+ParameterView.117=Επιλέξτε αυτό αν θέλετε να δημιουργήσετε εφεδρικά αντίγραφα του αρχείου συλλογής σας στα αρχεία collection-<date>.xml 
+ParameterView.119=Μέγεθος εφεδρικού αντίγραφου (MB)
+ParameterView.120=Σύνολο χαρακτήρων της συλλογής
+ParameterView.121=Σύνολο χαρακτήρων της συλλογής. Το UTF-16 είναι καλύτερο για Ασιατικές γλώσσες και το UTF-8 για Ευρωπαικές γλώσσες.
+ParameterView.129=Χρονικό όριο καινούργιων κομματιών (μέρες):
+ParameterView.130=Χρονικό όριο καινούργιων κομματιών σε μέρες: όλα τα κομμάτια που προστίθενται μετάξύ αυτού του αριθμού των ημερών εμφανίζονται στη λίστα αναπαραγωγής καινούργιων κομματιών
+ParameterView.131=Καλύτερο κομμάτι
+ParameterView.132=Αναπαραγωγή ενός από τα αγαπημένα σας κομμάτια στο ξεκίνημα
+ParameterView.133=Καινούργιο κομμάτι
+ParameterView.134=Αναπαραγωγή ενός καινούργιου κομματιού από τη συλλογή σας στο ξεκίνημα
+ParameterView.135=Τελευταίο κομμάτι από την τελευταία θέση
+ParameterView.136=Αναπαραγωγή του κομματιού που παίχτηκε τελευταίο από τη θέση που σταμάτησε
+ParameterView.139=Δίκτυο
+ParameterView.142=Proxy user name
+ParameterView.143=Proxy login name χρησιμοποιείται για πιστοποίηση αυθεντικότητας
+ParameterView.144=Proxy host name
+ParameterView.145=Proxy host name ή διεύθυνση IP 
+ParameterView.146=Proxy θύρα
+ParameterView.147=Proxy TCP-IP θύρα (συχνά 3128)
+ParameterView.148=Online Λήψη εξωφύλλων 
+ParameterView.149=Χρησιμοποιείστε το αυτόματο εξώφυλλο για να κατεβάσετε εξώφυλλα από άλμπουμ από το Διαδίκτυο (αν απαιτείται, ρυθμίστε τον proxy στην καρτέλα δικτύου)
+ParameterView.150=Μέγεθος εξωφύλλων
+ParameterView.151=Μέγεθος εξωφύλλων που κατεβαίβηκαν
+ParameterView.155=Ακρίβεια αναζήτησης. Όσο μεγαλύτερη είναι η ακίβεια, τόσο λιγότερες λανθασμένες εικόνες εξωφύλλων θα παίρνετε.
+ParameterView.156=Χαμηλή (αναζήτηση όλων των λέξεων)
+ParameterView.157=Μέτρια (αναζήτηση ομαδοποιημένων λέξεων)
+ParameterView.158=Υψηλή (αναζήτηση mandatory ομαδοποιημένων λέξεων) 
+ParameterView.159=Εξώφυλλα
+ParameterView.160=Χρονικό όριο σύνδεσης(δευτερόλεπτα)
+ParameterView.161=Χρονικό όριο σύνδεσης σε δευτερόλεπτα: Μία απομακρυσμένη ενέργεια αποτυγχάνει αν ένας peer δεν ανταποκριθεί σε αυτόν το χρόνο.
+ParameterView.164=Πριν την αφαίρεση μίας συσκευής
+ParameterView.165=Ερώτηση πριν την αφαίρεση μίας συσκευής
+ParameterView.166=Τυχαία εξώφυλλα
+ParameterView.167=Εμφάνιση ενός τυχαίου εξωφύλλου
+ParameterView.171=Πριν τη διαγραφή ενός εξωφύλλου από το δίσκο
+ParameterView.172=Ερώτηση πριν τη διαγραφή ενός εξωφύλλου από το δίσκο
+ParameterView.177=Αριθμός των προγραμματισμένων κομματιών που είναι ορατά
+ParameterView.178=Ο αριθμός των προγραμματισμένων κομματιών που θα εμφανιστούν στη λίστα αναπαραγωγής
+ParameterView.179=Προώθηση με επιλογή
+ParameterView.180=Αν επιλεγεί, κάνοντας διπλό κλικ σε ένα κομμάτι της συλλογής αυτό προστίθεται στη λίστα αναπαραγωγής
+ParameterView.181=Προώθηση με drag & drop
+ParameterView.182=Αν επιλεγεί, τα κομμάτια της συλλογής μπορούν με drag and drop να προστεθούν στη λίστα αναπαραγωγής
+ParameterView.186=Επανεκκίνηση αξιολογήσεων
+ParameterView.187=Επαναφορά των αξιολογήσεων όλων των κομματιών στο μηδέν
+ParameterView.188=Πριν το σβήσιμο του ιστορικού
+ParameterView.189=Πριν την επαναφορά των αξιολογήσεων
+ParameterView.190=Διάρκεια επικάλυψης-σβησίματος (δευτερόλεπτα)
+ParameterView.191=Ο αριθμός των δευτερολέπτων επικάλυψης-σβησίματος μεταξύ των κομματιών
+ParameterView.192=Πρότυπο του οργανωτή αρχείων
+ParameterView.193=Διαθέσιμα πρότυπα :%artist (Όνομα καλλιτέχνη); %title (Τίτλος κομματιού); %album (Όνομα άλμπουμ); %n (Track leading zero); %genre (Κατηγορία κομματιού); %year (Έτος)
+ParameterView.194=Πριν την οργάνωση των αρχείων
+ParameterView.195=Προβολή Κινούμενων Εικόνων:
+ParameterView.196=Ενεργοποίηση Θερμών Πλήκτρων
+ParameterView.197=Κάνει κάποια πλήκτρα όπως το F8 να λειτουργούν ακόμη και αν το Jajuk δεν είναι στο επίκεντρο
+ParameterView.198=Κάποιες αλλαγές θα ενεργοποιηθούν μόνο στο επόμενο η ξεκίνημα του Jajuk
+ParameterView.199=Scrobble my listening
+ParameterView.200=Αυτή η επιλογή στέλνει πληροφορίες στο Last.fm
+ParameterView.201=Last.FM όνομα-χρήστη
+ParameterView.202=Το όνομα χρήστη που χρησιμοποιείται στο Last.FM
+ParameterView.203=Last.FM κωδικός-πρόσβασης
+ParameterView.204=Ο κωδικός πρόσβασης που χρησιμοποιείται στο Last.FM
+ParameterView.205=Ορίσματα του MPlayer 
+ParameterView.206=Πρόσθετα ορίσματα του MPlayer όπως '-ao esd' ή '-ao arts' ή '-novideo (για να εμποδιστεί η αναπαραγωγή video)' για παράδειγμα
+ParameterView.207=Jajuk home path
+ParameterView.208=Ορισμός του φακέλου που περιέχει τη διαμόρφωση του  Jajuk (προεπιλεγμένο: <home>/.jajuk)
+ParameterView.209=Το μονοπάτι του Jajuk configuration έχει αλλάξει για τον τρέχοντα χρήστη (η προηγούμενη συλλογή έχει διατηρηθεί στην παλιά θέση). Το Jajuk μπορεί τώρα να επανεκκινηθεί.
+ParameterView.210=Αν το cross fade δε λειτουργεί, προσπαθείστε να προσθέσετε <-ao esd> στο Gnome ή <-ao arts> στο KDE στο πεδίο πρόσθετων παραμέτρων στη μηχανή Ήχου( Προβολή Προτιμήσεις / Καρτέλα Για Προχωρημένους).
+ParameterView.211=Μικρό μόνο
+ParameterView.212=Μικρό και μεσαίο
+ParameterView.213=Μεσαίο μόνο
+ParameterView.214=Μεσαίο και μεγάλο
+ParameterView.215=Μεγάλο μόνο
+ParameterView.216=Αναζήτηση χρησιμοποιώντας το όνομα του καλλιτέχνη
+ParameterView.217=Αναζήτηση χρησιμοποιώντας το όνομα του άλμπουμ
+ParameterView.218=Αναζήτηση χρησιμοποιώντας το όνομα του κομματιού
+ParameterView.219=Μεταβλητές περιβάλλοντος
+ParameterView.220=Ορισμός των μεταβλητών περιβάλλοντος που χρησιμοποιούνται από τον audio player (ARTS_SERVER στο KDE ή ESPEAKER στο Gnome για παράδειγμα). μορφή: var1=xx var2=yyy... 
+#Respect English size for next item
+ParameterView.221=Μέγεθος Σελίδας προβολής κατάλογος (0: όλα σε μία)
+ParameterView.222=Ορισμός του αριθμού των άλμπουμ ανά σελίδα στην προβολή κατάλογος. 0: εμφάνιση όλων των εξωφύλλων σε μία σελίδα.
+ParameterView.223=Μέγεθος γραμματοσειρών
+ParameterView.224=Ορισμός του μεγέθους των γραμματοσειρών κειμένου
+ParameterView.225=GUI
+ParameterView.226=Λειτουργίες
+ParameterView.228=Εμφάνιση album popups
+ParameterView.229=Προτιμήσεις προβολής καταλόγου
+ParameterView.233=Το θέμα θα εφαρμοστεί στο επόμενο ξεκίνημα του Jajuk 
+ParameterView.234=Έλεγχος για ανανεωμένες εκδόσεις του Jajuk 
+ParameterView.235=Last.FM
+ParameterView.236=No Proxy
+ParameterView.237=HTTP proxy
+ParameterView.238=SOCKS proxy
+ParameterView.239=Proxy password
+ParameterView.240=Enable Last.FM information queries
+ParameterView.241=Αν επιλεγεί, το Jajuk θα λάβει ποικίλες πληροφορίες για άλμπουμ και άλλα από το website του Last.FM (βλέπε Προβολή Πρόταση(suggestion) 
+ParameterView.242=Μονοπάτι του Mplayer
+ParameterView.243=<html>Ορίστε εδώ το πλήρες μονοπάτι με το εκτελέσιμο του mplayer (επιτρέπονται τα κενά)<br>Παράδειγμα: /Applications/MPlayer OSX.app/Contents/Resources/External_Binaries/mplayer_intel.app/Contents/MacOS/mplayer</html>
+ParameterView.244=ημερομηνία Ανακάλυψης = ημερομηνία Αρχείου 
+ParameterView.245=<html>Αν επιλεγεί, το jajuk θεωρεί ως ημερομηνία ανακάλυψης την ημερομηνία συστήματος των αρχείων ήχου<br>Απαιτεί να ληφθούν υπόψη  οι deep ανανεώσεις</html>
+ParameterView.246=Μέγεθος εικονιδίων της μπάρας Οπτικών (σε pixels)
+ParameterView.247=Το μονοπάτι προορισμού περιέχει ένα υπάρχον Jajuk workspace. Το workspace έχει μεταφερθεί σε αυτό το μονοπάτι για τον τρέχοντα χρήστη (το προηγούμενο workspace έχει διατηρηθεί στην παλιά θέση). Το jajuk μπορεί τώρα να επανεκκινηθεί.
+ParameterView.248=Τίτλος πλαισιού :
+ParameterView.249=Επαναφορά προτιμήσεων
+ParameterView.250=Επαναφορά ορισμένων από το χρήστη προτιμήσεων
+ParameterView.251=Το ιστορικό επαναφέρθηκε με επιτυχία
+ParameterView.252=Οι βαθμολογίες και ο αριθμός αναπραγωγών επαναφέρθηκαν με επιτυχία
+ParameterView.253=Οι προτιμήσεις επαναφέρθηκαν με επιτυχία
+ParameterView.256=Standard cover file names
+ParameterView.257=Jajuk recognizes standard covers files whose filename contains this text (without extension). Several values separated by ';' can be provided. Example : "Folder;front".
+ParameterView.260=Save covers Windows Explorer friendly
+ParameterView.261=Save downloaded covers as folder.jpg/png/... so that the windows explorer uses them as directory icon.
+ParameterView.262=Use audio normalization
+ParameterView.263=Maximizes the volume without distorting the sound
+ParameterView.264=Disable any Internet access from Jajuk
+ParameterView.265=Disable any Internet access from Jajuk (LastFM, covers or lyrics download...).
+ParameterView.266=Drop played tracks from queue
+ParameterView.267=All tracks are dropped which are before the current played in the queue
+ParameterView.268=Proxy configuration
+ParameterView.269=Explorer executable path
+ParameterView.270=Path to the executable used as external file explorer
+ParameterView.271=Show Systray
+ParameterView.272=If checked, jajuk can be managed from the notification area (not all operating systems are supported)
+ParameterView.273=Mirrow cover 
+ParameterView.274=If checked, the cover will be tilted and mirrowed 
+ParameterView.275=Notification Popup on track change :
+ParameterView.276=Select the type of notification at track change (a toast is a notification popup that appears briefly on the screen and disappears by itself) 
+ParameterView.277=Balloon pattern :
+ParameterView.278=This pattern set the text to be displayed by balloon notifier at track change
+ParameterView.279=Information pattern :
+ParameterView.280=This pattern set the text to be displayed in the information view (lower part of the screen)
+ParameterView.281=Minimize to tray
+ParameterView.282=If checked, Jajuk main main window will be shown in the systray only when minimized, no more in the taskbar
+ParameterView.283=Mirrow cover in fullscreen mode
+ParameterView.284=If checked, the cover will be tilted and mirrowed in fullscreen mode
+ParameterView.285=Enable bit-perfect
+ParameterView.286=<html>Disable the mixer (sound volume) and any other option that could affect <br>sound quality like audio normalization.<br>Use your OS mixer to change volume or mute once enabled.</html>   
+ParameterView.287=Sound
+ParameterView.288=Enable Title view animation effect
+ParameterView.289=Title view options
+ParameterView.290=Show splash screen at startup
+ParameterView.291=Show splash screen at startup in main Window mode (it is always disabled in slimbar or full screen mode) 
+ParameterView.292=Display a popup with album details when moving mouse over albums tables or thumbnails.
+ParameterView.301=Show videos
+ParameterView.302=If unset, jajuk don't display video-types files (startup required).
+ParameterView.303=Systray click forces display
+ParameterView.304=Clicking on the systray force window display to front (default behavior shows/hides the window)
+ParameterView.305=Preserve files dates
+ParameterView.306=Preserve files "last modification date" when setting tags
+ParameterView.307=Manual ratings
+ParameterView.308=Don't rely on automatic rating system based on play time and preferences but set a rating directly using preference level.
+ParameterView.309=Before writing one or more tags
+ParameterView.310=Reset "Don't show again" choices
+ParameterView.311=This makes possible to show again the choices you asked to hide.
+
+Main.22=Έλεγχος/Λήψη του MPlayer
+
+Player.0=Αναμονή για γραμμή ήχου (κατειλλημένη)
+
+Device.25=] ανανεώθηκε σε 
+Device.27= νέα αρχεία
+Device.31=Συγχρονισμός [
+Device.33=Ο συγχρονισμός έγινε σε 
+Device.35= δημιουργηθέντα αρχεία (
+Device.36= MB) 
+Device.41=Συγχροvισμός [
+Device.42=]  Αντιγραφή [
+Device.43= μη αναγνώσιμες ετικέτες
+Device.44=Είσοδος(Entering)
+Device.45=Αντιγραφή [
+Device.46=Μετατροπή [
+Device.47=] σε [
+Device.48= αναφορές αρχείου ή λίστας αναπαραγωγής χάθηκαν
+
+FIFO.4=). Θέλετε να προσπαθήσετε να το ενεργοποιήσετε ?
+FIFO.10=Παίζει τώρα: 
+FIFO.13= Kbps
+FIFO.14=Παίζει τώρα Web Radio:
+
+
+HistoryItem.0=yy/MM/dd HH:mm
+
+DeviceWizard.0=Ρύθμιση Συσκευής
+DeviceWizard.1=Τύπος Συσκευής(*): 
+DeviceWizard.2=Όνομα Συσκευής(*): 
+DeviceWizard.3=Τοποθεσία Συσκευής(*): 
+DeviceWizard.7=Πραγματοποίηση στιγμιαίας ανανέωσης
+DeviceWizard.8=Αυτόματη ενεργοποίηση στο ξεκίνημα
+DeviceWizard.10=Συγχρονισμένη με: 
+DeviceWizard.11=Συγχρονισμός μονής κατεύθυνσης
+DeviceWizard.12=Όλα τα νέα αρχεία που βρίσκονται στη συσκευή-πηγή αντιγράφονται σε αυτή τη συσκευή. Τίποτα δε γράφεται στη συσκευή-πηγή.
+DeviceWizard.13=Αμφίδρομος συγχρονισμός
+DeviceWizard.14=Όλα τα νέα αρχεία που βρίσκονται στη μία συσκευή αντιγράφονται στην άλλη
+DeviceWizard.43=Παρακαλώ επιλέξτε κατάλογο
+DeviceWizard.44=Η συσκευή δημιουργήθηκε
+DeviceWizard.45=Παρακαλώ δώστε ένα όνομα στη συσκευή. Πχ: CD A, Laptop...
+DeviceWizard.46=Παρακαλώ δώστε την τοποθεσία της συσκευής. Πχ: d:\music στα Windows, /home/foo/music στο Unix
+DeviceWizard.48=<html>Επιλέξτε αυτό αν θέλετε να πραγματοποιήσετε μία άμεση ανανέωση της συσκευής (προτείνεται). <p>Σημειώστε ότι αυτή η διαδικασία μπορεί να διαρκέσει αρκετά για μεγάλες συσκευές.</p></html>
+DeviceWizard.49=<html>Επιλέξτε αυτό αν θέλετε να ενεργοποιήσετε αυτόματα τη συσκευή όταν το Jajuk ξεκινάει. <p>Προτείνεται για καταλόγους στον τρέχοντα σκληρό δίσκο, αλλά όχι για CDs.</p></html>
+DeviceWizard.50=<html>Δώστε το διάστημα σε λεπτά για την αυτόματη αναζήτηση νέων αρχείων (0: καθόλου αναζήτηση, 0.5 λεπτά είναι το ελάχιστο interval)</html>
+DeviceWizard.51=Διαλέξτε αυτό αν θέλετε να συγχρονίσετε αυτή τη συσκευή με μία άλλη
+DeviceWizard.52=Διαλέξτε συσκευή-πηγή
+DeviceWizard.53=Ανανέωση της συσκευής κάθε
+#limited string size
+DeviceWizard.54=λεπ.
+
+JajukJMenuBar.0=Αρχείο
+JajukJMenuBar.1=Άνοιγμα αρχείου
+JajukJMenuBar.3=Έξοδος
+JajukJMenuBar.5=Ιδιότητες
+JajukJMenuBar.6=Δημιουργία εξατομικευμένης ιδιότητας
+JajukJMenuBar.7=Διαγραφή εξατομικευμένης ιδιότητας
+JajukJMenuBar.8=Προβολές
+JajukJMenuBar.9=Λειτουργίες
+JajukJMenuBar.10=Επανάληψη
+JajukJMenuBar.11=Τυχαία σειρά
+JajukJMenuBar.12=Συνέχιση
+JajukJMenuBar.13=Εισαγωγή
+JajukJMenuBar.14=Βοήθεια
+JajukJMenuBar.15=Περιεχόμενα της Βοήθειας
+JajukJMenuBar.16=About
+JajukJMenuBar.17=Επαναφορά προεπιλεγμένων Προβολών
+JajukJMenuBar.18=Οδηγός Συσκευής
+JajukJMenuBar.19=Αναφορά σφάλματος ή αιτήματος χαρακτηριστικού-γνωρίσματος
+JajukJMenuBar.20=Συμβουλή της Ημέρας
+JajukJMenuBar.21=Ρυθμίσεις
+JajukJMenuBar.22=Προτιμήσεις
+JajukJMenuBar.23=Εμφάνιση ιχνών αποσφαλμάτωσης
+JajukJMenuBar.24=Εμφάνιση μόνο των διαθέσιμων κομματιών 
+JajukJMenuBar.25=Εμφάνιση Προβολής
+JajukJMenuBar.26=Επαναφορά Προβολών(σε όλες τις οπτικές)
+JajukJMenuBar.27=Έλεγχος για ανανεωμένες εκδόσεις του Jajuk
+JajukJMenuBar.28=Εργαλεία
+JajukJMenuBar.29=Έξυπνες Λειτουργίες
+JajukJMenuBar.30=Επανάληψη όλων
+JajukJMenuBar.31=Karaoke
+# Next two lines are only used in development/test mode, translation is therefore optional 
+JajukJMenuBar.32=Call a full GC (test mode only)
+JajukJMenuBar.33=Perform a manual commit of the collection data (test mode only)
+
+PlaylistFileItem.1=Kαινούργια
+PlaylistFileItem.2=Νέα λίστα αναπαραγωγής
+PlaylistFileItem.3=Bookmarks
+PlaylistFileItem.4=Καλύτερα
+PlaylistFileItem.5=Τρέχουσα ουρά
+
+JajukFileChooser.0=Επιλογέας αρχείου
+
+SearchBox.0=Διεξαγωγή αναζήτησης μεταξύ κομματιών, καλλιτεχνών, ειδών, καταλόγων...
+
+CommandJPanel.0=Εμφάνιση ιστορικού αναπαραγωγής
+CommandJPanel.1=Κατάσταση λειτουργίας Επανάληψη: Αναπαράγει τα κομμάτια σε κύκλο
+CommandJPanel.2=Κατάσταση λειτουργίας Τυχαία Σειρά: Παίζει τυχαία επιλεγμένα κομμάτια
+CommandJPanel.3=Κατάσταση λειτουργίας Συνέχιση: Συνεχίζει με την αναπαραγωγή προγραμματισμένων κομματιών όταν τελειώσει
+CommandJPanel.4=Κατάσταση λειτουργίας Εισαγωγή: Παίζει μόνο ένα μέρος κάθε κομματιού. Ο χρόνος και η σχετική απόσταση μπορούν να οριστούν στην Προβολή Προτιμήσεις
+CommandJPanel.8=<html>ναπαραγωγή του προηγούμενου κομματιού στη τρέχουσα επιλογή<br />Shift+click εκκινεί το προηγούμενο άλμπουμ</html>
+CommandJPanel.9=<html>Αναπαραγωγή του επόμενου κομματιού στη τρέχουσα επιλογή<br />Shift+click εκκινεί το επόμενο άλμπουμ</html>
+CommandJPanel.10=<html>Γρήγορη επαναφορά στο τρέχον κομμάτι<br />Shift+click για επανάληψη</html>
+CommandJPanel.13=Γρήγορα μπροστά στο τρέχον κομμάτι
+CommandJPanel.15==<html>Κάντε click εδώ για να αλλάξετε τη μορφή εμφάνισης του χρόνου</html> 
+CommandJPanel.16=Launch DJ selection
+CommandJPanel.17=Διαχείριση των DJs
+CommandJPanel.18=Εκκίνηση προεπιλεγμένου DJ 
+CommandJPanel.19=Διαχείρηση των Περιβαλλόντων
+CommandJPanel.20=Κομμάτι - κομμάτι
+CommandJPanel.21=Ανακάτεμα Άλμπουμ - άλμπουμ
+CommandJPanel.22=Άλμπουμ - άλμπουμ
+CommandJPanel.25=Άνοιγμα του ραδιοφώνου
+CommandJPanel.26=Τρόπος επανάληψης όλων: Αναπαραγωγή λίστας συνέχεια
+CommandJPanel.27=Τρόπος Karaoke, απόκρυψη φωνών από το αναπαραχθέν κομμάτι (ισχύει από το επόμενο κομμάτι)
+
+InformationJPanel.5=Συνολικός χρόνος αναπραγωγής μουσικής 
+InformationJPanel.7=Πρόοδος τρέχοντος κομματιού 
+# %xxx are patterns, don't translate them !
+InformationJPanel.8=%title από %artist στο %album
+# Keep next label short
+InformationJPanel.9=<Καμία επιλογή>
+
+AbstractPlaylistEditorView.0=Τίτλος
+AbstractPlaylistEditorView.1=Τοποθεσία
+AbstractPlaylistEditorView.2=Τρέξτε αυτήν τη λίστα αναπαραγωγής 
+AbstractPlaylistEditorView.3=Αποθηκεύστε αυτήν τη λίστα αναπαραγωγής
+AbstractPlaylistEditorView.5=Διαγράψτε ένα item από αυτήν τη λίστα αναπαραγωγής 
+AbstractPlaylistEditorView.6=Μετακινήστε το επιλεγμένο κομμάτι επάνω
+AbstractPlaylistEditorView.7=Μετακινήστε το επιλεγμένο κομμάτι κάτω
+AbstractPlaylistEditorView.9=Διαγράψτε αυτήν τη λίστα αναπαραγωγής
+AbstractPlaylistEditorView.10=Προσθέστε ένα τυχαίο κομμάτι σε αυτήν τη λίστα αναπαραγωγής
+AbstractPlaylistEditorView.15=Λίστες αναπαραγωγής
+AbstractPlaylistEditorView.18=Κομμάτι στην ουρά
+AbstractPlaylistEditorView.19=Επαναλαμβανόμενο κομμάτι
+AbstractPlaylistEditorView.20=Προγραμματισμένο κομμάτι
+AbstractPlaylistEditorView.22=Αποθήκευση λίστας αναπαραγωγής
+AbstractPlaylistEditorView.27=Προετοιμασία Party
+AbstractPlaylistEditorView.29=Αναπαραγωγή κομματιού
+AbstractPlaylistEditorView.30=Ανακάτεμα της λίστας αναπαραγωγής
+
+StatView.0=Άλλα
+StatView.1=Είδη
+StatView.2=Δεν υπάρχουν διαθέσιμα δεδομένα
+StatView.3=Άλλα
+StatView.4=Μέγεθος ανά συσκευή (Gb)
+StatView.5=Δεν υπάρχουν διαθέσιμα δεδομένα
+StatView.7=Μέγεθος συλλογής ανά μήνα
+StatView.8=Μήνες
+StatView.9=Μέγεθος (Gb)
+StatView.10=Δεν υπάρχουν διαθέσιμα δεδομένα
+StatView.12=Συνολικός αριθμός κομματιών ανά μήνα
+StatView.13=Μήνες
+StatView.14=Αριθμός κομματιών
+StatView.15=Δεν υπάρχουν διαθέσιμα δεδομένα
+StatView.16=Στατιστικά
+StatView.24=Παλιότερα
+
+CDScanView.0=Ετικέτα CD: 
+CDScanView.1=Ετικέτα CD. Πχ: CD1, ROCK...
+CDScanView.2=Ετικέτα CD. Πχ: CD1, ROCK...
+CDScanView.3=Τοποθεσία CD: 
+CDScanView.4=Τοποθεσία που βρίσκεται το CD. Πχ: '/cdrom' στο Unix, 'e:' στα MS Windows...
+CDScanView.5=Τοποθεσία που βρίσκεται το CD. Πχ: '/cdrom' στο Unix, 'e:' στα MS Windows...
+CDScanView.6=Σάρωση
+CDScanView.12=Σαρωτής CD
+CDScanView.18=Σαρώνει το CD και προσθέτει όλα τα μουσικά αρχεία στη συλλογή
+CDScanView.19=Διαλέξτε την τοποθεσία του CD
+
+AbstractTreeView.0=Σύντμηση όλων
+
+TracksTreeView.0=Δέντρο Κομματιών
+TracksTreeView.27=Συλλογή
+TracksTreeView.31= κομμάτια
+TracksTreeView.33=Δημιουργία αναφοράς
+TracksTreeView.34=Λήψη ετικετών Online
+TracksTreeView.35=Ημερομηνία ανακάλυψης
+TracksTreeView.36=λιγότερο από μία εβδομάδα
+TracksTreeView.37=λιγότερο από ένα μήνα
+TracksTreeView.38=λιγότερο από έξι μήνες
+TracksTreeView.39=παλιότερο
+TracksTreeView.40=λιγότερο από ένα έτος
+TracksTreeView.41=λιγότερο από δύο έτη
+TracksTreeView.42=λιγότερο από πέντε έτη
+TracksTreeView.43=λιγότερο από δέκα έτη
+TracksTreeView.44=λιγότερο από τρεις μήνες
+
+CoverView.2=Διαγραφή αυτού του εξωφύλλου από το δίσκο 
+CoverView.3=Εξώφυλλο
+CoverView.4=Προηγούμενη εικόνα από το δίσκο και/ή το web αν η επιλογή αυτόματο-εξώφυλλο είναι επιλεγμένη
+CoverView.5=Επόμενη εικόνα από το δίσκο και/ή το web αν η επιλογή αυτόματο-εξώφυλλο είναι επιλεγμένη
+CoverView.6=Αποθήκευση εξωφύλλου με το πραγματικό του όνομα
+CoverView.8=Χρήση αυτού του  cover εξωφύλλου σαν το επιλεγμένο εξώφυλλο για αυτό το άλμπουμ
+CoverView.10=Αποθήκευση εξωφύλλου ως
+CoverView.11=Το εξώφυλλο αποθηκεύτηκε 
+
+AnimationView.0=Τίτλος
+
+FilesTreeView.0=Δέντρο Αρχείων
+FilesTreeView.3=Αντιγραφή
+FilesTreeView.4=Αποκοπή
+FilesTreeView.5=Επικόλληση
+FilesTreeView.7=Διαγραφή
+FilesTreeView.14=Αποσυγχρονισμός
+FilesTreeView.15=Επανασυγχρονισμός
+FilesTreeView.16=Δημιουργία λίστας αναπαραγωγής
+FilesTreeView.28=Ενεργοποίηση
+FilesTreeView.29=Απενεργοποίηση
+FilesTreeView.30=Εξαναγκασμένη ανανέωση
+FilesTreeView.31=Συγχρονισμός
+FilesTreeView.32=Έλεγχος
+FilesTreeView.40=Αντιγραφή
+FilesTreeView.41=Αποκοπή
+FilesTreeView.42=Επικόλληση
+FilesTreeView.47=Συλλογή
+FilesTreeView.52= αρχεία: 
+FilesTreeView.53= GB
+FilesTreeView.54= MB
+FilesTreeView.55=Ρύθμιση συσκευής
+FilesTreeView.59=Θέλετε να διεξάγετε γρήγορη ή σε βάθος (επανανάγνωση ετικετών) αναζήτηση?
+FilesTreeView.60=Γρήγορη
+FilesTreeView.61=Σε βάθος
+FilesTreeView.62=Οργάνωση αρχείων
+
+TracksTableView.0=Πίνακας κομματιών
+TracksTableView.7=Αναπαραγωγή
+TracksTableView.8=Προώθηση
+TracksTableView.9=Τυχαία αναπαραγωγή
+TracksTableView.10=Επανάληψη
+TracksTableView.11=Αναπαραγωγή Άλμπουμ
+TracksTableView.12=Αναπαραγωγή Καλλιτέχνη
+TracksTableView.14=Ιδιότητες
+TracksTableView.15=Προσθήκη στα αγαπημένα
+TracksTableView.16=Ώθηση επόμενου
+
+AbstractTableView.0=Φίλτρο:
+AbstractTableView.1=Ιδιότητα για φιλτράρισμα
+AbstractTableView.3=Τιμή που χρησιμοποιείται από το φίλτρο
+AbstractTableView.7=περιέχει:
+AbstractTableView.8=Οτιδήποτε
+AbstractTableView.10=(Μη διαθέσιμο)
+AbstractTableView.11=Κάνει τον πίνακα τροποποιήσιμο
+
+AboutView.7=Σχετικά
+AboutView.8=Άδεια
+AboutView.9=Σύστημα
+AboutView.10=Σχετικά
+AboutView.11=<html>Copyright 2003-2012<br/>Jajuk team</html>"
+
+PhysicalPlaylistRepositoryView.2=Αποθήκευση ως
+PhysicalPlaylistRepositoryView.9=Ουρά αναπαραγωγής
+
+FilesTableView.0=Πίνακας Αρχείων
+FilesTableView.15=Αναπαραγωγή καταλόγου
+
+DeviceView.1=Απομάκρυνση απενεργοποιημένης συσκευής (δε διαγράφει τίποτα από το δίσκο)
+DeviceView.2=Ιδιότητες επιλεγμένης συσκευής
+DeviceView.8=Ενεργοποίηση
+DeviceView.9=Απενεργοποίηση
+DeviceView.10=Έλεγχος
+DeviceView.11=Εξαναγκασμένη ανανέωση
+DeviceView.12=Συγχρονισμός
+DeviceView.13=Απομάκρυνση συσκευής
+DeviceView.14=Ρύθμιση
+DeviceView.17=Νέα
+DeviceView.18=Προσθήκη συσκευής
+DeviceView.21=Αυτή η συσκευή είναι διαθέσιμη 
+DeviceView.22=Αυτή η συσκευή είναι απροσπέλαστη
+DeviceView.23=Συσκευές
+
+JajukWindow.1=Ήχος
+JajukWindow.2=Σίγαση
+JajukWindow.3=Jajuk
+JajukWindow.4=Έξοδος
+JajukWindow.5=About Jajuk
+JajukWindow.6=Τυχαία αναπαραγωγή
+JajukWindow.7=Αναπαραγωγή των Καλύτερων
+JajukWindow.10=Παύση
+JajukWindow.12=Αναπαραγωγή
+JajukWindow.13=Προηγούμενο 
+JajukWindow.14=Επόμενο
+JajukWindow.15=Αναπαραγωγή Καινούργιων
+JajukWindow.16=Συνέχιση Άλμουμ
+JajukWindow.17=Jajuk: Advanced Jukebox
+JajukWindow.18=Έτοιμο για αναπαραγωγή
+JajukWindow.19=Σίγαση/Ήχος
+JajukWindow.21=Έξοδος
+JajukWindow.22=About Jajuk
+JajukWindow.23=Αναπαραγωγή τυχαίων κομματιών από τη συλλογή
+JajukWindow.24=Αναπαραγωγή των πιο δημοφιλών κομματιών της συλλογής
+JajukWindow.26=Αναπαραγωγή/Παύση
+JajukWindow.27=Διακοπή
+JajukWindow.31=Αναπαραγωγή των νεότερων κομματιών της συλλογής
+JajukWindow.32=Συνέχιση Άλμπουμ: Finish playing the current album
+JajukWindow.36=Τρέχον Περιβάλλον:
+JajukWindow.37=Δεν έχει οριστεί Περιβάλλον 
+JajukWindow.40=Διαμόρφωση επιπλέον ετικετών
+JajukWindow.41=Ανοίγει ένα παράθυρο για να ορίσετε τις ενεργοποιημένες επιπλέον ετικέτες
+
+JajukDonate.1=Δωρεά
+JajukDonate.2=Οι υποδομές του χρειάζονται χρήματα, μάθετε περισσότερα στη σελίδα του προϋπολογισμού μας.
+JajukDonate.3=Προϋπολογισμός
+JajukDonate.4=Αν θέλετε να στηρίξετε τον Jajuk, παρακαλούμε κάνετε μια δωρεά.
+
+ActiveTagsWizard.1=Διαθέσιμες Ετικέτες
+ActiveTagsWizard.2=Ενεργοποιημένες Ετικέτες
+ActiveTagsWizard.3=Αυτό διαμορφώνει τις πρόσθετες ετικέτες που θέλετε να εμφανίσετε στον Jajuk. Οι πληροφορίες διαβάζονται απευθείας από τα αρχεία ήχου (για παράδειγμα από id3 ετικέτες). Εάν ενεργοποιήσετε μια νέα ετικέτα, πραγματοποιείται μια βαθιά ανανέωση. Αυτό μπορεί να διαρκέσει μερικά λεπτά, ανάλογα με το μέγεθος της συλλογής σας.
+
+SimpleDeviceWizard.0=Γρήγορη δημιουργία συσκευής
+
+FirstTimeWizard.0=Γρήγορο ξεκίνημα
+FirstTimeWizard.1=<html><b>Καλώς Ήρθατε! Αυτός ο οδηγός θα σας βοηθήσει στη δημιουργία της μουσικής σας συλλογής.</b></html>
+FirstTimeWizard.2=<html>Παρακαλώ επιλέξτε την τοποθεσία της μουσικής σας</html>
+FirstTimeWizard.5=Παρακαλώ επιλέξτε κατάλογο
+FirstTimeWizard.6=Προχωρημένες προτιμήσεις
+FirstTimeWizard.7=Ορισμός του φακέλου που περιέχει το χώρο-εργασίας του Jajuk :DownloadManager.0=<html>Το Jajuk χρειάζεται τον κωδικό πρόσβασης του HTTP proxy σας για να λάβει εξώφυλλα.<br>Αν δεν τα θέλετε, παρακαλώ αλλάξτε τις ρυθμίσεις σας στην καρτέλα Εξώφυλλα της Προβολής Προτιμήσεις.<br>Αν δεν έχετε proxy, παρακαλώ αλλάξτε τις ρυθμίσεις σας στην καρτέλα Δίκτυο της Προβολής Προτιμήσεις.</html>
+FirstTimeWizard.8=Επιλεγμένος κατάλογοςSelected directory: 
+FirstTimeWizard.9=Κανένας
+
+
+DownloadManager.0=
+<html></html>Ο Jajuk χρειάζεται το κωδικός σας του HTTP proxy για να κατεβάσει τα εξώφυλλα.<br/>Αν δεν τα θέλετε, παρακαλούμε αλλάξτε τις ρυθμίσεις από την καρτέλα Εξώγυλλα στην προβολή Ιδιότητες.<br/>Αν δεν θέλετε να έχετε proxy, παρακαλούμε αλλάξτε τις ρυθμίσεις από την καρτέλα Δίκτυο στην προβολή Ιδιότητες.</html>
+
+PropertiesWizard.1=Ιδιότητα
+PropertiesWizard.2=Τιμή
+PropertiesWizard.4=Σύνδεσμος
+PropertiesWizard.6=Επιλογή
+PropertiesWizard.8=Επιτυχώς ενημερομένη ιδιότητα
+PropertiesWizard.10=οι ιδιότητες έχουν οριστεί
+PropertiesWizard.11=Εγγραφή ετικέτας σε:
+PropertiesWizard.12=Σύνδεσμος στις ιδιότητες του δοθέντος στοιχείου
+PropertiesWizard.13=Αντιγραφή
+PropertiesWizard.14=Αντιγραφή τιμής στη πρόχειρη μνήμη του συστήματος
+
+NewPropertyWizard.0=Δημιουργία Εξατομικευμένης Ιδιότητας
+NewPropertyWizard.3=(*)Τύπος
+NewPropertyWizard.4=Μορφή
+NewPropertyWizard.5=Προεπιλεγμένη τιμή
+
+CustomPropertyWizard.0=(*)Αντικείμενο
+CustomPropertyWizard.1=(*)Όνομα Εξατομικευμένης Ιδιότητας
+
+RemovePropertyWizard.0=Διαγραφή Εξατομικευμένης Ιδιότητας
+
+QualityFeedbackWizard.20=Ένα νέο παράθυρο θα ανοίξει τώρα για να υποβάλετε το ticket σας στον εξωτερικό σας πλοηγό(browser). Τα τελευταία σας anonymized traces έχουν ήδη προωθηθεί στο clipboard σας, παρακαλώ επικολλήστε τα στο πεδίο περιγραφής(description field) αν είναι αναφορά σφάλματος (αυτό θα αυξήσει σε μεγάλο βαθμό τις πιθανότητες διόρθωσης του προβλήματός σας).
+
+IncRateAction.0=Αύσηση της αξιολόγησης του τρέχοντος κομματιού
+
+SplashScreen.0=Αρχικοί έλεγχοι
+SplashScreen.1=Φόρτωμα συλλογής
+SplashScreen.2=Εκκίνηση της μηχανής μουσικής
+SplashScreen.3=Εκκίνηση της διασύνδεσης γραφικών
+
+CatalogView.0=Κατάλογος εξωφύλλων
+#Next line : Respect English size   $$$
+CatalogView.2=Display albums without cover
+CatalogView.3=Refresh the catalog
+CatalogView.4=Thumbnail size:
+CatalogView.5=Created thumbnail for:
+CatalogView.7=Select a cover
+CatalogView.11=Page:
+CatalogView.12=Display previous thumbnails page
+CatalogView.13=Display next thumbnails page
+CatalogView.14=Select thumbnails page to display
+CatalogView.15=Thumbnails size:
+CatalogView.16=albums
+CatalogView.17=/page
+CatalogView.18=Cover selection
+CatalogView.19=Rebuild thumbnails
+CatalogView.20=Show detail
+CatalogView.21=Display all albums
+CatalogView.22=Display albums with cover
+
+WikipediaView.0=Wikipedia
+WikipediaView.1=Επιλέξτε γλώσσα:
+WikipediaView.3=Δε βρέθηκε αποτέλεσμα
+WikipediaView.5=Αναζήτηση με το όνομα Καλλιτέχνη
+WikipediaView.6=Αναζήτηση με το όνομα Άλμπουμ
+WikipediaView.7=Αναζήτηση με βάση τον τίτλο
+WikipediaView.8=Φόρτωση
+WikipediaView.9=Αποτυχία φόρτωσης πληροφοριών από την Wikipedia
+WikipediaView.10=Αδυναμία αναζήτησης αγνώστου καλλιτέχνη.
+
+TipOfTheDayView.0=Συμβουλή της ημέρας
+TipOfTheDayView.1=Ήξερες...?
+TipOfTheDayView.2=Εμφάνιση στο ξεκίνημα?
+
+CDDBWizard.1=Όνομα αρχείου
+CDDBWizard.2=Τίτλος τρέχοντος Κομματιού
+CDDBWizard.3=Τίτλος τρέχοντος Άλμπουμ 
+CDDBWizard.4=Προτεινόμενος Τίτλος Κομματιού 
+CDDBWizard.5=Προτεινόμενος Τίτλος Άλμπουμ :
+CDDBWizard.12=Δε βρέθηκε ταύτιση!
+CDDBWizard.17=Βρέθηκε αποτέλεσμα που ταυτίζεται ακριβώς!
+CDDBWizard.18=Ταύτιση/Ταυτίσεις
+CDDBWizard.19=Λήψη ετικετών Online
+
+RefactorWizard.0=Το αρχείο μετακινήθηκε : 
+
+DigitalDJWizard.0=Επιλέξτε τη μορφή του νέου DJ
+DigitalDJWizard.1=Προγραμματισμός βασισμένος σε μεταβάσεις (ROCK -> POP)
+DigitalDJWizard.2=Προγραμματισμός βασισμένος σε ποσοστά (20% JAZZ, 30% ROCK)
+DigitalDJWizard.3=Προγραμματισμός βασισμένος σε περιβάλλον (Soft, Party...)
+DigitalDJWizard.4=Οδηγός Ψηφιακού DJ
+DigitalDJWizard.5=Γενική Ρύθμιση του DJ
+DigitalDJWizard.6=Όνομα του DJ (*)
+DigitalDJWizard.8=Ελάχιστος αριθμός αστεριών:
+DigitalDJWizard.9=Επικάλυψη-σβήσιμο (δευτερόλεπτα):
+DigitalDJWizard.10=Τα κομμάτια παίζονται μόνο μία φορά
+DigitalDJWizard.14=Επιλογή ειδών (επιτρέπονται οι πολλαπλές επιλογές)
+DigitalDJWizard.16=Θέλεις...
+DigitalDJWizard.17=Να δημιουργήσεις καινούργιο DJ?
+DigitalDJWizard.18=Να αλλάξεις έναν υπάρχοντα DJ?
+DigitalDJWizard.19=Να διαγράψεις έναν DJ?
+DigitalDJWizard.20=Νέος DJ βασισμένος σε μεταβάσεις 
+#limited string size
+DigitalDJWizard.21=Διαγραφή 
+#limited string size
+DigitalDJWizard.22=Προέλευση 
+#limited string size
+DigitalDJWizard.23=Προορισμός
+#limited string size
+DigitalDJWizard.24=Nb
+#limited string size
+DigitalDJWizard.26=Παρακαλώ δημιουργείστε τουλάχιστον μία μετάβαση
+#limited string size
+DigitalDJWizard.27=Επιλογή ειδών
+#limited string size
+DigitalDJWizard.28=%
+DigitalDJWizard.29=Νέος DJ βασισμένος σε ποσοστά
+DigitalDJWizard.30=Παρακαλώ δημιουργείστε τουλάχιστον ένα ποσοστό
+DigitalDJWizard.31=Νέος DJ βασισμένος σε περιβάλλον
+DigitalDJWizard.32=Νέο
+DigitalDJWizard.33=Δημιουργία νέου περιβάλλοντος
+DigitalDJWizard.34=Διαγραφή
+DigitalDJWizard.35=Διαγραφή επιλεγμένου περιβάλλοντος
+DigitalDJWizard.36=Όνομα του Περιβάλλοντος
+DigitalDJWizard.37=Όνομα
+DigitalDJWizard.38=Παρακαλώ δημιουργείστε τουλάχιστον ένα περιβάλλον
+DigitalDJWizard.39=Παρακαλώ συμπληρώστε το όνομα του περιβάλλοντος και επιλέξτε τα είδη του περιβάλλοντος
+DigitalDJWizard.40=Παρακαλώ διαλέξτε έναν DJ
+DigitalDJWizard.41=Παρακαλώ δώστε ένα όνομα στον DJ
+DigitalDJWizard.42=Ένας DJ με αυτό το όνομα υπάρχει ήδη
+DigitalDJWizard.43=Αλλαγή DJ
+DigitalDJWizard.44=Διαλέξτε τον DJ που θα ρυθμίσετε
+DigitalDJWizard.45=Επιλογή ενέργειας
+DigitalDJWizard.46=Επιλογή τύπου DJ
+DigitalDJWizard.47=Παρακαλώ διαλέξτε ή δημιουργείστε περιβάλλον
+DigitalDJWizard.48=Γενικά Χαρακτηριστικά
+DigitalDJWizard.49=Παρακαλώ συμπληρώστε τα γενικά χαρακτηριστικά του DJ
+DigitalDJWizard.50=Παρακαλώ ορίστε ποσοστά
+DigitalDJWizard.51=Διαγραφή DJ
+DigitalDJWizard.52=Παρακαλώ ορίστε μεταβάσεις
+DigitalDJWizard.53=Ελάχιστος αριθμός αστεριών αξιολόγησης για τα κομμάτια που επιλέγονται (1: όλα τα κομμάτια)
+DigitalDJWizard.54=Διάρκει επικάλυψης-σβησίματος ανάμεσα στα κομμάτια
+DigitalDJWizard.55=Αν επιλεγεί θα περιέχεται κάθε κομμάτι μόνο μία φορά
+DigitalDJWizard.56=Οδηγός Περιβαλλόντων
+DigitalDJWizard.57=Διαχείριση των περιβάλλονόντων
+DigitalDJWizard.58=Επιλογή περιβάλλοντος:
+DigitalDJWizard.59=Το άθροισμα όλων των ποσοστών πρέπει να είναι < 100 %
+DigitalDJWizard.60=Υπάρχον όνομα περιβάλλοντος
+DigitalDJWizard.61=Διαγραφή DJ
+#limited string size
+DigitalDJWizard.62=Προεπιλογές
+DigitalDJWizard.63=Προσθήκη προεπιλεγμένων περιβαλλόντων
+DigitalDJWizard.64=Οτιδήποτε
+DigitalDJWizard.66=Επιλογή προεπιλεγμένου Περιβάλλοντος 
+DigitalDJWizard.67=Περιορίστε τον αριθμό των κομματιών στην ουρά
+DigitalDJWizard.68=Μέγιστος αριθμός κομματιών στην ουρά
+$$$$
+PreparePartyWizard.1=Prepare Party
+PreparePartyWizard.2=Select source for tracks
+PreparePartyWizard.3=First define your party's tracks
+PreparePartyWizard.4=Select limits
+PreparePartyWizard.5=Please define constraints
+PreparePartyWizard.6=DJs
+PreparePartyWizard.7=Ambiences
+PreparePartyWizard.8=Playlists
+PreparePartyWizard.9=Random tracks
+PreparePartyWizard.10=Max. tracks
+PreparePartyWizard.11=How many tracks to include at maximum.
+PreparePartyWizard.12=Max. size (MB)
+PreparePartyWizard.13=How many many megabyte of data you want to create at maximum.
+PreparePartyWizard.14=Max. length (Minutes)
+PreparePartyWizard.15=How many long the resulting party should be at maximum.
+PreparePartyWizard.16=Restrict type
+PreparePartyWizard.17=Choose to only use one type of audio files. This can be useful, if a audio player only supports certain types of media.
+PreparePartyWizard.18=Select location
+PreparePartyWizard.19=Select the location where the files for the party are stored. A subdirectory is created for the files. 
+PreparePartyWizard.20=Please select the target location. 
+PreparePartyWizard.21=Selected directory: 
+PreparePartyWizard.22=Please select the target directory. 
+PreparePartyWizard.23=Files were copied in
+PreparePartyWizard.24=Best Of Playlist
+PreparePartyWizard.25=Novelties Playlist
+PreparePartyWizard.26=Normalize filenames
+PreparePartyWizard.27=Normalize filenames to replace foreign characters so that the file is portable across operating systems and different encodings
+PreparePartyWizard.31=Target location:
+PreparePartyWizard.32=Queued files
+PreparePartyWizard.33=Bookmarked files
+PreparePartyWizard.34=Try to convert other media types
+PreparePartyWizard.35=Uses the external tool 'pacpl - Perl Audio Converter' for converting audio files if required
+PreparePartyWizard.36= file(s) could not be converted to the selected media format.
+PreparePartyWizard.37=<html>(requires PACPL, see <a href="http://jajuk.info/index.php/Installing_Perl_Audio_Converter">Perl Audio Converter</a>)</html>
+PreparePartyWizard.38=Configure conversion settings
+PreparePartyWizard.39=<html>Please define the command to start the Perl Audio Converter.<br/>On Linux this is often just "pacpl" or "perl <install-location>/pacpl.<br/>On Windows this is usually "perl <install-location>\pacpl</html>
+PreparePartyWizard.40=Configure...
+
+Ambience.0=Rock/Pop
+Ambience.1=Rap
+Ambience.2=HardRock
+Ambience.3=Techno
+Ambience.4=Electro
+Ambience.5=Classical
+Ambience.6=Soft
+Ambience.7=Party
+Ambience.8=Jazz
+Ambience.9=World
+Ambience.10=Others
+Ambience.11=Folk/Oldies
+Ambience.12=Inde
+Ambience.13=Latin
+
+DebugLogAction.0=Καταγραφή ιχνών αποσφαλμάτωσης
+DebugLogAction.1=Ανανέωση
+DebugLogAction.2=Αντιγραφή στo clipboard
+
+CopyClipboardAction.0=Αντιγραφή διεύθυνσης στο clipboard
+
+LaunchInBrowserAction.0=Άνοιγμα διεύθυνσης στον προεπιλεγμένο browser
+
+ReportAction.0=Αναφορά επιτυχούς δημιουργίας 
+ReportAction.1=Μουσική Αναφορά Jajuk
+ReportAction.2=Παρακαλώ λάβετε υπ'όψην το περιβάλλον και μην εκτυπώνετε αν δεν είναι απολύτως απαραίτητο
+ReportAction.3=Λίστα Άλμπουμ
+ReportAction.4=Κομμάτια ανά άλμπουμ
+ReportAction.5=Λίστα καλλιτεχνών
+ReportAction.6=Άλμπουμ ανά καλλιτέχνες
+ReportAction.7=Λίστα είδος
+ReportAction.8=Άμλπουμ ανά είδος
+ReportAction.9=Artists/ άλμπουμ ανά είδος
+ReportAction.10=Λίστα φακέλων
+ReportAction.11=Αρχεία ανά φάκελο
+ReportAction.12=Όνομα αρχείου	
+ReportAction.13=Όνομα κομματιού
+ReportAction.14=Λίστα συσκευών
+ReportAction.15=Φάκελοι ανά συσκευή
+ReportAction.16=Φάκελοι/ αρχεία
+ReportAction.17=συλλογή
+ReportAction.18=Artists/ άλμπουμ/ κομμάτια ανά genre
+ReportAction.19=Μεταπήδηση σε:
+
+ActionMove.0=Επικόλληση
+
+ActionRefresh.0=Εξαναγκασμένη ανανέωση
+
+RenameAction.0=Μετονομασία
+RenameAction.1=Παρακαλώ εισάγετε το νέο όνομα για αυτό το αρχείο:
+RenameAction.2=Παρακαλώ εισάγετε το νέο όνομα για αυτόν τον κατάλογο:
+
+NewFolderAction.0=Νέος Φάκελος
+NewFolderAction.1=Παρακαλώ εισάγετε το όνομα του νέου Φακέλου:
+NewFolderAction.2=Υπάρχει ήδη Φάκελος με αυτό το όνομα.
+$$$$$
+LyricsView.0=Στίχοι
+LyricsView.1=Χωρίς στίχους, πρόσβαση διαδικτύου απενεργοποιημένη, χρησιμοποιήστε το μενού Διαμόρφωση για ενεργοποιήση.
+LyricsView.2=Enter lyrics edit mode
+LyricsView.3=Exit lyrics edit mode
+LyricsView.4=Save lyrics
+LyricsView.5=Delete lyrics
+
+ActionDelete.0=Τα αρχεία διαγράφηκαν
+ActionDelete.1=Οι κατάλογοι διαγράφηκαν
+
+FindDuplicateTracksAction.0=Δε βρέθηκαν διπλά (όμοια) κομμάτια.
+FindDuplicateTracksAction.2=Εύρεση διπλών (όμοιων) κομματιών
+FindDuplicateTracksAction.3=Λίστα διπλών (όμοιων) κομματιών που βρέθηκαν
+FindDuplicateTracksAction.4=Επιλογή όλων των  διπλών (όμοιων) κομματιών
+
+RefreshDialog.1=Ανανέωση συσκεής σε εξέλιξη
+RefreshDialog.2=Ανανέωση συσκεής σε εξέλιξη: 
+RefreshDialog.3=Καθάρισμα παλαιών αρχείων
+
+UpdateManager.0=Μία νέα έκδοση του Jajuk (
+UpdateManager.1=) έχει εντοπιστεί, μπορείτε να την κατεβάσετε από http://jajuk.info
+UpdateManager.2=Δεν βρέθηκε καμία διαθέσιμη νέα έκδοση έως τώρα
+
+SuggestionView.0=Προτάσεις
+SuggestionView.1=Προτιμόμενα
+SuggestionView.2=Νεότερα
+SuggestionView.3=Άλλα άλμπουμ
+SuggestionView.4=Παρόμοιοι καλλιτέχνες
+SuggestionView.5=Ακούγονται σπάνια
+SuggestionView.7=<html><b>Τίποτα για εμφάνιση</b><br><br><i>Οι πληροφορίες του Last.FM εμφανίζονται μόνο αν:<ul><li>Πάιζει ένα κομμάτι</li><li>Είναι γνωστός ο artist του κομματιού που παίζεται (σωστό tag)</li><li>Η επιλογή "Ενεργοποίση των Last.FM information queries" είναι επιλεγμένη στην προβολή Προτιμήσεις / καρτέλα Last.FM </li></ul></i></html>
+
+AbstractThumbnail.0=Άνοιγμα σελίδας LAST.FM
+
+AlbumsTableView.0=Πίνακας άλμπουμ
+AlbumsTableView.1=Αριθμός κομματιών
+
+AlarmClock.0=Ορισμός νέου συναγερμού
+
+AlarmDialog.0=Χρόνος (ΩΩ24:ΛΛ:ΔΔ)
+AlarmDialog.1=Ώρα
+AlarmDialog.2=Λεπτά
+AlarmDialog.3=Δευτερόλεπτα
+AlarmDialog.4=Ενέργεια συναγερμού
+AlarmDialog.5=Επιλογή ενέργειας συναγερμού
+
+ShowPropertiesAction.0=Εμφάνιση ιδιοτήτων αντικειμένου
+
+QueueView.1=Ακύρωση της ουράς
+QueueView.2=Μετακίνηση πίνακα αυτόματα στο τρέχον κομμάτι που παίζεται
+QueueView.3=Σταμάτημα παιξίματος στο τέλος του τρέχοντος κομματιού
+
+JajukSlimWindow.0=Εμφάνιση/απόκρυψη του Jajuk slimbar
+
+JajukFullscreen.0=Απ-/ενεργοποίηση πλήρης οθόνης
+
+BanSelectionAction.0=Αποκλεισμός
+BanSelectionAction.1=Αποκλεισμός του αντικειμένου έτσι ώστε να μην επιλεγεί ξανά
+
+UnBanSelectionAction.0=Άρση αποκελισμού
+UnBanSelectionAction.1=Άρετε τον αποκλεισμό αντικειμένων έτσι ώστε να μπορούν να προταθούν ξανά
+
+OpenExplorerAction.0=Άνοιγμα με περιηγητή
+OpenExplorerAction.1=Άνοιγμα του καταλόγου χρησιμοποιώντας εξωτερικό πρόγραμμα περιηγητή
+
+Preference.0=<html>Ορισμός προσωπικής επιλογής για το τρέχον κομμάτιbr>Λαμβάνεται υπόψη για τον υπολογισμό της τελικής βαθμολογίας</html>
+Preference.1=Σκουπίδι
+Preference.2=Χαμηλό
+Preference.3=Μέτριο
+Preference.4=Καλό
+Preference.5=Εξαιρετικό
+Preference.6=Κλασσικό
+Preference.7=Επιλογές...
+Preference.8=Χωρίς επιλογή
+
+ArtistView.0=Προβολή καλλιτέχνη
+
+Notificator.NONE=None
+Notificator.TOAST=Toast
+Notificator.BALLOON=Balloon
+Notificator.track_change.webradio_title=Ξεκίνησε το Web radio : 
+Notificator.track_change.track_title=Ξεκίνησε το Κομμάτι : 
+
+SyncTreeTableAction.0=Συγχρονισμός προβολής δέντρου και πίνακα
+SyncTreeTableAction.1=<html>Συγχρονισμός προβολών δέντρου και πίνακα<br/>Όταν χρησιμοποιηθεί κατά προβολή δέντρου, επιλέγοντας ένα στοιχείο σε μία προβολή πίνακα θα επεκταθεί και θα μετακινηθείτε στο στοιχείο του δέντρου.<br/> Όταν χρησιμοποιηθεί σε μια προβολή πίνακα, επιλέγοντας ένα στοιχείο σε μια προβολή δέντρου θα φιλτράρει τον πίνακα αναλόγως.</html>
+
+ShowCurrentlyPlayingAction.0=Εμφάνιση στην περιοχή ειδοποιήσεων ποιος τίτλος παίζει αυτή τη στιγμή
+ShowCurrentlyPlayingAction.1=Εάν ενεργοποιηθεί στις ρυθμίσεις, η ενέργεια αυτή θα εμφανίσει ένα παράθυρο ειδοποίησης του συστήματος που εμφανίζει πληροφορίες σχετικά με το τρέχον κομμάτι.
+
+ExportRatingsAction.1=Εξαγωγή βαθμολογιών
+ExportRatingsAction.2=Εγγραφή των βαθμολογιών όλων των κομματιών σε αρχείο ώστε να είναι δυνατή η εισαγωγή τους σε άλλη εγκατάσταση του Jajuk που έχει τα ίδια αρχεία
+ExportRatingsAction.3=Παρακαλώ επιλέξτε το XML αρχείο για την εξαγωγή των βαθμολογιών
+
+ImportRatingsAction.1=Εισαγωγή βαθμολογιών
+ImportRatingsAction.2=Ανάγνωση των βαθμολογιών που εξήχθησαν από άλλη εγκατάσταση της Jajuk. Η βαθμολογία όλων των αρχείων που ταιριάζουν θα ενημερωθεί.
+ImportRatingsAction.3=Παρακαλώ επιλέξτε το XML αρχείο για την εισαγωγή των βαθμολογιών
+
+WebRadioView.0=Web Radios
+WebRadioView.1=Webradio
+WebRadioView.2=Origin
+WebRadioView.8=New webradio
+WebRadioView.10=Reload presets
+WebRadioView.11=Reload presets webradios from Jajuk website (keep custom keywords).
+
+TipOfTheDay.0=   Tip 0:  μπορείς να ξαναπαίξεις το τρέχον κομμάτι από την αρχή με [Shift+click] στο κουμπί επαναφοράς
+TipOfTheDay.1=   Tip 1:  μπορείς να ξαναπαίξεις το τρέχον άλμπουμ από το πρώτο του κομμάτι με [Shift+click]
+TipOfTheDay.2=   Tip 2:  μπορείς να προσθέσεις τυχαία κομμάτια σε λίστες αναπαραγωγής χρησιμοποιώντας το κουμπί ? στον επεξεργαστή λίστας αναπαραγωγής
+TipOfTheDay.3=   Tip 3:  μπορείς λάβεις εξώφυλλα online ακόμη και πίσω από proxy server χρησιμοποιώντας την καρτέλα Δίκτυο της Προβολής Προτιμήσεις
+TipOfTheDay.4=   Tip 4:  το Jajuk περιέχει ένα slimbar (Maximize κουμπί στην πάνω αριστερή πλευρά του μενού) για τον έλεγχο της αναπαραγωγής, το οποίο καταλαμβάνει λίγο μόνο χώρο στην επιφάνεια εργασίας
+TipOfTheDay.5=   Tip 5:  μπορείς να κρύψεις τα μη διαθέσιμα κομμάτια επιλέγοντας "Εμφάνιση μόνο ενεργοποιημένων συσκευών" στην καρτέλα Επιλογές της Προβολής Προτιμήσεις
+TipOfTheDay.6=   Tip 6:  μπορείς να πραγματοποιήσεις σχεδόν κάθε λειτουργία του Jajuk χρησιμοποιώντας το πληκτρολόγιο
+TipOfTheDay.7=   Tip 7:  μπορείς να σύρεις και να αφήσεις αντικείμενα από Δενδρικές Προβολές στον επεξεργαστή λίστας αναπαραγωγής και στην αποθήκη λιστών αναπαραγωγής
+TipOfTheDay.8=   Tip 8:  μπορείς να ακούσεις εισαγωγές κομματιών χρησιμοποιώντας την κατάσταση λειτουργίας Εισαγωγή
+TipOfTheDay.9=   Tip 9:  μπορείς ρυθμίσεις την διάρκεια επικάλυψης-σβησίματος στην καρτέλα Επιλογές της Προβολής Προτιμήσεις
+TipOfTheDay.10=   Tip 10:  το Jajuk μπορεί να χρησιμοποιηθεί σαν προχωρημένο ξυπνητήρι με τη χρήση του χαρακτηριστικού Συναγερμός το οποίο είναι διαθέσιμο από το μενού Εργαλεία
+TipOfTheDay.11=   Tip 11:  μπορείς να ελέγξεις της κύριες λειτουργίες του Jajuk χρησιμοποιώντας μόνο the tray (Linux & Windows)?
+TipOfTheDay.12=   Tip 12:  το Θέμα του Jajuk μπορεί να διαμορφωθεί από την καρτέλα GUI της Προβολής Προτιμήσεις
+TipOfTheDay.13=   Tip 13:  μπορείς να ρυθμίσεις τη συμπεριφορά του διπλού-click και του drag and drop (προώθηση και αναπαραγωγή) στην καρτέλα Επιλογές της Προβολής Προτιμήσεις
+TipOfTheDay.14=   Tip 14:  τα "προγραμματισμένα" κομμάτια του Jajuk είναι κομμάτια που θα αναπαραχθούν μετά τις τρέχουσες επιλογές κομματιών
+TipOfTheDay.15=   Tip 15:  η διασύνδεση γραφικών του Jajuk είναι πλήρως dockable και ότι μπορείς να σύρεις και να αφήσεις Προβολές ώστε να τις οργανώσεις ξανά
+TipOfTheDay.16=   Tip 16:  μπορείς να πάρεις το συνολικό αριθμό αρχείων και κομματιών επιλέγοντας τον κόμβο "Συλλογή" στην Προβολή Φυσικού ή Λογικού Δέντρου
+TipOfTheDay.17=   Tip 17:  μπορείς να λάβεις ετικέτες online με τη λειτουργία "Λήψη ετικετών online" σε καταλόγους στην Προβολή Φυσικού Δέντρου
+TipOfTheDay.18=   Tip 18:  η μπάρα ιστορικού του Jajuk (κάτω μέρος του παραθύρου) εμφανίζει όλα τα κομμάτια που παίχτηκαν προηγουμένως
+TipOfTheDay.19=   Tip 19:  yμπορείς να πραγματοποιήσεις γρήγορες αναζητήσεις χρησιμοποιώντας το κουτί Αναζήτησης (κάτω μέρος του παραθύρου)
+TipOfTheDay.20=   Tip 20:  μπορείς να αναφέρεις σφάλματα ή αιτήματα λειτουργίας-χαρακτηριστικού χρησιμοποιώντας τον οδηγό ποιότητας (Βοήθεια -> Αναφορά θέματος)
+TipOfTheDay.21=   Tip 21:  οι DJs του Jajuk μπορούν να δημιουργήσουν έξυπνες λίστες αναπαραγωγής ακολουθώντας τους κανόνες σου
+TipOfTheDay.22=   Tip 22:  μπορείς να λάβεις τους στίχους κομματιώνμ χρησιμοποιώντας την "Προβολή Στίχοι"
+TipOfTheDay.23=   Tip 23:  η προβολή Προτάσεις προβάλλει πληροφορίες του LAST.FM όπως παρόμοιους καλλιτέχνες
+TipOfTheDay.24=   Tip 24:  μπορείς να ορίσεις μία εικόνα background της επιλογής σου στην προβολή Προτιμήσεις / καρτέλα GUI  
+TipOfTheDay.25=   Tip 25:  μπορείς να προβάλεις/αποκρύψεις unmounted συσκευές με ένα click στη μενού μπάρα "Ρυθμίσεις"
+TipOfTheDay.26=   Tip 26:  τώρα μπορείς να επιλέξεις κατάλογο για τα δεδομένα του Jajuk (όπως έναν εξωτερικό δίσκο) για να διατηρήσεις τα δεδομένα και τις προτιμήσεις σε οποιονδήποτε υπολογιστή (βλέπε  καρτέλα "Προχωρημένοι" στην προβολή Προτιμήσεις) ?
+TipOfTheDay.27=   Tip 27:  μπορείς να προσθέσεις οποιαδήποτε προβολή σε οποιαδήποτε οπτική χρησιμοποιώντας τη menu μπάρα "Προβολές"
+TipOfTheDay.28=   Tip 28:  you can launch a wikipedia page in you default browser using the "Launch address in default browser" icon <a href="../images/3/30/Launch_16x16.png" title="Image:launch_16x16.png" class="internal"> <img src='../images/3/30/Launch_16x16.png' alt="Image:launch_16x16.png"/> </a>   
+TipOfTheDay.29=   Tip 29:  Jajuk supports web radios <a href="../images/9/9d/Webradio_32x32.png" title="Image:webradio_32x32.png" class="internal"> <img src='../images/9/9d/Webradio_32x32.png' alt="Image:webradio_32x32.png"/> </a>   
+TipOfTheDay.30=   Tip 30:  Jajuk can be remote-controlled by using D-Bus if available on the current platform (i.e. not on Windows). This allows to use multimedia keys on the keyboard to control Jajuk. Look at the online manual for more information.    
+TipOfTheDay.31=   Tip 31:  Try the audio normalization from Preference view / Sound tab to keep sound level equal among tracks
+TipOfTheDay.32=   Tip 32:  You can export tracks and generate playlists from your collection thanks the Prepare Party feature
+TipOfTheDay.33=   Tip 33:  A single left click over the cover picture in the Cover View switches from 3D to 2D display.
+
+]]></body>
+
diff --git a/src/main/java/org/jajuk/i18n/jajuk_es.properties b/src/main/resources/org/jajuk/i18n/jajuk_es.properties
similarity index 62%
rename from src/main/java/org/jajuk/i18n/jajuk_es.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_es.properties
index 38e424e..dcb215b 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_es.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_es.properties
@@ -1,1143 +1,1194 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<body><![CDATA[
-#Módulo de lengua española para Jajuk
-#Escrito por : Josep Carles Collazos
-#Copyright 2004,2005,2006 Josep Carles Collazos, this is part of Jajuk distributed under the GPL V2 license
-#FROM en 4213
-#$Revision$
-
-#--- Generic labels ---
-#DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
-# YOU PROBABLY DON'T WANT TO CREATE A LABEL HERE, CREATE ONE ONLY IF VERY GENERICAL 
-# AND USED MANY TIMES  
-Info=Información
-Warning=Aviso
-Error=Error
-Ok=OK
-Cancel=Cancelar
-Close=Cerrar
-Stop=Stop
-Save=Salvar
-Apply=Aplicar
-Delete=Delete
-Details=Detalles
-Yes=Si
-No=No
-Success=Operación exitosa
-Sort=Ordenar por:
-Option=Por favor, selecciona una opción:
-Help=Ayuda
-Hide=No mostrar
-By=by
-On=on
-Later=Después
-Default=Defecto
-All=Todo
-YestoAll=Si a todo
-Maximize=Maximizar
-Purge=Limpiar
-
-#--- Wizard Strings --- 
-#These strings are used in the context of a basic wizard
-Wizard_Next=Siguiente
-Wizard_Prev=Anterior
-Wizard_Finish=Finalizar
-
-#--- General Strings ---
-Type=Tipo
-Type.mp3=Mpeg layer 3
-Type.playlist=Playlist
-Type.ogg=Ogg Vorbis
-Type.wav=Audio WAVE/SPEEX
-Type.au=Sun Audio
-Type.aiff=Apple Audio Interchange
-Type.flac=Free Lossless Audio Codec
-Type.mpc=MusePack
-Type.wma=Windows Media Audio
-Type.ape=Monkey's Audio format
-Type.aac=Advanced Audio Coding
-Type.real=Real Audio
-Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
-Type.mac=Monkey's Audio format
-Type.radio=Web Radio
-Type.video=Video
-Type.wavpack=WavPack
-
-unknown=Desconocido
-unknown_artist=Desconocido
-unknown_album=Desconocido
-unknown_genre=Desconocido
-unknown_year=Desconocido
-
-Note.0=Jajuk detectó una nueva versión. Las perspectivas han sido inicializadas a la nueva versión.
-Note.1=El sistema de valoraciones de Jajuk cambió (ver Jajuk online help -> Rating system page). Tus anteriores valoraciones han sido migradas a una escala de 0 a 100 pero es aconsejable resetarlas desde Preference view -> History tab (atención: todas las valoraciones se perderán) 
-
-#Write confirmation so replies are: yes / no / cancel
-Confirmation_exit=¿ Quieres salir realmente de Jajuk ?
-Confirmation_delete=Atención! estás a punto de borrar físicamente el(los) siguiente(s) ficheros de tu disco:
-Confirmation_void_refresh=Atención! estás a punto de actualizar un dispositivo vacío el cual será limpiado. En Unix, asegurate que el dispositivo esté montado. Estás seguro ?
-Confirmation_remove_device=¿ Realmente quieres eliminar este dispositivo ?
-Confirmation_delete_cover=¿ Quieres realmente borrar definitivamente esta carátula del disco ?
-Confirmation_delete_files=¿ Quieres realmente borrar estos archivos del disco ?
-Confirmation_delete_dirs=¿ Quieres realmente borrar estos directorios del disco ?
-Confirmation_clear_history=¿ Quieres realmente limpiar el histórico ?
-Confirmation_reset_ratings=¿ Quieres realmente ?
-Confirmation_refactor_files=¿ Quieres realmente renombrar el(los) siguiente(s) ficheros ?
-Confirmation_restore_all=Una restauración de las vistas necesita reiniciar Jajuk , ¿ quieres salir ?
-Confirmation_defaults_radios=Se borrarán todas las emisoras de radio que has creado previamente, ¿ estás seguro ?
-Confirmation_delete_empty_dirs=Los siguientes directorios estan vacíos. ¿ Quieres borrarlos ?
-Confirmation_file_overwrite=Este archivos ya existe. ¿ Quieres sobreescribir este archivo ?
-Confirmation_file_number=archivo(s) seran borrados.
-Confirmation_alarm_stop=¿ Estás seguro que quieres parar esta alarma ?
-Confirmation_defaults=Esto volverá a las opciones por defecto todas las pestañas ( no solo ésta ) , ¿ estás seguro ?
-Confirmation_rebuild_thumbs=Esto recreará las miniaturas de todos tus albums, puede llevar varios minutos para grances colecciones. ¿ estás seguro ?
-Confirmation_reset_preferences=¿ Seguro que quieres resetear las preferencias de pistas  ?  
-
-Device_type.directory=Directorio
-Device_type.file_cd=CD de Ficheros Musicales
-Device_type.audio_cd=CD Audio
-Device_type.extdd=Disco Duro Externo
-Device_type.player=Reproductor Digital
-Device_type.network_drive=Unidad de red
-Device_type.remote=Remoto (No implementado)
-
-Perspective_Description_Files=Archivos
-Perspective_Description_Tracks=Pistas
-Perspective_Description_Configuration=Configuración
-Perspective_Description_Statistics=Estadísticas
-Perspective_Description_Help=Ayuda
-Perspective_Description_Display=Visualización
-Perspective_Description_Albums=Albums
-Perspective_Description_Info=Información
-Perspective_Description_Playlists=Playlists
-
-Item_Playlist_File=Playlist
-Item_Track=Pista
-Item_Album=Album
-Item_Artist=Autor
-Item_Genre=Estilo
-Item_Device=Dispositivo
-Item_File=Archivo
-Item_Directory=Directorio
-
-Property_id=Id
-Property_name=Nombre
-Property_type=Tipo
-Property_url=Url
-Property_mount_point=Punto de Montaje
-Property_auto_refresh=Auto Refrescar
-Property_auto_mount=Auto Montar
-Property_album=Album
-Property_style=Género
-Property_author=Artista
-Property_length=Longitud
-Property_year=Año
-Property_rate=Puntuación
-Property_files=Arxivos
-Property_hits=Hits
-Property_filename=Arxivos
-Property_date=Fecha
-Property_added=Descubrimiento
-Property_parent=Directorio padre
-Property_device=Dispositivo
-Property_directory=Directorio
-Property_track=Pista
-Property_size=Tamaño (Mb)
-Property_quality=Calidad
-Property_hashcode=Hashcode
-Property_playlist_files=playlists
-Property_comment=Comentario
-Property_order=Pista
-Property_path=Path
-Property_tracks=Pistas
-Property_Format_Number=Número
-Property_Format_String=String
-Property_Format_Boolean=Boolean
-Property_Format_Float=Float
-Property_Format_Date=Date
-Property_Format_URL=Url
-Property_pf=Preferencia
-Property_tpt=Tiempo total de reproducción (segs)
-Property_ban=Bloqueado
-
-Language_desc_en=Inglés
-Language_desc_fr=Francés
-Language_desc_de=Alemán
-Language_desc_it=Italiano
-Language_desc_sv=Sueco
-Language_desc_nl=Holandés
-Language_desc_zh=Chino
-Language_desc_es=Español
-Language_desc_ca=Catalán
-Language_desc_ko=Korean
-Language_desc_el=Griego
-Language_desc_ru=Ruso
-Language_desc_gl=Gallego
-
-#--- Error codes ---
-Error.000=Error desconocido
-Error.005=Error al parsear el fichero de la colección.
-Error.007=Error reproduciendo fichero, puede que MPlayer no empezara dentro del timeout, timeout:
-Error.008=Error deteniendo fichero
-Error.009=No se puede leer el fichero
-Error.010=No se puede encontrar un fichero asociado con este elemento en ningún dispositivo montado
-Error.011=Error técnico al montar el dispositivo o dispositivo vacío
-Error.012=Error técnico al desmontar el dispositivo, probablemente lo use otra aplicación
-Error.013=No se puede borrar el dispositivo: Está actualmente montado o actualizándose
-Error.016=No se puede acceder al dispositivo especificado, por favor , entra el punto de montaje. Ex: '/cdrom' en Unix,'e:' en MS Windows
-Error.017=Error analizando la playlist
-Error.018=No se encontró ninguna pista accesible
-Error.019=Existe un dispositivo con este nombre
-Error.020=Error de E/S, verifica el espacio en disco
-Error.021=El campo Url es obligatorio. Ej: 'd:\music' en MS Windows, '/home/foo/music' en Unix
-Error.022=El campo Nombre es obligatorio. Ej: 'Disco Duro', 'CD ROCK'
-Error.023=No se puede lanzar la pista inicial
-Error.024=No se puede escribir el fichero
-Error.025=Uno de los ficheros que quieres leer está en un dispositivo desmontado
-Error.026=Error registrando reproductores
-Error.027=Sincronización abortada
-Error.028=Error grabando playlist
-Error.029=Un dispositivo existente es un directorio padre de este dispositivo, tiene el mismo path o es un directorio hijo
-Error.030=Demasiadas conexiones fallidas. Jajuk ha parado de buscar carátulas en la red.
-Error.101=El dispositivo no existe o no está disponible
-Error.102=Error
-Error.103=Error leyendo información de tag
-Error.104=Error escribiendo información de tag
-Error.105=Resource Bundle key no encontrada
-Error.106=Excepción no capturada
-Error.107=El dispositivo ya se está refrescando o sincronizando
-Error.108=Error en el análisis del fichero de perspectiva
-Error.109=Reproductor o clase de implementación de tag no accesible
-Error.110=Este nombre de propiedad está reservado  por Jajuk internal system, por favor escoja otro nombre
-Error.111=Dispositivo ya montado
-Error.112=No se puede montar el dispositivo
-Error.113=No se puede guardar la configuración del usuario
-Error.114=No se puede leer la configuración del usuario
-Error.118=Error procesando petición de evento
-Error.119=Error analizando fichero de historial o no existe
-Error.120=No se puede acceder al dispositivo : está montado, refrescándose o bien sincronizándose
-Error.121=El dispositivo está en uso y no puede ser desmontado
-Error.122=Error en FIFO
-Error.123=Error estableciendo tema
-Error.124=Otra sesión encontrada. Solo se puede lanzar una instancia de Jajuk a la vez
-Error.125=Dispositivo ya montado
-Error.126=Búsqueda no soportada por este formato de audio
-Error.127=No hay novedades durante tiempo especificado, puedes cambiarlo en la vista de preferencias
-Error.128=Esta pista es la primera de la colección, no hay pistas anteriores
-Error.129=Error cargando imagen de carátula
-Error.131=No se puede borrar el fichero
-Error.133=El fichero de la colección está corrupto por una razón desconocida, jajuk se encargará de restaurar un fichero de backup
-Error.134=No se puede renombrar el archivo
-Error.135=El archivo no existe
-Error.136=Operación fallida
-Error.137=Formato Erroneo
-Error.138=Algunos archivos referenciados por estas pistas están localizados en un dispositivos desmontado y no cambiarán
-Error.140=Cadena errónea: no debería contener los carácteres & ' " < o >
-Error.141=Esta playlistt está situada en un dispositivo desmontado, por lo que no está disponible
-Error.142=Esta playlist contiene algunas pistas fuera de dispositivos conocidos que serán ignoradas
-Error.143=La localización del dispositivo no está disponible
-Error.144=Error parseando DJ
-Error.145=No se puede hacer commit DJ
-Error.146=<html>El patrón actual es incorrecto.<br>Items válidos son: %artist (Artist name); %title (Track title); %album (Album name);<br> %n (Track leading zero); %genre (track genre); %year (Year)<br> y el patrón debe contener al menos una barra</html> 
-Error.147=Algunos archivos no pueden ser movidos (ver detalles para más información)
-Error.148=El campo Year es desconocido
-Error.149=El campo Album es desconocido
-Error.150=El campo Artist es desconocido
-Error.151=El campo TrackName es desconocido
-Error.152=El campo TrackOrder es desconocido
-Error.153=El campo Style es desconocido
-Error.154=No se puede renombrar el archivo, revisa algun carácter erróneo en el nombre o en los tags
-Error.155=Error al poner tags a los archivos, revisa los permisos
-Error.156=No hay DJ disponible para una colección vacía
-Error.157=DJ erróneo, por favor, selecciona o crea un DJ utilitzando el combo referenciado por este botón
-Error.158=Las constraints de DJ no pueden ser respetadas o ninguna pista disponible
-Error.159=El ambiente asociado ha sido borrado
-Error.160=Fichero no movido. El fuente y el destino eran el mismo
-Error.161=No se puede escribir al directorio, comprobar permisos
-Error.162=Esta propiedad de usuario ya existe
-Error.163=Error restaurando las vistas por defecto
-Error.164=No hay pistas accesibles para el ambiente :
-Error.165=Error en el path de la colección, el directorio o no existe o no tiene permisos de escritura
-Error.166=Album vacío, no se puede capturar la caràtula
-Error.167=No se puede crear el informe
-Error.168=No se han encontrado archifos duplicados
-Error.169=Operación con errores. Tener en cuenta que esta operación requiere una conexión a internet para obtener la lista de emisoras de radio.
-Error.170=Error reproduciendo webradio
-Error.171=No se ha definido una fuente de sincronización para este dispositivo, asignala utilizando el asistente de configuración de dispositivos (En la vista de Dispositivo, clickar sobre el dispositivo).
-Error.172=Se encontró un error mientras se borraba el siguiente archivos(s):
-Error.173=Se encontró un error mientras se borraban los siguientes directorios:
-Error.174=Error accediendo a la web de Freedb , revisa tu conexión de red 
-Error.175=Operación cancelada
-
-
-#Warnings
-Warning.0=MPlayer no se encuentra. Algunos formatos de audio y video (flac, wma, aac, mpg2 ...) serán deshabilitados. Para utilizar Mplayer si está instalado, tienes que configurar manualmente elpath en la vista de Preferencias / avanzado. 
-Warning.1=Versión de MPlayer no válida, es necesario MPlayer1.0Pre8 o superior. Algunos formatos de audio serán deshabilitados. 
-Warning.2=Parece que alguien más está usando ahora la colección de Jajuk. El último usuario en salir sobreescribirá la configuración(opciones, valoraciones...). 
-Warning.3=Mplayer no puede ser descargado. Si estás detrás de un proxy HTTP, configúralo en la vista de Preferencias / Pestaña de Red y reinicia Jajuk. 
-Warning.4=Mplayer es necesario para escuchar web radios 
-Warning.5=El directorio de destino ya existe, algunos archivos se sobreescribirán, ¿ Estás seguro ? 
-
-#--- Strings by class ---
-ParameterView.0=Duración del histórico:
-ParameterView.2=Cambia el tiempo en dias que quieres guardar trazas de pistas escuchadas. Cambiar a -1 si no quieres ver ningún histórico y 0 si quieres tener histórico permanente
-ParameterView.3=Borrar histórico
-ParameterView.4=Borrar histórico
-ParameterView.8=Histórico/Valoraciónes
-ParameterView.9=Reproducir :
-ParameterView.10=Nada
-ParameterView.11=No music at all at startup
-ParameterView.12=La última desde el principio
-ParameterView.13=Reproduce la última pista de la sesión anterior
-ParameterView.14=Pista aleatoria
-ParameterView.15=Reproduce una pista aleatoria de la colección
-ParameterView.16=Pista :
-ParameterView.17=Seleccionar un fichero a reproducir al inicio
-ParameterView.18=Seleccionar un fichero a reproducir al inicio
-ParameterView.19=Inicio
-ParameterView.26=Confirmaciones
-ParameterView.27=Antes de borrar físicamente un fichero
-ParameterView.28=Preguntar de borrar físicamente un fichero
-ParameterView.29=Antes de salir de Jajuk
-ParameterView.30=Preguntar al salir de Jajuk
-ParameterView.33=Opciones
-ParameterView.35=Ocultar pistas situadas en dispositivos desmontados
-ParameterView.36=Reiniciar al llegar al fin de la colección
-ParameterView.37=Reinicia la coleccion completa cuando se llega al final en modo continuo
-ParameterView.38=Idioma:
-ParameterView.42=Idioma de la interfaz
-ParameterView.43=Tema:
-ParameterView.44=<html>Seleccionar un tema<p>(Puede ser necesario reiniciar jajuk para verlo correctamente)</html>
-ParameterView.46=Nivel de log:
-ParameterView.47=Fatal
-ParameterView.48=Error
-ParameterView.49=Warning
-ParameterView.50=Info
-ParameterView.51=Debug
-ParameterView.52=Jajuk verbosity : Fatal:display only critical errors, Error:+display errors, Info:+display information messages, Warning:+display warnings, Debug: any message
-ParameterView.59=Inicio de posición de introducción (%):
-ParameterView.60=Posición de la introducción en la pista en %, desde 0 ( inicio de la pista ) a 99 ( final de la pista )
-ParameterView.61=Longitud de la introducción (seg):
-ParameterView.62=Longitud de la introducción en segundos
-ParameterView.85=Aplicar
-ParameterView.86=Restaurar valores por defecto
-ParameterView.87=Preferencias
-ParameterView.98=Patrones
-ParameterView.99=Realizar un escaneo profundo de tags
-ParameterView.100=<html>Fuerza a Jajuk to releer las id3 tags actuales.<p>Esto puede ser útil para refrescar tags que se han modificado usando otro programa</html>
-ParameterView.101=Usar directorio padre como nombre de álbum
-ParameterView.102=Jajuk usa el directorio padre como el nombre del álbum para una pista si no puede obtenerlo via id3 tags
-ParameterView.109=Preferencias salvadas
-ParameterView.110=Preferencias cambiadas a valores por defecto
-ParameterView.111=Tamaño de la playlist Best Of:
-ParameterView.112=Cambia el número de pistas en la playlist BestOf(de 1 a 100)
-ParameterView.113=Usar regexp en filtros
-ParameterView.114=Usar expresiones regulares (Formato Regexp) en los filtros de las tablas, ejemplo: .*foo.*
-ParameterView.115=Avanzada
-ParameterView.116=Hacer copia de seguridad del archivo de colección
-ParameterView.117=Marcar esto si quieres hacer una copia de seguridad de tu archivos de colección a ficheros collection-<date>.xml
-ParameterView.118=Tamaño de Backup (Mb)
-ParameterView.119=Tamaño de Backup (Mb) (Mb)
-ParameterView.120=Charset de la colección
-ParameterView.121=Charset de la colección. UTF-16 está optimizado para idiomas Asiáticos y UTF-8 está optimizado para idiomas europeos.
-ParameterView.129=Tiempo límite de las novedades (días):
-ParameterView.130=Tiempo límite de las novedades en días : todas las pistas añadidas antes de este número de días son tomadas como novedades
-ParameterView.131=Pista BestOf
-ParameterView.132=Reproduce una de tus pistas favoritas al inicio
-ParameterView.133=Pista Nueva
-ParameterView.134=Reproduce una novedad de tu colección al inicio
-ParameterView.135=La última pista anterior
-ParameterView.136=Reproduce la última pista reproducida durante la sesión anterior
-ParameterView.139=Red
-ParameterView.142=Usuario del proxy
-ParameterView.143=Nombre de login del proxy usado para autentificación
-ParameterView.144=Host del proxy
-ParameterView.145=Nombre de host o IP del proxy
-ParameterView.146=Puerto del proxy
-ParameterView.147=Puerto TCP/IP del proxy (frecuentemente 3128)
-ParameterView.148=Usar auto carátulas
-ParameterView.149=Use auto cover to bring covers from the Internet (if required, configure your proxy in the network tab)
-ParameterView.150=Mínimo tamaño de carátula(Kb)
-ParameterView.151=Mínimo tamaño de carátula(Kb) de carátulas descargadas
-ParameterView.152=Máximo tamaño de carátula(Kb)
-ParameterView.153=Máximo tamaño de carátula(Kb) de carátulas descargadas
-ParameterView.155=Search accuracy. The higher is accuracy, the less you will get wrong cover images
-ParameterView.156=Baja
-ParameterView.157=Media
-ParameterView.158=Alta
-ParameterView.159=Carátulas
-ParameterView.160=Timeout de Conexión (seg)
-ParameterView.161=Timeout de Conexión in segs: la operación falla si la otra parte no contesta en este tiempo
-ParameterView.162=Timout de transferencia (seg).
-ParameterView.163=Timeout de transferencia (seg): la operación fall si los datos no se descargaron en este tiempo
-ParameterView.164=Antes de eliminar un dispositivo
-ParameterView.165=Preguntar antes de eliminar un dispositivo
-ParameterView.166=Barajar carátulas
-ParameterView.167=Mostrar una carátula aleatoria
-ParameterView.168=Artista
-ParameterView.169=Precargar carátulas
-ParameterView.170=Precargar todas las carátulas disponibles cuando sea posible
-ParameterView.171=Antes de borrar físicamente una carátula
-ParameterView.172=Preguntar antes de borrar físicamente una carátula
-ParameterView.177=Número visible de pistas planificadas
-ParameterView.178=El número de pistas planificadas a mostrar en la playlist
-ParameterView.179=Encolar la selección
-ParameterView.180=Encolar (y no reproducir) una pista haciendo doble click en un elemento
-ParameterView.181=Encolar al hacer drag & drop
-ParameterView.182=Encolar (y no ejecutar) una pista cuando la arrastremos.
-ParameterView.183=Sincronizar vistas de árbol y tabla
-ParameterView.184=Si está marcado la vista de tabla solo mostrará pistas seleccionadas en la vista de árbol
-ParameterView.185=Mostrar un popup cuando se lance una pista
-ParameterView.186=Inicializar puntuaciones
-ParameterView.187=Inicializar puntuaciones a cero para pistas
-ParameterView.188=Antes limpiar histórico
-ParameterView.189=Antes inicializar puntuaciones
-ParameterView.190=duración de la atenuación (segundos)
-ParameterView.191=El número de segundos de atenuación entre pistas
-ParameterView.192=Organizador de ficheros :
-ParameterView.193=Patrones disponibles: %artist (Nombre del artista); %title (Título de la pista); %album (Nombre del álbum); %n (Track leading zero); %genre (Género); %year (Año)
-ParameterView.194=Antes de organizar ficheros
-ParameterView.195=Vista de animación
-ParameterView.196=Habilitar atajos de teclado
-ParameterView.197=Habilitar algunas teclas como F8 para que funcionen aunque Jajuk no tenga el foco
-ParameterView.198=Algunos cambios serán efectivos solo en el próximo inicio de Jajuk
-ParameterView.199=Scrobble lo que escucho
-ParameterView.200=Esta opción envia informaciones a Last.fm
-ParameterView.201=Usuario de Last.FM
-ParameterView.202=El nombre de usuario usado en Last.FM
-ParameterView.203=Password de Last.FM
-ParameterView.204=El password usado en Last.FM
-ParameterView.205=Argumentos de MPlayer
-ParameterView.206=Argumetnos adicionales de MPlayer como '-ao esd' o '-ao arts' o '-novideo (para no reproducir videos)' p.e.
-ParameterView.207=Path base de Jajuk
-ParameterView.208=Cambiar el directorio que contiene la configuración de Jajuk (por defecto es el directorio home del usuario)
-ParameterView.209=El path de la configuración de Jajuk ha sido cambiado por el usuario actual (la colección anterior ha sido guardado en la localización anterior). Jajuk se puede reiniciar.
-ParameterView.210=Si el cross fade no funciona, trata de añadir <-ao esd> en Gnome o <-ao arts> en KDE en el campo de argumentos adicionales del motor de sonido (Preferencias / Avanzado).
-ParameterView.211=Pequeñas solo
-ParameterView.212=Pequeñas y medianas
-ParameterView.213=Medianas solo
-ParameterView.214=Medianas y grandes
-ParameterView.215=Grandes solo
-ParameterView.216=Buscar usando el nombre del artista
-ParameterView.217=Buscar usando el nombre del album
-ParameterView.218=Buscar usando el nombre de la pista
-ParameterView.219=Variables de entorno
-ParameterView.220=Establece la variables de entorno usadas por el reproductor de audio (ARTS_SERVER en KDE o ESPEAKER en Gnome for ie). Formato: var1=xx var2=yyy... 
-#Respect English size for next item
-ParameterView.221=Tamaño página de Catálogo (0: Todo en una)
-ParameterView.222=Establece el número de álbumes por página en la vista de catálogo. 0: muestra todas las carátulas en una sola página
-ParameterView.223=Tamaño de Fuentes
-ParameterView.224=Establece el tamaño de la fuente de texto
-ParameterView.225=GUI
-ParameterView.226=Modos
-ParameterView.228=Mostrar ventanas de albums
-ParameterView.229=Preferencias de la vista de Catálogo
-ParameterView.233=El interfaz se refrescará en el próximo reinicio de jajuk
-ParameterView.234=Chequea actualizaciones de Jajuk
-ParameterView.235=Last.FM
-ParameterView.236=Sin Proxy
-ParameterView.237=proxy HTTP
-ParameterView.238=proxy SOCKS
-ParameterView.239=Proxy password
-ParameterView.240=Habilitar consultas de información de Last.FM
-ParameterView.241=Si está marcado, jajuk recogerá información de los albumes de Last.FM (ver vista de sugerencias) 
-ParameterView.242=Path de Mplayer
-ParameterView.243=<html>Cambiar aquí el path completo del ejecutable mplayer (espacio permitidos)<br>Exemple: /Applications/MPlayer OSX.app/Contents/Resources/External_Binaries/mplayer_intel.app/Contents/MacOS/mplayer</html>
-ParameterView.244=Forzar fecha de los archivos como fecha de descubrimiento 
-ParameterView.245=<html>Jajuk considera la fecha de los archivos de como la fecha de descubrimiento<br>Requeire un refresco en profundidad para ser tenido en cuenta</html>
-ParameterView.246=Tamanys dels icons a la barra de Perspectives (pixels)
-ParameterView.247=El path de destino contiene ya un workspace de Jajuk. El workspace se ha cambiado a este path para el usuario actual (el workspace anterior ha sido guardado en la anterior localización). Jajuk puede ser reiniciado.
-ParameterView.248=Título del marco : 
-ParameterView.249=Resetear preferencias
-ParameterView.250=Resetear preferencias del usuario
-ParameterView.251=Histórico reseteado correctamente
-ParameterView.252=Valoraciones y tiempos de reproducción reseteados correctamente
-ParameterView.253=Preferencias resetadas correctamente
-
-Main.21=Confirmación
-Main.22=Descargando MPlayer
-
-Player.0=Esperando la línea de audio (ocupada)
-
-Device.21=Refrescando [
-Device.22=]  Entrando [
-Device.25=] refrescado en
-Device.27= nuevos ficheros -
-Device.31=Sinc. [
-Device.33=sincronización hecha en
-Device.35= ficheros creados (
-Device.36= MB)
-Device.41=Sinc. [
-Device.42=]  Copiando [
-Device.43= tags no legibles
-Device.44=Entrando
-
-FIFO.4=). ¿ Quieres montarlo ?
-FIFO.10=Ahora reproduciendo:
-FIFO.13= Kbps
-FIFO.14=Reproduciendo Web Radio:
-
-HistoryItem.0=yy/MM/dd HH:mm
-
-DeviceWizard.0=Configuración de dispositivo
-DeviceWizard.1=Tipo de dispositivo(*):
-DeviceWizard.2=Nombre del dispositivo(*):
-DeviceWizard.3=Localización del dispositivo(*):
-DeviceWizard.4=Directorio de montaje Unix (opcional):
-DeviceWizard.7=Ejecutar un refresco instantaneo
-DeviceWizard.8=Auto montar al inicio
-DeviceWizard.10=Sincronizado con :
-DeviceWizard.11=Sincronización unidireccional
-DeviceWizard.12=Todos los ficheros nuevos en el dispositivo fuente se copiarán en este dispositivo. Nada será escrito en el dispositivo fuente
-DeviceWizard.13=Sicronización bidireccional
-DeviceWizard.14=Todos los ficheros nuevos encontrados en un dispositivo se copiarán al otro
-DeviceWizard.43=Por favor escoge un direcorio
-DeviceWizard.44=Dispositivo creado
-DeviceWizard.45=Por favor, dale un nombre al dispositivo. Ej: CD A, Portátil ...
-DeviceWizard.46=Por favor, da una localización para el dispositivo. Ej: d:\music en Windows, /home/foo/music en Unix
-DeviceWizard.48=<html>Marcar si quieres ejecutar un refresco inmediato del dispositivo (avisado)<p>Esta operación puede tardar bastante para dispositivos grandes</html>
-DeviceWizard.49=<html>Marcar si quieres montar automáticamente el dispositivo al inicio<p>especialmente para directorios en el disco duro local. Evitarlo para CDs</html>
-DeviceWizard.50=<html>Intervalo en minutos para búsqueda automática de nuevos archivos (0: deshabilitada)</html>
-DeviceWizard.51=Marcar si quieres sincronizar este dispositivo con otro
-DeviceWizard.52=Seleccionar dispositivo fuente
-DeviceWizard.53=Refrescar dispositivo cada
-#limited string size
-DeviceWizard.54=min
-
-JajukJMenuBar.0=Archivo
-JajukJMenuBar.1=Abrir fichero
-JajukJMenuBar.3=Salir
-JajukJMenuBar.5=Propiedades
-JajukJMenuBar.6=Crear propiedad de usuario
-JajukJMenuBar.7=Borrar propiedad de usuario
-JajukJMenuBar.8=Vistas
-JajukJMenuBar.9=Modos
-JajukJMenuBar.10=Repetición
-JajukJMenuBar.11=Aleatorio
-JajukJMenuBar.12=Continuo
-JajukJMenuBar.13=Introducción
-JajukJMenuBar.14=Ayuda
-JajukJMenuBar.15=Contenido de la ayuda
-JajukJMenuBar.16=Sobre
-JajukJMenuBar.17=Restaurar vistas por defecto
-JajukJMenuBar.18=Asistente de Dispositivos
-JajukJMenuBar.19=Comunicar un problema
-JajukJMenuBar.20=Consejo del Día
-JajukJMenuBar.21=Configuración
-JajukJMenuBar.22=Preferencias
-JajukJMenuBar.23=Mostrar trazas de debug
-JajukJMenuBar.24=Mostrar solo pistas disponibles
-JajukJMenuBar.25=Mostrar vista
-JajukJMenuBar.26=Restaurar vistas (todas las perspectivas)
-JajukJMenuBar.27=Chequear actualizaciones de Jajuk
-JajukJMenuBar.28=Herramientas
-JajukJMenuBar.29=Inteligencia
-
-PlaylistFileItem.1=Novedades
-PlaylistFileItem.2=Nueva playlist
-PlaylistFileItem.3=Marcadores
-PlaylistFileItem.4=Lo mejor de
-PlaylistFileItem.5=Cola
-
-JajukFileChooser.0=Escoger Fichero
-
-SearchBox.0=Buscar entre pistas, autores, estilos, directorio ...
-
-CommandJPanel.0=Ver histórico de reproducción
-CommandJPanel.1=Modo repetición: Reproduce una pista en bucle
-CommandJPanel.2=Modo aleatorio: Reproduce aleatoriamente las pistas seleccionadas
-CommandJPanel.3=Modo continuo: Continua reproduciendo las pistas siguientes cuando acaba
-CommandJPanel.4=Modo Introducción: Reproduce un fragmento de las pistas. Inicio y tiempo pueden ser cambiados desde la vista de parámetros
-CommandJPanel.5=Reproducir una selección aleatoria de la colección entera
-CommandJPanel.6=Reproducir pistas favoritas
-CommandJPanel.7=Sonido off
-CommandJPanel.8=<html>Reproducir pista anterior en la selección actual<br>Mays+Boton Izquierdo lanza el álbum anterior</html>
-CommandJPanel.9=<html>Reproducir pista siguiente en la selección actual<br>Mays+Boton Izquierdo lanza el álbum anterior</html>
-CommandJPanel.10=<html>Retroceso rápido en la pista actual<br> Shift+Botón izquierdo para repetición completa</html>
-CommandJPanel.11=Pausa/Reanuda pista actual
-CommandJPanel.12=Parar
-CommandJPanel.13=Avance rápido en la pista actual
-CommandJPanel.14=Volumen
-CommandJPanel.15=<html>Click aquí para cambiar el formato de tiempo mostrado</html>  
-CommandJPanel.16=Lanzar selección de DJ
-CommandJPanel.17=Administrar DJs
-CommandJPanel.18=Lanzar el DJ seleccionado por defecto
-CommandJPanel.19=Administrar Ambientes
-CommandJPanel.20=Pista por pista
-CommandJPanel.21=Album por álbum
-CommandJPanel.22=Album por album
-CommandJPanel.23=Click para limpiar la búsqueda
-CommandJPanel.24=Configurar web radios
-CommandJPanel.25=Encender la radio
-
-InformationJPanel.5=Tiempo total de la cola a reproducir [Nb de pistas restantes]
-InformationJPanel.6=Bitrate de pista
-InformationJPanel.7=Progreso de la pista actual
-#song name BY artist ON album name
-InformationJPanel.8=%title por %artist en %album
-
-AbstractPlaylistEditorView.0=Título
-AbstractPlaylistEditorView.1=Localización
-AbstractPlaylistEditorView.2=Reproducir esta playlist
-AbstractPlaylistEditorView.3=Salvar esta playlist
-AbstractPlaylistEditorView.4=Añadir elemento a esta playlist
-AbstractPlaylistEditorView.5=Eliminar elemento de esta playlist
-AbstractPlaylistEditorView.6=Mover arriba
-AbstractPlaylistEditorView.7=Mover abajo
-AbstractPlaylistEditorView.9=Borrar esta playlist
-AbstractPlaylistEditorView.10=Añadir una pista aleatoria a esta playlist
-AbstractPlaylistEditorView.15=Playlists
-AbstractPlaylistEditorView.17=Estás a punto de modificar las siguientes playlists :
-AbstractPlaylistEditorView.18=Pista en cola
-AbstractPlaylistEditorView.19=Pista repetida
-AbstractPlaylistEditorView.20=Pista planificada
-AbstractPlaylistEditorView.21=Pista de playlist
-AbstractPlaylistEditorView.22=Playlist grabada
-AbstractPlaylistEditorView.27=Preparar Fiesta
-AbstractPlaylistEditorView.28=directorio creado con éxito
-
-StatView.0=Otros
-StatView.1=Géneros
-StatView.2=No hay datos disponibles
-StatView.3=Otras
-StatView.4=Tamaño por dispositivo (GB)
-StatView.5=No hay datos disponibles
-StatView.7=Tamaño de la colección por mes
-StatView.8=Meses
-StatView.9=Tamaño (GB)
-StatView.10=No hay datos disponibles
-StatView.12=Número total de pistas por meses
-StatView.13=Meses
-StatView.14=número de Pistas
-StatView.15=No hay datos disponibles
-StatView.16=Estadística
-StatView.24=Antiguas
-
-CDScanView.0=CD label :
-CDScanView.1=Etiqueta de CD. Ej: CD1, ROCK...
-CDScanView.2=Etiqueta de CD Ej: CD1, ROCK...
-CDScanView.3=Localización del CD :
-CDScanView.4=Localización donde se puede encontrar el CD. Ej: '/cdrom' en Unix, 'e:' en MS Windows...
-CDScanView.5=Localización donde se puede encontrar el CD. Ex: '/cdrom' on Unix, 'e:' under MS Windows...
-CDScanView.6=Analizar
-CDScanView.12=Analizar CD
-CDScanView.18=Analizar el CD y añadir automáticamente todos los ficheros de música a la colección
-CDScanView.19=Seleccionar localización del CD
-
-TracksTreeView.0=Arbol de pistas
-TracksTreeView.27=Colección
-TracksTreeView.31= pistas
-TracksTreeView.33=Exportar
-TracksTreeView.34=Obtener tags online
-TracksTreeView.35=Descubrir fecha
-TracksTreeView.36=menos de una semana
-TracksTreeView.37=menos de un mes
-TracksTreeView.38=menos de seis meses
-TracksTreeView.39=anterior
-TracksTreeView.40=menos de un año
-TracksTreeView.41=menos de dos años
-TracksTreeView.42=menos de cinco años
-TracksTreeView.43=menos de diez años
-TracksTreeView.44=menos de tres meses
-TracksTreeView.45=Año
-
-CoverView.2=Borrar del disco esta carátula
-CoverView.3=Carátula
-CoverView.4=Imagen anterior del disco y/o de la Web si la opción de Auto-Carátula está marcada
-CoverView.5=Imagen siguiente del disco y/o de la Web si la opción de Auto-Carátula está marcada
-CoverView.6=Grabar carátula con su nombre original
-CoverView.7=Grabar carátula como ...
-CoverView.8=Usar esta carátula como la carátula por defecto de este álbum
-CoverView.9=carátulas
-CoverView.10=Grabar carátula como
-CoverView.11=Carátula grabada
-CoverView.12=Album
-CoverView.13=Título
-
-AnimationView.0=Animación
-
-FilesTreeView.0=Árbol de archivos
-FilesTreeView.3=Copiar
-FilesTreeView.4=Cortar
-FilesTreeView.5=Pegar
-FilesTreeView.7=Borrar
-FilesTreeView.14=Desincronizar
-FilesTreeView.15=Resincronizar
-FilesTreeView.16=Crear Playlist
-FilesTreeView.17=Copiar
-FilesTreeView.18=Cortar
-FilesTreeView.28=Montar
-FilesTreeView.29=Desmontar
-FilesTreeView.30=Forzar Refrescar
-FilesTreeView.31=Sincronizar
-FilesTreeView.32=Probar
-FilesTreeView.33=Crear playlists
-FilesTreeView.40=Copiar
-FilesTreeView.41=Cortar
-FilesTreeView.42=Pegar
-FilesTreeView.47=Colección
-FilesTreeView.52= ficheros:
-FilesTreeView.53= GB
-FilesTreeView.54= MB
-FilesTreeView.55= Configurar dispositivo
-FilesTreeView.59=¿ Quieres ejecutar un refresco rápido o en profundidad (leer las tags otra vez) ?
-FilesTreeView.60=Rápido
-FilesTreeView.61=En profundidad
-FilesTreeView.62=Organizar ficheros
-
-TracksTableView.0=Tabla de pistas
-TracksTableView.7=Reproducir
-TracksTableView.8=Encolar
-TracksTableView.9=Reproducir aleatoriamente
-TracksTableView.10=Reproducir con repetición
-TracksTableView.11=Reproducir álbum
-TracksTableView.12=Reproducir autor
-TracksTableView.14=Propiedades
-TracksTableView.15=Añadir a Favoritos
-
-AbstractTableView.0=Filtro:
-AbstractTableView.1=Propiedad a filtrar
-AbstractTableView.3=Valor a ser usado por el filtro
-AbstractTableView.4=Aplicar filtro
-AbstractTableView.5=Limpiar el filtro
-AbstractTableView.6=Aplicar filtro avanzado
-AbstractTableView.7=contiene:
-AbstractTableView.8=Cualquiera
-AbstractTableView.10=(No disponible)
-AbstractTableView.11=Hacer editable la tabla
-
-AboutView.7=Sobre
-AboutView.8=Licencia
-AboutView.9=Sistema
-AboutView.10=Sobre
-
-PhysicalPlaylistRepositoryView.0=Reproducir
-PhysicalPlaylistRepositoryView.1=Editar
-PhysicalPlaylistRepositoryView.2=Guardar como
-PhysicalPlaylistRepositoryView.3=Borrar
-PhysicalPlaylistRepositoryView.4=Propiedades
-PhysicalPlaylistRepositoryView.6=Playlists físicas
-PhysicalPlaylistRepositoryView.8=Inteligentes
-PhysicalPlaylistRepositoryView.9=Encolar
-PhysicalPlaylistRepositoryView.10=Cola actual: drag and drop una pista a ella para reproducir
-PhysicalPlaylistRepositoryView.11=Nueva
-PhysicalPlaylistRepositoryView.12=Nueva playlist: drag and drop una pista a ella para añadir ficheros
-PhysicalPlaylistRepositoryView.13=Favoritos
-PhysicalPlaylistRepositoryView.14=Bookmark playlist: drag and drop una pista a ella para guardarla
-PhysicalPlaylistRepositoryView.15=Lo mejor de
-PhysicalPlaylistRepositoryView.16=Best of playlist: contiene las mejores pistas
-PhysicalPlaylistRepositoryView.17=Novedades
-PhysicalPlaylistRepositoryView.18=Playlist de Novedades: contiene las pistas más nuevas de la colección
-
-FilesTableView.0=Tabla de archivos
-FilesTableView.15=Reproducir un directorio
-#Dev: do not use ID = 16, next label is FilesTableView.17 
-
-DeviceView.0=Añadir un dispositivo
-DeviceView.1=Eliminar un dispositivo desmontado (no borra nada del disco)
-DeviceView.2=Propiedades del dispositivo seleccionado
-DeviceView.3=Montar dispositivo seleccionado
-DeviceView.4=Desmontar dispositivo seleccionado
-DeviceView.5=Probar disponibilidad del dispositivo seleccionado
-DeviceView.6=Forzar refrescar dispositivo seleccionado
-DeviceView.7=Sincronizar dispositivo seleccionado
-DeviceView.8=Montar
-DeviceView.9=Desmontar
-DeviceView.10=Probar
-DeviceView.11=Forzar refrescar
-DeviceView.12=Sincronizar
-DeviceView.13=Eliminar dispositivo
-DeviceView.14=Configurar
-DeviceView.17=Nuevo
-DeviceView.18=Añadir un dispositivo
-DeviceView.21=Este dispositivo está disponible
-DeviceView.22=No se puede acceder al dispositivo
-DeviceView.23=Dispositivos
-
-JajukWindow.1=Unmute
-JajukWindow.2=Mute
-JajukWindow.3=Jajuk
-JajukWindow.4=Salir
-JajukWindow.5=Sobre Jajuk
-JajukWindow.6=Reproducir aleatoriamente
-JajukWindow.7=Reproducir Lo Mejor de
-JajukWindow.10=Pausa
-JajukWindow.11=Stop
-JajukWindow.12=Play
-JajukWindow.13=Anterior
-JajukWindow.14=Siguiente
-JajukWindow.15=Reproducir Novedades
-JajukWindow.16=Continuar album
-JajukWindow.17=Jajuk: Advanced Jukebox
-JajukWindow.18=Preparado para reproducción
-JajukWindow.19=Mute/Unmute
-JajukWindow.21=Salir
-JajukWindow.22=Sobre Jajuk
-JajukWindow.23=Reproducir aleatoriamente pistas de la colección entera
-JajukWindow.24=Reproducir las mejores pistas de la colección entera
-JajukWindow.26=Play/Pausa
-JajukWindow.27=Stop
-JajukWindow.29=Pista o emisora anterior. Con el ratón, botón izquierdo +[Mays]: album anterior.
-JajukWindow.30=Pista o emisora siguiente. Con el ratón, botón izquierdo +[Mays]: album siguiente.
-JajukWindow.31=Reproducir novedades de la colección entera
-JajukWindow.32=Continuar album: acabar de reproducir este album
-JajukWindow.33=Volumen
-JajukWindow.34=Posición
-JajukWindow.35=Reproduciendo:
-JajukWindow.36=Ambiente actual:
-JajukWindow.37=Sin Ambiente seleccionado
-#Do not use JajukWindow.38, next is JajukWindow.39 
-
-SimpleDeviceWizard.0=Creación rápida de dispositivo
-
-FirstTimeWizard.0=Inicio rápido
-FirstTimeWizard.1=<html><p><br>Bienvenido! Este asistente te ayudará en la creación de la colección.</p></html>
-FirstTimeWizard.2=<html>Selecciona la localización de la música</html>
-FirstTimeWizard.3=<html>Quieres obtener las carátulas online<br>(se puede abrir una conexión a internet automàticamente) ?</html>
-FirstTimeWizard.4=Mostrar la ayuda ahora ?
-FirstTimeWizard.5=Por favor, escoger un directorio
-FirstTimeWizard.6=Preferencias avanzadas
-FirstTimeWizard.7=Establecer directorio de area de trabajo de Jajuk :
-
-HelpView.2=Ayuda
-
-DownloadManager.0=<html>Jajuk necesita la contraseña de tu proxy HTTP para descargar carátulas<br>Si no las quieres, por favor cambia tu configuración en la pestaña Carátulas de la vista de Preferencias<br>Si no tienes proxy, cambia los ajustes en la pestaña de Red de la vista de Preferencias</html>
-DownloadManager.1=Contraseña requerida
-
-PropertiesWizard.0=Propiedades de ...
-PropertiesWizard.1=Propiedad
-PropertiesWizard.2=Valor
-PropertiesWizard.3=Editable?
-PropertiesWizard.4=Enlace
-PropertiesWizard.6=Selección
-PropertiesWizard.7=Tipo
-PropertiesWizard.8=Propiedad cambiada correctamente
-PropertiesWizard.9=Propiedad no editable para esta selección
-PropertiesWizard.10=Las propiedades se han cambiado
-PropertiesWizard.11=Escribiendo  tag a:
-PropertiesWizard.12=Enlaza un elemento dado a unas propiedades dadas
-
-NewPropertyWizard.0=Crear propiedad de usuario
-NewPropertyWizard.3=(*)Tipo
-NewPropertyWizard.4=Formato
-NewPropertyWizard.5=Valor por defecto
-
-CustomPropertyWizard.0=(*)Item
-CustomPropertyWizard.1=(*)Nombre de propiedad de usuario
-
-RemovePropertyWizard.0=Borrar propiedad de usuario
-
-QualityFeedbackWizard.20=Una nueva ventana para enviar tu ticket se abrirá en el navegador externo. Tus últimas trazas anonimizadas han sido puestas en el portapapeles, Por favor pégalas en el campo descripción si es un informe de bug (esto incrementa las opciones para que podamos arreglar tu problema).
-
-IncRateAction.0=Incrementar valoración de la pista actual 
-
-SplashScreen.0=Controles iniciales
-SplashScreen.1=Cargando Colección
-SplashScreen.2=Iniciando motor musical
-SplashScreen.3=Iniciando interfaz gráfico
-
-CatalogView.0=Catálogo de Albums
-#Note: CatalogView.2 label musn't be mush larger than in english for correct display in 800x600
-CatalogView.2=Sin carátulas
-CatalogView.3=Refrescar catálogo
-CatalogView.4=Tamaño de miniaturas:
-CatalogView.5=Creada miniatura para:
-CatalogView.7=Seleccionar carátula
-CatalogView.8=Ninguna carátula encontrada
-CatalogView.9=Anterior
-CatalogView.10=Siguiente
-CatalogView.11=Página:
-CatalogView.12=Mostar página anterior de miniaturas
-CatalogView.13=Mostar página siguiente de miniaturas
-CatalogView.14=Seleccionar página de miniaturas a mostrar
-CatalogView.15=Tamaño de miniatura:
-CatalogView.16=albums
-CatalogView.17=/pagina
-CatalogView.18=Selección de carátula
-CatalogView.19=Rehacer miniaturas
-CatalogView.20=Mostrar detalles
-
-WikipediaView.0=Wikipedia
-WikipediaView.1=Seleccionar Idioma:
-WikipediaView.3=Nada encontrado
-WikipediaView.5=Buscar por nombre de Artista
-WikipediaView.6=Buscar por nombre de Album
-WikipediaView.7=Buscar por título
-
-
-TipOfTheDayView.0=Consejo del día
-TipOfTheDayView.1=¿ Sabías... ?
-TipOfTheDayView.2=¿ Mostrar al inicio ?
-
-CDDBWizard.0=Aceptar
-CDDBWizard.1=Archivo
-CDDBWizard.2=Nombre de pista actual
-CDDBWizard.3=Nombre de álbum actual
-CDDBWizard.4=Nombre de pista propuesto
-CDDBWizard.5=Nombre de álbum propuesto :
-CDDBWizard.6=Hecho ! Encontrado
-CDDBWizard.7=posibles coincidencias
-CDDBWizard.12=No encontrada coincidencia !
-CDDBWizard.14=Este directorio no contiene ningún archivo
-CDDBWizard.16=Estilo:
-CDDBWizard.17=Encontrada coincidencia exacta !
-CDDBWizard.18=Coincidencias
-CDDBWizard.19=Obtener Tags Online
-
-RefactorWizard.0=Fichero movido : 
-
-DigitalDJWizard.0=Seleccionar el nuevo modo de DJ
-DigitalDJWizard.1=Programación basada en transiciones (ROCK -> POP)
-DigitalDJWizard.2=Programación basada en proporciones (20% JAZZ, 30% ROCK)
-DigitalDJWizard.3=Programación basada en ambientes (Suave, Fiesta, ...)
-DigitalDJWizard.4=Asistente de DJ Digital
-DigitalDJWizard.5=Configuración general del DJ
-DigitalDJWizard.6=Nombre del DJ (*)
-DigitalDJWizard.7=Usar puntuaciones
-DigitalDJWizard.8=Nivel de puntuación:
-DigitalDJWizard.9=Cross fade (sec):
-DigitalDJWizard.10=Pistas solo reproducidas una vez
-DigitalDJWizard.11=Tirar
-DigitalDJWizard.12=Desde Estilos
-DigitalDJWizard.13=A Estilos
-DigitalDJWizard.14=Selección de Estilos (Se puede hacer selecciones múltiples)
-DigitalDJWizard.15=Número de pistas
-DigitalDJWizard.16=¿ Quieres ?
-DigitalDJWizard.17=¿ Crear un nuevo DJ ?
-DigitalDJWizard.18=¿ Cambiar un DJ existente ?
-DigitalDJWizard.19=¿ Borrar un DJ ?
-DigitalDJWizard.20=Nuevo DJ basado en transiciones 
-#limited string size
-DigitalDJWizard.21=Borrar 
-#limited string size
-DigitalDJWizard.22=Origen
-#limited string size
-DigitalDJWizard.23=Destino
-#limited string size
-DigitalDJWizard.24=Nb
-#limited string size
-DigitalDJWizard.25=Empieza por:
-DigitalDJWizard.26=Por favor, crea almenos una transición
-#limited string size
-DigitalDJWizard.27=Selección de géneros
-#limited string size
-DigitalDJWizard.28=%
-DigitalDJWizard.29=DJ basado en proporciones
-DigitalDJWizard.30=Por favor, crea almenos una proporción
-DigitalDJWizard.31=DJ basado en ambiente
-DigitalDJWizard.32=Nuevo ambiente
-DigitalDJWizard.33=Crear un nuevo ambiente
-DigitalDJWizard.34=Borrar ambiente
-DigitalDJWizard.35=Borrar el ambiente seleccionado
-DigitalDJWizard.36=Nombre del ambiente
-DigitalDJWizard.37=Nombre
-DigitalDJWizard.38=Por favor, crea almenos un ambiente
-DigitalDJWizard.39=Por favor, rellena el nombre y selecciona los estilos del ambiente
-DigitalDJWizard.40=Por favor, selecciona un DJ
-DigitalDJWizard.41=Por favor, pon el nombre al DJ
-DigitalDJWizard.42=Un DJ con este nombre ya existe
-DigitalDJWizard.43=Cambiar DJ
-DigitalDJWizard.44=Seleccionar el DJ a configurar
-DigitalDJWizard.45=Selección de acción
-DigitalDJWizard.46=Selección del tipo de DJ
-DigitalDJWizard.47=Por favor, selecciona o crea un ambiente
-DigitalDJWizard.48=Atributos Generales
-DigitalDJWizard.49=Por favor, rellena los atributos generales del DJ
-DigitalDJWizard.50=Por favor, define proporciones
-DigitalDJWizard.51=Borrar DJ
-DigitalDJWizard.52=Por favor, define transiciones
-DigitalDJWizard.53=Número mínimo de estrellas de puntuación para pistas de la selección (1: todas las pistas)
-DigitalDJWizard.54=Duración de Cross fade entre pistas
-DigitalDJWizard.55=Si está marcado, la selección contendrà cada pista solo una vez
-DigitalDJWizard.56=Asistente de Ambientes
-DigitalDJWizard.57=Administrar Ambientes
-DigitalDJWizard.58=Selección de Ambientes:
-DigitalDJWizard.59=La suma de todas las proporciones tendria que ser < 100 %
-DigitalDJWizard.60=Nombre de ambiente existente
-DigitalDJWizard.61=Borrar DJ
-#limited string size
-DigitalDJWizard.62=Por defecto
-DigitalDJWizard.63=Añadir ambientes por defecto
-DigitalDJWizard.64=Cualquiera
-DigitalDJWizard.66=Selección de Ambiente por defecto
-
-#--- Tips of day ---
-
-Ambience.0=Rock/Pop
-Ambience.1=Rap
-Ambience.2=HardRock
-Ambience.3=Techno
-Ambience.4=Electro
-Ambience.5=Clásico
-Ambience.6=Suave
-Ambience.7=Fiesta
-Ambience.8=Jazz
-Ambience.9=World
-Ambience.10=Otros
-Ambience.11=Folk/Oldies
-Ambience.12=Indy
-Ambience.13=Latin
-
-DebugLogAction.0=Listar trazas de Debug
-DebugLogAction.1=Refrescar
-
-CopyClipboardAction.0=Copiar dirección al portapapeles
-
-LaunchInBrowserAction.0=Lanzar dirección en el navegador del sistema
-
-ReportAction.0=Informe creado satisfactoriamente 
-ReportAction.1=Informe de Música Jajuk
-ReportAction.2=Por favor, por el cuidado del medio ambiente,  no imprimas si no es necesario
-ReportAction.3=Lista de Albums
-ReportAction.4=Pistas por Album
-ReportAction.5=Lista de Artistas
-ReportAction.6=Álbums por artistas
-ReportAction.7=Lista de Géneros
-ReportAction.8=Albums por género
-ReportAction.9=Autores/ albums por género
-ReportAction.10=Lista de Directorios
-ReportAction.11=Archivos por directorio
-ReportAction.12=Nombre de archivo
-ReportAction.13=Nombre de pista
-ReportAction.14=Lista de Dispositivos
-ReportAction.15=Directorios por dispositivo
-ReportAction.16=Directorios/ archivos
-ReportAction.17=colección
-ReportAction.18=Autores/ albums/ pistas por estilo
-ReportAction.19=Ir a:
-
-ActionMove.0=Pegar
-
-ActionRefresh.0=Forzar Refrescar
-ActionRefresh.1=Refrescando directorio
-
-RenameAction.0=Renombrar
-RenameAction.1=Por favor, entra el nuevo nombre para este archivo:
-RenameAction.2=Por favor, entra el nuevo nombre para este directorio:
-
-NewFolderAction.0=Nueva Carpeta
-NewFolderAction.1=Por favor, entra el nuevo nombre para esta carpeta:
-NewFolderAction.2=Una carpeta con el mismo nombre ya existe.
-
-LyricsView.0=Letra
-
-ActionDelete.0=Ficheros borrados
-ActionDelete.1=Directorios borrados
-
-FindDuplicateFilesAction.0=No se encontraron ficheros duplicados.
-FindDuplicateFilesAction.1=Ficheros duplicados encontrados
-
-RefreshDialog.0=Preparando actualización de dispositivo...
-RefreshDialog.1=Actualizando dispositivo
-RefreshDialog.2=Actualizando dispositivo: 
-RefreshDialog.3=Limpiando los archivos antiguos
-
-RadioWizard.0=Selecciona o crea una web radio
-RadioWizard.1=Administrarweb radios
-RadioWizard.2=Nueva
-RadioWizard.3=Borrar
-RadioWizard.4=Por defecto
-RadioWizard.5=Una web radio con este nombre ya existe
-RadioWizard.6=Nombre de Web Radio
-RadioWizard.7=Asistente de Web Radio
-RadioWizard.8=URL
-RadioWizard.9=Nombre
-RadioWizard.10=URL incorrecta
-RadioWizard.11=Nombre y URL son obligatorios
-
-UpdateManager.0=Una nueva versión de Jajuk (
-UpdateManager.1=) se ha encontrado, puedes decargarla desde http://jajuk.info
-UpdateManager.2=No hay nueva versión por ahora
-
-LastFmManager.0=El soporte Last.FM está deshabilitado. Si quieres enviar las canciones que escuches a Last.FM, habilítalo y configura tu login y password de Last.FM en la vista de Preferencias / pestaña Last.FM. 
-
-SuggestionView.0=Sugerencias
-SuggestionView.1=Preferidas
-SuggestionView.2=Nuevos
-SuggestionView.3=Otros albums
-SuggestionView.4=Artistas similares
-SuggestionView.5=Raramente escuchadas
-SuggestionView.7=<html><b>Nada que mostrar</b><br><br><i>La información de Last.FM se muestra solo si:<ul><li>Una pista está reproduciéndos</li><li>El autor de la pista es conocido (tag correcta)</li><li>La opción "Habilitar consultas a Last.FM" está marcada en la vista de Preferencias / pestaña Last.FM</li></ul></i></html>
-
-AbstractThumbnail.0=Abrir la página LAST.FM
-
-AlbumsTableView.0=Tabla de Albums
-AlbumsTableView.1=No de pistas
-
-AlarmClock.0=Establecer nueva alarma
-AlarmClock.1=Mostrar alarmas
-AlarmClock.2=Sin alarmas establecidas
-AlarmClock.3=Alarma
-AlarmClock.4=Momento ya pasado !
-AlarmClock.5=Recordatorio para ti:
-
-AlarmDialog.0=Tiempo (HH:MM:SS)
-AlarmDialog.1=Hora
-AlarmDialog.2=Minutos
-AlarmDialog.3=Segundos
-AlarmDialog.4=Acción de la alarma
-AlarmDialog.5=Seleccionar acción de la alarma
-AlarmDialog.6=Mensaje:
-AlarmDialog.7=Establecer mensaje recordatorio
-AlarmDialog.8=Diariamente
-AlarmDialog.9=Establecer la alarma diariamente.
-
-ShowPropertiesAction.0=Muestra propiedades del objeto
-
-QueueView.1=Vaciar la cola
-
-JajukSlimWindow.0=Habilitar/deshabilitar Slim Jajuk
-
-BanSelectionAction.0=Bloquear
-BanSelectionAction.1=Bloquear el elemento para que nunca se seleccione
-
-UnBanSelectionAction.0=Desbloquear
-UnBanSelectionAction.1=Desbloquear elemento(s) para volver a ser propuestos
-
-Preference.0=<html>Asigna una preferencia personal a la pista actual<br>Es tomada en cuenta para el cálculo de la valoración final</html>
-Preference.1=Basura
-Preference.2=Pobre
-Preference.3=Medio
-Preference.4=Bueno
-Preference.5=Excelente
-Preference.6=Clásico
-Preference.7=Preferencias...
-Preference.8=Sin preferencia
-
-# TipOfTheDay are automatically generated with the Jajuk Manual.
-#    To change tip of the day use page: http://jajuk.info/index.php/Tip_of_the_day
-TipOfTheDay.0=Tip 0: Qué puedes repetir la pista actual desde el inicio con  [Control-Left click] o {right click] al botón de Rewind en el  panel de Control o en la bandeja del sistema  ?
-TipOfTheDay.1=Tip 1: Qué puedes repetir el álbum actual desde la primera pista con  [Control-Left click] o {right click] al botón Anterior en el  panel de Control o en la bandeja del sistema  ?
-TipOfTheDay.2=Tip 2: Qué puedes añadir elementos aleatorois a la lista de reproducción (playlist)  usando el botón  ? en el editor de playlist ?
-TipOfTheDay.3=Tip 3: Qué puedes obtenerr carátulas de internet incluso detrás de un proxy usando la pestaña de Red em la vista de Configuración ?
-TipOfTheDay.4=Tip 4: Qué puedes guardar les carátulas obtenidas desde internet para acelerar la navegación en la vista de carátulas utilitzando la opción de precargar les carátulas en la pestaña de carátulas  a la vista de configuración ?
-TipOfTheDay.5=Tip 5: Qué puedes ocultar las pistas no disponibles a la aplicación utilitzando la opción Mostrar solo dispositivos montados en la pestaña de opciones de la vista de configuración ?
-TipOfTheDay.6=Tip 6: Qué puedes reducir el tamaño de la colección para caràcteres asiáticos selecciondo UTF-16 como encodding en la Vista de Configuración / Pestaña Avanzado ?
-TipOfTheDay.7=Tip 7: Qué puedes arrastrar i soltar elementos de las vistas de árbol a las playlist del editor de playlist o del repositorio de playlist  ?
-TipOfTheDay.8=Tip 8: Qué puedes escuchar el principio de las pistas usando el modo  intro ?
-TipOfTheDay.9=Tip 9: Qué puedes configurar la duración de la atenuación en la vista de Preferencias / pestaña de Opciones ?
-TipOfTheDay.10=Tip 10: Qué puedes iniciar jajuk en modo reducido desmarcando la opción Mostrar jajuk al inicio en el area de noticación ?
-TipOfTheDay.11=Tip 11: Qué puedes controlar las principales funciones de jajuk usando solo el icono en el area de notificación (solo Linux y Windows) ?
-TipOfTheDay.12=Tip 12: Qué el aspecto (look and feel) de Jajuk es configurable en la vista de Preferencias / pestaña de Opciones ?
-TipOfTheDay.13=Tip 13: Qué puedes configurar el comportamiento del doble click y del drag & drop  (push y play) en la vista de Preferencias / pestaña de Opciones ?
-TipOfTheDay.14=Tip 14: Qué las pistas "planificadas" de  Jajuk son pistas que sonarán después de la selección actual ?
-TipOfTheDay.15=Tip 15: Qué la interfaz gráfica de Jajuk es completamente dockable y que se pueden reorganizar las vistas con drag and drop ?
-TipOfTheDay.16=Tip 16: Qué se puede obtener el número total de archivos y pistas seleccionando el nodo "colección" en las vistas física o lógica ?
-TipOfTheDay.17=Tip 17: Qué puedes obtener tags online con la función "Obtener tags online" en directorios de la vista física ?
-TipOfTheDay.18=Tip 18: Qué la barra de histórico de Jajuk (arriba de la ventana) muestra todas las pistas que sonaron anteriormente ?
-TipOfTheDay.19=Tip 19: Qué puedes hacer búsquedas rápidas usando el cuadro de búsqueda (arriba de la ventana) ?
-TipOfTheDay.20=Tip 20: Qué puedes reportar bugs o nuevas funcionalidades usando el agente de calidad  (Ayuda -> Comunicar un problema) ?
-TipOfTheDay.21=Tip 21: Qué los DJs de Jajuk pueden crear playlists inteligentes siguiendo tus reglas ?
-TipOfTheDay.22=Tip 22: Qué puedes obtener las letras usando la "Vista de letras" ?
-TipOfTheDay.23=Tip 23: Qué la vista de Sugerencias muestra información de LAST.FM como artistas similares ?
-TipOfTheDay.24=Tip 24: Qué se puede añadir cualquier vista a una perspectiva usando la barra de menú de "Vistas" ?
-TipOfTheDay.25=Tip 25: Qué puedes establecer una imagen de fondo escogida en la vista de Preferencias / pestaña GUI ?  
-TipOfTheDay.26=Tip 26: Qué puedes mostrar/esconder los dispositivos desmontados con un click en la barra de menu "Modos" ? 
-TipOfTheDay.27=Tip 27: Qué puedes escoger el directorio para los datos de Jajuk (como un disco externo) para guardar tus datos y preferencias en cualquier ordenador (ver pestaña "Avanzado" en la vista de Preferencias) ?
-TipOfTheDay.28=Tip 28: Qué puedes añadir cualquier vista a cualquier perspectiva utilizando la barra de menu de "Vistss" ?
-TipOfTheDay.29=Tip 29: you can launch a web page in you default browser using this icon <a href=../images/3/30/Launch_16x16.png title=Image:launch_16x16.png class=internal> <img src=../images/3/30/Launch_16x16.png alt=Image:launch_16x16.png/> </a> 
-TipOfTheDay.30=Tip 30: Jajuk supports web radio <a href=../images/9/9d/Webradio_32x32.png title=Image:webradio_32x32.png class=internal> <img src=../images/9/9d/Webradio_32x32.png alt=Image:webradio_32x32.png/> </a> 
-
-
-]]></body>
\ No newline at end of file
+<?xml version='1.0' encoding='UTF-8'?>
+<body><![CDATA[
+#Jajuk Spanish langpack. 
+#Author: Arthur Verkaik, with edited parts of Josep Carles Collazos's document from 2006.
+#Copyright 2013 Arthur Verkaik, this is part of Jajuk distributed under the GPL V2 license
+#REFERENCE
+#
+ 
+#--- Generic labels ---
+# DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
+# YOU PROBABLY DON'T WANT TO CREATE A LABEL HERE, CREATE ONE ONLY IF VERY GENERICAL 
+# AND USED MANY TIMES  
+Info=Información
+Warning=Advertencia
+Error=Error
+Ok=OK
+Cancel=Cancelar
+Close=Cerrar
+Stop=Parar
+Save=Guardar
+Apply=Apply
+Delete=Borrar
+Details=Detalles
+Yes=Si
+No=No
+Success=Operación Exitosa
+Sort=Ordenar por:
+Option=Por favor, selecciona una opción:
+Help=Ayuda
+Hide=No mostrar más
+Path=Por favor, selecciona un camino:
+Later=Luego
+Default=Defecto
+YestoAll=Si a todo
+Purge=Purga
+
+#--- Wizard Strings --- 
+#These strings are used in the context of a basic wizard
+Wizard_Next=Siguiente
+Wizard_Prev=Anterior
+Wizard_Finish=Terminar
+
+#--- General Strings --- 
+Type=Tipo
+Type.mp3=Mpeg Layer 3
+Type.playlist=Lista de reproducción
+Type.ogg=Ogg Vorbis
+Type.wav=Audio WAVE/SPEEX
+Type.au=Sun Audio
+Type.aiff=Apple Audio Interchange
+Type.flac=Free Lossless Audio Codec
+Type.mpc=MusePack
+Type.wma=Windows Media Audio
+Type.ape=Monkey's Audio format
+Type.aac=Advanced Audio Coding
+Type.real=Real Audio
+Type.mp2=Mpeg Layer 2
+Type.mac=Monkey's Audio format
+Type.radio=Web Radio
+Type.video=Video
+Type.wavpack=WavPack
+
+unknown=Unknown
+unknown_artist=Desconocido
+unknown_album=Desconocido
+unknown_genre=Desconocido
+unknown_year=Desconocido
+
+various_artist=Varios artistas
+
+Note.0=Jajuk ha detectado una actualización importante de estreno. Las perspectivas han sido reajustadas a la configuración predeterminada.
+Note.1=El sistema de valoraciones de Jajuk cambió (ver Jajuk online help -> Rating system page). Tus anteriores valoraciones han sido migradas a una escala de 0 a 100 pero es aconsejable resetarlas desde Preference view -> History tab (atención: todas las valoraciones se perderán)
+
+#Write confirmation so replies are: yes / no / cancel
+Confirmation_exit=¿ Quieres salir de Jajuk ?
+Confirmation_delete=¡ Atención ! Estás a punto de borrar el(los) siguiente(s) fichero(s) de tu disco:
+Confirmation_void_refresh=¡ Atención ! Estás a punto de actualizar un dispositivo vacío el cual será limpiado. En Unix, asegurate que el dispositivo esté montado. ¿ Estás seguro ?
+Confirmation_remove_device=¿ Realmente quieres eliminar este dispositivo?
+Confirmation_delete_cover=¿ Realmente quieres borrar esta carátula del disco ?
+Confirmation_delete_files=¿ Realmente quieres borrar estos archivos del disco ?
+Confirmation_delete_dirs=¿ Realmente quieres borrar estos directorios del disco ?
+Confirmation_clear_history=¿ Realmente quieres borrar el histórico ?
+Confirmation_reset_ratings=¿ Realmente quieres reajustar todas las clasificaciónes de las pistas a cero ?
+Confirmation_refactor_files=¿ Realmente quieres renombrar el(los) siguiente(s) fichero(s) ?
+Confirmation_restore_all=Una restauración de las vistas necesita reiniciar Jajuk , ¿ quieres salir de Jajuk ?
+Confirmation_delete_empty_dirs=Los siguientes directorios estan vacíos. ¿ Quieres borrarlos definitivamente ?
+Confirmation_file_overwrite=Esto fichero ya exista. ¿ Quieres sobrescribirlo ?
+Confirmation_file_number=fichero(s) seran borrados definitivamente.
+Confirmation_defaults=Esto volverá a las opciones por defecto todas las pestañas ( no solo ésta ) , ¿ estás seguro ?
+Confirmation_reset_preferences=¿ Realmente quieres reajustar las configuraciónes de las pistas ?
+Confirmation_reset_ratings_overwrite=Cualquier clasificación que se encuentra en el archivo importado sobreescribirá la clasificación actual de este archivo en esta instalación de Jajuk. ¿ Estás seguro de que quieres hacer esto ?
+Confirmation_tag_write=Uno o más etiquetas están a punto de estar escritos en el disco. ¿ Está seguro ?
+
+Device_type.directory=Directorio
+Device_type.file_cd=CD de Ficheros Musicales
+Device_type.extdd=Disco Duro Externo
+Device_type.player=Reproductor Digital
+Device_type.network_drive=Unidad de Red
+
+Perspective_Description_Simple=Simple
+Perspective_Description_Files=Archivos
+Perspective_Description_Tracks=Pistas
+Perspective_Description_Configuration=Configuración
+Perspective_Description_Statistics=Estadísticas
+Perspective_Description_Display=Visualización
+Perspective_Description_Albums=Albums
+Perspective_Description_Info=Información
+Perspective_Description_Playlists=Listas de reproducción
+
+Item_Playlist_File=Lista de reproducción
+Item_Track=Pista
+Item_Album=Album
+Item_Artist=Artista
+Item_Genre=Género
+Item_Device=Dispositivo
+Item_File=File
+Item_Directory=Directorio
+Item_Year=Año
+Item_AlbumArtist=Album-Artista
+
+Property_id=Id
+Property_name=Nombre
+Property_type=Tipo
+Property_url=Url
+Property_mount_point=Punto de Montaje
+Property_auto_refresh=Auto Refrescar
+Property_auto_mount=Auto Montar
+Property_album=Album
+Property_style=Género
+Property_author=Artista
+Property_album_artist=Album Artista
+Property_disc_number=Disc#
+Property_length=Longitud
+Property_year=Año
+Property_rate=Puntuación
+Property_files=Archivos
+Property_hits=Hits
+Property_filename=Archivo
+Property_date=Fecha
+Property_added=Fecha de descubrimiento
+Property_parent=Directorio padre
+Property_device=Dispositivo
+Property_directory=Directorio
+Property_track=Pista
+Property_size=Tamaño (MB)
+Property_quality=Calidad
+Property_hashcode=Hashcode
+Property_playlist_files=Listas de reproducción
+Property_comment=Comentario
+Property_order=Orden
+Property_path=Orden completo
+Property_tracks=Pistas
+Property_file_date=Fecha del archivo
+Property_Format_Number=Número
+Property_Format_String=String
+Property_Format_Boolean=Boolean
+Property_Format_Float=Float
+Property_Format_Date=Date
+Property_Format_URL=Url
+Property_pf=Preferencia
+Property_tpt=Tiempo total de reproducción (segs)
+Property_ban=Banned
+Property_disc_id=DiscID
+Property_keywords=Palabras clave
+Property_label=Descripción
+Property_bitrate=Bitrate (kbps)
+Property_frequency=Frequiencia (Hz)
+Property_origin=Origen
+
+Language_desc_en=Inglés
+Language_desc_fr=Francés
+Language_desc_de=Alemán
+Language_desc_it=Italiano
+Language_desc_sv=Sueco
+Language_desc_nl=Holandés
+Language_desc_zh=Chino
+Language_desc_es=Español
+Language_desc_ca=Catalán
+Language_desc_ko=Korean
+Language_desc_el=Griego
+Language_desc_ru=Ruso
+Language_desc_gl=Gallego
+Language_desc_cs=Checo
+Language_desc_pt=Portugués
+
+#--- Error codes ---
+Error.000=Error desconocido
+Error.005=Error al parsear el fichero de la colección.
+Error.007=Error reproduciendo fichero, puede que MPlayer no empezara dentro del timeout, timeout:
+Error.008=Error deteniendo fichero
+Error.009=No se puede leer el fichero
+Error.010=No se puede encontrar un fichero asociado con este elemento en ningún dispositivo montado
+Error.011=Error técnico al montar el dispositivo o dispositivo vacío
+Error.012=Error técnico al desmontar el dispositivo, probablemente lo use otra aplicación
+Error.013=No se puede borrar el dispositivo: Está actualmente montado o actualizándose
+Error.016=No se puede acceder al dispositivo especificado, por favor , entra el punto de montaje. Ex: '/cdrom' en Unix,'e:' en MS Windows
+Error.017=Error analizando la playlist
+Error.018=No se encontró ninguna pista accesible
+Error.019=Existe un dispositivo con este nombre
+Error.020=Error de E/S, verifica el espacio en disco
+Error.023=No se puede lanzar la pista inicial
+Error.024=No se puede escribir el fichero
+Error.025=Uno de los ficheros que quieres leer está en un dispositivo desmontado
+Error.026=Error registrando reproductores
+Error.027=Sincronización abortada
+Error.028=Error grabando playlist
+Error.030=Demasiadas conexiones fallidas. Jajuk ha parado de buscar carátulas en la red.
+Error.102=Error
+Error.103=Error leyendo información de tag
+Error.104=Error escribiendo información de tag
+Error.105=Resource Bundle key no encontrada
+Error.106=Excepción no capturada
+Error.107=El dispositivo ya se está refrescando o sincronizando
+Error.108=Error en el análisis del fichero de perspectiva
+Error.110=Este nombre de propiedad está reservado  por Jajuk internal system, por favor escoja otro nombre
+Error.111=Dispositivo ya montado
+Error.112=No se puede montar el dispositivo
+Error.113=No se puede guardar la configuración del usuario
+Error.114=No se puede leer la configuración del usuario
+Error.119=Error analizando fichero de historial o no existe
+Error.120=No se puede acceder al dispositivo : está montado, refrescándose o bien sincronizándose
+Error.121=El dispositivo está en uso y no puede ser desmontado
+Error.122=Error en FIFO
+Error.125=Dispositivo ya montado
+Error.126=Búsqueda no soportada por este formato de audio
+Error.127=No hay novedades durante tiempo especificado, puedes cambiarlo en la vista de preferencias
+Error.128=Esta pista es la primera de la colección, no hay pistas anteriores
+Error.131=No se puede borrar el fichero
+Error.133=El fichero de la colección está corrupto por una razón desconocida, jajuk se encargará de restaurar un fichero de backup
+Error.134=No se puede renombrar el archivo
+Error.135=El archivo no existe
+Error.136=Operación fallida
+Error.137=Formato Erroneo
+Error.140=Cadena errónea: no debería contener los carácteres & ' " < o >
+Error.141=Esta playlistt está situada en un dispositivo desmontado, por lo que no está disponible
+Error.142=Esta playlist contiene algunas pistas fuera de dispositivos conocidos que serán ignoradas
+Error.143=La localización del dispositivo no está disponible
+Error.144=Error parseando DJ
+Error.145=No se puede hacer commit DJ
+Error.146=<html>El patrón actual es incorrecto.<br>Items válidos son: %artist (Artist name); %title (Track title); %album (Album name);<br> %n (Track leading zero); %genre (track genre); %year (Year)<br> y el patrón debe contener al menos una barra</html> 
+Error.147=Algunos archivos no pueden ser movidos (ver detalles para más información)
+Error.148=El campo Year es desconocido
+Error.149=El campo Album es desconocido
+Error.150=El campo Artist es desconocido
+Error.152=El campo TrackOrder es desconocido
+Error.153=El campo Style es desconocido
+Error.154=No se puede renombrar el archivo, revisa algun carácter erróneo en el nombre o en los tags
+Error.155=Error al poner tags a los archivos, revisa los permisos
+Error.156=No hay DJ disponible para una colección vacía
+Error.157=DJ erróneo, por favor, selecciona o crea un DJ utilitzando el combo referenciado por este botón
+Error.158=Las constraints de DJ no pueden ser respetadas o ninguna pista disponible
+Error.159=El ambiente asociado ha sido borrado
+Error.160=Fichero no movido. El fuente y el destino eran el mismo
+Error.161=No se puede escribir al directorio, comprobar permisos
+Error.162=Esta propiedad de usuario ya existe
+Error.163=Error restaurando las vistas por defecto
+Error.165=Error en el path de la colección, el directorio o no existe o no tiene permisos de escritura
+Error.166=Album vacío, no se puede capturar la caràtula
+Error.167=No se puede crear el informe
+Error.171=No se ha definido una fuente de sincronización para este dispositivo, asignala utilizando el asistente de configuración de dispositivos (En la vista de Dispositivo, clickar sobre el dispositivo).
+Error.172=Se encontró un error mientras se borraba el siguiente archivos(s):
+Error.174=Error accediendo a la web de Freedb , revisa tu conexión de red 
+Error.176=Error generando lista de reproducción
+Error.177=Rellena con un tiempo correcto en formato (HH24:MM:SS), por favor.
+Error.179=No se puede abrir el sistema de archivos del explorador, trata de establecer una ruta a la misma en vista Preferencia / Opciones avanzadas
+Error.180=Error al copiar archivos
+Error.181=No se pudo encontrar el archivo especificado
+Error.182=No se puede acceder a la ruta de configuración especificada, utilizamos la ruta de inicio del usuario en su lugar. Si es necesario, cambialo en la vista de "Preferencias", pestaña "Advanced".
+Error.184=Valor incorrecta: Intervalo refrescante puede ser 0 o un número> = 0.5
+
+#Warnings
+Warning.0=MPlayer no se encuentra. Algunos formatos de audio y video (flac, wma, aac, mpg2 ...) serán deshabilitados. Para utilizar Mplayer si está instalado, tienes que configurar manualmente elpath en la vista de Preferencias / avanzado. 
+Warning.1=Versión de MPlayer no válida, es necesario MPlayer1.0Pre8 o superior. Algunos formatos de audio serán deshabilitados. 
+Warning.2=Parece que alguien más está usando ahora la colección de Jajuk. El último usuario en salir sobreescribirá la configuración(opciones, valoraciones...). 
+Warning.3=Mplayer no puede ser descargado. Si estás detrás de un proxy HTTP, configúralo en la vista de Preferencias / Pestaña de Red y reinicia Jajuk. 
+Warning.4=Mplayer es necesario para escuchar web radios 
+Warning.5=El directorio de destino ya existe, algunos archivos se sobreescribirán, ¿ Estás seguro ? 
+Warning.6=No hay pista disponible para jugar (Sugerencia: tratar de montar algunos dispositivos o cambio ambiente)
+Warning.7=Jajuk detecta una necesidad de renovación profunda de que se actualicen. ¿Quieres hacerlo ahora? (todavía se puede hacer en cualquier momento desde el punto de vista Dispositivos)
+
+#--- Strings by class ---
+ParameterView.0=Duración del histórico:
+ParameterView.2=Cambia el tiempo en dias que quieres guardar trazas de pistas escuchadas. Cambiar a 0 si no quieres ver ningún histórico y -1 si quieres tener histórico permanente
+ParameterView.3=Borrar histórico
+ParameterView.4=Borrar histórico
+ParameterView.8=Histórico/Valoraciónes
+ParameterView.9=Reproducir :
+ParameterView.10=Nada
+ParameterView.11=No music at all at startup
+ParameterView.12=La última desde el principio
+ParameterView.13=Reproduce la última pista de la sesión anterior
+ParameterView.14=Pista aleatoria
+ParameterView.15=Reproduce una pista aleatoria de la colección
+ParameterView.16=Pista :
+ParameterView.17=Seleccionar un fichero a reproducir al inicio
+ParameterView.18=Seleccionar un fichero a reproducir al inicio
+ParameterView.19=Inicio
+ParameterView.26=Confirmaciones
+ParameterView.27=Antes de borrar físicamente un fichero
+ParameterView.28=Preguntar de borrar físicamente un fichero
+ParameterView.29=Antes de salir de Jajuk
+ParameterView.30=Preguntar al salir de Jajuk
+ParameterView.33=Opciones
+ParameterView.35=Ocultar pistas situadas en dispositivos desmontados
+ParameterView.38=Idioma:
+ParameterView.42=Idioma de la interfaz
+ParameterView.43=Tema:
+ParameterView.44=<html>Seleccionar un tema<p>(Puede ser necesario reiniciar jajuk para verlo correctamente)</html>
+ParameterView.46=Nivel de log:
+ParameterView.47=Fatal
+ParameterView.48=Error
+ParameterView.49=Warning
+ParameterView.50=Info
+ParameterView.51=Debug
+ParameterView.52=Jajuk verbosity : Fatal:display only critical errors, Error:+display errors, Info:+display information messages, Warning:+display warnings, Debug: any message
+ParameterView.59=Inicio de posición de introducción (%):
+ParameterView.60=Posición de la introducción en la pista en %, desde 0 ( inicio de la pista ) a 99 ( final de la pista )
+ParameterView.61=Longitud de la introducción (seg):
+ParameterView.62=Longitud de la introducción en segundos
+ParameterView.85=Aplicar
+ParameterView.86=Restaurar valores por defecto
+ParameterView.87=Preferencias
+ParameterView.98=Patrones
+ParameterView.101=Usar directorio padre como nombre de álbum
+ParameterView.102=Jajuk usa el directorio padre como el nombre del álbum para una pista si no puede obtenerlo via id3 tags
+ParameterView.109=Preferencias salvadas
+ParameterView.110=Preferencias cambiadas a valores por defecto
+ParameterView.111=Tamaño de la playlist Best Of:
+ParameterView.112=Cambia el número de pistas en la playlist BestOf(de 1 a 100)
+ParameterView.113=Usar regexp en filtros
+ParameterView.114=Usar expresiones regulares (Formato Regexp) en los filtros de las tablas, ejemplo: .*foo.*
+ParameterView.115=Avanzada
+ParameterView.116=Hacer copia de seguridad del archivo de colección
+ParameterView.117=Marcar esto si quieres hacer una copia de seguridad de tu archivos de colección a ficheros collection-<date>.xml
+ParameterView.119=Tamaño de Backup (Mb) (Mb)
+ParameterView.120=Charset de la colección
+ParameterView.121=Charset de la colección. UTF-16 está optimizado para idiomas Asiáticos y UTF-8 está optimizado para idiomas europeos.
+ParameterView.129=Tiempo límite de las novedades (días):
+ParameterView.130=Tiempo límite de las novedades en días : todas las pistas añadidas antes de este número de días son tomadas como novedades
+ParameterView.131=Pista BestOf
+ParameterView.132=Reproduce una de tus pistas favoritas al inicio
+ParameterView.133=Pista Nueva
+ParameterView.134=Reproduce una novedad de tu colección al inicio
+ParameterView.135=La última pista anterior
+ParameterView.136=Reproduce la última pista reproducida durante la sesión anterior
+ParameterView.139=Red
+ParameterView.142=Usuario del proxy
+ParameterView.143=Nombre de login del proxy usado para autentificación
+ParameterView.144=Host del proxy
+ParameterView.145=Nombre de host o IP del proxy
+ParameterView.146=Puerto del proxy
+ParameterView.147=Puerto TCP/IP del proxy (frecuentemente 3128)
+ParameterView.148=Usar auto carátulas
+ParameterView.149=Use auto cover to bring covers from the Internet (if required, configure your proxy in the network tab)
+ParameterView.150=Mínimo tamaño de carátula(Kb)
+ParameterView.151=Mínimo tamaño de carátula(Kb) de carátulas descargadas
+ParameterView.152=Máximo tamaño de carátula(Kb)
+ParameterView.153=Máximo tamaño de carátula(Kb) de carátulas descargadas
+ParameterView.155=Search accuracy. The higher is accuracy, the less you will get wrong cover images
+ParameterView.156=Baja
+ParameterView.157=Media
+ParameterView.158=Alta
+ParameterView.159=Carátulas
+ParameterView.160=Timeout de Conexión (seg)
+ParameterView.161=Timeout de Conexión in segs: la operación falla si la otra parte no contesta en este tiempo
+ParameterView.164=Antes de eliminar un dispositivo
+ParameterView.165=Preguntar antes de eliminar un dispositivo
+ParameterView.166=Barajar carátulas
+ParameterView.167=Mostrar una carátula aleatoria
+ParameterView.168=Artista
+ParameterView.171=Antes de borrar físicamente una carátula
+ParameterView.172=Preguntar antes de borrar físicamente una carátula
+ParameterView.177=Número visible de pistas planificadas
+ParameterView.178=El número de pistas planificadas a mostrar en la playlist
+ParameterView.179=Encolar la selección
+ParameterView.180=Encolar (y no reproducir) una pista haciendo doble click en un elemento
+ParameterView.181=Encolar al hacer drag & drop
+ParameterView.182=Encolar (y no ejecutar) una pista cuando la arrastremos.
+ParameterView.183=Sincronizar vistas de árbol y tabla
+ParameterView.184=Si está marcado la vista de tabla solo mostrará pistas seleccionadas en la vista de árbol
+ParameterView.185=Mostrar un popup cuando se lance una pista
+ParameterView.186=Inicializar puntuaciones
+ParameterView.187=Inicializar puntuaciones a cero para pistas
+ParameterView.188=Antes limpiar histórico
+ParameterView.189=Antes inicializar puntuaciones
+ParameterView.190=duración de la atenuación (segundos)
+ParameterView.191=El número de segundos de atenuación entre pistas
+ParameterView.192=Organizador de ficheros :
+ParameterView.193=Patrones disponibles: %artist (Nombre del artista); %title (Título de la pista); %album (Nombre del álbum); %n (Track leading zero); %genre (Género); %year (Año)
+ParameterView.194=Antes de organizar ficheros
+ParameterView.195=Vista de animación
+ParameterView.196=Habilitar atajos de teclado
+ParameterView.197=Habilitar algunas teclas como F8 para que funcionen aunque Jajuk no tenga el foco
+ParameterView.198=Algunos cambios serán efectivos solo en el próximo inicio de Jajuk
+ParameterView.199=Scrobble lo que escucho
+ParameterView.200=Esta opción envia informaciones a Last.fm
+ParameterView.201=Usuario de Last.FM
+ParameterView.202=El nombre de usuario usado en Last.FM
+ParameterView.203=Password de Last.FM
+ParameterView.204=El password usado en Last.FM
+ParameterView.205=Argumentos de MPlayer
+ParameterView.206=Argumetnos adicionales de MPlayer como '-ao esd' o '-ao arts' o '-novideo (para no reproducir videos)' p.e.
+ParameterView.207=Path base de Jajuk
+ParameterView.208=Cambiar el directorio que contiene la configuración de Jajuk (por defecto es el directorio home del usuario)
+ParameterView.209=El path de la configuración de Jajuk ha sido cambiado por el usuario actual (la colección anterior ha sido guardado en la localización anterior). Jajuk se puede reiniciar.
+ParameterView.210=Si el cross fade no funciona, trata de añadir <-ao esd> en Gnome o <-ao arts> en KDE en el campo de argumentos adicionales del motor de sonido (Preferencias / Avanzado).
+ParameterView.211=Pequeñas solo
+ParameterView.212=Pequeñas y medianas
+ParameterView.213=Medianas solo
+ParameterView.214=Medianas y grandes
+ParameterView.215=Grandes solo
+ParameterView.216=Buscar usando el nombre del artista
+ParameterView.217=Buscar usando el nombre del album
+ParameterView.218=Buscar usando el nombre de la pista
+ParameterView.219=Variables de entorno
+ParameterView.220=Establece la variables de entorno usadas por el reproductor de audio (ARTS_SERVER en KDE o ESPEAKER en Gnome for ie). Formato: var1=xx var2=yyy... 
+#Respect English size for next item
+ParameterView.221=Tamaño página de Catálogo (0: Todo en una)
+ParameterView.222=Establece el número de álbumes por página en la vista de catálogo. 0: muestra todas las carátulas en una sola página
+ParameterView.223=Tamaño de Fuentes
+ParameterView.224=Establece el tamaño de la fuente de texto
+ParameterView.225=GUI
+ParameterView.226=Modos
+ParameterView.228=Mostrar ventanas de albums
+ParameterView.229=Preferencias de la vista de Catálogo
+ParameterView.233=El interfaz se refrescará en el próximo reinicio de jajuk
+ParameterView.234=Chequea actualizaciones de Jajuk
+ParameterView.235=Last.FM
+ParameterView.236=Sin Proxy
+ParameterView.237=proxy HTTP
+ParameterView.238=proxy SOCKS
+ParameterView.239=Proxy password
+ParameterView.240=Habilitar consultas de información de Last.FM
+ParameterView.241=Si está marcado, jajuk recogerá información de los albumes de Last.FM (ver vista de sugerencias) 
+ParameterView.242=Path de Mplayer
+ParameterView.243=<html>Cambiar aquí el path completo del ejecutable mplayer (espacio permitidos)<br>Exemple: /Applications/MPlayer OSX.app/Contents/Resources/External_Binaries/mplayer_intel.app/Contents/MacOS/mplayer</html>
+ParameterView.244=Forzar fecha de los archivos como fecha de descubrimiento 
+ParameterView.245=<html>Jajuk considera la fecha de los archivos de como la fecha de descubrimiento<br>Requeire un refresco en profundidad para ser tenido en cuenta</html>
+ParameterView.246=Tamanys dels icons a la barra de Perspectives (pixels)
+ParameterView.247=El path de destino contiene ya un workspace de Jajuk. El workspace se ha cambiado a este path para el usuario actual (el workspace anterior ha sido guardado en la anterior localización). Jajuk puede ser reiniciado.
+ParameterView.248=Título del marco : 
+ParameterView.249=Resetear preferencias
+ParameterView.250=Resetear preferencias del usuario
+ParameterView.251=Histórico reseteado correctamente
+ParameterView.252=Valoraciones y tiempos de reproducción reseteados correctamente
+ParameterView.253=Preferencias resetadas correctamente
+ParameterView.256=Los nombres de archivo de cobertura estándar
+ParameterView.257=Jajuk reconoce estándar cubre archivos cuyo nombre contiene este texto (sin extensión). Varios valores separados por ';' puede proporcionar. Ejemplo: "Carpeta; delante".
+ParameterView.260=Guardar cubre el Explorador de Windows amable
+ParameterView.261=Guardar cubiertas descargados como fólder.jpg / png / ... para que el explorador de Windows los utiliza como icono del directorio.
+ParameterView.262=Utilice la normalización de audio
+ParameterView.263=Maximiza el volumen sin distorsionar el sonido
+ParameterView.264=Bloquea el aceso Internet de Jajuk
+ParameterView.265=Bloquea el aceso Internet de Jajuk (LastFM, covers or lyrics download...).
+ParameterView.268=Configuración de proxy
+ParameterView.269=Ruta ejecutable Explorador
+ParameterView.270=Ruta de acceso al archivo ejecutable utilizado como explorador de archivos externos
+ParameterView.271=Muestra Systray
+ParameterView.272=Si se marca, Jajuk se puede gestionar desde el área de notificación (no se admiten todos los sistemas operativos)
+ParameterView.273=Cubierta Mirrow 
+ParameterView.274=Si se selecciona, la cubierta será inclinada y duplicada
+ParameterView.275=Notificación emergente al cambiar de pista:
+ParameterView.276=Seleccione el tipo de notificación de cambio de derrota (un brindis es una ventana emergente de notificación que aparece brevemente en la pantalla y desaparece por sí mismo)
+ParameterView.277=Patrón de globo :
+ParameterView.278=Este modelo establece el texto que se mostrará en globo notificante a cambio de pista
+ParameterView.279=Patrón de información:
+ParameterView.280=Este modelo establece el texto que se mostrará en la vista de información (parte inferior de la pantalla)
+ParameterView.281=Minimizar a la bandeja
+ParameterView.282=Si se selecciona, la ventana principal Jajuk se muestra en la bandeja del sistema sólo cuando se minimiza, y no más en la barra de tareas.
+ParameterView.283=Cubierta Mirrow en el modo de pantalla completa
+ParameterView.284=Si se selecciona, la cubierta será inclinada y "mirrowed" en el modo de pantalla completa
+ParameterView.285=Permite bit-perfect
+ParameterView.286=<html>Desactivar el mezclador (volumen de sonido) y cualquier otra opción que podría afectar <br> calidad de sonido como normalización de audio. <br> Utilice el mezclador OS para cambiar el volumen o silenciar una vez activado. </ Html>
+ParameterView.287=Sonido
+ParameterView.288=Permite vista Título efecto de animación
+ParameterView.289=Opciones de visualización Título
+ParameterView.290=Mostrar pantalla de bienvenida al iniciar
+ParameterView.291=Mostrar pantalla de bienvenida al iniciar en modo ventana principal (que siempre se desactiva en modo de pantalla slimbar o compelta)
+ParameterView.292=Mostrar una ventana emergente con detalles álbum al mover el ratón sobre las mesas álbumes o miniaturas.
+ParameterView.301=Muestra videos
+ParameterView.302=Si no está activado, Jajuk no se muestran los archivos de vídeo (tipo de inicio es necesario).
+ParameterView.303=Systray click fuerza visualización
+ParameterView.304=Al hacer clic sobre la fuerza de la bandeja del sistema de visualización de la ventana frontal (comportamiento por defecto muestra / oculta la ventana)
+ParameterView.305=Preserva las fechas de los archivos
+ParameterView.306=Preservar la "última fecha de modificación" de los archivos al fijar etiquetas
+ParameterView.307=Calificaciones Manual
+ParameterView.308=No confíe en el sistema de clasificación automática basada en el tiempo de juego y preferencias, sino establecer una clasificación directa con nivel de preferencia.
+ParameterView.309=Antes de escribir una o más etiquetas
+ParameterView.310=Restablecer "No volver a mostrar" opciones
+ParameterView.311=Esto hace posible mostrar de nuevo las elecciones que le pide que ocultar.
+
+Main.22=Descargando MPlayer
+
+Player.0=Esperando la línea de audio (ocupada)
+
+Device.25=] refrescado en
+Device.27= nuevos ficheros -
+Device.31=Sinc. [
+Device.33=sincronización hecha en
+Device.35= ficheros creados (
+Device.36= MB)
+Device.41=Sinc. [
+Device.42=]  Copiando [
+Device.43= tags no legibles
+Device.44=Entrando
+Device.45=Copiando [
+Device.46=Convirtiendo [
+Device.47=] a [
+Device.48=referencias de archivos o lista de reproducción se redujo
+
+FIFO.4=). ¿ Quieres montarlo ?
+FIFO.10=Ahora reproduciendo:
+FIFO.13= Kbps
+FIFO.14=Reproduciendo Web Radio:
+
+HistoryItem.0=yy/MM/dd HH:mm
+
+DeviceWizard.0=Configuración de dispositivo
+DeviceWizard.1=Tipo de dispositivo(*):
+DeviceWizard.2=Nombre del dispositivo(*):
+DeviceWizard.3=Localización del dispositivo(*):
+DeviceWizard.4=Directorio de montaje Unix (opcional):
+DeviceWizard.7=Ejecutar un refresco instantaneo
+DeviceWizard.8=Auto montar al inicio
+DeviceWizard.10=Sincronizado con :
+DeviceWizard.11=Sincronización unidireccional
+DeviceWizard.12=Todos los ficheros nuevos en el dispositivo fuente se copiarán en este dispositivo. Nada será escrito en el dispositivo fuente
+DeviceWizard.13=Sicronización bidireccional
+DeviceWizard.14=Todos los ficheros nuevos encontrados en un dispositivo se copiarán al otro
+DeviceWizard.43=Por favor escoge un direcorio
+DeviceWizard.44=Dispositivo creado
+DeviceWizard.45=Por favor, dale un nombre al dispositivo. Ej: CD A, Portátil ...
+DeviceWizard.46=Por favor, da una localización para el dispositivo. Ej: d:\music en Windows, /home/foo/music en Unix
+DeviceWizard.48=<html>Marcar si quieres ejecutar un refresco inmediato del dispositivo (avisado)<p>Esta operación puede tardar bastante para dispositivos grandes</html>
+DeviceWizard.49=<html>Marcar si quieres montar automáticamente el dispositivo al inicio<p>especialmente para directorios en el disco duro local. Evitarlo para CDs</html>
+DeviceWizard.50=<html>Intervalo en minutos para búsqueda automática de nuevos archivos (0: deshabilitada)</html>
+DeviceWizard.51=Marcar si quieres sincronizar este dispositivo con otro
+DeviceWizard.52=Seleccionar dispositivo fuente
+DeviceWizard.53=Refrescar dispositivo cada
+#limited string size
+DeviceWizard.54=min
+
+JajukJMenuBar.0=Archivo
+JajukJMenuBar.1=Abrir fichero
+JajukJMenuBar.3=Salir
+JajukJMenuBar.5=Propiedades
+JajukJMenuBar.6=Crear propiedad de usuario
+JajukJMenuBar.7=Borrar propiedad de usuario
+JajukJMenuBar.8=Vistas
+JajukJMenuBar.9=Modos
+JajukJMenuBar.10=Repetición
+JajukJMenuBar.11=Aleatorio
+JajukJMenuBar.12=Continuo
+JajukJMenuBar.13=Introducción
+JajukJMenuBar.14=Ayuda
+JajukJMenuBar.15=Contenido de la ayuda
+JajukJMenuBar.16=Sobre
+JajukJMenuBar.17=Restaurar vistas por defecto
+JajukJMenuBar.18=Asistente de Dispositivos
+JajukJMenuBar.19=Comunicar un problema
+JajukJMenuBar.20=Consejo del Día
+JajukJMenuBar.21=Configuración
+JajukJMenuBar.22=Preferencias
+JajukJMenuBar.23=Mostrar trazas de debug
+JajukJMenuBar.24=Mostrar solo pistas disponibles
+JajukJMenuBar.25=Mostrar vista
+JajukJMenuBar.26=Restaurar vistas (todas las perspectivas)
+JajukJMenuBar.27=Chequear actualizaciones de Jajuk
+JajukJMenuBar.28=Herramientas
+JajukJMenuBar.29=Inteligente
+JajukJMenuBar.30=Repetir todo
+JajukJMenuBar.31=Karaoke
+# Next two lines are only used in development/test mode, translation is therefore optional 
+JajukJMenuBar.32=Call a full GC (test mode only)
+JajukJMenuBar.33=Perform a manual commit of the collection data (test mode only)
+
+PlaylistFileItem.1=Novedades
+PlaylistFileItem.2=Nueva playlist
+PlaylistFileItem.3=Marcadores
+PlaylistFileItem.4=Lo mejor de
+PlaylistFileItem.5=Cola
+
+JajukFileChooser.0=Escoger Fichero
+
+SearchBox.0=Buscar entre pistas, autores, estilos, directorio ...
+
+CommandJPanel.0=Ver histórico de reproducción
+CommandJPanel.1=Modo repetición: Reproduce una pista en bucle
+CommandJPanel.2=Modo aleatorio: Reproduce aleatoriamente las pistas seleccionadas
+CommandJPanel.3=Modo continuo: Continua reproduciendo las pistas siguientes cuando acaba
+CommandJPanel.4=Modo Introducción: Reproduce un fragmento de las pistas. Inicio y tiempo pueden ser cambiados desde la vista de parámetros
+CommandJPanel.8=<html>Reproducir pista anterior en la selección actual<br>Mays+Boton Izquierdo lanza el álbum anterior</html>
+CommandJPanel.9=<html>Reproducir pista siguiente en la selección actual<br>Mays+Boton Izquierdo lanza el álbum anterior</html>
+CommandJPanel.10=<html>Retroceso rápido en la pista actual<br> Shift+Botón izquierdo para repetición completa</html>
+CommandJPanel.13=Avance rápido en la pista actual
+CommandJPanel.15=<html>Click aquí para cambiar el formato de tiempo mostrado</html>  
+CommandJPanel.16=Lanzar selección de DJ
+CommandJPanel.17=Administrar DJs
+CommandJPanel.18=Lanzar el DJ seleccionado por defecto
+CommandJPanel.19=Administrar Ambientes
+CommandJPanel.20=Pista por pista
+CommandJPanel.21=Album por álbum
+CommandJPanel.22=Album por album
+CommandJPanel.25=Encender la radio
+CommandJPanel.26=Modo repita todo : Cola de reproducción en un bucle
+CommandJPanel.27=Karaoke modo, oculta las voces de pista reproducida (se aplica sólo a la pista siguiente para ser lanzado)
+
+InformationJPanel.5=Tiempo total de la cola a reproducir [Nb de pistas restantes]
+InformationJPanel.7=Progreso de la pista actual
+# %xxx are patterns, don't translate them !
+InformationJPanel.8=%title by %artist on %album
+# Keep next label short
+InformationJPanel.9=<No selection>
+
+AbstractPlaylistEditorView.0=Título
+AbstractPlaylistEditorView.1=Localización
+AbstractPlaylistEditorView.2=Reproducir esta playlist
+AbstractPlaylistEditorView.3=Salvar esta playlist
+AbstractPlaylistEditorView.5=Eliminar elemento de esta playlist
+AbstractPlaylistEditorView.6=Mover arriba
+AbstractPlaylistEditorView.7=Mover abajo
+AbstractPlaylistEditorView.9=Borrar esta playlist
+AbstractPlaylistEditorView.10=Añadir una pista aleatoria a esta playlist
+AbstractPlaylistEditorView.15=Playlists
+AbstractPlaylistEditorView.18=Pista en cola
+AbstractPlaylistEditorView.19=Pista repetida
+AbstractPlaylistEditorView.20=Pista planificada
+AbstractPlaylistEditorView.22=Playlist grabada
+AbstractPlaylistEditorView.27=Preparar Fiesta
+AbstractPlaylistEditorView.29=Reproducción de la pista
+AbstractPlaylistEditorView.30=Mezcla la lista de reproducción
+
+StatView.0=Otros
+StatView.1=Géneros
+StatView.2=No hay datos disponibles
+StatView.3=Otras
+StatView.4=Tamaño por dispositivo (GB)
+StatView.5=No hay datos disponibles
+StatView.7=Tamaño de la colección por mes
+StatView.8=Meses
+StatView.9=Tamaño (GB)
+StatView.10=No hay datos disponibles
+StatView.12=Número total de pistas por meses
+StatView.13=Meses
+StatView.14=número de Pistas
+StatView.15=No hay datos disponibles
+StatView.16=Estadística
+StatView.24=Antiguas
+
+CDScanView.0=CD label :
+CDScanView.1=Etiqueta de CD. Ej: CD1, ROCK...
+CDScanView.2=Etiqueta de CD Ej: CD1, ROCK...
+CDScanView.3=Localización del CD :
+CDScanView.4=Localización donde se puede encontrar el CD. Ej: '/cdrom' en Unix, 'e:' en MS Windows...
+CDScanView.5=Localización donde se puede encontrar el CD. Ex: '/cdrom' on Unix, 'e:' under MS Windows...
+CDScanView.6=Analizar
+CDScanView.12=Analizar CD
+CDScanView.18=Analizar el CD y añadir automáticamente todos los ficheros de música a la colección
+CDScanView.19=Seleccionar localización del CD
+
+AbstractTreeView.0=Se derrumbo todo
+
+TracksTreeView.0=Arbol de pistas
+TracksTreeView.27=Colección
+TracksTreeView.31= pistas
+TracksTreeView.33=Exportar
+TracksTreeView.34=Obtener tags online
+TracksTreeView.35=Descubrir fecha
+TracksTreeView.36=menos de una semana
+TracksTreeView.37=menos de un mes
+TracksTreeView.38=menos de seis meses
+TracksTreeView.39=anterior
+TracksTreeView.40=menos de un año
+TracksTreeView.41=menos de dos años
+TracksTreeView.42=menos de cinco años
+TracksTreeView.43=menos de diez años
+TracksTreeView.44=menos de tres meses
+
+CoverView.2=Borrar del disco esta carátula
+CoverView.3=Carátula
+CoverView.4=Imagen anterior del disco y/o de la Web si la opción de Auto-Carátula está marcada
+CoverView.5=Imagen siguiente del disco y/o de la Web si la opción de Auto-Carátula está marcada
+CoverView.6=Grabar carátula con su nombre original
+CoverView.8=Usar esta carátula como la carátula por defecto de este álbum
+CoverView.10=Grabar carátula como
+CoverView.11=Carátula grabada
+
+AnimationView.0=Animación
+
+FilesTreeView.0=Árbol de archivos
+FilesTreeView.3=Copiar
+FilesTreeView.4=Cortar
+FilesTreeView.5=Pegar
+FilesTreeView.7=Borrar
+FilesTreeView.14=Desincronizar
+FilesTreeView.15=Resincronizar
+FilesTreeView.16=Crear Playlist
+FilesTreeView.28=Montar
+FilesTreeView.29=Desmontar
+FilesTreeView.30=Forzar Refrescar
+FilesTreeView.31=Sincronizar
+FilesTreeView.32=Probar
+FilesTreeView.40=Copiar
+FilesTreeView.41=Cortar
+FilesTreeView.42=Pegar
+FilesTreeView.47=Colección
+FilesTreeView.52= ficheros:
+FilesTreeView.53= GB
+FilesTreeView.54= MB
+FilesTreeView.55= Configurar dispositivo
+FilesTreeView.59=¿ Quieres ejecutar un refresco rápido o en profundidad (leer las tags otra vez) ?
+FilesTreeView.60=Rápido
+FilesTreeView.61=En profundidad
+FilesTreeView.62=Organizar ficheros
+
+TracksTableView.0=Tabla de pistas
+TracksTableView.7=Reproducir
+TracksTableView.8=Encolar
+TracksTableView.9=Reproducir aleatoriamente
+TracksTableView.10=Reproducir con repetición
+TracksTableView.11=Reproducir álbum
+TracksTableView.12=Reproducir autor
+TracksTableView.14=Propiedades
+TracksTableView.15=Añadir a Favoritos
+TracksTableView.16=Presione siguiente
+
+AbstractTableView.0=Filter:
+AbstractTableView.1=Property to filter
+AbstractTableView.3=Value used by the filter
+AbstractTableView.7=contains:
+AbstractTableView.8=Any
+AbstractTableView.10=(Not available)
+AbstractTableView.11=Make the table editable
+
+AboutView.7=Sobre
+AboutView.8=Licencia
+AboutView.9=Sistema
+AboutView.10=Sobre
+AboutView.11=<html>Copyright 2003-2012<br/>Jajuk team</html>"
+
+PhysicalPlaylistRepositoryView.2=Guardar como
+PhysicalPlaylistRepositoryView.9=Encolar
+
+FilesTableView.0=Tabla de archivos
+FilesTableView.15=Reproducir un directorio
+
+DeviceView.1=Eliminar un dispositivo desmontado (no borra nada del disco)
+DeviceView.2=Propiedades del dispositivo seleccionado
+DeviceView.8=Montar
+DeviceView.9=Desmontar
+DeviceView.10=Probar
+DeviceView.11=Forzar refrescar
+DeviceView.12=Sincronizar
+DeviceView.13=Eliminar dispositivo
+DeviceView.14=Configurar
+DeviceView.17=Nuevo
+DeviceView.18=Añadir un dispositivo
+DeviceView.21=Este dispositivo está disponible
+DeviceView.22=No se puede acceder al dispositivo
+DeviceView.23=Dispositivos
+
+JajukWindow.1=Unmute
+JajukWindow.2=Mute
+JajukWindow.3=Jajuk
+JajukWindow.4=Salir
+JajukWindow.5=Sobre Jajuk
+JajukWindow.6=Reproducir aleatoriamente
+JajukWindow.7=Reproducir Lo Mejor de
+JajukWindow.10=Pausa
+JajukWindow.12=Play
+JajukWindow.13=Anterior
+JajukWindow.14=Siguiente
+JajukWindow.15=Reproducir Novedades
+JajukWindow.16=Continuar album
+JajukWindow.17=Jajuk: Advanced Jukebox
+JajukWindow.18=Preparado para reproducción
+JajukWindow.19=Mute/Unmute
+JajukWindow.21=Salir
+JajukWindow.22=Sobre Jajuk
+JajukWindow.23=Reproducir aleatoriamente pistas de la colección entera
+JajukWindow.24=Reproducir las mejores pistas de la colección entera
+JajukWindow.26=Play/Pausa
+JajukWindow.27=Para
+JajukWindow.31=Reproducir novedades de la colección entera
+JajukWindow.32=Continuar album: acabar de reproducir este album
+JajukWindow.36=Ambiente actual:
+JajukWindow.37=Sin Ambiente seleccionado
+JajukWindow.40=Configuración de etiquetas adicionales
+JajukWindow.41=Abre un diálogo para configurar las etiquetas adicionales activadas
+
+JajukDonate.1=Donar
+JajukDonate.2=Jajuk proyectos de infraestructura necesita fondos, se puede aprender más sobre nuestra página de presupuesto.
+JajukDonate.3=Presupuesto
+JajukDonate.4=Si quieres apoyar Jajuk, por favor, haga una donación.
+
+ActiveTagsWizard.1=Etiquetas disponibles
+ActiveTagsWizard.2=Etiquetas activadas
+ActiveTagsWizard.3=Esto configura las etiquetas extras que desees que Jajuk visualiza. La informacion se lee directamente de los archivos de audio (de las etiquetas ID3, por ejemplo). Si se activa una nueva etiqueta, una renovación profunda se hace. Esto puede tomar algunos minutos dependiendo del tamaño de su colección.
+
+SimpleDeviceWizard.0=Creación rápida de dispositivo
+
+FirstTimeWizard.0=Inicio rápido
+FirstTimeWizard.1=<html><p><br>Bienvenido! Este asistente te ayudará en la creación de la colección.</p></html>
+FirstTimeWizard.2=<html>Selecciona la localización de la música</html>
+FirstTimeWizard.5=Por favor, escoger un directorio
+FirstTimeWizard.6=Preferencias avanzadas
+FirstTimeWizard.7=Establecer directorio de area de trabajo de Jajuk :
+FirstTimeWizard.8=Directorio seleccionado:
+FirstTimeWizard.9=Nada
+
+
+DownloadManager.0=<html>Jajuk necesita la contraseña de tu proxy HTTP para descargar carátulas<br>Si no las quieres, por favor cambia tu configuración en la pestaña Carátulas de la vista de Preferencias<br>Si no tienes proxy, cambia los ajustes en la pestaña de Red de la vista de Preferencias</html>
+
+PropertiesWizard.1=Propiedad
+PropertiesWizard.2=Valor
+PropertiesWizard.4=Enlace
+PropertiesWizard.6=Selección
+PropertiesWizard.8=Propiedad cambiada correctamente
+PropertiesWizard.10=Las propiedades se han cambiado
+PropertiesWizard.11=Escribiendo  tag a:
+PropertiesWizard.12=Enlaza un elemento dado a unas propiedades dadas
+PropertiesWizard.13=Copiar
+PropertiesWizard.14=Copia el valor en el portapapeles del sistema
+
+NewPropertyWizard.0=Crear propiedad de usuario
+NewPropertyWizard.3=(*)Tipo
+NewPropertyWizard.4=Formato
+NewPropertyWizard.5=Valor por defecto
+
+CustomPropertyWizard.0=(*)Item
+CustomPropertyWizard.1=(*)Nombre de propiedad de usuario
+
+RemovePropertyWizard.0=Borrar propiedad de usuario
+
+QualityFeedbackWizard.20=Una nueva ventana para enviar tu ticket se abrirá en el navegador externo. Tus últimas trazas anonimizadas han sido puestas en el portapapeles, Por favor pégalas en el campo descripción si es un informe de bug (esto incrementa las opciones para que podamos arreglar tu problema).
+
+IncRateAction.0=Incrementar valoración de la pista actual 
+
+SplashScreen.0=Controles iniciales
+SplashScreen.1=Cargando Colección
+SplashScreen.2=Iniciando motor musical
+SplashScreen.3=Iniciando interfaz gráfico
+
+CatalogView.0=Catálogo de Albums
+#Note: CatalogView.2 label musn't be mush larger than in english for correct display in 800x600
+CatalogView.2=Sin carátulas
+CatalogView.3=Refrescar catálogo
+CatalogView.4=Tamaño de miniaturas:
+CatalogView.5=Creada miniatura para:
+CatalogView.7=Seleccionar carátula
+CatalogView.11=Página:
+CatalogView.12=Mostar página anterior de miniaturas
+CatalogView.13=Mostar página siguiente de miniaturas
+CatalogView.14=Seleccionar página de miniaturas a mostrar
+CatalogView.15=Tamaño de miniatura:
+CatalogView.16=albums
+CatalogView.17=/pagina
+CatalogView.18=Selección de carátula
+CatalogView.19=Rehacer miniaturas
+CatalogView.20=Mostrar detalles
+CatalogView.21=Mostrar todos los álbumes
+CatalogView.22=Mostrar todos los álbumes con cubiertas
+
+WikipediaView.0=Wikipedia
+WikipediaView.1=Seleccionar Idioma:
+WikipediaView.3=Nada encontrado
+WikipediaView.5=Buscar por nombre de Artista
+WikipediaView.6=Buscar por nombre de Album
+WikipediaView.7=Buscar por título
+WikipediaView.8=Cargando
+WikipediaView.9=No se ha podido cargar la información de Wikipedia
+WikipediaView.10=No se puede buscar por artista desconocido.
+
+TipOfTheDayView.0=Consejo del día
+TipOfTheDayView.1=¿ Sabías... ?
+TipOfTheDayView.2=¿ Mostrar al inicio ?
+
+CDDBWizard.1=Archivo
+CDDBWizard.2=Nombre de pista actual
+CDDBWizard.3=Nombre de álbum actual
+CDDBWizard.4=Nombre de pista propuesto
+CDDBWizard.5=Nombre de álbum propuesto :
+CDDBWizard.12=No encontrada coincidencia !
+CDDBWizard.17=Encontrada coincidencia exacta !
+CDDBWizard.18=Coincidencias
+CDDBWizard.19=Obtener Tags Online
+
+RefactorWizard.0=Fichero movido : 
+
+DigitalDJWizard.0=Seleccionar el nuevo modo de DJ
+DigitalDJWizard.1=Programación basada en transiciones (ROCK -> POP)
+DigitalDJWizard.2=Programación basada en proporciones (20% JAZZ, 30% ROCK)
+DigitalDJWizard.3=Programación basada en ambientes (Suave, Fiesta, ...)
+DigitalDJWizard.4=Asistente de DJ Digital
+DigitalDJWizard.5=Configuración general del DJ
+DigitalDJWizard.6=Nombre del DJ (*)
+DigitalDJWizard.8=Nivel de puntuación:
+DigitalDJWizard.9=Cross fade (sec):
+DigitalDJWizard.10=Pistas solo reproducidas una vez
+DigitalDJWizard.14=Selección de Estilos (Se puede hacer selecciones múltiples)
+DigitalDJWizard.16=¿ Quieres ?
+DigitalDJWizard.17=¿ Crear un nuevo DJ ?
+DigitalDJWizard.18=¿ Cambiar un DJ existente ?
+DigitalDJWizard.19=¿ Borrar un DJ ?
+DigitalDJWizard.20=Nuevo DJ basado en transiciones 
+#limited string size
+DigitalDJWizard.21=Borrar 
+#limited string size
+DigitalDJWizard.22=Origen
+#limited string size
+DigitalDJWizard.23=Destino
+#limited string size
+DigitalDJWizard.24=Nb
+DigitalDJWizard.26=Por favor, crea almenos una transición
+#limited string size
+DigitalDJWizard.27=Selección de géneros
+#limited string size
+DigitalDJWizard.28=%
+DigitalDJWizard.29=DJ basado en proporciones
+DigitalDJWizard.30=Por favor, crea almenos una proporción
+DigitalDJWizard.31=DJ basado en ambiente
+DigitalDJWizard.32=Nuevo ambiente
+DigitalDJWizard.33=Crear un nuevo ambiente
+DigitalDJWizard.34=Borrar ambiente
+DigitalDJWizard.35=Borrar el ambiente seleccionado
+DigitalDJWizard.36=Nombre del ambiente
+DigitalDJWizard.37=Nombre
+DigitalDJWizard.38=Por favor, crea almenos un ambiente
+DigitalDJWizard.39=Por favor, rellena el nombre y selecciona los estilos del ambiente
+DigitalDJWizard.40=Por favor, selecciona un DJ
+DigitalDJWizard.41=Por favor, pon el nombre al DJ
+DigitalDJWizard.42=Un DJ con este nombre ya existe
+DigitalDJWizard.43=Cambiar DJ
+DigitalDJWizard.44=Seleccionar el DJ a configurar
+DigitalDJWizard.45=Selección de acción
+DigitalDJWizard.46=Selección del tipo de DJ
+DigitalDJWizard.47=Por favor, selecciona o crea un ambiente
+DigitalDJWizard.48=Atributos Generales
+DigitalDJWizard.49=Por favor, rellena los atributos generales del DJ
+DigitalDJWizard.50=Por favor, define proporciones
+DigitalDJWizard.51=Borrar DJ
+DigitalDJWizard.52=Por favor, define transiciones
+DigitalDJWizard.53=Número mínimo de estrellas de puntuación para pistas de la selección (1: todas las pistas)
+DigitalDJWizard.54=Duración de Cross fade entre pistas
+DigitalDJWizard.55=Si está marcado, la selección contendrà cada pista solo una vez
+DigitalDJWizard.56=Asistente de Ambientes
+DigitalDJWizard.57=Administrar Ambientes
+DigitalDJWizard.58=Selección de Ambientes:
+DigitalDJWizard.59=La suma de todas las proporciones tendria que ser < 100 %
+DigitalDJWizard.60=Nombre de ambiente existente
+DigitalDJWizard.61=Borrar DJ
+#limited string size
+DigitalDJWizard.62=Por defecto
+DigitalDJWizard.63=Añadir ambientes por defecto
+DigitalDJWizard.64=Cualquiera
+DigitalDJWizard.66=Selección de Ambiente por defecto
+DigitalDJWizard.67=Limite el número de pistas a la cola
+DigitalDJWizard.68=El número máximo de pistas a la cola
+
+PreparePartyWizard.1=Prepare Fiesta
+PreparePartyWizard.2=Seleccione la fuente para las pistas
+PreparePartyWizard.3=Primero defina pistas de su fiesta
+PreparePartyWizard.4=Seleccione los límites
+PreparePartyWizard.5=Por favor define restricciones
+PreparePartyWizard.6=DJs
+PreparePartyWizard.7=Ambientes
+PreparePartyWizard.8=Listas de reproducción
+PreparePartyWizard.9=Pistas azar
+PreparePartyWizard.10=Pistas máxima
+PreparePartyWizard.11=Cuántas pistas para incluir al máximo.
+PreparePartyWizard.12=Tamaño máximo (MB)
+PreparePartyWizard.13=Cuántos megabytes de data que desea crear al máximo.
+PreparePartyWizard.14=Longitud máxima (Minutes)
+PreparePartyWizard.15=Cuántas largo del partido resultante debe ser al máximo.
+PreparePartyWizard.16=Restringir el tipo
+PreparePartyWizard.17=Elija utilizar un solo tipo de archivos de audio. Esto puede ser útil, si un reproductor de audio sólo es compatible con ciertos tipos de archivos.
+PreparePartyWizard.18=Elegir la localidad
+PreparePartyWizard.19=Seleccione la ubicación donde están almacenados los archivos de la fiesta. Se crea un subdirectorio para los archivos.
+PreparePartyWizard.20=Seleccione la ubicación de destino, por favor.
+PreparePartyWizard.21=Directorio seleccionado:
+PreparePartyWizard.22=Seleccione el directorio de destino, por favor.
+PreparePartyWizard.23=Los archivos se han copiado en
+PreparePartyWizard.24=Lista de reproducción Best Of
+PreparePartyWizard.25=Lista de reproducción Novelties
+PreparePartyWizard.26=Normalizar los nombres de archivo
+PreparePartyWizard.27=Normalizar los nombres de archivo para reemplazar caracteres extranjeros para que el archivo sea portable a través de los sistemas operativos y diferentes codificaciones
+PreparePartyWizard.31=Ubicación de destino:
+PreparePartyWizard.32=Archivos en cola
+PreparePartyWizard.33=Archivos favoritos
+PreparePartyWizard.34=Trata de convertir otros tipos de medios
+PreparePartyWizard.35=Utiliza la herramienta externa 'pacpl - Perl Audio Converter' para convertir los archivos de audio si es necesario
+PreparePartyWizard.36= archivo(s) no se pudo(ieron) convertir en el formato seleccionado.
+PreparePartyWizard.37=<html> (requiere pacpl, consulte <a href="http://jajuk.info/index.php/Installing_Perl_Audio_Converter"> Perl Audio Converter </ a>) </ html>
+PreparePartyWizard.38=Configura las opciones de conversión
+PreparePartyWizard.39=<html> Define el comando para iniciar el Perl Audio Converter. <br/> En Linux esto es a menudo simplemente "pacpl" o "perl <install-location> / pacpl. <br/> En Windows esto es por lo general" perl <install-location> \ pacpl </ html>
+PreparePartyWizard.40=Configura...
+
+Ambience.0=Rock/Pop
+Ambience.1=Rap
+Ambience.2=HardRock
+Ambience.3=Techno
+Ambience.4=Electro
+Ambience.5=Classical
+Ambience.6=Soft
+Ambience.7=Party
+Ambience.8=Jazz
+Ambience.9=World
+Ambience.10=Others
+Ambience.11=Folk/Oldies
+Ambience.12=Inde
+Ambience.13=Latin
+
+DebugLogAction.0=Listar trazas de Debug
+DebugLogAction.1=Refrescar
+DebugLogAction.2=Copiar al portapapeles
+
+CopyClipboardAction.0=Copia la dirección al portapapeles
+
+LaunchInBrowserAction.0=Lanzar dirección en el navegador del sistema
+
+ReportAction.0=Informe creado satisfactoriamente 
+ReportAction.1=Informe de Música Jajuk
+ReportAction.2=Por favor, por el cuidado del medio ambiente,  no imprimas si no es necesario
+ReportAction.3=Lista de Albums
+ReportAction.4=Pistas por Album
+ReportAction.5=Lista de Artistas
+ReportAction.6=Álbums por artistas
+ReportAction.7=Lista de Géneros
+ReportAction.8=Albums por género
+ReportAction.9=Autores/ albums por género
+ReportAction.10=Lista de Directorios
+ReportAction.11=Archivos por directorio
+ReportAction.12=Nombre de archivo
+ReportAction.13=Nombre de pista
+ReportAction.14=Lista de Dispositivos
+ReportAction.15=Directorios por dispositivo
+ReportAction.16=Directorios/ archivos
+ReportAction.17=colección
+ReportAction.18=Autores/ albums/ pistas por estilo
+ReportAction.19=Ir a:
+
+ActionMove.0=Pegar
+
+ActionRefresh.0=Forzar Refrescar
+
+RenameAction.0=Renombrar
+RenameAction.1=Por favor, entra el nuevo nombre para este archivo:
+RenameAction.2=Por favor, entra el nuevo nombre para este directorio:
+
+NewFolderAction.0=Nueva Carpeta
+NewFolderAction.1=Por favor, entra el nuevo nombre para esta carpeta:
+NewFolderAction.2=Una carpeta con el mismo nombre ya existe.
+
+LyricsView.0=Letra
+LyricsView.1=No hay letras, acceso al Internet discapacitado, utiliza el menú de configuración para habilitarla.
+LyricsView.2=Entre en el modo de edición de letras
+LyricsView.3=Sale en el modo de edición de letras
+LyricsView.4=Guardar letras
+LyricsView.5=Eliminar letras
+
+ActionDelete.0=Ficheros borrados
+ActionDelete.1=Directorios borrados
+
+FindDuplicateFilesAction.0=No se encontraron ficheros duplicados.
+FindDuplicateFilesAction.1=Encontrar ficheros duplicados
+FindDuplicateTracksAction.3=Lista de las pistas duplicadas encontradas
+FindDuplicateTracksAction.4=Seleccione todas las pistas duplicadas
+
+RefreshDialog.1=Actualizando dispositivo
+RefreshDialog.2=Actualizando dispositivo: 
+RefreshDialog.3=Limpiando los archivos antiguos
+
+UpdateManager.0=Una nueva versión de Jajuk (
+UpdateManager.1=) se ha encontrado, puedes decargarla desde http://jajuk.info
+UpdateManager.2=No hay nueva versión por ahora
+
+SuggestionView.0=Sugerencias
+SuggestionView.1=Preferidas
+SuggestionView.2=Nuevos
+SuggestionView.3=Otros albums
+SuggestionView.4=Artistas similares
+SuggestionView.5=Raramente escuchadas
+SuggestionView.7=<html><b>Nada que mostrar</b><br><br><i>La información de Last.FM se muestra solo si:<ul><li>Una pista está reproduciéndos</li><li>El autor de la pista es conocido (tag correcta)</li><li>La opción "Habilitar consultas a Last.FM" está marcada en la vista de Preferencias / pestaña Last.FM</li></ul></i></html>
+
+AbstractThumbnail.0=Abrir la página LAST.FM
+
+AlbumsTableView.0=Tabla de Albums
+AlbumsTableView.1=No de pistas
+
+AlarmClock.0=Establecer nueva alarma
+
+AlarmDialog.0=Tiempo (HH:MM:SS)
+AlarmDialog.1=Hora
+AlarmDialog.2=Minutos
+AlarmDialog.3=Segundos
+AlarmDialog.4=Acción de la alarma
+AlarmDialog.5=Seleccionar acción de la alarma
+
+ShowPropertiesAction.0=Muestra propiedades del objeto
+
+QueueView.1=Vaciar la cola
+QueueView.2=Desplácese tabla automáticamente a la pista reproducida actual
+QueueView.3=Deje de jugar cuando la pista actual termine
+
+JajukSlimWindow.0=Mostrar/ocultar Jajuk slimbar
+
+JajukFullscreen.0=Activar/Desactivar el reproductor a pantalla completa
+
+BanSelectionAction.0=Bloquear
+BanSelectionAction.1=Bloquear el elemento para que nunca se seleccione
+
+UnBanSelectionAction.0=Desbloquear
+UnBanSelectionAction.1=Desbloquear elemento(s) para volver a ser propuestos
+
+OpenExplorerAction.0=Abrir con el explorador
+OpenExplorerAction.1=Abra el directorio con un programa explorador externo
+
+Preference.0=<html>Asigna una preferencia personal a la pista actual<br>Es tomada en cuenta para el cálculo de la valoración final</html>
+Preference.1=Basura
+Preference.2=Pobre
+Preference.3=Medio
+Preference.4=Bueno
+Preference.5=Excelente
+Preference.6=Clásico
+Preference.7=Preferencias...
+Preference.8=Sin preferencia
+
+ArtistView.0=Vista Artista
+
+Notificator.NONE=Nada
+Notificator.TOAST=Brindis
+Notificator.BALLOON=Globo
+Notificator.track_change.webradio_title=Radio Internet lanzada : 
+Notificator.track_change.track_title=Pista lanzada : 
+
+SyncTreeTableAction.0=Sincronizar vista de árbol y de tabla
+SyncTreeTableAction.1=<html> Sincronizar árbol y vistas de tabla <br/> Cuando se utiliza en una vista de árbol, seleccione un elemento en una vista de tabla se expandirá y desplazar el elemento en el árbol. <br/> Cuando se utiliza en una vista de tabla, seleccionando un elemento en una vista de árbol filtrará la tabla correspondiente. </ html>
+
+ShowCurrentlyPlayingAction.0=Mostrar en el área de notificación cual título se está reproduciendo
+ShowCurrentlyPlayingAction.1=Si está activada en la configuración, esta acción se mostrará una ventana de notificación que muestra información sobre la pista que se está reproduciendo.
+
+ExportRatingsAction.1=Exportar calificaciones
+ExportRatingsAction.2=Escribe notas de todas las pistas en un archivo para que pueda importarlo a otra instalación de Jajuk que tiene los mismos archivos
+ExportRatingsAction.3=Elige el archivo XML done quieres exportar las calificaciones, por favor
+
+ImportRatingsAction.1=Importar calificaciones
+ImportRatingsAction.2=Lea en las calificaciones que se exportaron de otra instalación de Jajuk. La calificación de todos los archivos que coincidan se actualizará.
+ImportRatingsAction.3=Elige el archivo XML done quieres importar las calificaciones, por favor
+
+WebRadioView.0=Web Radios
+WebRadioView.1=Webradio
+WebRadioView.2=Origen
+WebRadioView.8=Nueva webradio
+WebRadioView.10=Actualizar presets
+WebRadioView.11=Actualizar presets webradios del sitio web Jajuk (guarda palabras clave personalizadas).
+
+TipOfTheDay.0=    Tip 0: Qué puedes repetir la pista actual desde el inicio con  [Control-Left click] o {right click] al botón de Rewind en el  panel de Control o en la bandeja del sistema  ?
+TipOfTheDay.1=    Tip 1: Qué puedes repetir el álbum actual desde la primera pista con  [Control-Left click] o {right click] al botón Anterior en el  panel de Control o en la bandeja del sistema  ?
+TipOfTheDay.2=    Tip 2: Qué puedes añadir elementos aleatorois a la lista de reproducción (playlist)  usando el botón  ? en el editor de playlist ?
+TipOfTheDay.3=    Tip 3: Qué puedes obtenerr carátulas de internet incluso detrás de un proxy usando la pestaña de Red em la vista de Configuración ?
+TipOfTheDay.4=    Tip 4: Qué puedes guardar les carátulas obtenidas desde internet para acelerar la navegación en la vista de carátulas utilitzando la opción de precargar les carátulas en la pestaña de carátulas  a la vista de configuración ?
+TipOfTheDay.5=    Tip 5: Qué puedes ocultar las pistas no disponibles a la aplicación utilitzando la opción Mostrar solo dispositivos montados en la pestaña de opciones de la vista de configuración ?
+TipOfTheDay.6=    Tip 6: Qué puedes reducir el tamaño de la colección para caràcteres asiáticos selecciondo UTF-16 como encodding en la Vista de Configuración / Pestaña Avanzado ?
+TipOfTheDay.7=    Tip 7: Qué puedes arrastrar i soltar elementos de las vistas de árbol a las playlist del editor de playlist o del repositorio de playlist  ?
+TipOfTheDay.8=    Tip 8: Qué puedes escuchar el principio de las pistas usando el modo  intro ?
+TipOfTheDay.9=    Tip 9: Qué puedes configurar la duración de la atenuación en la vista de Preferencias / pestaña de Opciones ?
+TipOfTheDay.10=   Tip 10: Qué puedes iniciar jajuk en modo reducido desmarcando la opción Mostrar jajuk al inicio en el area de noticación ?
+TipOfTheDay.11=   Tip 11: Qué puedes controlar las principales funciones de jajuk usando solo el icono en el area de notificación (solo Linux y Windows) ?
+TipOfTheDay.12=   Tip 12: Qué el aspecto (look and feel) de Jajuk es configurable en la vista de Preferencias / pestaña de Opciones ?
+TipOfTheDay.13=   Tip 13: Qué puedes configurar el comportamiento del doble click y del drag & drop  (push y play) en la vista de Preferencias / pestaña de Opciones ?
+TipOfTheDay.14=   Tip 14: Qué las pistas "planificadas" de  Jajuk son pistas que sonarán después de la selección actual ?
+TipOfTheDay.15=   Tip 15: Qué la interfaz gráfica de Jajuk es completamente dockable y que se pueden reorganizar las vistas con drag and drop ?
+TipOfTheDay.16=   Tip 16: Qué se puede obtener el número total de archivos y pistas seleccionando el nodo "colección" en las vistas física o lógica ?
+TipOfTheDay.17=   Tip 17: Qué puedes obtener tags online con la función "Obtener tags online" en directorios de la vista física ?
+TipOfTheDay.18=   Tip 18: Qué la barra de histórico de Jajuk (arriba de la ventana) muestra todas las pistas que sonaron anteriormente ?
+TipOfTheDay.19=   Tip 19: Qué puedes hacer búsquedas rápidas usando el cuadro de búsqueda (arriba de la ventana) ?
+TipOfTheDay.20=   Tip 20: Qué puedes reportar bugs o nuevas funcionalidades usando el agente de calidad  (Ayuda -> Comunicar un problema) ?
+TipOfTheDay.21=   Tip 21: Qué los DJs de Jajuk pueden crear playlists inteligentes siguiendo tus reglas ?
+TipOfTheDay.22=   Tip 22: Qué puedes obtener las letras usando la "Vista de letras" ?
+TipOfTheDay.23=   Tip 23: Qué la vista de Sugerencias muestra información de LAST.FM como artistas similares ?
+TipOfTheDay.24=   Tip 24: Qué se puede añadir cualquier vista a una perspectiva usando la barra de menú de "Vistas" ?
+TipOfTheDay.25=   Tip 25: Qué puedes establecer una imagen de fondo escogida en la vista de Preferencias / pestaña GUI ?  
+TipOfTheDay.26=   Tip 26: Qué puedes mostrar/esconder los dispositivos desmontados con un click en la barra de menu "Modos" ? 
+TipOfTheDay.27=   Tip 27: Qué puedes escoger el directorio para los datos de Jajuk (como un disco externo) para guardar tus datos y preferencias en cualquier ordenador (ver pestaña "Avanzado" en la vista de Preferencias) ?
+TipOfTheDay.28=	  Tip 28: Qué puedes añadir cualquier vista a cualquier perspectiva utilizando la barra de menu de "Vistss" ?
+TipOfTheDay.28=   Tip 28:  usted puede lanzar una página de la wikipedia en su navegador predeterminado mediante la "dirección de lanzamiento en el navegador predeterminado" icono <a href = título "../images/3/30/Launch_16x16.png" = "Imagen: launch_16x16.png" class = "interno "> <img src='../images/3/30/Launch_16x16.png' alt="Image:launch_16x16.png"/> </ a>
+TipOfTheDay.29=   Tip 29:  Jajuk soporta radios web <a href="../images/9/9d/Webradio_32x32.png" title="Image:webradio_32x32.png" class="internal"> <img src = '../images/9/9d / Webradio_32x32.png "alt =" Imagen: webradio_32x32.png "/> </ a>
+TipOfTheDay.30=   Tip 30:  Jajuk puede controlarse a distancia mediante el uso de D-Bus, si está disponible en la plataforma actual (es decir, no en Windows). Esto permite utilizar las teclas multimedia del teclado para controlar Jajuk. Mira el manual en línea para obtener más información.
+TipOfTheDay.31=   Tip 31:  Pruebe la normalización de audio de ficha de la vista / sonido Preferencia para mantener el nivel de sonido igual entre pistas
+TipOfTheDay.32=   Tip 32:  Puede exportar pistas y generar listas de reproducción de su colección agradece la característica Parte prepare
+TipOfTheDay.33=   Tip 33:  Un solo clic izquierdo sobre la imagen de la portada de la cubierta Ver switches de 3D a pantalla 2D.
+
+]]></body>
+
diff --git a/src/main/java/org/jajuk/i18n/jajuk_fr.properties b/src/main/resources/org/jajuk/i18n/jajuk_fr.properties
similarity index 88%
rename from src/main/java/org/jajuk/i18n/jajuk_fr.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_fr.properties
index 830d704..3705cfa 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_fr.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_fr.properties
@@ -2,9 +2,9 @@
 <body><![CDATA[
 #Module de langue français pour Jajuk
 #Auteur: Bertrand Florat
-#Copyright 2003-2011 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
-#FROM en 6168
-#$Revision$
+#Copyright 2003-2012 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
+#FROM en 2012-07-14 22:04:05
+#
 
 #--- Generic labels ---
 #DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -29,9 +29,7 @@ Later=Plus tard
 Stop=Arrêt
 Delete=Effacer
 Default=Default
-All=Tous
 YestoAll=Oui à tous
-Maximize=Maximizer
 Purge=Purger
 
 #--- Wizard Strings --- 
@@ -55,7 +53,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Playliste Monkey's Audio format
 Type.mac=Monkey's Audio
 Type.radio=WebRadio
 Type.video=Video
@@ -66,7 +63,6 @@ unknown_artist=Inconnu
 unknown_album=Inconnu
 unknown_genre=Inconnu
 unknown_year=Inconnue
-unknown_album-artist=Inconnu
 
 various_artist=Artistes divers
 
@@ -74,7 +70,7 @@ Note.0=Jajuk a detecté une mise à jour majeure. Vos perspectives ont été rei
 Note.1=Le système de notation de Jajuk a changé (Voir le manuel). Vos notes ont été migrées vers une echelle de 0 à 100 mais nous préconisons de reinitialiser toutes les notes : dans la vue Preferences -> onglet Historique (attention, toutes les notations existentes seront supprimées)
 
 Confirmation_exit=Voulez-vous vraiment quitter?
-Confirmation_delete=Attention! Vous êtes sur le point d'effacer physiquement le(s) fichier(s) suivants de votre disque, êtes vous sûr ?
+Confirmation_delete=Attention! Vous êtes sur le point d'effacer définitivement le(s) fichier(s) suivants de votre disque, êtes vous sûr ?
 Confirmation_void_refresh=Attention! Vous allez rafraîchir un support vide. Sous Unix, vérifiez que le support est monté ou vous allez perdre toutes les informations Jajuk sur ce support. Confirmez-vous l’action ?
 Confirmation_remove_device=Voulez vous vraiment enlever ce support ?
 Confirmation_delete_cover=Voulez vous vraiment effacer définitivement cette pochette de votre disque ?
@@ -82,16 +78,16 @@ Confirmation_clear_history=Voulez vous vraiment effacer l'historique ?
 Confirmation_reset_ratings=Voulez vous vraiment remettre tous les notes à zéro ?
 Confirmation_refactor_files=Voulez vous vraiment renommer les fichiers sélectionnés ?
 Confirmation_restore_all=La réinitialisation de toutes les perspectives nécessite un redémarrage de Jajuk, Voulez vous quitter maintenant ?
-Confirmation_defaults_radios=Cette opération supprimera toutes vos stations déjà créées, confirmez-vous ?
 Confirmation_delete_files=Voulez vous vraiment effacer ces fichiers définitivement ?
 Confirmation_delete_dirs=Voulez vous vraiment effacer ces répertoires définitivement ?
-Confirmation_delete_empty_dirs=Les répertoires suivants sont vides, voulez vous les effacer ?
+Confirmation_delete_empty_dirs=Les répertoires suivants sont vides, voulez vous les effacer définitivement ?
 Confirmation_file_overwrite=Le fichier existe déjà, voulez vous l'écraser ?
-Confirmation_file_number=fichiers(s) seront effacés  	 
-Confirmation_alarm_stop=Voulez vous vraiment arrêter cette alarme ?	  
+Confirmation_file_number=fichiers(s) seront effacés définitivement 	 
 Confirmation_defaults=Notez que cette action réinitialisera toutes les options, et pas seulement celles de l'onglet courant. Confirmez-vous l'action ?
 Confirmation_rebuild_thumbs=Cette action reconstruira les vignettes de tous vos albums, ce qui peut prendre plusieurs minutes pour les grosses collections, confirmez-vous ?
 Confirmation_reset_preferences=Confirmez-vous la réinitialisation des preferences de tous vos morceaux ?
+Confirmation_reset_ratings_overwrite=Confirmez vous le remplacement des notations existantes par celles du fichier importé ?
+Confirmation_tag_write=Confirmez-vous l'écriture sur disque d'un ou plusieurs tags ?
   	
 Device_type.directory=Répertoire
 Device_type.file_cd=CD de fichiers musicaux
@@ -105,7 +101,6 @@ Perspective_Description_Files=Fichiers
 Perspective_Description_Tracks=Morceaux
 Perspective_Description_Configuration=Config
 Perspective_Description_Statistics=Stats
-Perspective_Description_Help=Aide
 Perspective_Description_Display=Affichage
 Perspective_Description_Albums=Albums
 Perspective_Description_Info=Info
@@ -141,7 +136,7 @@ Property_rate=Note
 Property_files=Fichiers
 Property_hits=Lectures
 Property_filename=Fichier
-Property_date=Date
+Property_date=Date création
 Property_added=Date découverte
 Property_parent=Répertoire parent
 Property_device=Support
@@ -165,6 +160,11 @@ Property_pf=Préférence
 Property_tpt=Temps total de lecture (secs)
 Property_ban=Banni
 Property_disc_id=DiscID
+Property_keywords=Mot clé
+Property_label=Description
+Property_bitrate=Bitrate (kbps)
+Property_frequency=Frequence (Hz)
+Property_origin=Origine
 
 Language_desc_en=Anglais
 Language_desc_fr=Français
@@ -197,16 +197,12 @@ Error.017=Erreur en lisant la liste de lecture
 Error.018=Aucun morceau n'est accessible
 Error.019=Un support portant ce nom existe déjà
 Error.020=Erreur d'entrée/sortie en copiant un fichier, vérifiez l'espace disque
-Error.021=Le champs 'url' est obligatoire Ex: 'd:\musique' sous MS Windows, '/home/foo/musique' sous Unix 
-Error.022=Le champs 'nom' est obligatoire. Ex: 'Disque dur', 'CD ROCK' 
 Error.024=Impossible d'écrire le fichier
 Error.025=Un des fichiers que vous désirez lire se trouve sur un support non monté
 Error.026=Erreur en enregistrant un lecteur de musique
 Error.027=Synchronisation annulée
 Error.028=Erreur en sauvegardant la liste de lecture
-Error.029=Il existe un support existant qui a le même chemin, qui est un sous répertoire  ou qui est un répertoire parent
 Error.030=Dépassement du nombre d'erreurs de connexions, Jajuk stoppe les recherches de pochettes en ligne
-Error.101=Le support n'existe pas ou n'est pas accessible
 Error.102=Erreur
 Error.103=Erreur en lisant un tag
 Error.104=Erreur en écrivant un tag
@@ -214,43 +210,36 @@ Error.105=La clé du  Ressource Bundle ne peut être trouvée
 Error.106=Exception non traitée
 Error.107=Support déjà en cours de rafraîchissement ou de synchronisation
 Error.108=Erreur en lisant le fichier perspective
-Error.109=Une classe d'implémentation d'un lecteur ou d'un lecteur de méta-information est introuvable
 Error.110=Ce nom d'attribut est réservé par Jajuk, merci d'en choisir un autre
 Error.111=Support déjà monté
 Error.112=Impossible de monter le support
 Error.113=Impossible d'écrire la configuration utilisateur
 Error.114=Impossible de lire la configuration utilisateur
-Error.118=Erreur en traitant un événement
 Error.119=Pas de fichier d'historique ou erreur en l'ouvrant
 Error.120=Impossible d'accéder au support : soit il n'est pas monté, soit il est en cours de rafraîchissement ou de synchronisation
 Error.121=Le support est en cours d'utilisation et ne peut être démonté
 Error.122=Erreur dans la pile 
-Error.123=Erreur en fixant le thème
-Error.124=Une autre session Jajuk a été trouvée, vous ne pouvez lancer qu'une seule session par machine en même temps
 Error.125=Support déjà démonté
 Error.126=L'avance rapide n'est pas supportée par ce format audio
 Error.127=Aucune nouveauté pour le l'intervalle de temps demandé, vous pouvez le changer dans la vue Paramétrage / onglet Options
 Error.128=Le morceau courant est le tout premier de la collection, pas de morceau précédent disponible
-Error.129=Erreur en chargeant l'image
 Error.131=Impossible d'effacer le fichier
 Error.133=Votre collection était corrompue pour une raison inconnue, Jajuk a pu restaurer la sauvegarde
 Error.134=Impossible de renommer le fichier
 Error.135=Le fichier n'existe pas
 Error.136=L'opération a échouée
 Error.137=Erreur de format
-Error.138=Certains fichiers référencés par ce morceau sont situés sur des supports non montés et n'ont donc pas été modifiés.
 Error.140=Mauvais format: ne doit pas contenir les caractères < > & ' "
 Error.141=Cette liste de lecture se trouve sur un support non monté ou en cours de rafraîchissement et n'est donc pas accessible
 Error.142=Cette liste de lecture contient des morceaux ignorés n'existant pas ou se trouvant en dehors des supports connus
 Error.143=Le chemin du support n'est pas accessible
 Error.144=Erreur en lisant le DJ
 Error.145=Impossible d'écrire le DJ
-Error.146=<html>Le format du canevas de réorganisation de fichiers est erroné.<br>Les éléments valides sont : %artist (nom de l'auteur); %title (nom du morceau); %album (nom de l'album);<br> %n (no de piste); %genre (style); %year (année); %disc (No de disque)<br> et le format doit contenir au moins un '/'</html>
+Error.146=<html>Le format du canevas de réorganisation de fichiers est erroné.<br>Les éléments valides sont : %artist (nom de l'auteur); %title (nom du morceau); %album (nom de l'album);<br> %n (no de piste); %genre (style); %year (année); %disc (No de disque); %Nom_attribut_personnalisé<br> et le format doit contenir au moins un '/'</html>
 Error.147=Certains fichiers n'ont pu être déplacés (Faire détail pour voir la liste)
 Error.148=Le champs Année n'est pas renseigné
 Error.149=Le champs Album n'est pas renseigné
 Error.150=Le champs Artiste n'est pas renseigné
-Error.151=Le champs Titre n'est pas renseigné
 Error.152=Le champs Numéro n'est pas renseigné
 Error.153=Le champs Style n'est pas renseigné
 Error.154=Impossible de renommer le fichier, vérifiez les caractères dans le nom du fichier ou dans les tags
@@ -262,22 +251,20 @@ Error.159=L'ambiance associée ne peut être supprimée
 Error.160=Fichier non déplacé, source et destination identique
 Error.161=Impossible d'écrire dans le répertoire, vérifiez les permissions
 Error.163=Erreur en restaurant la disposition par défaut
-Error.164=Aucun morceau accessible pour l'ambiance:
 Error.165=Chemin erroné, le répertoire ne peut être trouvé ou n'est pas accessible en écriture
 Error.166=Album vide, impossible de récupérer de pochette
 Error.167=Impossible de créer le rapport
-Error.168=Aucun fichiers doublons trouvés
-Error.169=L'opération a échoué. Notez que cette opération nécessite un accès Internet pour récupérer la liste de webradios en ligne.
-Error.170=Erreur en lançant la webradio
 Error.171=Aucune source de synchronisation n'est encore définie pour ce support, fixez en double cliquant sur le support dans la vue Supports.
 Error.172=Le morceau en cours de lecture ainsi que ses répertoires parents ne peuvent être supprimés :
-Error.173=Erreur en supprimant le(s) répertoire(s) suivant(s) :
 Error.174=Erreur en accédant au site Freedb, vérifiez votre connexion réseau 
-Error.175=Opération annulée
 Error.176=Erreur en générant la liste de lecture
 Error.177=Veuillez saisir une heure valide au format HH24:MM:SS
 Error.179=Impossible d'ouvrir d'explorer de fichiers, vous pouvez fixer un chemin vers l'outil dans la vue Préférences / Onglet Avancé
-Error.180=Erreur en copiant les fichiers
+Error.180=Erreur en copiant les fichiers*
+Error.181=Impossible de trouver le fichier spécifié
+Error.182=Impossible d'accéder au chemin de configuration spécifié, le repertoire personnel de l'utilisateur sera utilisé. Si nécéssaire, veuillez changer ce chemin dans la vue "Preferences" / onglet "Avancé"
+Error.183=Le champs ne peut être vide
+Error.184=Erreur : l'interval de rafraîchissement doit être zero ou un nombre >= 0.5
 
 # Warnings
 Warning.0=MPlayer n'a pas été trouvé. Certains formats audio (flac, wma, aac, mpg2 et certaines fonctions des ogg) seront inactivés. Si Mplayer est déjà installé, fixez son chemin dans la vue "Préférence" / onglet "Avancé"
@@ -313,8 +300,6 @@ ParameterView.29=Avant de quitter Jajuk
 ParameterView.30=Demander avant de quitter Jajuk
 ParameterView.33=Options
 ParameterView.35=Cacher les fichiers situés sur des supports non montés
-ParameterView.36=Redémarrer la collection en arrivant au bout
-ParameterView.37=Revenir au début quand on atteint la fin de la collection en mode 'continue'
 ParameterView.38=Langue : 
 ParameterView.42=Options de multi-langue
 ParameterView.43=Thème : 
@@ -335,8 +320,6 @@ ParameterView.85=Appliquer
 ParameterView.86=Défauts
 ParameterView.87=Préférences
 ParameterView.98=Modèles
-ParameterView.99=Forcer la relecture des tags
-ParameterView.100=<html>Force Jajuk à relire les tags id3 lors du rafraîchissement<p>Ce peut être utile si vous avez modifié entre temps les tags avec un autre outil</html>
 ParameterView.101=Utiliser le répertoire comme album
 ParameterView.102=Utiliser le répertoire parent comme nom d'album si ce dernier ne peut être déterminé par les tags
 ParameterView.109=Préférences sauvegardées
@@ -348,7 +331,6 @@ ParameterView.114=Utiliser les expressions régulières (au format regexp) dans
 ParameterView.115=Avancé
 ParameterView.116=Sauvegarde de la collection
 ParameterView.117=Cochez si vous voulez sauvegarder votre fichier collection vers des fichiers collection-<date>.xml
-ParameterView.118=Taille de la sauvegarde (Mo)
 ParameterView.119=Taille totale cumulée de la sauvegarde (Mo)
 ParameterView.120=Encodage de la collection
 ParameterView.121=Encodage de la collection. L'UTF-16 est optimisé pour les langages asiatiques et non européennes et l'UTF-8 est optimisé pour les langues européennes
@@ -378,14 +360,10 @@ ParameterView.158=Précision élevée (cherche tous les groupes de mots et tous
 ParameterView.159=Pochettes
 ParameterView.160=Timeout de la connexion (sec)
 ParameterView.161=Timeout de la connexion (secs) : l'opération échoue si la machine distante ne répond pas dans ce temps
-ParameterView.162=Timeout du transfert (sec)
-ParameterView.163=Timeout du transfert (sec) : l'opération échoue si les données ne sont pas complètement transférées dans ce temps
 ParameterView.164=Avant d'enlever un support
 ParameterView.165=Demande avant d'enlever un support
 ParameterView.166=Pochettes aléatoires
 ParameterView.167=Affiche les pochettes aléatoirement
-ParameterView.169=Pré charger les pochettes
-ParameterView.170=Pré charger les pochettes quand c'est possible
 ParameterView.171=Avant d'effacer physiquement une pochette
 ParameterView.172=Demande avant d'effacer physiquement une pochette
 ParameterView.177=Nombre de morceaux planifiés visibles
@@ -401,9 +379,9 @@ ParameterView.189=Avant de réinitialiser les notes
 ParameterView.190=Durée du fondu enchaîné (sec)
 ParameterView.191=Durée du fondu enchaîné entre deux morceaux en secondes
 ParameterView.192=Organiseur de collection :
-ParameterView.193=Variables :%artist (auteur); %title (Nom du morceau); %album (Album); %n (Numéro du morceau); %genre (Style); %year (Année); %disc (No disque)
+ParameterView.193=<html>Variables :%artist (auteur); %title (Nom du morceau); %album (Album); %n (Numéro du morceau); %genre (Style); %year (Année); %disc (No disque); ; %Nom_attribut_personnalisé</html>
 ParameterView.194=Avant d'organiser un répertoire
-ParameterView.195=Vue animation :
+ParameterView.195=Vue Titre :
 ParameterView.196=Activer les Hotkeys
 ParameterView.197=Activer une fonction permettant à certains raccourcis clavier comme F8 (muet) de fonctionner même lorsque Jajuk n'a pas le focus
 ParameterView.198=Certains changements ne seront pris en compte qu'au prochain démarrage de Jajuk
@@ -414,8 +392,8 @@ ParameterView.202=Utilisateur Last.FM
 ParameterView.203=Mot de passe Last.FM
 ParameterView.204=Mot de passe Last.FM
 ParameterView.205=Arguments de MPlayer
-ParameterView.206=Arguments mplayer complémentaires comme '-ao esd' ou '-ao arts' ou '-novideo' (pour ne pas jouer les videos)' par exemple
-ParameterView.207=Emplacement de la collection
+ParameterView.206=<html>Arguments mplayer complémentaires comme '-ao esd' <br>ou '-ao arts' ou '-novideo' (pour ne pas jouer les videos)' par exemple<br>Attention : ces options sont ignorées quand l'option "bit-perfect" est activée</html>
+ParameterView.207=Emplacement de la configuration
 ParameterView.208=Fixer le répertoire contenant la configuration de Jajuk (par défaut, répertoire utilisateur)
 ParameterView.209=Le chemin de configuration de Jajuk a été modifié pour l'utilisateur en cours (l'ancienne collection n'a pas été effacée car peut elle est peut être utilisée par d'autres utilisateurs). Jajuk va maintenant être redémarré.
 ParameterView.210=Si le fondu enchaîné ne fonctionne pas, essayez d'ajouter <-ao esd> sous Gnome ou <-ao arts> sous KDE dans la zone "Arguments du moteur de son" (onglet Avancé).
@@ -436,7 +414,7 @@ ParameterView.223=Taille des polices
 ParameterView.224=Fixer la taille des polices de caractère
 ParameterView.225=Interface graphique
 ParameterView.226=Modes
-ParameterView.228=Afficher les popups sur les albums
+ParameterView.228=Afficher une description en passant sur les albums
 ParameterView.229=Préférences de la vue Catalogue
 ParameterView.233=Le thème sera totalement appliqué au prochain démarrage de jajuk
 ParameterView.234=Vérifier les mises à jour de Jajuk
@@ -459,9 +437,7 @@ ParameterView.250=Réinitialiser les préférences manuelles appliquées sur les
 ParameterView.251=L'historique a été réinitialisé avec succès
 ParameterView.252=Les notations ont été réinitialisées avec succès
 ParameterView.253=Les préferences ont été réinitialisées avec succès
-ParameterView.254=Utiliser les noms courts sous Windows
-ParameterView.255=[Windows 32 bits seulement] Force mplayer à utiliser les noms courts Windows pour les fichiers audio pour corriger des problèmes pour lire les fichiers contenant des caractères spéciaux dans leur nom.
-ParameterView.256=Nom des couvertures par défaut
+ParameterView.256=Noms stadards de couvertures
 ParameterView.257=Jajuk prend comme couverture par defaut les images dont le nom est ici donné (sans extension). Il est possible de donner plusieurs noms séparés par des ';'. Exemple : "Folder,front". 
 ParameterView.260=Sauvegarde des couvertures en mode Windows Explorer
 ParameterView.261=Sauvegarde les couvertures avec le nom folder.jpg/png/... de sorte que Windows Explorer l'utilise comme icone de repertoire.
@@ -480,14 +456,36 @@ ParameterView.273=Couvertures en miroir
 ParameterView.274=Si activé, la vue Couvertures affiche les images avec effet de miroir
 ParameterView.275=Notification de nouveau morceau :
 ParameterView.276=Type de notification lors d'un changement de morceau (un toast est une popup qui apparait briévement sur l'écran)
-ParameterView.277=Canevas pour la notification :
-ParameterView.278=Ce canevas est utilisé pour construire le texte affiché à chaque changement de morceau
+ParameterView.277=Canevas pour les ballons :
+ParameterView.278=Ce canevas est utilisé pour construire le texte affiché dans le ballon à chaque changement de morceau
 ParameterView.279=Canevas d'information :
 ParameterView.280=Ce canevas est utilisé pour construire le texte affiché dans la vue Information (bas de l'écran) à chaque changement de morceau
 ParameterView.281=Réduire vers le systray
 ParameterView.282=Si sélectionné, la fenêtre principale de Jajuk ne sera plus visible que dans le systray lors d'une minimization.
+ParameterView.283=Effet miroir pour les couvertures en mode plein-écran
+ParameterView.284=Active l'affichage en miroir des couvertures en mode plein-écran
+ParameterView.285=Activer le bit-perfect
+ParameterView.286=<html>Désactive le mixer (volume) et toute autre option qui pourrait affecter<br>la qualité du son.<br>Utilisez le volume de votre système d'exploitation une fois activé.</html>   
+ParameterView.287=Son
+ParameterView.288=Activer les animations de vue Titre
+ParameterView.289=Options de la vue Titre
+ParameterView.290=Afficher la fenêtre de démarrage
+ParameterView.291=Affiche la fenêtre de démarrage lorsque Jajuk est démarré en mode fenêtre (cette fenêtre est toujours désactivée en mode slimbar ou plein-écran) 
+ParameterView.292=Affiche une popup de détail quand la souris passe au dessus de la table des albums ou le catalogue d'albums.
+ParameterView.301=Afficher les videos
+ParameterView.302=Si décoché, Jajuk ne prend pas en compte les fichiers de type video (démarrage nécessaire)
+ParameterView.303=Click sur systray force affichage
+ParameterView.304=Le click gauche sur le systray force la fenêtre principale à s'afficher en avant (le comportement par défaut est alternativement d'afficher et de masquer la fenêtre)
+ParameterView.305=Préserver les dates des fichiers
+ParameterView.306=Préserve la date de dernière modification des fichiers audio même quand des tags y sont modifiés
+ParameterView.307=Notations manuelles
+ParameterView.308=Ne s'appuie pas sur le système de notation automatique basé sur la durée de lecture et les préférences mais utilise directement les préférences de l'utilisateur.
+ParameterView.309=Avant d'écrire un ou plusieurs tags
+ParameterView.310=Réinitiliaser les choix "ne plus afficher"
+ParameterView.311=Ceci rend possible d'afficher à nouveau les choix pour lesquels "ne plus afficher" a été demandé
+
+
 
-Main.21=Confirmation
 Main.22=Vérifie/Télécharge MPlayer
 
 Player.0=En attente de la ligne audio (occupée)
@@ -506,7 +504,7 @@ Device.44=Lit
 Device.45=Copie [
 Device.46=Convertit [
 Device.47=] vers [
-
+Device.48= références de fichier ou de playlist supprimées
 
 FIFO.4=). Voulez vous le monter ?
 FIFO.10=Lecture: 
@@ -538,7 +536,6 @@ DeviceWizard.51=Cochez cette option si vous désirez synchroniser ce support ave
 DeviceWizard.52=Sélectionnez un support source
 DeviceWizard.53=Rafraîchir ce support toutes les
 DeviceWizard.54=min
-DeviceWizard.55=Erreur : l'interval de rafraîchissement doit être zero ou un nombre >= 0.5.
 
 JajukJMenuBar.0=Fichier
 JajukJMenuBar.1=Ouvrir fichier
@@ -586,8 +583,6 @@ CommandJPanel.1=[Ctrl-t] Mode boucle : joue un ou plusieurs morceaux en boucle
 CommandJPanel.2=[Ctrl-h] Mode aléatoire : joue les morceaux de la sélection au hasard
 CommandJPanel.3=Mode continue : continue à jouer quand la sélection est terminée
 CommandJPanel.4=Mode introduction : ne joue qu'une partie de chaque morceau. La position et la durée peuvent être paramétrées dans la vue Préférences de la perspective Configuration
-CommandJPanel.5=Joue un morceau au hasard parmi toute la collection
-CommandJPanel.6=Joue vos morceaux favoris
 CommandJPanel.8=<html>[F9] Passe au morceau précédent dans la sélection courante<br>Clic droit: relance le morceau courant<br>Clic+[MAJ]: lance l'album précédent<br>Clic+[CTRL]: relance l'album courant</html></html>
 CommandJPanel.9=<html>[F10] Passe au morceau suivant dans la sélection courante<br>Un clic avec la touche MAJ enfoncée lance l'album suivant</html>
 CommandJPanel.10=<html>[Alt-gr F9] Retour rapide dans le morceau courant<br>Un clic avec la touche MAJ enfoncée rejoue le morceau</html>
@@ -600,14 +595,11 @@ CommandJPanel.19=Gérer les ambiances
 CommandJPanel.20=Morceau après morceau
 CommandJPanel.21=Album mélangé après album
 CommandJPanel.22=Album après album
-CommandJPanel.23=Cliquez pour réinitialiser la zone de recherche
-CommandJPanel.24=Configurer les webradios
 CommandJPanel.25=Allumer la webradio
 CommandJPanel.26=Mode Répéter tout : boucle sur la file entière
 CommandJPanel.27=Mode Karaoké : supprime les voix (ne s'applique qu'au morceau suivant)
 
 InformationJPanel.5=Temps total restant à jouer [Nombre de morceaux restants]
-InformationJPanel.6=Qualité du fichier
 InformationJPanel.7=Position dans le morceau courant
 InformationJPanel.8=%title par %artist sur "%album"
 InformationJPanel.9=<Aucune selection>
@@ -616,24 +608,21 @@ AbstractPlaylistEditorView.0=Morceau
 AbstractPlaylistEditorView.1=Chemin
 AbstractPlaylistEditorView.2=Jouer cette liste de lecture
 AbstractPlaylistEditorView.3=Sauver cette liste de lecture
-AbstractPlaylistEditorView.4=Ajouter un fichier à cette liste de lecture
 AbstractPlaylistEditorView.5=Enlever un fichier
 AbstractPlaylistEditorView.6=Monter
 AbstractPlaylistEditorView.7=Abaisser
 AbstractPlaylistEditorView.9=Effacer cette liste de lecture
 AbstractPlaylistEditorView.10=Ajoute un morceau aléatoire à cette liste de lecture
 AbstractPlaylistEditorView.15=Listes de lecture
-AbstractPlaylistEditorView.17=Vous êtes sur le point de mettre simultanément à jour les listes de lecture suivantes :
 AbstractPlaylistEditorView.18=Morceau dans la file
 AbstractPlaylistEditorView.19=Morceau répété
 AbstractPlaylistEditorView.20=Morceau planifié
-AbstractPlaylistEditorView.21=Elément de liste de lecture
 AbstractPlaylistEditorView.22=Liste de lecture sauvegardée
 AbstractPlaylistEditorView.23=Jouer
 AbstractPlaylistEditorView.24=Pousser
 AbstractPlaylistEditorView.27=Préparer une soirée
-AbstractPlaylistEditorView.28=répertoire créé dans
 AbstractPlaylistEditorView.29=Morceau en cours
+AbstractPlaylistEditorView.30=Mélanger la playliste
 
 StatView.0=Autres
 StatView.1=Répartition par styles
@@ -678,7 +667,6 @@ TracksTreeView.41=Moins de deux ans
 TracksTreeView.42=Moins de cinq ans
 TracksTreeView.43=Moins de dix ans
 TracksTreeView.44=Moins de trois mois
-TracksTreeView.45=Année
 
 CoverView.2=Effacer physiquement cette pochette
 CoverView.3=Pochettes
@@ -686,13 +674,10 @@ CoverView.4=Image précédente du disque ou du Web si la recherche en ligne est
 CoverView.5=Image suivante du disque ou du Web si la recherche en ligne est enclenchée
 CoverView.6=<html><p>Sauver la pochette avec son nom original</p><p>Avec Control: Sauver sous...</p></html>
 CoverView.8=Utiliser cette pochette comme défaut pour cet album
-CoverView.9=pochettes
 CoverView.10=Sauver la pochette comme
 CoverView.11=Pochette sauvée
-CoverView.12=Album
-CoverView.13=Morceau
   	 
-AnimationView.0=Animation
+AnimationView.0=Titre
 
 FilesTreeView.0=Arbre fichiers
 FilesTreeView.3=Copier
@@ -702,14 +687,11 @@ FilesTreeView.7=Effacer
 FilesTreeView.14=Désynchroniser
 FilesTreeView.15=Resynchroniser
 FilesTreeView.16=Créer une liste de lecture
-FilesTreeView.17=Copier
-FilesTreeView.18=Couper
 FilesTreeView.28=Monter
 FilesTreeView.29=Démonter
 FilesTreeView.30=Forcer le rafraîchissement
 FilesTreeView.31=Synchroniser
 FilesTreeView.32=Tester
-FilesTreeView.33=Créer des listes de lecture
 FilesTreeView.40=Copier
 FilesTreeView.41=Couper
 FilesTreeView.42=Coller
@@ -737,9 +719,6 @@ TracksTableView.16=Pousser comme suivant
 AbstractTableView.0=Filtre: 
 AbstractTableView.1=Attribut à filtrer
 AbstractTableView.3=Valeur à utiliser pour filtrer
-AbstractTableView.4=Appliquer le filtre
-AbstractTableView.5=Supprimer le filtre
-AbstractTableView.6=Appliquer un filtre complexe
 AbstractTableView.7=contient :
 AbstractTableView.8=Tous
 AbstractTableView.10=(Pas disponible)
@@ -750,36 +729,14 @@ AboutView.8=Licence
 AboutView.9=Système
 AboutView.10=A Propos
 
-PhysicalPlaylistRepositoryView.0=Jouer
-PhysicalPlaylistRepositoryView.1=Éditer
 PhysicalPlaylistRepositoryView.2=Sauver sous
-PhysicalPlaylistRepositoryView.3=Supprimer
-PhysicalPlaylistRepositoryView.4=Attributs
-PhysicalPlaylistRepositoryView.6=Listes de lecture physiques
-PhysicalPlaylistRepositoryView.8=Spéciales
 PhysicalPlaylistRepositoryView.9=File courante
-PhysicalPlaylistRepositoryView.10=File courante: glissez/déposez-y des morceaux pour les jouer
-PhysicalPlaylistRepositoryView.11=Nouvelle
-PhysicalPlaylistRepositoryView.12=Nouvelle liste de lecture: glissez/déposez-y des morceaux pour ajouter des morceaux
-PhysicalPlaylistRepositoryView.13=Signets
-PhysicalPlaylistRepositoryView.14=Liste de lecture signets: glissez/déposez-y des morceaux pour en garder la trace
-PhysicalPlaylistRepositoryView.15=Bestof
-PhysicalPlaylistRepositoryView.16=Liste de lecture bestof: contient vos morceaux préférés 
-PhysicalPlaylistRepositoryView.17=Nouveautés
-PhysicalPlaylistRepositoryView.18=Liste de lecture des nouveautés: contient les morceaux les plus récents de votre collection
-PhysicalPlaylistRepositoryView.19=Préparer fête
 
 FilesTableView.0=Table des fichiers
 FilesTableView.15=Jouer tout le répertoire
 
-DeviceView.0=Ajouter un support
 DeviceView.1=Supprimer un support (n'efface rien physiquement sur le disque)
 DeviceView.2=Propriétés du support sélectionné
-DeviceView.3=Monter le support sélectionné
-DeviceView.4=Démonter le support sélectionné
-DeviceView.5=Tester le support sélectionné
-DeviceView.6=Forcer le rafraîchissement du support sélectionné
-DeviceView.7=Synchroniser le support sélectionné
 DeviceView.8=Monter
 DeviceView.9=Démonter
 DeviceView.10=Tester
@@ -819,9 +776,6 @@ JajukWindow.29=Jouer le morceau précédent. Clic gauche +[MAJ]= album précéde
 JajukWindow.30=Jouer le morceau suivant. Clic gauche +[MAJ]= album suivant.
 JajukWindow.31=Jouer des nouveautés dans la collection toute entière
 JajukWindow.32=Finir de jouer l'album courant
-JajukWindow.33=[Ctrl-UP/DOWN] Volume
-JajukWindow.34=Position
-JajukWindow.35=Joue :
 JajukWindow.36=Ambiance courante:
 JajukWindow.37=Aucune ambiance
 
@@ -836,33 +790,28 @@ ActiveTagsWizard.3=Il est ici possible de configurer les tags complémentaires 
 
 SimpleDeviceWizard.0=Création rapide de supports
 
-HelpView.2=Aide
 
 DownloadManager.0=<html>Jajuk nécessite le mot de passe de votre proxy HTTP pour charger des pochettes sur le Web<br>Si vous n'en voulez pas, changez vos options de la vue Paramétrage / onglet Réseau<br>Si vous n'avez pas de proxy, décochez l'option Proxy</html>
-DownloadManager.1=Mot de passe requis
 
 FirstTimeWizard.0=Démarrage rapide
 FirstTimeWizard.1=<html><b>Bienvenue! Cet assistant vous permettra de créer rapidement votre collection.</b></html>
 FirstTimeWizard.2=<html>Sélectionnez le répertoire contenant votre musique</html> 
-FirstTimeWizard.4=Afficher l'aide tout de suite
 FirstTimeWizard.5=Veuillez choisir un répertoire
 FirstTimeWizard.6=Préférences avancées
 FirstTimeWizard.7=Fixer l'emplacement de la collection :
 FirstTimeWizard.8=Répertoire sélectionné :
 FirstTimeWizard.9=Aucun
 
-PropertiesWizard.0=Propriétés de l'élément
 PropertiesWizard.1=Attribut
 PropertiesWizard.2=Valeur
-PropertiesWizard.3=Editable?
 PropertiesWizard.4=Lien
 PropertiesWizard.6=Sélection
-PropertiesWizard.7=Type
 PropertiesWizard.8=Attribut mis à jour avec succès
-PropertiesWizard.9=Pas d'attribut éditable pour cette sélection
 PropertiesWizard.10=attribut(s) fixé(s)
 PropertiesWizard.11=Ecriture du tag dans:
 PropertiesWizard.12=Lien vers la fenêtre de propriétés de l'élément
+PropertiesWizard.13=Copier
+PropertiesWizard.14=Copier la valeur dans le clipboard
  	 
 NewPropertyWizard.0=Créer un attribut personnel
 NewPropertyWizard.1=(*) Ajouter un attribut à l'élément
@@ -892,9 +841,6 @@ CatalogView.3=Forcer la régénération des vignettes
 CatalogView.4=Taille des vignettes:
 CatalogView.5=Vignette créée pour:
 CatalogView.7=Sélectionner une pochette
-CatalogView.8=Aucune vignette trouvée 
-CatalogView.9=Précèdent
-CatalogView.10=Suivant
 CatalogView.11=Page:
 CatalogView.12=Affiche la page précédente
 CatalogView.13=Affiche la page suivante
@@ -922,17 +868,12 @@ TipOfTheDayView.0=Astuces du jour
 TipOfTheDayView.1=Savez vous... ?
 TipOfTheDayView.2=Afficher au démarrage ?
 
-CDDBWizard.0=Accepter
 CDDBWizard.1=Fichier
 CDDBWizard.2=Morceau courant
 CDDBWizard.3=Album courant
 CDDBWizard.4=Morceau proposé
 CDDBWizard.5=Album proposé : 
-CDDBWizard.6=Recherche effectuée. Trouvé 
-CDDBWizard.7=résultats
 CDDBWizard.12=Pas de résultat
-CDDBWizard.14=Ce répertoire ne content aucun fichier
-CDDBWizard.16=Style:
 CDDBWizard.17=Résultats exacts trouvés
 CDDBWizard.18=Résultat(s)
 CDDBWizard.19=Obtenir les tags en ligne
@@ -947,11 +888,7 @@ DigitalDJWizard.6=Nom du DJ(*)
 DigitalDJWizard.8=Nombre d'étoiles minimum:
 DigitalDJWizard.9=Durée de recouvrement (sec):
 DigitalDJWizard.10=Morceaux uniques
-DigitalDJWizard.11=Effacer
-DigitalDJWizard.12=Styles origine
-DigitalDJWizard.13=Styles Destination
 DigitalDJWizard.14=Sélection des styles (sélections multiples autorisées)
-DigitalDJWizard.15=Nombre de morceaux
 DigitalDJWizard.16=Désirez vous ?
 DigitalDJWizard.17=Créer un nouveau DJ ?
 DigitalDJWizard.18=Modifier un DJ ?
@@ -1009,6 +946,8 @@ DigitalDJWizard.63=Ajouter les ambiances par défaut
 DigitalDJWizard.64=Toutes
 DigitalDJWizard.65=Sélection du DJ
 DigitalDJWizard.66=Sélection de l'ambiance par défaut (une ambiance est un groupe de genres, voir le manuel)
+DigitalDJWizard.67=Taille maximale de la file
+DigitalDJWizard.68=Limiter la taille de la file de morceaux
 
 PreparePartyWizard.1=Préparer une soirée
 PreparePartyWizard.2=Sélection de l'origine des morceaux
@@ -1048,7 +987,6 @@ PreparePartyWizard.38=Configurer la conversion audio
 PreparePartyWizard.39=<html>Veuillez définir la commande à utiliser pour lancer Perl Audio Converter.<br/>Sous Linux : en général "pacpl" or "perl <install-location>/pacpl.<br/>Sous MS Windows, en général: "perl <install-location>\pacpl</html>
 PreparePartyWizard.40=Configurer...
 
-
 Ambiences.0=Rock/Pop
 Ambiences.1=Rap
 Ambiences.2=Hard Rock
@@ -1066,6 +1004,7 @@ Ambiences.13=Latino
 
 DebugLogAction.0=Traces de debug
 DebugLogAction.1=Rafraîchir
+DebugLogAction.2=Copier dans le clipboard
 
 CopyClipboardAction.0=Copier l'URL
 
@@ -1094,7 +1033,6 @@ ReportAction.19=Aller à:
 
 ActionMove.0=Coller
 ActionRefresh.0=Forcer le rafraichissement
-ActionRefresh.1=Rafraichir le répertoire
 
 RenameAction.0=Renommer
 RenameAction.1=Veuillez saisir un nouveau nom de fichier :
@@ -1115,27 +1053,22 @@ ActionDelete.0=Fichiers supprimés
 ActionDelete.1=Répertoires supprimés
 
 FindDuplicateTracksAction.0=Aucun doublon détecté
-FindDuplicateTracksAction.1=Des doublons ont été trouvés
 FindDuplicateTracksAction.2=Rechercher les doublons
 FindDuplicateTracksAction.3=Liste des doublons
 FindDuplicateTracksAction.4=Sélectionner tous les doublons
 
-RefreshDialog.0=Préparation au rafraîchissement du support...
 RefreshDialog.1=Rafraîchi le support
 RefreshDialog.2=Rafraichissement du support:
 RefreshDialog.3=Nettoyage des anciens fichiers
 
-RadioWizard.0=Veuillez sélectionner ou créer une webradio
 RadioWizard.1=Gérer les webradios
 RadioWizard.2=Nouvelle
 RadioWizard.3=Suppression
 RadioWizard.4=Défauts
 RadioWizard.5=Une webradio poste déjà ce nom
-RadioWizard.6=Nom de la Webradio
 RadioWizard.7=Assistant Webradio
 RadioWizard.8=URL
 RadioWizard.9=Nom
-RadioWizard.10=Mauvaise URL
 RadioWizard.11=Le nom et l'URL sont obligatoires
 
 UpdateManager.0=Une nouvelle version de Jajuk (
@@ -1169,6 +1102,7 @@ ShowPropertiesAction.0=Propriétés
 
 QueueView.1=Vider la file
 QueueView.2=Scroller automatiquent vers le morceau en cours
+QueueView.3=Stopper dès que le morceau courant se termine 
 
 JajukSlimWindow.0=Afficher/masquer la slimbar
 
@@ -1204,6 +1138,23 @@ Notificator.track_change.track_title=Morceau :
 SyncTreeTableAction.0=Synchroniser les vues arbre et tableau
 SyncTreeTableAction.1=<html>Synchronise les vues arbre et tableau<br>Quand utilisé dans une vue arbre, la sélection d'un élément du tableau ouvre et scroll vers l'élément correspondant de l'arbre.<br>Quand utilisé dans une vue tableau, la séléction d'un élément de l'arbre filtre le tableau en conséquence.</html>
 
+ExportRatingsAction.1=Exporter les notations
+ExportRatingsAction.2=Exporte toutes les notations dans un fichier pour import dans une autre installation de Jajuk
+ExportRatingsAction.3=Veuillez choisir le fichier XML cible 
+
+ImportRatingsAction.1=Importe les notations
+ImportRatingsAction.2=Importe les notations exportées depuis une autre configuration de Jajuk.
+ImportRatingsAction.3=Veuillez choisir le fichier XML à importer
+
+ShowCurrentlyPlayingAction.0=Afficher la fenêtre de notification pour le titre en cours 
+ShowCurrentlyPlayingAction.1=Si activé dans les préférences, cette action affiche une fenêtre de notification contenant des informations sur le morceau en cours. 
+
+WebRadioView.0=Webradios
+WebRadioView.1=Webradio
+WebRadioView.2=Origine
+WebRadioView.8=Nouvelle webradio
+WebRadioView.10=Recharger les présélections
+WebRadioView.11=Recharge les présélections disponibles sur le site de Jajuk (conserve néanmoins les mots clés fixés par l'utilisateur)
 
 #--- Tips of the day ---
 TipOfTheDay.0=Vous pouvez rejouer le morceau courant par un Clic Retour rapide + [MAJ] sur le bouton "Précédent"
@@ -1232,10 +1183,13 @@ TipOfTheDay.22=Vous pouvez obtenir les paroles des morceaux via la vue "Paroles"
 TipOfTheDay.23=La vue Suggestions affiche les informations Last.FM de l'auteur en cours comme les auteurs similaires
 TipOfTheDay.24=Vous pouvez bannir un morceau que vous n'appréciez pas à partir de la barre de lecture ou du paneau de contrôle en bas de l'écran.
 TipOfTheDay.25=Vous pouvez montrer / masquer les morceaux non accessibles en un seul clic dans le menu "Configuration"
-TipOfTheDay.26=Vous pouvez choisir l'emplacement de la collection (sur un disque externe par exemple) pour rendre accessible votre collection à plusieurs ordinateurs (vue Préférences / onglet Avancé)
+TipOfTheDay.26=Vous pouvez choisir l'emplacement de la configuration (sur un disque externe par exemple) pour rendre accessible votre configuration à plusieurs ordinateurs (vue Préférences / onglet Avancé)
 TipOfTheDay.27=Vous pouvez maintenant ajouter n'importe quelle vue dans n'importe quelle perspective via le menu "Vues"
 TipOfTheDay.28=Vous pouvez lancer une page Wikipedia dans votre navigateur Web par défaut en utilisant la fonction "Lancer l'Url" <a href=../images/3/30/Launch_16x16.png title=Image:launch_16x16.png class=internal> <img src=../images/3/30/Launch_16x16.png alt=Image:launch_16x16.png/> </a> 
 TipOfTheDay.29=Jajuk supporte les web radios <a href=../images/9/9d/Webradio_32x32.png title=Image:webradio_32x32.png class=internal> <img src=../images/9/9d/Webradio_32x32.png alt=Image:webradio_32x32.png/> </a>
 TipOfTheDay.30=Jajuk peut être piloté à distance via D-Bus (Linux seulement). Il est alors possible d'utiliser les touches multimédia. Voir le manuel pour plus d'information. 
+TipOfTheDay.31=Essayez la normalisation audio dans la vue Préférence / onglet Son pour conserver un niveau de gain constant entre les morceaux.
+TipOfTheDay.32=Vous pouvez exporter des morceaux avec leur playlist grace à la fonctionnalité "Préparer une soirée"
+TipOfTheDay.33=Un click gauche simple sur une couverture active/désactive l'effet mirroir
 
 ]]></body>
diff --git a/src/main/java/org/jajuk/i18n/jajuk_gl.properties b/src/main/resources/org/jajuk/i18n/jajuk_gl.properties
similarity index 89%
rename from src/main/java/org/jajuk/i18n/jajuk_gl.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_gl.properties
index c69dd18..b0bc447 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_gl.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_gl.properties
@@ -31,9 +31,7 @@ Hide=Ocultar
 Path=Por favor selecciona unha ruta
 Later=Máis Tarde
 Default=Por Defecto
-All=Todo
 YestoAll=Si a Todo
-Maximize=Maximizar
 Purge=Purgar
 
 #--- Wizard Strings --- 
@@ -57,7 +55,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
 Type.mac=Monkey's Audio format
 Type.radio=Web Radio
 Type.video=Video
@@ -86,11 +83,9 @@ Confirmation_clear_history=¿Queres realmente limpia-lo histórico?
 Confirmation_reset_ratings=¿Queres realmente resetear tódolas puntuacións das cancións a cero?
 Confirmation_refactor_files=¿Queres realmente renomea-lo(s) seguinte(s) arquivos(s)?
 Confirmation_restore_all=Unha restauración das vistas require reiniciar Jajuk , ¿queres saír?
-Confirmation_defaults_radios=Borraranse tódalas emisoras de radio que creaches previamente, ¿estás seguro?
 Confirmation_delete_empty_dirs=Os seguintes directorios están vacíos. ¿Quere-los borrar?
 Confirmation_file_overwrite=Este arquivo xa existe. ¿Queres sobreescribir este arquivo?
 Confirmation_file_number=o(s) arquivo(s) será(n) borrado(s).
-Confirmation_alarm_stop=Estás seguro de queres parar esta alerta?
 Confirmation_defaults=Nota: esto reseteará tódalas opcións das cellas ós valores por defecto (e non só os actualmente en curso), ¿estás seguro?
 Confirmation_rebuild_thumbs=Esto reconstruirá tódalas iconas de tódolos teus álbumes, pode levar bastantes minutos nas colecións grandes. Estás seguro de facelo? 
 Confirmation_reset_preferences=Queres reseta-las preferencias das cancións ?
@@ -108,7 +103,6 @@ Perspective_Description_Files=Arquivos
 Perspective_Description_Tracks=Pistas
 Perspective_Description_Configuration=Configuración
 Perspective_Description_Statistics=Estatísticas
-Perspective_Description_Help=Axuda
 Perspective_Description_Display=Visualización
 Perspective_Description_Albums=Álbumes
 Perspective_Description_Info=Información
@@ -197,17 +191,13 @@ Error.017=Erro analizando a lista de reprodución
 Error.018=Non se atopou ningunha pista accesible
 Error.019=Xa existe un dispositivo con este nome
 Error.020=Erro de E/S. O disco pode que estea cheo
-Error.021=O campo Url é obrigatorio. Ex: 'd:\music' en MS Windows, '/home/foo/music' en Unix
-Error.022=O campo Nome é obrigatorio. Ex: 'Disco Duro', 'CD ROCK'
 Error.023=Non se pode inicia-la pista inicial
 Error.024=Non se pode escribi-lo arquivo
 Error.025=Un dos arquivos que queres ler está nun dispositivo desinstalado
 Error.026=Erro rexistrando reproductores
 Error.027=Sincronización abortada
 Error.028=Erro gardando a lista de reprodución
-Error.029=Un dispositivo existente é un directorio pai deste dispositivo, ten a mesma ruta ou é un directorio fillo
 Error.030=Demasiadas conexións erradas. Jajuk parou de buscar carátulas na rede.
-Error.101=O dispositivo non existe ou non está dispoñible
 Error.102=Erro
 Error.103=Erro lendo a información do tag
 Error.104=Erro escribindo a información do tag
@@ -215,31 +205,25 @@ Error.105=Código de Empaquetado non atopado
 Error.106=Excepción non capturada
 Error.107=Xa se está actualizando ou sincronizando
 Error.108=Erro na verificación do arquivo de vistas
-Error.109=Reproductor ou clase de implementación do tag non accesible
 Error.110=Este nome de propiedade está reservado polo sistema interno de Jajuk, por favor escolla outro nome
 Error.111=Dispositivo xa instalado
 Error.112=Non se pode instala-lo dispositivo
 Error.113=Non se pode garda-la configuración do usuario
 Error.114=Non se pode le-la configuración do usuario
-Error.118=Erro procesando a petición de evento
 Error.119=Non existe arquivo do histórico ou erro verificando o mesmo
 Error.120=Non se pode acceder o dispositivo : aínda non está instalado, está actualizandose ou sincronizándose
 Error.121=O dispositivo está en uso e non pode ser desinstalado
 Error.122=Erro en FIFO
-Error.123=Erro escollendo sobreplanta
-Error.124=Outra sesión de Jajuk atopada. Só se pode lanzar unha instancia de Jajuk á vez
 Error.125=Dispositivo xa desinstalado
 Error.126=Búsqueda no soportada por este formato de audio
 Error.127=Non hai novedades durante o tempo especificado, podes cambia-lo valor para o tempo límite na vista de preferencias
 Error.128=Esta pista é a primeira da colección, non hai pistas anteriores dispoñibles
-Error.129=Erro cargando a imaxe de carátula
 Error.131=Non se pode borra-lo arquivo
 Error.133=O arquivo da colección está corrupto por unha razón descoñecida, jajuk encargarase de restaurar dende un arquivo de respaldo
 Error.134=Non se pode renomea-lo arquivo
 Error.135=O arquivo non existe
 Error.136=Operación fallida
 Error.137=Formato Erróneo
-Error.138=Algúns arquivos referenciados por estas pistas están localizados nuns dispositivos desinstalados e esto non pode ser cambiado
 Error.140=Cadea errónea: non debería conte-los carácteres & ' " < o >
 Error.141=Esta lista de reprodución está situada nun dispositivo desinstalado, polo que non está dispoñible
 Error.142=Esta lista de reprodución contén algunhas pistas fora de dispositivos coñecidos que serán ignorados
@@ -251,7 +235,6 @@ Error.147=Alguns arquivos non poden ser movidos (ver detalles para máis informa
 Error.148=O campo Ano é descoñecido
 Error.149=O campo Álbume é descoñecido
 Error.150=O campo Artista é descoñecido
-Error.151=O campo Título de Pista é descoñecido
 Error.152=O campo Pista é descoñecido
 Error.153=O campo Xénero é descoñecido
 Error.154=Non se pode renomea-lo arquivo, revisa algun carácter erróneo no mome ou nos tags
@@ -264,18 +247,12 @@ Error.160=Arquivo non movido. A fonte e a orixe eran os mesmos
 Error.161=Non se pode escribir no directorio, comprobar permisos
 Error.162=Esta caracteristica de usuario xa existe
 Error.163=Erro restaurando as vistas por defecto
-Error.164=Non hai pistas accesibles para o ambiente :
 Error.165=Erro na ruta, o directorio ou non existe ou non ten permisos de escritura
 Error.166=Álbume baleiro, non se pode captura-la caràtula
 Error.167=Non se pode crea-lo informe
-Error.168=Non se atoparon arquivos duplicados
-Error.169=Operación con erros. Ter en conta que esta operación require unha conexión a internet para obte-la lista de emisoras de radio.
-Error.170=Erro reproducindo webradio
 Error.171=Non se definiu unha fonte de sincronización para este dispositivo, asinala utilizando o asistente de configuración de dispositivos (Na vista de Dispositivo, pulsar sobre o dispositivo).
 Error.172=Erro atopado mentres se borrabán os seguintes arquivos:
-Error.173=Erro atopado mentres se borrabán os seguintes directorios:
 Error.174=Erro ó acceder ó sitio web de Freedb, revisa a túa conexión 
-Error.175=Operación cancelada
 Error.176=Erro ó xenera-la lista de reprodución
 Error.177=Por favor insire unha hora válida no formato (HH24:MM:SS)
 Error.179=Non se pode abri-o exlorador do sistemas, tenta escoller unha ruta na vista Preferencias / Avanzadas
@@ -290,7 +267,7 @@ Warning.5=O directorio de destino xa existe, alguos arquivos  sobreescribiranse,
 
 #--- Strings by class ---
 ParameterView.0=Duración do histórico:
-ParameterView.2=Escolle o tempo en dias que queres garda-la historia das pistas escoitadas. Escolle -1 se non queres ver ningún histórico e 0 se queres ter un histórico permanente
+ParameterView.2=Escolle o tempo en dias que queres garda-la historia das pistas escoitadas. Escolle 0 se non queres ver ningún histórico e -1 se queres ter un histórico permanente
 ParameterView.3=Borrar histórico
 ParameterView.4=Borrar histórico
 ParameterView.8=Histórico
@@ -312,8 +289,6 @@ ParameterView.29=Antes de sair de Jajuk
 ParameterView.30=Preguntar ó sair de Jajuk
 ParameterView.33=Opcións
 ParameterView.35=Ocultar pistas situadas en dispositivos desinstalados
-ParameterView.36=Reiniciar ó chegar ó fin da colección
-ParameterView.37=Reinicia-la colección completa cando se chega ó final no modo continuo
 ParameterView.38=Idioma:
 ParameterView.42=Idioma da interface
 ParameterView.43=Faciana:
@@ -333,8 +308,6 @@ ParameterView.85=Aplicar
 ParameterView.86=Restaurar valores por defecto
 ParameterView.87=Preferencias
 ParameterView.98=Tags
-ParameterView.99=Realizar un escaneo profundo dos tags
-ParameterView.100=<html>Forzar a Jajuk a re-ler os tags id3 actuais.<p>Esto pode ser útil para actualiza-los tags que fosen modificados usando outro programa</html>
 ParameterView.101=Usar directorio pai coma nome de álbume
 ParameterView.102=Jajuk usará o directorio pai coma o nome do álbume para as pistas se non pode obte-lo vía tags id3
 ParameterView.109=Preferencias gardadas
@@ -346,7 +319,6 @@ ParameterView.114=Usar expresións regulares (Formato Regexp) nos filtros das ta
 ParameterView.115=Avanzada
 ParameterView.116=Facer unha copia de seguridade do arquivo de colección
 ParameterView.117=Marcar esto se queres facer unha copia de seguridade do teu arquivo de colección a arquivos collection-<date>.xml
-ParameterView.118=Tamaño do Backup (Mb)
 ParameterView.119=Tamaño do Backup (Mb)
 ParameterView.120=Tipo de caracteres da colección
 ParameterView.121=Tipo de caracteres da colección. UTF-16 está optimizado para idiomas Asiáticos e UTF-8 está optimizado para idiomas europeos.
@@ -376,14 +348,10 @@ ParameterView.158=Precisión Alta (busca-las palabras agrupadas obrigratoriament
 ParameterView.159=Carátulas
 ParameterView.160=Tempo sen Conexión (seg)
 ParameterView.161=Tempo sen Conexión en segs: a operación falla se a outra parte non resposta nese tempo
-ParameterView.162=Tempo sen transferencia (seg).
-ParameterView.163=Tempo sen transferencia (seg): a operación falla se os datos non se descargaron nese tempo
 ParameterView.164=Antes de desinstalar un dispositivo
 ParameterView.165=Preguntar antes de desinstalar un dispositivo
 ParameterView.166=Mesturar carátulas
 ParameterView.167=Amosar unha carátula aleatoria
-ParameterView.169=Precargar carátulas
-ParameterView.170=Precargar tódalas carátulas dispoñibles cando sexa posible
 ParameterView.171=Antes de borrar físicamente unha carátula
 ParameterView.172=Preguntar antes de borrar físicamente unha carátula
 ParameterView.177=Número visible de pistas escollidas
@@ -460,8 +428,6 @@ ParameterView.250=Resetear preferencias definidas polo usuario
 ParameterView.251=Histórico reseteado con éxito
 ParameterView.252=Puntuación e número de veces reproducida reseteadas con éxito
 ParameterView.253=Preferencias reseteadas con éxito
-ParameterView.254=Usar nomes cutos de Windows
-ParameterView.255=[Só Windows 32 bits] Se está marcado, forzar a mplayer a usa-los nomes dos arquivos de audio ó estilo dos nomes curtos de windows para fixar algún inconveniente con algún idioma (locale)
 ParameterView.256=Nomes dos arquivos das caratulas por defecto
 ParameterView.257=Jajuk toma por defecto ós nomes das caratulas a partir do nome do arquivo da caratula (sen a extensión). Pode ser que moitos valores esteán separados por ';'. Exemplo : "Fronte,contraportada".
 ParameterView.260=Gardar caratulas de xeito "amistoso" co Windows Explorer
@@ -478,7 +444,6 @@ ParameterView.270=Ruta do executable usado coma explorador de arquivos externo
 ParameterView.271=Amosa-la bandexa de iconas
 ParameterView.272=Se está marcado, jajuk pode ser manexado dende a area de notificación (non está dispoñible para tódolos sistemas operativos)
 
-Main.21=Confirmación
 Main.22=Descargando MPlayer
 
 Player.0=Esperando la línea de audio (ocupada)
@@ -571,8 +536,6 @@ CommandJPanel.1=[Ctrl-t] Modo repetición: Reproduci-las pistas nun bucle
 CommandJPanel.2=[Ctrl-h] Modo aleatorio: Reproducir aleatoriamente as pistas seleccionadas
 CommandJPanel.3=Modo continuo: Voltar a reproduci-las pistas escollidas unha vez escoitada a lista
 CommandJPanel.4=Modo introducción: Reproducir un fragmento de cada pista. Inicio e duración poden ser cambiados dende a vista de Preferencias
-CommandJPanel.5=Reproducir unha selección aleatoria da colección enteira
-CommandJPanel.6=Reproduci-las túas pistas favoritas
 CommandJPanel.8=<html>[F9] Reproduci-la pista anterior na selección actual<br>Shift+ click lanza o álbume anterior<br />CTRL+click para reproducir de novo ó álbume actual</html>
 CommandJPanel.9=<html>[F10] Reproduci-la pista siguinte na selección actual<br>Shift+click lanza o álbume anterior</html>
 CommandJPanel.10=<html>[Alt-gr F9] Retroceso rápido na pista actual<br> Shift+click para repetición completa</html>
@@ -585,14 +548,11 @@ CommandJPanel.19=Administrar Ambientes
 CommandJPanel.20=Pista por pista
 CommandJPanel.21=Aleatoriamente álbume por álbume
 CommandJPanel.22=Álbume por álbume
-CommandJPanel.23=Clica para limpia-la busca
-CommandJPanel.24=Configurar web radios
 CommandJPanel.25=Encende-la radio
 CommandJPanel.26=Modo repetir todo: Reproduci-la cola en bucle
 CommandJPanel.27=Modo Karaoke, oculta as voces na canción reproducida (aplicaranse os cambios á seguinte canción en ser reproducida)
 
 InformationJPanel.5=Tempo total da list a reproducir [Nb de pistas restantes]
-InformationJPanel.6=Taxa de Bits da pista
 InformationJPanel.7=Progreso de la pista actual
 #song name BY artist ON album name
 InformationJPanel.8=%title de %artist do %album
@@ -604,21 +564,17 @@ AbstractPlaylistEditorView.0=Título
 AbstractPlaylistEditorView.1=Localización
 AbstractPlaylistEditorView.2=Reproducir esta lista de reprodución
 AbstractPlaylistEditorView.3=Salvar esta lista de reprodución
-AbstractPlaylistEditorView.4=Engadir un elemento a esta lista de reprodución
 AbstractPlaylistEditorView.5=Eliminar un elemento desta lista de reprodución
 AbstractPlaylistEditorView.6=Move-la pista seleccionada arriba
 AbstractPlaylistEditorView.7=Move-la pista seleccionada abaixo
 AbstractPlaylistEditorView.9=Borrar esta lista de reprodución
 AbstractPlaylistEditorView.10=Engadir unha pista aleatoria a esta lista de reprodución
 AbstractPlaylistEditorView.15=Editor de listas de reprodución
-AbstractPlaylistEditorView.17=Estás a punto de actualiza-las seguintes listas de reprodución :
 AbstractPlaylistEditorView.18=Pista en cola
 AbstractPlaylistEditorView.19=Pista repetida
 AbstractPlaylistEditorView.20=Pista seleccionada
-AbstractPlaylistEditorView.21=Pista da lista de reprodución
 AbstractPlaylistEditorView.22=Lista de reprodución gardada
 AbstractPlaylistEditorView.27=Preparar Festa
-AbstractPlaylistEditorView.28=Cartafol creado con éxito en
 
 StatView.0=Outros
 StatView.1=Xéneros
@@ -663,7 +619,6 @@ TracksTreeView.41=menos de dous anos
 TracksTreeView.42=menos de cinco anos
 TracksTreeView.43=menos de 10 anos
 TracksTreeView.44=menos de tres meses
-TracksTreeView.45=Ano
 
 CoverView.2=Borrar do disco esta carátula
 CoverView.3=Carátula
@@ -671,11 +626,8 @@ CoverView.4=Imaxe anterior obtida do disco e/ou da Web se a opción de Auto-Car
 CoverView.5=Imaxe seguinte obtida do disco e/ou da Web se a opción de Auto-Carátula está marcada
 CoverView.6=<html><p>Garda-la carátula co seu nome orixinal</p><p>Con CTRL: Gardar carátula coma...</p></html>
 CoverView.8=Usar esta carátula coma a carátula por defecto deste álbume
-CoverView.9=carátulas
 CoverView.10=Gardar carátula coma
 CoverView.11=Carátula gardada
-CoverView.12=Álbume
-CoverView.13=Título
 
 AnimationView.0=Animación
 
@@ -687,14 +639,11 @@ FilesTreeView.7=Borrar
 FilesTreeView.14=Desincronizar
 FilesTreeView.15=Resincronizar
 FilesTreeView.16=Crear Lista de Reprodución
-FilesTreeView.17=Copiar
-FilesTreeView.18=Cortar
 FilesTreeView.28=Instalar
 FilesTreeView.29=Desinstalar
 FilesTreeView.30=Forzar Refrescar
 FilesTreeView.31=Sincronizar
 FilesTreeView.32=Probar
-FilesTreeView.33=Crear listas de reprodución
 FilesTreeView.40=Copiar
 FilesTreeView.41=Cortar
 FilesTreeView.42=Pegar
@@ -722,9 +671,6 @@ TracksTableView.16=Ir ó seguinte
 AbstractTableView.0=Filtro:
 AbstractTableView.1=Propiedade a filtrar
 AbstractTableView.3=Valor usado polo filtro
-AbstractTableView.4=Aplicar filtro
-AbstractTableView.5=Limpia-lo filtro
-AbstractTableView.6=Aplicar un filtro avanzado
 AbstractTableView.7=contén:
 AbstractTableView.8=Calquera
 AbstractTableView.10=(Non dispoñible)
@@ -734,39 +680,17 @@ AboutView.7=Acerca de
 AboutView.8=Licenza
 AboutView.9=Sistema
 AboutView.10=Acerca de
-AboutView.11=<html>Copyright 2003-2011<br>Jajuk team</html>"
+AboutView.11=<html>Copyright 2003-2012<br>Jajuk team</html>"
 
-PhysicalPlaylistRepositoryView.0=Reproducir
-PhysicalPlaylistRepositoryView.1=Editar
 PhysicalPlaylistRepositoryView.2=Gardar como
-PhysicalPlaylistRepositoryView.3=Borrar
-PhysicalPlaylistRepositoryView.4=Propiedades
-PhysicalPlaylistRepositoryView.6=Listas de Reprodución físicas
-PhysicalPlaylistRepositoryView.8=Intelixente
 PhysicalPlaylistRepositoryView.9=Reproducir Cola
-PhysicalPlaylistRepositoryView.10=Lista actual: arrastra e solta as pistas para engadilas á lista de reprodución
-PhysicalPlaylistRepositoryView.11=Nova
-PhysicalPlaylistRepositoryView.12=Nova lista de reprodución: arrastra e solta as pista a engadir a favoritos
-PhysicalPlaylistRepositoryView.13=Favoritos
-PhysicalPlaylistRepositoryView.14=Lista de reprodución de favoritos: arrastra e solta as pistas a engadir a favoritos
-PhysicalPlaylistRepositoryView.15=O Mellor de
-PhysicalPlaylistRepositoryView.16=Lista de reprodución de O Mellor de: contén as mellores pistas
-PhysicalPlaylistRepositoryView.17=Novidades
-PhysicalPlaylistRepositoryView.18=Lista de reprodución de novidades: contén as pistas máis novas da colección
-PhysicalPlaylistRepositoryView.19=Preparara Festa
 
 FilesTableView.0=Tabóa de arquivos
 FilesTableView.15=Reproducir un directorio
 #Dev: do not use ID = 16, next label is FilesTableView.17 
 
-DeviceView.0=Engadir un dispositivo
 DeviceView.1=Eliminar un dispositivo desinstalado (non borra nada do disco)
 DeviceView.2=Propiedades do dispositivo seleccionado
-DeviceView.3=Instala-lo dispositivo seleccionado
-DeviceView.4=Desinstala-lo dispositivo seleccionado
-DeviceView.5=Probar disponibilidade do dispositivo seleccionado
-DeviceView.6=Forza-lo refresco do dispositivo seleccionado
-DeviceView.7=Sincronizar dispositivo seleccionado
 DeviceView.8=Instalar
 DeviceView.9=Desinstalar
 DeviceView.10=Probar
@@ -804,9 +728,6 @@ JajukWindow.26=[Ctrl-p] Reproducir/Pausar
 JajukWindow.27=[Ctrl-s] Parar
 JajukWindow.31=Reproducir novidades da colección enteira
 JajukWindow.32=Rematar de reproducir este álbume
-JajukWindow.33=[Ctrl-UP/DOWN] Volume
-JajukWindow.34=Posición
-JajukWindow.35=Reproducindo:
 JajukWindow.36=Ambiente actual:
 JajukWindow.37=Sen Ambiente seleccionado
 #Do not use JajukWindow.38, next is JajukWindow.39 
@@ -816,25 +737,18 @@ SimpleDeviceWizard.0=Creación rápida de dispositivo
 FirstTimeWizard.0=Comezo rápido
 FirstTimeWizard.1=<html><p><br>Benvido! Este asistente ayudarache na creación da colección.</p></html>
 FirstTimeWizard.2=<html>Selecciona o directorio onde está situada a música<p>(O primeiro refresco levará un bó anaco)</html>
-FirstTimeWizard.4=Amosa-la axuda agora
 FirstTimeWizard.5=Por favor, escolle un directorio
 FirstTimeWizard.6=Preferencias avanzadas
 FirstTimeWizard.7=Establece-lo directorio da área de traballo de Jajuk :
 
-HelpView.2=Axuda
 
 DownloadManager.0=<html>Jajuk necesita a seña do teu proxy HTTP para descargar carátulas<br>Se non as queres, por favor cambia a túa configuración na cella Carátulas da vista de Preferencias<br>Se non tes proxy, cambia os axustes na cella de Rede da vista de Preferencias</html>
-DownloadManager.1=Seña requirida
 
-PropertiesWizard.0=Propiedades de ...
 PropertiesWizard.1=Propiedade
 PropertiesWizard.2=Valor
-PropertiesWizard.3=Editable?
 PropertiesWizard.4=Enlace
 PropertiesWizard.6=Selección
-PropertiesWizard.7=Tipo
 PropertiesWizard.8=Propiedade cambiada correctamente
-PropertiesWizard.9=Propiedade non editable para esta selección
 PropertiesWizard.10=as propiedades forón escollidas
 PropertiesWizard.11=Escribindo tag en:
 PropertiesWizard.12=Enlazar cuns detalles de propiedades dun elemento dado 
@@ -865,9 +779,6 @@ CatalogView.3=Refresca-lo catálogo
 CatalogView.4=Tamaño das miniaturas:
 CatalogView.5=Creada miniatura para:
 CatalogView.7=Seleccionar unha carátula
-CatalogView.8=Ningunha carátula atopada
-CatalogView.9=Anterior
-CatalogView.10=Seguinte
 CatalogView.11=Páxina:
 CatalogView.12=Amosa-la páxina anterior de miniaturas
 CatalogView.13=Amosa-la páxina seguinte de miniaturas
@@ -894,17 +805,12 @@ TipOfTheDayView.0=Consello do día
 TipOfTheDayView.1=¿Sabías...?
 TipOfTheDayView.2=¿Amosar ó comezo?
 
-CDDBWizard.0=Aceptar
 CDDBWizard.1=Nome do Arquivo
 CDDBWizard.2=Título da Pista Actual
 CDDBWizard.3=Título do Álbume Actual
 CDDBWizard.4=Título de Pista Proposto
 CDDBWizard.5=Título de Álbume Proposto:
-CDDBWizard.6=Feito! Atopado
-CDDBWizard.7=posibles coincidencias
 CDDBWizard.12=Non foi atopada coincidencia algunha !
-CDDBWizard.14=Este directorio non contén arquivo algún
-CDDBWizard.16=Xénero:
 CDDBWizard.17=Atopada coincidencia exacta !
 CDDBWizard.18=Coincidencias
 CDDBWizard.19=Obter Tags en liña
@@ -921,11 +827,7 @@ DigitalDJWizard.6=Nome do DJ (*)
 DigitalDJWizard.8=Número mínimo de estrelas:
 DigitalDJWizard.9=Atenuación (seg):
 DigitalDJWizard.10=Pistas somentes reproducidas unha vez
-DigitalDJWizard.11=Tirar
-DigitalDJWizard.12=Dende Xéneros
-DigitalDJWizard.13=A Xéneros
 DigitalDJWizard.14=Selección de Xéneros (seleccións múltiples permitidas)
-DigitalDJWizard.15=Número de pistas
 DigitalDJWizard.16=¿Queres....
 DigitalDJWizard.17=Crear un novo DJ ?
 DigitalDJWizard.18=Configurar un DJ existente ?
@@ -1031,7 +933,6 @@ ReportAction.19=Ir a:
 ActionMove.0=Pegar
 
 ActionRefresh.0=Forzar refresco
-ActionRefresh.1=Refresca-lo diretorio
 
 RenameAction.0=Renomear
 RenameAction.1=Por favor insire un novo nome para este arquivo:
@@ -1053,22 +954,18 @@ FindDuplicateTracksAction.2=Atopar pistas duplicadas
 FindDuplicateTracksAction.3=Lista de pistas duplicadas atopadas
 FindDuplicateTracksAction.4=Seleccionar tódalas pistas duplicadas
 
-RefreshDialog.0=Preparando actualización de dispositivo...
 RefreshDialog.1=Actualizando dispositivo
 RefreshDialog.2=Actualizando dispositivo: 
 RefreshDialog.3=Limpando os arquivos antigos
 
-RadioWizard.0=Selecciona ou crea unha web radio
 RadioWizard.1=Xestionar web radios
 RadioWizard.2=Nova
 RadioWizard.3=Borrar
 RadioWizard.4=Por defecto
 RadioWizard.5=Xa existe unha web radio con ese nome
-RadioWizard.6=Nome da Web Radio
 RadioWizard.7=Asistente de Web Radio
 RadioWizard.8=URL
 RadioWizard.9=Nome
-RadioWizard.10=URL incorrecta
 RadioWizard.11=O nome e a URL son obrigatorios
 
 UpdateManager.0=Unha nova versión de Jajuk (
diff --git a/src/main/java/org/jajuk/i18n/jajuk_it.properties b/src/main/resources/org/jajuk/i18n/jajuk_it.properties
similarity index 86%
rename from src/main/java/org/jajuk/i18n/jajuk_it.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_it.properties
index 58615bd..37fd346 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_it.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_it.properties
@@ -4,7 +4,7 @@
 #Scritto da : Riccardo Capecchi
 #Copyright 2003,2004 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
 #FROM en 1.54
-#$Revision$
+#
 
 #General Strings 
 Type.mp3=Mpeg layer 3
@@ -31,7 +31,6 @@ Perspective_Description_Files=Fisico
 Perspective_Description_Tracks=Logico
 Perspective_Description_Configuration=Configurazione
 Perspective_Description_Statistics=Statistiche
-Perspective_Description_Help=Aiuto
 
 Info=Informazioni
 Warning=Attenzione
@@ -69,14 +68,11 @@ Error.017=Errore analizzando il file con la playlist
 Error.018=Nessuna traccia puo' essere letta da questa playlist
 Error.019=Il nome e' gia' utilizzato da un dispositivo esistente 
 Error.020=Errore di Input/Output copiando il file
-Error.021=Il campo 'url' e' obbligatorio. Es: 'd:\mp3' sotto MS Windows, '/opt/mp3' sotto Unix 
-Error.022=Il campo 'nome' e' obbligatorio. Es: 'Hard drive', 'CD ROCK' 
 Error.024=Impossibile scrivere il file
 Error.025=Uno dei file che volevi leggere e' su un dispositivo smontato
 Error.026=Errore nella registrazione del lettore
 Error.027=Sincronizzazione annullata
 Error.028=Errore nel salvataggio della playlist
-Error.101=Il dispositivo non esiste o non e' raggiungibile
 Error.102=Errore
 Error.103=Errore leggendo le meta-informazioni (tag)
 Error.104=Errore scrivendo le meta-informazioni (tag)
@@ -84,7 +80,6 @@ Error.105=Il tasto ResourceBundle non puo' essere trovato
 Error.106=Eccezione non trattata
 Error.107=Gia' in corso di aggiornamento
 Error.108=Errore nell'analizzare il file di prospettiva
-Error.109=Implementazione della classe  del lettore o delle meta-informazioni non raggiungibile
 Error.110=Questo nome di attributo e' riservato da Jajuk , scegliere un altro nome
 Error.111=Dispositivo gia' montato
 Error.112=Impossibile montare il dispositivo
@@ -92,19 +87,16 @@ Error.113=Impossibile scrivere il file di configurazione
 Error.114=Impossibile leggere il file di configurazione
 Error.116=Impossibile registrare la prospettiva, classe non trovatao errore nel costrutto, vedere la traccia nello stack
 Error.117=Impossibile registrare la vista, classe non trovata
-Error.118=Errore nel trattamento di un evento
 Error.119=Errore nella lettura del file storico
 Error.120=Impossibile accedere al dispositivo : O non e' montato o e' attualmente in stato sincronizzazione/aggiornamento
 Error.121=Il dispositivo e' in uso e non puo' essere montato
 Error.122=Errore nella pila FIFO
-Error.123=Errore nel settagio del tema
-Error.124=E' stata trovata un altra sessione, e' possibile lanciare una sola istanza di Jajuk alla volta
 Error.125=Dispositivo gia' smontato
 
 
 #Strings from a class
 ParameterView.0=Durata dello storico
-ParameterView.2=Settare qua il numero di giorni di conservazione dello storico. Settare a -1 se non si vuole nessuno storico o 0 per tenere uno storico perenne
+ParameterView.2=Settare qua il numero di giorni di conservazione dello storico. Settare a 0 se non si vuole nessuno storico o -1 per tenere uno storico perenne
 ParameterView.3=Cancella storico
 ParameterView.4=Cancella storico
 ParameterView.8=Storico
@@ -127,8 +119,6 @@ ParameterView.30=Chiedi prima di uscire da Jajuk
 ParameterView.33=Opzioni
 ParameterView.34=Mostra solo i dispositivi montati
 ParameterView.35=Nascondi i brani su dispositivi non disponibili
-ParameterView.36=Riparti quando raggiungi la fine della collezione
-ParameterView.37=Riparti la collezione intera quando raggiungi la fine nella modalita' continua
 ParameterView.38=Linguaggio : 
 ParameterView.40=Inglese (en)
 ParameterView.41=Francese (fr)
@@ -162,8 +152,6 @@ ParameterView.87=Parametri
 ParameterView.96=Mostra copertina quando disponibile
 ParameterView.97=Mostra la copertina sia nella vista logica che fisica. La copertina e' il file 'cover.jpg' o la prima immagine trovata nella directory dell'album
 ParameterView.98=Meta-informazioni (Tags)
-ParameterView.99=Forza la rilettura delle meta-informazioni
-ParameterView.100=<html>Forza Jajuk la rilettura dei tags id3 .<p>Questo puo' essere utile per rileggere le meta-informazioni che hai modificato con altri programmi</html>
 ParameterView.101=Usa il nome della directory come nome dell'album
 ParameterView.102=Usa il nome della directory come nome dell'album per i brani che non hanno meta-informazioni
 ParameterView.103=Il cambio di linguaggio sara' attivo al prossimo riavvio di Jajuk
@@ -176,7 +164,6 @@ ParameterView.112=Setta il numero di brani per la playlist bestof (da 1 a 100)
 Main.10=Jajuk : Advanced Jukebox
 Main.12=E' la tua prima sessione di Jajuk, come prima cosa devi creare un dispositivo nella vista dei dispositivi
 Main.13=Jajuk partito correttamente
-Main.21=Conferme
 
 Device.21=Aggiornamento [
 Device.22=]  Entering [
@@ -256,8 +243,6 @@ CommandJPanel.1=Ripeti : Leggi i brani in un ciclo
 CommandJPanel.2=Casuale : Leggi in sequenza casuale i brani selezionati
 CommandJPanel.3=Continuo : Continua aleggere i brani quando la selezione e' terminata
 CommandJPanel.4=Introduzione : Leggi solo una parte di ogni brano. Il punto di partenza e la durata possono essere settati nella configurazione
-CommandJPanel.5=Leggi in modalita casuale dall'intera collezione
-CommandJPanel.6=Leggi i tuoi brani preferiti
 CommandJPanel.7=Spegni il sonoro
 CommandJPanel.8=Leggi il brano precedente nella selezione corrente
 CommandJPanel.9=Leggi il brano successivo nella selezione corrente
@@ -269,21 +254,18 @@ CommandJPanel.14=Volume
 CommandJPanel.15=Vai in questa posizione nel brano suonato
 
 InformationJPanel.5=Tempo totale rimasto di musica da leggere
-InformationJPanel.6=Qualita' (bitrate) del brano
 InformationJPanel.7=Posizione nel brano corrente
 
 AbstractPlaylistEditorView.0=Brano
 AbstractPlaylistEditorView.1=Locazione
 AbstractPlaylistEditorView.2=Leggi questa playlist
 AbstractPlaylistEditorView.3=Salva questa playlist
-AbstractPlaylistEditorView.4=Aggiungi un oggetto a questa playlist
 AbstractPlaylistEditorView.5=Togli un oggetto da questa playlist
 AbstractPlaylistEditorView.6=Sposta piu' in alto l'oggetto nella playlist
 AbstractPlaylistEditorView.7=Sposta piu' in basso l'oggetto nella playlist
 AbstractPlaylistEditorView.8=Mostra la playlist corrente
 AbstractPlaylistEditorView.9=cancella questa playlist
 AbstractPlaylistEditorView.15=Edita la Playlist
-AbstractPlaylistEditorView.17=Tu stai per aggiornare su disco le seguenti playlist:
 
 StatView.0=Altro
 StatView.1=Divisione per genere
@@ -364,8 +346,6 @@ FilesTreeView.13=Leggi ciclicamente
 FilesTreeView.14=Desincronizza
 FilesTreeView.15=Risincronizza
 FilesTreeView.16=Crea una playlist
-FilesTreeView.17=Copia
-FilesTreeView.18=Taglia
 FilesTreeView.19=Incolla
 FilesTreeView.20=Renomina
 FilesTreeView.21=Cancella
@@ -380,7 +360,6 @@ FilesTreeView.29=Smonta
 FilesTreeView.30=Aggiorna
 FilesTreeView.31=Sincronizza
 FilesTreeView.32=Testa
-FilesTreeView.33=Cre una playlists
 FilesTreeView.34=Setta un attributo
 FilesTreeView.35=Attributo
 FilesTreeView.36=Leggi
@@ -410,9 +389,6 @@ TracksTableView.6=Rate
 AbstractTableView.0=Filtro: 
 AbstractTableView.1=Attributo da filtrare
 AbstractTableView.3=Valore da utilizzare per il filtro
-AbstractTableView.4=Applica filtro
-AbstractTableView.5=Annula i filtri
-AbstractTableView.6=Applica un filtro avanzato
 AbstractTableView.7=contiene :
 
 AboutView.7=A proposito
@@ -420,21 +396,8 @@ AboutView.8=Licenza
 AboutView.9=Sistema
 AboutView.10=A proposito
 
-PhysicalPlaylistRepositoryView.0=Leggi
-PhysicalPlaylistRepositoryView.1=Modifica
 PhysicalPlaylistRepositoryView.2=Salva come
-PhysicalPlaylistRepositoryView.3=Cancella
-PhysicalPlaylistRepositoryView.4=Propieta'
-PhysicalPlaylistRepositoryView.6=Playlists
-PhysicalPlaylistRepositoryView.8=Speciali
 PhysicalPlaylistRepositoryView.9=Coda
-PhysicalPlaylistRepositoryView.10=Coda corrente : sposta/lascia per leggere i file
-PhysicalPlaylistRepositoryView.11=Nuovo
-PhysicalPlaylistRepositoryView.12=Nuova playlist : sposta/lascia per aggiungere i file alla playlist
-PhysicalPlaylistRepositoryView.13=Segnalibri
-PhysicalPlaylistRepositoryView.14=Segnalibri playlist : sposta/lascia per aggiungere un segnalibro
-PhysicalPlaylistRepositoryView.15=Best of
-PhysicalPlaylistRepositoryView.16=Best of playlist : contiene i migliori brani
 
 FilesTableView.0=Tabella Fisica
 FilesTableView.1=Leggi
@@ -452,14 +415,8 @@ FilesTableView.12=Dispositivo
 FilesTableView.13=File
 FilesTableView.14=Qualita'
 
-DeviceView.0=Aggiungi un dispositivo
 DeviceView.1=Cancella un dispositivo (non cancella nulla fisicamente dal disco)
 DeviceView.2=Propieta' del dispositivo selezionato
-DeviceView.3=Monta il dispositivo selezionato
-DeviceView.4=Smonta il dispositivo selezionato
-DeviceView.5=Testa la disponibilita' del dispositivo selezionato
-DeviceView.6=Aggiorna il dispositivo selezionato
-DeviceView.7=Sincronizza il dispositivo selezionato
 DeviceView.8=Monta
 DeviceView.9=Smonta
 DeviceView.10=Testa
@@ -486,5 +443,4 @@ JajukWindow.12=Leggi >
 JajukWindow.13=Precedente <--
 JajukWindow.14=Successivo -->
 
-HelpView.2=Aiuto
 ]]></body>
diff --git a/src/main/java/org/jajuk/i18n/jajuk_ko.properties b/src/main/resources/org/jajuk/i18n/jajuk_ko.properties
similarity index 88%
rename from src/main/java/org/jajuk/i18n/jajuk_ko.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_ko.properties
index 71a0eb6..1c99e1a 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_ko.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_ko.properties
@@ -5,7 +5,7 @@
 #Written by: Sung Pil Moon - 문성필(sungpilm at andrew.cmu.edu)
 #Copyright 2003,2004 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
 #REFERENCE
-#$Revision$
+#
 
 #--- Generic labels ---
 #DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -58,7 +58,6 @@ Perspective_Description_Files= 물리적
 Perspective_Description_Tracks=논리적
 Perspective_Description_Configuration=설정
 Perspective_Description_Statistics=통계
-Perspective_Description_Help=도움말
 Perspective_Description_Display=재생기
 Perspective_Description_Albums=카탈로그
 Perspective_Description_Info=정보
@@ -142,17 +141,13 @@ Error.017=재생목록 파일 파싱 에러
 Error.018=접근할 수 있는 트랙이 발견되지 않았습니다
 Error.019=기존에 있는 장치가 이미 이 이름을 가지고 있습니다. 
 Error.020=화일 복사, 디스크 용량 검사시 입출력 에러 
-Error.021=반드시 URL 필드를 입력하십시오 - 예) 'd:\music' under MS Windows, '/home/foo/music' under Unix (
-Error.022=반드시 Name 필드를 입력하십시오. 예) 'Hard drive', 'CD ROCK'  
 Error.023=시작 트랙을 시작할 수 없습니다
 Error.024=파일을 쓸 수 없습니다
 Error.025=읽고자 하는 파일 중 하나가 마운트되지 않은 장치에 있습니다
 Error.026=재생기 등록시 에러
 Error.027=동기화가 취소되었습니다.
 Error.028=재생목록 파일을 저장하는 데 에러가 발생했습니다
-Error.029=기존에 존재하는 장치가 현 장치의 부모 디렉토리와 동일한 경로나 자손 디렉토리를 가지고 있습니다. 
 Error.030=너무 많은 연결때문에 Jajuk이 온라인 커버를 찾는 것을 중지했습니다
-Error.101=장치가 존재하지 않거나 접근할 수 없습니다.
 Error.102=에러
 Error.103=태그 정보를 읽을 때 에러
 Error.104=태그 정보를 쓸 때 에러
@@ -160,31 +155,25 @@ Error.105=리소스 번들 키를 찾을 수 없습니다
 Error.106=잡히지 않는 예외 에러
 Error.107=이미 갱신하고 있거나 동기화하고 있는 중입니다
 Error.108=속성 파일 파싱 에러
-Error.109=재생기나 태그 구현 클래스에 접근할 수 없습니다
 Error.110=이 속성이름이 Jajuk 내부 시스템에서 사용되도록 되어있습니다. 다른 이름을 선택하십시오 
 Error.111=장치가 이미 마운트되어 있습니다
 Error.112=장치를 마운트할 수 없습니다
 Error.113=사용자 설정을 저장할 수 없습니다
 Error.114=사용자 설정을 읽을 수 없습니다.
-Error.118=이벤트 요청 처리시 에러가 발생했습니다
 Error.119=히스토리 화일 파싱시 에러가 발생했습니다
 Error.120=장치에 접근할 수 없습니다. 마운트되지 않았거나 현재 장치가 갱신중이거나 동기화 중일 수 있습니다. 
 Error.121=장치가 사용중이어서 마운트를 끝낼 수 없습니다. 
 Error.122=선입선출(FIFO)시 에러 
-Error.123=룩앤필(Look & Feel) 설정시 에러 
-Error.124=또 다른 세션이 발견되었습니다. 한 번에 하나의 Jajuk 인스턴스만 실행시킬 수 있습니다. 
 Error.125=장치가 이미 마운트를 끝냈습니다. 
 Error.126=검색(Seeking)은 이 오디오 포맷에서 지원되지 않습니다.
 Error.127=특정 시간 제한으로 인해 노벨티(Novelties) 기능을 사용할 수 없습니다.
 Error.128=현재 트랙이 컬렉션의 제일 첫 부분입니다. 가능한 이전 트랙이 없습니다.
-Error.129=커버이미지를 로딩할 때 에러가 발생했습니다
 Error.131=파일을 지울 수 없습니다
 Error.133=알 수 없는 이유로 인해 컬렉션 파일이 손상되었습니다.Jajuk이 백업화일 복구처리를 하였습니다. 
 Error.134=화일의 이름을 바꿀 수 없습니다.
 Error.135=화일이 존재하지 않습니다. 
 Error.136=명령수행에 실패했습니다 
 Error.137=잘못된 포맷입니다. 
-Error.138=트랙에 의해 매핑된 화일들이 마운트되지 않은 장치에 존재하여 변경될 수 없습니다. 
 Error.140=잘못된 문자열입니다. &, ', '', <, >는 포함될 수 없습니다. 
 Error.141=이 재생목록은 마운트되지 않았거나 새로 갱신중인 장치에 있어서 사용할 수 없습니다. 
 Error.142=이 재생목록은 알려진 외부 장치에 있는 일부 무시된 트랙들을 포함하고 있습니다. 
@@ -214,8 +203,6 @@ ParameterView.30=Jajuk을 끝내기 전 물어봅니다
 ParameterView.33=옵션
 ParameterView.34=오직 마운트된 장치들만 표시합니다 
 ParameterView.35=마운트되지 않은 장치에 있는 트랙들을 숨깁니다. 
-ParameterView.36=컬렉션의 끝 트랙에 도달했을 때 재시작합니다. 
-ParameterView.37=현재 모드에서 가장 마지막 트랙에 도달했을 때 모든 컬렉션을 재시작합니다. 
 ParameterView.38=언어: 
 ParameterView.42=인터페이스 언어 설정 
 ParameterView.43=룩앤필: 
@@ -245,8 +232,6 @@ ParameterView.85=적용
 ParameterView.86=디폴트로 복구합니다. 
 ParameterView.87=파라미터 
 ParameterView.98=태그
-ParameterView.99=보다 상세한 태그 스캔을 수행합니다. 
-ParameterView.100=<html> Jajuk이 실제 id3 태그를 다시 읽도록 강제시킵니다. <p> 이는 당신이 다른 프로그램을 사용하여 tag를 수정한 후 새로 갱신할 때 유용합니다. 
 ParameterView.101=앨범 이름으로 부모 디렉토리를 사용하십시오 
 ParameterView.102=id3 태그에 의해 앨범 이름을 얻을 수 없다면 Jajuk에게 부모 디렉토리를 사용하도록 하십시오 
 ParameterView.103=언어 변환은 다음 Jajuk 실행시 적용됩니다. 
@@ -259,7 +244,6 @@ ParameterView.114=테이블 필터에서 정규식 표현을 사용하십시오
 ParameterView.115=고급
 ParameterView.116=컬렉션 화일을 복구합니다. 
 ParameterView.117=컬렉션 화일을 <date>.xml 화일로 백업하려면 여기에 체크하십시오 
-ParameterView.118=백업 사이즈 (MB) 
 ParameterView.119=백업 사이즈 (MB) 
 ParameterView.120=컬렉션 문자셋 
 ParameterView.121=컬렉션 문자셋. UTF-16은 아시아 국가 언어에 최적화되어있고, UTF-8은 유럽언어에 최적화되어 있습니다. 
@@ -293,15 +277,11 @@ ParameterView.158=높음
 ParameterView.159=커버 
 ParameterView.160=커넥션 타임아웃 (초 단위) 
 ParameterView.161=커넥션 타임아웃 (초 단위): 설정 시간동안 반응이 없다면 명령은 완수되지 않은 것입니다. 
-ParameterView.162=전송 타임 아웃 (초 단위): 
-ParameterView.163=데이터 전송 타임 아웃 (초 단위): 설정 시간동안 필요로 하는 데이터가 완전히 다운로드 되지 않는 다면 명령은 완수되지 않은 것입니다. 
 ParameterView.164=장치를 제거하기 전 
 ParameterView.165=장치를 제거하기 전 물어봅니다. 
 ParameterView.166=커버를 섞습니다. 
 ParameterView.167=무작위로 커버를 표시합니다. 
 ParameterView.168=저자 
-ParameterView.169=커버를 미리 로드합니다. 
-ParameterView.170=가능하다면 모든 가능한 커버들을 미리 로드합니다. 
 ParameterView.171=실제로 커버를 제거하기 전 
 ParameterView.172=실제로 커버를 제거하기 전 물어봅니다. 
 ParameterView.175=각 트랙마다 커버를 로드합니다. 
@@ -322,7 +302,6 @@ ParameterView.189=rating을 초기화하기 전
 ParameterView.190=크로스 페이드 간격 (초 단위) 
 ParameterView.191=트랙간 크로스 페이드 간격 (초 단위) 
 
-Main.21=결정
 
 Player.0=오디오 라인을 기다립니다.(점유되어진 라인) 
 
@@ -404,8 +383,6 @@ CommandJPanel.1=반복 모드: 반복적으로 트랙을 재생합니다.
 CommandJPanel.2=셔플 모드: 선택된 트랙들을 무작위로 재생합니다. 
 CommandJPanel.3=계속 모드: 트랙 재생이 끝나면 다음곡을 재생합니다. 
 CommandJPanel.4=인트로 모드: 각 트랙마다 일정 시간동안만 재생합니다. 오프셋과 시간은 파라미터 뷰에서 설정할 수 있습니다. 
-CommandJPanel.5=전체 컬렉션에서 선택된 곡들을 무작위로 재생합니다. 
-CommandJPanel.6=사용자 선호 트랙들을 재생합니다. 
 CommandJPanel.7=소리를 제거합니다. 
 CommandJPanel.8=<html> 현 선택에서 이전 트랙을 재생합니다. <br> Shift+click을 누르면 이전 앨범을 시작합니다. </html>
 CommandJPanel.9=<html> 현 선택에서 다음 트랙을 재생합니다. <br> Shift+click을 누르면, 다음 앨범을 시작합니다. </html>
@@ -417,25 +394,21 @@ CommandJPanel.14=볼륨
 CommandJPanel.15=재생중인 트랙에서의 이 위치로 이동
 
 InformationJPanel.5=총 재생시간 
-InformationJPanel.6=트랙의 비트율
 InformationJPanel.7=현 트랙의 진행상황
 
 AbstractPlaylistEditorView.0=트랙
 AbstractPlaylistEditorView.1=위치
 AbstractPlaylistEditorView.2=현 재생목록을 실행합니다. 
 AbstractPlaylistEditorView.3=현 재생목록을 저장합니다. 
-AbstractPlaylistEditorView.4=선택 곡을 재생목록에 추가합니다. 
 AbstractPlaylistEditorView.5=현 재생목록으로부터 선택 곡을 제거합니다. 
 AbstractPlaylistEditorView.6=선택 곡의 목록 위치를 높게 설정합니다. 
 AbstractPlaylistEditorView.7=선택 곡의 목록 위치를 낮게 설정합니다. 
 AbstractPlaylistEditorView.9=현 재생목록을 제거합니다.
 AbstractPlaylistEditorView.10=셔플트랙을 재생목록에 추가합니다. 
 AbstractPlaylistEditorView.15=재생목록 에디터 
-AbstractPlaylistEditorView.17=다음의 모든 재생목록들을 모두 디스크에 업데이트하려고 합니다. 
 AbstractPlaylistEditorView.18=큐에 있는 트랙
 AbstractPlaylistEditorView.19=반복되는 트랙
 AbstractPlaylistEditorView.20=(재생) 예정 중인 트랙
-AbstractPlaylistEditorView.21=재생목록 트랙
 AbstractPlaylistEditorView.22=저장된 재생목록
 AbstractPlaylistEditorView.23=재생 
 AbstractPlaylistEditorView.24=다음
@@ -506,11 +479,8 @@ CoverView.5=자동 커버이미지 옵션이 체크되어 있다면 디스크나
 CoverView.6=원래 이름과 함께 커버 이미지 저장
 CoverView.7=커버 이미지를 새 이름으로. 저장
 CoverView.8=현 커버를 현 앨범의 기본 커버 이미지로 사용
-CoverView.9=커버
 CoverView.10=현 커버를 새 이름으로 저장
 CoverView.11=저장된 커버
-CoverView.12=앨범
-CoverView.13=트랙
 
 AnimationView.0=애니메이션
 
@@ -529,8 +499,6 @@ FilesTreeView.13=반복 재생
 FilesTreeView.14=비동기화
 FilesTreeView.15=재동기화
 FilesTreeView.16=재생목록 생성
-FilesTreeView.17=복사
-FilesTreeView.18=잘라내기
 FilesTreeView.19=붙여넣기
 FilesTreeView.21=제거
 FilesTreeView.23=속성
@@ -543,7 +511,6 @@ FilesTreeView.29=마운트 제거
 FilesTreeView.30=강제 새로고침
 FilesTreeView.31=동기화
 FilesTreeView.32=테스트
-FilesTreeView.33=재생목록 생성
 FilesTreeView.35=속성
 FilesTreeView.36=재생
 FilesTreeView.37=다음곡
@@ -575,9 +542,6 @@ TracksTableView.15=선호목록에 추가
 AbstractTableView.0=필터링: 
 AbstractTableView.1=필터링에 대한 속성
 AbstractTableView.3=필터링에 의해 사용되는 값
-AbstractTableView.4=필터링 적용
-AbstractTableView.5=필터링 초기화
-AbstractTableView.6=고급 필터링 적용
 AbstractTableView.7=포함:
 AbstractTableView.8=any
 AbstractTableView.10=(Not available)
@@ -587,23 +551,8 @@ AboutView.8=License
 AboutView.9=System
 AboutView.10=About
 
-PhysicalPlaylistRepositoryView.0=재생
-PhysicalPlaylistRepositoryView.1=에디트
 PhysicalPlaylistRepositoryView.2=새 이름으로
-PhysicalPlaylistRepositoryView.3=제거
-PhysicalPlaylistRepositoryView.4=속성
-PhysicalPlaylistRepositoryView.6=재생목록
-PhysicalPlaylistRepositoryView.8=Specials
 PhysicalPlaylistRepositoryView.9=큐
-PhysicalPlaylistRepositoryView.10=현재 큐: 재생되는 동안 드래그&드랍 가능
-PhysicalPlaylistRepositoryView.11=New
-PhysicalPlaylistRepositoryView.12=새 재생목록: 화일 추가하기 위해 드래그&드랍 가능
-PhysicalPlaylistRepositoryView.13=북마크
-PhysicalPlaylistRepositoryView.14=재생목록 북마크: 북마크에 추가하기 위해 드래그&드랍 가능
-PhysicalPlaylistRepositoryView.15=베스트
-PhysicalPlaylistRepositoryView.16=베스트 재생목록: top 트랙 포함.
-PhysicalPlaylistRepositoryView.17=Novelties
-PhysicalPlaylistRepositoryView.18=Novelties 재생목록: 새로 추가된 트랙들 포함
 
 FilesTableView.0=물리적 테이블
 FilesTableView.1=재생
@@ -614,14 +563,8 @@ FilesTableView.6=속성
 FilesTableView.15=디렉토리 재생
 FilesTableView.16=재생목록에 추가
 
-DeviceView.0=장치 추가
 DeviceView.1=마운트되지 않은 장치 제거 (디스크에서 물리적으로는 어떤 장치도 제거되지 않습니다.)
 DeviceView.2=선택된 장치 속성
-DeviceView.3=선택된 장치 마운트
-DeviceView.4=선택된 장치 마운트 해제
-DeviceView.5=선택된 장치 사용가능성 테스트 
-DeviceView.6=선택 장치의 새로고침 강제 
-DeviceView.7=선택된 장치 동기화 
 DeviceView.8=마운트
 DeviceView.9=마운트 해제 
 DeviceView.10=테스트
@@ -664,31 +607,21 @@ JajukWindow.29=이전 트랙 - left-click+[SHIFT]: 이전 앨범
 JajukWindow.30=다음 트랙 - left-click+[SHIFT]: 다음 앨범
 JajukWindow.31=전체 컬렉션에서 novelties 목록 재생
 JajukWindow.32=Continue album: finish to play current album
-JajukWindow.33=볼륨
-JajukWindow.34=위치
-JajukWindow.35=현 재생 :
 
 FirstTimeWizard.0=빠른 시작
 FirstTimeWizard.1=<html><b>환영합니다! Jajuk 마법사는 당신의 컬렉션을 생성하는 데 도움을 줄 것입니다.</b></html>
 FirstTimeWizard.2=음악 디렉토리 위치를 선택하십시오
 FirstTimeWizard.3=<html>Jajuk이 온라인에서 커버 이미지를 얻기를 원하십니까 <br>(자동적으로 인터넷을 연결할 것입니다) ?</html>
-FirstTimeWizard.4=바로 도움말을 보시겠습니까 ?
 FirstTimeWizard.5=디렉토리를 선택하십시오
 
-HelpView.2=도움말
 
 DownloadManager.0=<html>온라인에서 커버를 얻기 위해 당신의 HTTP proxy 패스워드가 필요합니다, Parameter의 네트웍 탭에서 설정을 변경하십시오.</html>
-DownloadManager.1=패스워드가 필요합니다. 
 
-PropertiesWizard.0=아이템 속성
 PropertiesWizard.1=속성
 PropertiesWizard.2=값
-PropertiesWizard.3=수정가능?
 PropertiesWizard.4=링크
 PropertiesWizard.6=Selection
-PropertiesWizard.7=유형
 PropertiesWizard.8=속성을 성공적으로 업데이트했습니다. 
-PropertiesWizard.9=현 선택에 대해 속성을 변경할 수 없습니다. 
 PropertiesWizard.10=속성이 변경되었습니다. 
 PropertiesWizard.11=Writing tag to:
 PropertiesWizard.12=Link to given element properties details
@@ -723,9 +656,6 @@ CatalogView.3=강제 썸네일 재생성
 CatalogView.4=썸네일 크기:
 CatalogView.5=썸네일 생성:
 CatalogView.7=온라인상에서 커머 이미지 수집
-CatalogView.8=발견된 커버 이미지가 없습니다. 
-CatalogView.9=이전
-CatalogView.10=다음
 
 WikipediaView.0=Wikipedia
 WikipediaView.1=언어를 선택하십시오:
@@ -734,19 +664,14 @@ TipOfTheDayView.0=Tip of the Day
 TipOfTheDayView.1=알고 있습니까... ?
 TipOfTheDayView.2=시작시 표시?
 
-CDDBWizard.0=수락
 CDDBWizard.1=파일 이름
 CDDBWizard.2=현재 트랙 이름
 CDDBWizard.3=현재 앨범 이름
 CDDBWizard.4=Proposed Track Name
 CDDBWizard.5=Proposed Album Name
-CDDBWizard.6=검색하였습니다.  
-CDDBWizard.7=가능한 검색 결과
 CDDBWizard.11=가능한 데이터베이스 서버에 요청하고 있습니다. 
 CDDBWizard.12=검색 결과가 없습니다. 
 CDDBWizard.13=가능한 검색 결과입니다.
-CDDBWizard.14=이 디렉토리는 어떤 파일도 포함하고 있지 않습니다. 
-CDDBWizard.16=스타일:
 CDDBWizard.17=요구사항과 정확하게 맞는 결과를 검색하였습니다. Found exact match !
 CDDBWizard.18=Match(es)
 
diff --git a/src/main/java/org/jajuk/i18n/jajuk_nl.properties b/src/main/resources/org/jajuk/i18n/jajuk_nl.properties
similarity index 88%
rename from src/main/java/org/jajuk/i18n/jajuk_nl.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_nl.properties
index 45a80c5..a806317 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_nl.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_nl.properties
@@ -4,7 +4,7 @@
 #Author: Marc-Siebren Kwadijk and Bart Cremers
 #Copyright 2006 Bart Cremers, this is part of Jajuk distributed under the GPL V2 license
 #FROM en 1.178
-#$Revision$
+#
 
 #--- Generic labels ---
 #DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -57,7 +57,6 @@ Perspective_Description_Files=Fysiek
 Perspective_Description_Tracks=Logisch
 Perspective_Description_Configuration=Configuratie
 Perspective_Description_Statistics=Statistieken
-Perspective_Description_Help=Help
 Perspective_Description_Display=Speler
 Perspective_Description_Albums=Catalogus
 Perspective_Description_Info=Informatie
@@ -140,17 +139,13 @@ Error.017=Fout bij het omzetten van het bestand met de afspeellijst.
 Error.018=Van deze afspeellijst kan geen toegankelijk spoor geladen worden.
 Error.019=Deze naam wordt al gebruikt door een ander apparaat.
 Error.020=IO fout bij het kopieren van het bestand, controleer de vrije ruimte op de schijf.
-Error.021=Het URL veld is verplicht. Bijv: 'd:\mp3' in MS Windows, '/opt/mp3' in Unix
-Error.022=Het Naam veld is verplicht. Bijv: 'Harde schijf', 'CD ROCK'.
 Error.023=Kan het opstart nummer niet afspelen.
 Error.024=Kan dit bestand niet schrijven.
 Error.025=Een van de bestanden die u wilt lezen staat op een apparaat dat niet verbonden is.
 Error.026=Fout bij het registreren van spelers.
 Error.027=Synchronisatie is afgebroken.
 Error.028=Fout bij het bewaren van de afspeellijst.
-Error.029=Een bestaand apparaat is een bovenliggen map van dit apparaat, heeft dezelfde locatie of is een onderliggende map.
 Error.030=Te veel problemen bij het connecteren, Jajuk stopt met het online zoeken naar omslagen.
-Error.101=Apparaat bestaat niet of is niet bereikbaar.
 Error.102=Fout
 Error.103=Fout bij het lezen van label informatie.
 Error.104=Fout bij het schrijven van label informatie.
@@ -158,38 +153,32 @@ Error.105=Sleutel van de ResourceBundle kan niet gevonden worden.
 Error.106=Niet voorziene fout.
 Error.107=Verversen is al bezig.
 Error.108=Fout bij het omzetten van een perspectief bestand.
-Error.109=De implementatie class van de speler of het label is niet bereikbaar.
 Error.110=Deze naam is in gebruik door het interne systeem van Jajuk, kies een andere naam.
 Error.111=Dit apparaat is al verbonden.
 Error.112=Kan dit apparaat niet verbinden.
 Error.113=Kan gebruikers informatie niet opslaan.
 Error.114=Kan gebruikers informatie niet lezen.
-Error.118=Fout bij het behandelen van een event.
 Error.119=Fout bij het omzetten van het geschiedenis bestand.
 Error.120=Kan het apparaat niet bereiken. Het is niet geladen of nu aan het verversen/synchroniseren.
 Error.121=Dit apparaat is in gebruik en kan niet geladen worden.
 Error.122=Fout in FIFO.
-Error.123=Fout bij het instellen van de interface.
-Error.124=Jajuk draait al op dit systeem. Je kan maar één Jajuk instantie tegelijk starten.
 Error.125=Dit apparaat is al geladen.
 Error.126=Zoeken wordt niet ondersteund door dit audio formaat.
 Error.127=None novelties for the specified time limit, you can set it in the parameter view
 Error.128=Huidig nummer is het eerste in de verzameling, geen vorig nummer beschikbaar.
-Error.129=Fout bij het laden van de omslag afbeelding.
 Error.131=Kan het bestand niet verwijderen.
 Error.133=Je verzameling bestand is door een onbekende reden onleesbaar geworden. Jajuk heeft je verzameling geladen van een backup bestand.
 Error.134=Kan het bestand niet hernoemen.
 Error.135=Het bestand bestaat niet.
 Error.136=Handeling mislukt!
 Error.137=Onjuist formaat
-Error.138=Some files mapped by these track are located on unmonted devices and thus haven't been changed.
 Error.140=Verkeerd formaat:  & ' " < en > zijn niet toegelaten.
 Error.141=Deze afspeellijst bevindt zich op een afgekoppeld apparaat of het apparaat is aan het verversen. Daarom is het bestand momenteel niet beschikbaar.
 Error.142=Deze afspeellijst bevat enkele genegeerde nummers die zich buiten de gekende apparaten bevinden.
 
 #Strings from a class
 ParameterView.0=Lengte van de geschiedenis:
-ParameterView.2=Stel hier het aantal dagen in dat u bij wilt houden wat u geluisterd heeft. Stel -1 in als u niets wilt bijhouden en 0 als u het permanent wilt bewaren.
+ParameterView.2=Stel hier het aantal dagen in dat u bij wilt houden wat u geluisterd heeft. Stel 0 in als u niets wilt bijhouden en -1 als u het permanent wilt bewaren.
 ParameterView.3=Wis geschiedenis
 ParameterView.4=Wis geschiedenis
 ParameterView.8=Geschiedenis
@@ -212,8 +201,6 @@ ParameterView.30=Vraag voordat Jajuk gestopt wordt
 ParameterView.33=Opties
 ParameterView.34=Laat alleen verbonden apparaten zien
 ParameterView.35=Verberg nummers op niet verbonden apparaten
-ParameterView.36=Begin opnieuw aan het einde van de verzameling
-ParameterView.37=Begin opnieuw met de hele verzameling als het einde wordt bereikt bij continu spelen
 ParameterView.38=Taal:
 ParameterView.42=Taal instelling voor de interface
 ParameterView.43=Uiterlijk en gedrag:
@@ -243,8 +230,6 @@ ParameterView.85=Pas toe
 ParameterView.86=Herstel standaardinstellingen
 ParameterView.87=Parameters
 ParameterView.98=Labels
-ParameterView.99=Doe een grondige scan voor labels.
-ParameterView.100=<html>Dwing Jajuk de huidige id3 labels te lezen.<p>Dit kan nuttig zijn om labels te verversen die u in een ander programma hebt aangepast.</html>
 ParameterView.101=Gebruik de bovenliggende map als album naam
 ParameterView.102=Gebruik de bovenliggende map als album naam als die naam niet met id3 labels wordt gevonden.
 ParameterView.103=De taal wordt veranderd nadat Jajuk opnieuw is opgestart.
@@ -257,7 +242,6 @@ ParameterView.114=Gebruik Reguliere expressies (Regexp formaat) in filters voor
 ParameterView.115=Geavanceerd
 ParameterView.116=Reservekopie verzameling bestand
 ParameterView.117=Selecteer dit als je een reservekopie van je verzameling bestand collection-<datum>.xml bestanden wil maken.
-ParameterView.118=Grootte reservekopie (MB)
 ParameterView.119=Grootte reservekopie (MB)
 ParameterView.120=Tekenset verzameling
 ParameterView.121=Tekenset verzameling. UTF-16 is optimaal voor Aziatische talen en UTF-8 is optimaal voor Europese talen.
@@ -291,15 +275,11 @@ ParameterView.158=Hoog
 ParameterView.159=Omslagen
 ParameterView.160=Tijdslimiet verbinding (sec)
 ParameterView.161=Tijdslimiet voor de verbinding in seconden: de bewerking mislukt als een externe computer geen antwoord geeft binnen deze limiet.
-ParameterView.162=Tijdslimiet overdracht (sec).
-ParameterView.163=Tijdslimiet voor de gegevens overdracht in seconden: de bewerking mislukt als de benodigde gegevens niet volledig binnen gehaald zijn binnen deze limiet.
 ParameterView.164=Voor het verwijderen van een apparaat
 ParameterView.165=Vragen voor het verwijderen van een apparaat.
 ParameterView.166=Omslagen in willekeurige volgorde
 ParameterView.167=Toon een willekeurige omslag.
 ParameterView.168=Auteur
-ParameterView.169=Omslagen vooraf laden
-ParameterView.170=Laad alle beschikbare omslagen op voorhand indien mogelijk.
 ParameterView.171=Alvorens een omslag fysiek te verwijderen
 ParameterView.172=Vragen voor het fysiek verwijderen van een omslag.
 ParameterView.175=Laad omslag bij elk nummer
@@ -320,7 +300,6 @@ ParameterView.189=Alvorens de waarderingen te wissen
 ParameterView.190=Duur Cross-Fade (sec)
 ParameterView.191=Duur van de cross-fade tussen twee nummers in seconden
 
-Main.21=Bevestiging
 
 Player.0=Wachten op audio kanaal (bezet)
 
@@ -402,8 +381,6 @@ CommandJPanel.1=Herhaling: blijf nummers herhalen
 CommandJPanel.2=Willekeurig: speel willekeurig gekozen nummers
 CommandJPanel.3=Continu: speel nieuwe nummers na afronding
 CommandJPanel.4=Intro: speel een deel van elk nummer. Begin en duur kunnen ingesteld worden bij Instellingen
-CommandJPanel.5=Speel een willekeurige selectie van de hele verzameling
-CommandJPanel.6=Speel uw favoriete nummers
 CommandJPanel.7=Geluid uit
 CommandJPanel.8=Speel vorige nummer van huidige selectie
 CommandJPanel.9=Speel volgende nummer van huidige selectie
@@ -415,25 +392,21 @@ CommandJPanel.14=Volume
 CommandJPanel.15=Ga naar dit moment in het huidige nummer
 
 InformationJPanel.5=Totale tijd nog te spelen
-InformationJPanel.6=Bitrate van dit nummer
 InformationJPanel.7=Voortgang van dit nummer
 
 AbstractPlaylistEditorView.0=Nummer
 AbstractPlaylistEditorView.1=Locatie
 AbstractPlaylistEditorView.2=Speel deze speellijst
 AbstractPlaylistEditorView.3=Bewaar deze speellijst
-AbstractPlaylistEditorView.4=Voeg toe aan deze speellijst
 AbstractPlaylistEditorView.5=Verwijder van deze speellijst
 AbstractPlaylistEditorView.6=Positie van dit onderdeel hoger
 AbstractPlaylistEditorView.7=Positie van dit onderdeel lager
 AbstractPlaylistEditorView.9=Wis deze speellijst
 AbstractPlaylistEditorView.10=Voeg een willekeurig nummer toe aan deze afspeellijst
 AbstractPlaylistEditorView.15=Speellijst aanpassen
-AbstractPlaylistEditorView.17=U zult nu op schijf deze speellijsten updaten:
 AbstractPlaylistEditorView.18=Nummer in de wachtrij
 AbstractPlaylistEditorView.19=Nummer herhaald
 AbstractPlaylistEditorView.20=Nummer gepland
-AbstractPlaylistEditorView.21=Nummer in afspeellijst
 AbstractPlaylistEditorView.22=Afspeellijst bewaard
 AbstractPlaylistEditorView.23=Afspelen
 AbstractPlaylistEditorView.24=Push
@@ -504,11 +477,8 @@ CoverView.5=Volgende afbeelding vanaf de schijf en/of het internet als de "voora
 CoverView.6=Bewaar omslag met de origele naam
 CoverView.7=Bewaar omslag als...
 CoverView.8=Gebruik deze omslag als de standaard omslag voor dit album
-CoverView.9=omslagen
 CoverView.10=Bewaar omslag als
 CoverView.11=Omslag bewaard
-CoverView.12=Album
-CoverView.13=Nummer
 
 AnimationView.0=Animatie
 
@@ -527,8 +497,6 @@ FilesTreeView.13=Speel en herhaal
 FilesTreeView.14=Herstel synchroniseren
 FilesTreeView.15=Synchroniseer opnieuw
 FilesTreeView.16=Maak speellijst
-FilesTreeView.17=Kopieer
-FilesTreeView.18=Knip
 FilesTreeView.19=Plak
 FilesTreeView.21=Wis
 FilesTreeView.23=Eigenschappen
@@ -541,7 +509,6 @@ FilesTreeView.29=Verbreek verbinding
 FilesTreeView.30=Ververs
 FilesTreeView.31=Synchroniseer
 FilesTreeView.32=Test
-FilesTreeView.33=Maak afspeellijsten
 FilesTreeView.35=Eigenschappen
 FilesTreeView.36=Speel
 FilesTreeView.37=Dwing
@@ -573,9 +540,6 @@ TracksTableView.15=Toevoegen aan Favorieten
 AbstractTableView.0=Filter:
 AbstractTableView.1=Eigenschap van filter
 AbstractTableView.3=Waarde gebruikt door de filter
-AbstractTableView.4=Pas filter toe
-AbstractTableView.5=Wis het filter
-AbstractTableView.6=Pas geavanceerd filter toe
 AbstractTableView.7=bevat:
 AbstractTableView.8=Alles
 AbstractTableView.10=(Niet beschikbaar)
@@ -585,23 +549,8 @@ AboutView.8=Licentie
 AboutView.9=Systeem
 AboutView.10=Over
 
-PhysicalPlaylistRepositoryView.0=Speel
-PhysicalPlaylistRepositoryView.1=Wijzig
 PhysicalPlaylistRepositoryView.2=Bewaar als
-PhysicalPlaylistRepositoryView.3=Wis
-PhysicalPlaylistRepositoryView.4=Eigenschappen
-PhysicalPlaylistRepositoryView.6=Speellijsten
-PhysicalPlaylistRepositoryView.8=Speciaal
 PhysicalPlaylistRepositoryView.9=Wachtrij
-PhysicalPlaylistRepositoryView.10=Huidige wachtrij: selecteer en sleep erin om af te spelen
-PhysicalPlaylistRepositoryView.11=Nieuw
-PhysicalPlaylistRepositoryView.12=Nieuwe afspeellijst: selecteer en sleep erin om nummers toe te voegen
-PhysicalPlaylistRepositoryView.13=Gemarkeerd
-PhysicalPlaylistRepositoryView.14=Gemarkeerde afspeellijst: selecteer en sleep erin om bij te houden
-PhysicalPlaylistRepositoryView.15=Favorieten
-PhysicalPlaylistRepositoryView.16=Favorieten afspeellijst: de beste nummers
-PhysicalPlaylistRepositoryView.17=Niewigheden
-PhysicalPlaylistRepositoryView.18=Niewigheden afspeellijst: bevat de nieuwste nummer uit de vezameling
 
 FilesTableView.0=Fysieke tabel
 FilesTableView.1=Speel
@@ -612,14 +561,8 @@ FilesTableView.6=Eigenschappen
 FilesTableView.15=Afspeel map
 FilesTableView.16=Toevoegen aan Favorieten
 
-DeviceView.0=Voeg een apparaat toe
 DeviceView.1=Verwijder apparaat (verwijdert niets van schijf)
 DeviceView.2=Kies apparaat eigenschappen
-DeviceView.3=Verbind met gekozen apparaat
-DeviceView.4=Verbreek verbinding met gekozen apparaat
-DeviceView.5=Test beschikbaarheid van gekozen apparaat
-DeviceView.6=Ververs gekozen apparaat
-DeviceView.7=Synchroniseer gekozen apparaat
 DeviceView.8=Verbind
 DeviceView.9=Verbreek verbinding
 DeviceView.10=Test
@@ -662,31 +605,21 @@ JajukWindow.29=Vorig nummer - [SHIFT] + linker muisknop : vorig album.
 JajukWindow.30=Volgend nummer - [SHIFT] + linker muisknop : volgend album.
 JajukWindow.31=Speel nieuwe nummers uit de volledige verzameling
 JajukWindow.32=Vervolg album: speel huidig album volledig af
-JajukWindow.33=Volume
-JajukWindow.34=Positie
-JajukWindow.35=Nu speelt :
 
 FirstTimeWizard.0=Snelstart
 FirstTimeWizard.1=<html><b>Welkom! Deze assistent zal je helpen om je eerste collectie aan te maken.</b></html>
 FirstTimeWizard.2=Kies de locatie van je muziek bestanden (bijvoorbeeld ~/music of d:\music):
 FirstTimeWizard.3=<html>Wil je dat Jajuk omslagen op het internet zoekt?<br>(een verbinding met internet wordt automatisch gemaakt indien nodig) ?</html>
-FirstTimeWizard.4=Toon extra hulp onmiddellijk ?
 FirstTimeWizard.5=Kies een map
 
-HelpView.2=Help
 
 DownloadManager.0=<html>Jajuk heeft je HTTP-proxy wachtwoord nodig om de omslagen op te halen.<br>Als je dit niet wil, verander dan je instellingen in de "Omslagen" tab van het parameter beeld.<br>Als je geen proxy hebt, verander dan je instellingen in de "Netwerk" tab van het Parameter beeld.</html>
-DownloadManager.1=Wachtwoord nodig
 
-PropertiesWizard.0=Item eigenschappen
 PropertiesWizard.1=Eigenschap
 PropertiesWizard.2=Waarde
-PropertiesWizard.3=Aanpasbaar?
 PropertiesWizard.4=Koppeling
 PropertiesWizard.6=Selectie
-PropertiesWizard.7=Type
 PropertiesWizard.8=Eigenschap bijgewerkn gelukt
-PropertiesWizard.9=Geen aanpasbare eigenschap voor deze selectie
 PropertiesWizard.10=eigenschappen zijn ingesteld
 PropertiesWizard.11=Schrijft label naar:
 PropertiesWizard.12=Koppeling naar eigenschap details van het gegeven element
@@ -719,9 +652,6 @@ CatalogView.3=Forceer opnieuw aanmaken van miniaturen
 CatalogView.4=Grootte miniaturen:
 CatalogView.5=Aanmaken van miniatuur voor:
 CatalogView.7=Haal omslagen online
-CatalogView.8=Geen omslagen gevonden
-CatalogView.9=Vorige
-CatalogView.10=Volgende
 
 WikipediaView.0=Wikipedia
 WikipediaView.1=Kies taal:
@@ -730,19 +660,14 @@ TipOfTheDayView.0=Tip van de Dag
 TipOfTheDayView.1=Wist je dat ... ?
 TipOfTheDayView.2=Toon bij opstarten?
 
-CDDBWizard.0=Accepteren
 CDDBWizard.1=Bestandsnaam
 CDDBWizard.2=Naam huidig nummer
 CDDBWizard.3=Titel huidig album
 CDDBWizard.4=Voorgestelde naam voor nummer
 CDDBWizard.5=Voorgestelde naam voor album
-CDDBWizard.6=Klaar !
-CDDBWizard.7=mogelijke overeenkomsten gevonden
 CDDBWizard.11=Vragen aan Freedb Servers ...
 CDDBWizard.12=Geen overeenkomst gevonden !
 CDDBWizard.13=Mogelijke overeenkomsten gevonden !
-CDDBWizard.14=Deze map bevat geen enkel bestand
-CDDBWizard.16=Stijl:
 CDDBWizard.17=Precieze overeenkomst gevonden !
 CDDBWizard.18=Match(es)
 
diff --git a/src/main/java/org/jajuk/i18n/jajuk_pt.properties b/src/main/resources/org/jajuk/i18n/jajuk_pt.properties
similarity index 90%
rename from src/main/java/org/jajuk/i18n/jajuk_pt.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_pt.properties
index 88dc69f..244e10f 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_pt.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_pt.properties
@@ -2,9 +2,9 @@
 <body><![CDATA[
 #Jajuk Portuguese langpack. 
 #Author: Augusto Bastos R.
-#Copyright 2003-2011 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
+#Copyright 2003-2012 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
 #FROM en 5888
-#$Revision$
+#
  
 #--- Generic labels ---
 # DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -31,9 +31,7 @@ Hide=Não mostrar novamente
 Path=Por favor escolha um caminho
 Later=Mais tarde
 Default=Predefinição
-All=Tudo
 YestoAll=Sim para tudo
-Maximize=Maximizar
 Purge=Purgar
 
 #--- Wizard Strings --- 
@@ -57,7 +55,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
 Type.mac=Monkey's Audio format
 Type.radio=Rádio Web
 Type.video=Vídeo
@@ -68,7 +65,6 @@ unknown_artist=Desconhecido
 unknown_album=Desconhecido
 unknown_genre=Desconhecido
 unknown_year=Desconhecido
-unknown_album-artist=Desconhecido
 
 various_artist=Vários Artistas
 
@@ -87,11 +83,9 @@ Confirmation_clear_history=Deseja mesmo limpar o histórico?
 Confirmation_reset_ratings=Deseja mesmo redefinir todas as pontuações para zero?
 Confirmation_refactor_files=Deseja mesmo renomear este(s) ficheiro(s)?
 Confirmation_restore_all=Um restauro completo das vistas requer que o Jajuk reinicie. Deseja prosseguir?
-Confirmation_defaults_radios=Esta acção irá eliminar todas as estações de rádio previamente criadas. Deseja prosseguir?
 Confirmation_delete_empty_dirs=Os directórios seguintes estão vazios. Deseja eliminá-los?
 Confirmation_file_overwrite=Este ficheiro já existe. Deseja reescrevê-lo?
 Confirmation_file_number=ficheiro(s) será(ão) eliminado(s).
-Confirmation_alarm_stop=Deseja mesmo parar este alarme?
 Confirmation_defaults=Note que esta acção irá redefinir todas as opções de separadores para os valores predefinidos. Deseja prosseguir?
 Confirmation_rebuild_thumbs=Esta acção irá redesenhar as miniaturas de todos os seus álbuns, poderá demorar vários minutos para colecções grandes. Deseja prosseguir?  
 Confirmation_reset_preferences=Deseja mesmo redefinir as preferências da faixa?
@@ -109,7 +103,6 @@ Perspective_Description_Files=Ficheiros
 Perspective_Description_Tracks=Faixas
 Perspective_Description_Configuration=Configurações
 Perspective_Description_Statistics=Estatísticas
-Perspective_Description_Help=Ajuda
 Perspective_Description_Display=Sob Escuta
 Perspective_Description_Albums=Álbuns
 Perspective_Description_Info=Informações
@@ -201,17 +194,13 @@ Error.017=Erro ao analisar a lista de reprodução.
 Error.018=Não é possível encontrar faixas acessíveis.
 Error.019=Um dispositivo existente já possui este nome.
 Error.020=Erro de I/O copiando ficheiro. O disco poderá estar cheio.
-Error.021=O campo de URL é obrigatório. Ex.:  '/home/foo/music' em Unix, 'd:\music' no MS Windows.
-Error.022=O campo do Nome é obrigatório. Ex.: 'Disco Rígido', 'CD ROCK'.
 Error.023=Não é possível começar a faixa de início.
 Error.024=Não é possível reescrever ficheiro.
 Error.025=Um dos ficheiros que está a tentar ler está num dispositivo desmontado.
 Error.026=Erro ao registar leitores.
 Error.027=Sincronização abortada.
 Error.028=Erro ao guardar lista de reprodução.
-Error.029=Um dispositivo existente é um directório superior deste dispositivo, tem o mesmo caminho ou é um directório inferior.
 Error.030=Demasiadas falhas na conexão. O Jajuk desistiu da procura das capas em linha.
-Error.101=O Dispositivo não existe ou não está acessível.
 Error.102=Erro!
 Error.103=Erro ao ler informações da etiqueta.
 Error.104=Erro ao escrever informações na etiqueta.
@@ -219,31 +208,25 @@ Error.105=Chave de recursos não encontrada.
 Error.106=Excepção não prevista.
 Error.107=Dispositivo já em actualização ou sincronização.
 Error.108=Erro de análise ao ficheiro da Perspectiva.
-Error.109=Classe da implementação do leitor ou da etiqueta não acessível.
 Error.110=O nome desta propriedade está reservada ao sistema interno do Jajuk. Por favor escolha outro.
 Error.111=O dispositivo já está montado.
 Error.112=Não é possível proceder à montagem do dispositivo.
 Error.113=Não é possível guardar as configurações do utilizador.
 Error.114=Não é possível ler as configurações do utilizador.
-Error.118=Erro ao processar a acção requisitada.
 Error.119=Erro na análise ou ausência do ficheiro do histórico.
 Error.120=Não é possível aceder ao dispositivo: ou não está montado, ou está em actualização ou sincronização.
 Error.121=O dispositivo está em utilização e não é possível desmontá-lo.
 Error.122=Erro no FIFO.
-Error.123=Erro definindo o tema visual.
-Error.124=O Jajuk já está em execução. Apenas uma instância do programa pode ser executada de cada vez.
 Error.125=O dispositivo já está montado.
 Error.126=A função de pesquisa não é suportada por este formato de áudio.
 Error.127=Não foram encontradas Novas Entradas para a janela temporal especificada. Pode definir os limites temporais na vista das Preferências.
 Error.128=A faixa presente é a primeira da colecção. Não existe faixa que a anteceda.
-Error.129=Erro ao carregar a imagem de capa.
 Error.131=Não é possível eliminar o ficheiro.
 Error.133=O ficheiro da sua colecção ficou corrompido por razão desconhecida. O Jajuk restaurou a colecção pela cópia de segurança.
 Error.134=Não é possível renomear o ficheiro.
 Error.135=O ficheiro não existe.
 Error.136=A operação foi mal sucedida.
 Error.137=Formato errado.
-Error.138=Alguns ficheiros apontados por estas faixas estão localizados em dispositivos desmontados e por isso não foram alterados.
 Error.140=Expressão inválida: não pode conter os caracteres & ' " < > 
 Error.141=Esta lista de reprodução está localizada num dispositivo desmontado ou em actualização e por isso não está disponível.
 Error.142=Esta lista de reprodução aponta para faixas não existentes ou para faixas localizadas fora dos dispositivos conhecidos pelo Jajuk. Essas faixas foram ignoradas.
@@ -255,7 +238,6 @@ Error.147=Alguns ficheiros não puderam ser movidos (ver detalhes para mais info
 Error.148=O campo do Ano é desconhecido.
 Error.149=O campo do Álbum é desconhecido.
 Error.150=O campo do Artista é desconhecido.
-Error.151=O campo do Título da Faixa é desconhecido.
 Error.152=O campo do Faixa é desconhecido.
 Error.153=O campo do Género é desconhecido.
 Error.154=Não é possível renomear o ficheiro, verifique a presença de caracteres interditos no nome do ficheiro ou etiquetas.
@@ -268,22 +250,17 @@ Error.160=O ficheiro não foi movido, os nomes de origem e destino são idêntic
 Error.161=Não é possível escrever para o directório, verifique permissões.
 Error.162=Esta propriedade personalizada já existe.
 Error.163=Erro ao restaurar vistas predefinidas.
-Error.164=Nenhuma faixa acessível para ambiência: 
 Error.165=Caminho errado para a colecção, o directório não pode ser encontrado ou não pode ser escrito.
 Error.166=Álbum vazio, não é possível requestar a capa.
 Error.167=Não foi possível criar o relatório.
-Error.168=Não foram encontrados ficheiros duplicados.
-Error.169=Operação mal sucedida. Note que esta operação necessita de uma ligação à Internet para poder requestar a lista de estações de rádio.
-Error.170=Erro ao reproduzir rádio web.
 Error.171=Uma fonte de sincronização ainda não foi definida para este dispositivo, defina-a através do utilitário de configuração do dispositivo na vista dos Dispositivos / Dispositivo.
 Error.172=Não é possível eliminar os ficheiros actualmente em reprodução: 
-Error.173=Erro encontrado ao eliminar os seguintes directórios: 
 Error.174=Erro ao aceder ao sítio web Freedbe, verifique a sua ligação à rede.
-Error.175=Operação cancelada.
 Error.176=Erro ao gerar a lista de reprodução.
 Error.177=Por favor introduza um tempo válido no formato HH(0-24):MM:SS.
 Error.179=Não é possível abrir o explorador de ficheiros do sistema, experimente definir-lhe um caminho na vista das Preferências / Avançadas.
 Error.180=Erro ao copiar os ficheiros.
+Error.184=Valor errado: o intervalo de actualização deve ser 0 ou um número >= 0,5
 
 #Warnings
 Warning.0=O MPlayer não foi encontrado. Alguns formatos de áudio e de vídeo (flac, wma, aac, mpg2 ... ) serão desabilitados. Se o MPlayer já está instalado, por favor defina manualmente o seu caminho na vistas das Preferências / Avançadas.
@@ -297,7 +274,7 @@ Warning.7=O Jajuk precisa de realizar uma actualização exaustiva da colecção
 
 #--- Strings by class ---
 ParameterView.0=Duração do histórico: 
-ParameterView.2=Defina o número de dias que se deve manter o registo das faixas reproduzidas. Introduza -1 se não quiser registar um histórico, e -0 se preferir registar o histórico permanentemente
+ParameterView.2=Defina o número de dias que se deve manter o registo das faixas reproduzidas. Introduza 0 se não quiser registar um histórico, e -1 se preferir registar o histórico permanentemente
 ParameterView.3=Limpar o histórico
 ParameterView.4=Limpar o histórico
 ParameterView.8=Histórico
@@ -319,8 +296,6 @@ ParameterView.29=Antes de sair do Jajuk
 ParameterView.30=Perguntar antes de fechar o programa
 ParameterView.33=Opções
 ParameterView.35=Esconder faixas localizadas em dispositivos desmontados
-ParameterView.36=Retomar quando o final da colecção for atingido
-ParameterView.37=Reiniciar a colecção quando o final for atingido no modo Contínuo
 ParameterView.38=Língua: 
 ParameterView.42=Seleccione a língua do interface
 ParameterView.43=Tema visual: 
@@ -340,8 +315,6 @@ ParameterView.85=Aplicar
 ParameterView.86=Restaurar predefinições
 ParameterView.87=Preferências
 ParameterView.98=Padrões
-ParameterView.99=Executar um rastreio exaustivo às etiquetas
-ParameterView.100=<html>Forçar o Jajuk a reler as actuais etiquetas id3.<p>Isto poderá ser útil na actualização de etiquetas modificadas utilizando um outro programa.</p></html>
 ParameterView.101=Utilizar o directório superior como nome do álbum
 ParameterView.102=Quando verificado, o nome do directório superior será utilizado como o nome do álbum em faixas cuja etiqueta id3 não possa ser utilizada 
 ParameterView.109=Preferências guardadas
@@ -353,7 +326,6 @@ ParameterView.114=Utilizar expressões comuns (formato Regexp) nos filtros de ta
 ParameterView.115=Avançadas
 ParameterView.116=Salvaguardar ficheiro da colecção
 ParameterView.117=Verifique a caixa se deseja salvaguardar o ficheiro da sua colecção para ficheiros colecção-<date>.xml
-ParameterView.118=Tamanho da salvaguarda (MB) 
 ParameterView.119=Tamanho da salvaguarda (MB) 
 ParameterView.120=Codificação da colecção
 ParameterView.121=Codificação de caracteres da colecção. UTF-16 está optimizado para línguas Asiáticas e UTF-8 está optimizado para línguas Europeias.
@@ -383,14 +355,10 @@ ParameterView.158=Alta precisão (pesquisar por palavras obrigatoriamente agrupa
 ParameterView.159=Capas
 ParameterView.160=Expiração da conexão (segundos)
 ParameterView.161=Tempo oferecido até à expiração da conexão em segundos: uma operação remota falhará se não se obtiver resposta neste limite de tempo
-ParameterView.162=Expiração da transferência (segundos) 
-ParameterView.163=Tempo oferecido até à expiração da transferência de dados em segundos: uma operação remota falhará se os dados requisitados não forem completamente descarregados neste limite de tempo
 ParameterView.164=Antes de remover um dispositivo
 ParameterView.165=Perguntar antes da remoção de um dispositivo
 ParameterView.166=Capa aleatória
 ParameterView.167=Apresentar uma capa aleatória
-ParameterView.169=Pré-requisitar capas
-ParameterView.170=Pré-requisitar capas todas as capas disponíveis quando possível
 ParameterView.171=Antes de eliminar uma capa
 ParameterView.172=Antes da eliminação física de uma capa
 ParameterView.177=Número de faixas planeadas visíveis
@@ -464,8 +432,6 @@ ParameterView.250=Redefinir preferências do utilizador
 ParameterView.251=Histórico redefinido com sucesso
 ParameterView.252=Pontuações e contagens redefinidas com sucesso
 ParameterView.253=Preferências redefinidas com sucesso
-ParameterView.254=Utilize nomes curtos do Windows
-ParameterView.255=[Apenas para Windows 32 bits] Quando verificado, força o MPlayer a usar nomes curtos nos ficheiros de áudio para resolver problemas com algumas localizações em Windows
 ParameterView.256=Nomes predefinidos para ficheiros de capa 
 ParameterView.257=O Jajuk aceita como predefinição vários ficheiros de capa cujo nome contenha este texto (sem extensões). Vários termos separados por ';' poderão ser fornecidos. Por exemplo : "Folder;front"
 ParameterView.260=Guardar capas de forma compatível com o Windows Explorer
@@ -492,7 +458,6 @@ ParameterView.280=Este padrão define o texto a ser mostrado na vista de informa
 ParameterView.281=Minimizar para a área de notificação
 ParameterView.282=Quando verificado, a janela principal do Jajuk será mostrada na área de notificação do sistema apenas, quando minimizada, e não mais na barra de tarefas
 
-Main.21=Confirmações
 Main.22=Verificando/Descarregando MPlayer
 
 Player.0=Esperando por um canal de áudio (ocupado)
@@ -541,7 +506,6 @@ DeviceWizard.52=Seleccione um dispositivo de origem
 DeviceWizard.53=Actualizar dispositivo a cada
 #limited string size
 DeviceWizard.54=min
-DeviceWizard.55=Valor errado: o intervalo de actualização deve ser 0 ou um número >= 0,5.
 
 JajukJMenuBar.0=Ficheiro
 JajukJMenuBar.1=Abrir ficheiro
@@ -592,8 +556,6 @@ CommandJPanel.1=[Ctrl-t] Modo de repetição: reproduza faixas ciclicamente
 CommandJPanel.2=[Ctrl-h] Modo aleatório: reproduza faixas escolhidas ao acaso
 CommandJPanel.3=Modo contínuo: reproduza as faixas planeadas quando chegar ao final
 CommandJPanel.4=Modo introdutório: reproduza apenas uma parte de cada faixa. Duração e começo podem ser especificados na vista das Preferências
-CommandJPanel.5=Reproduz uma selecção aleatória de faixas de toda a colecção
-CommandJPanel.6=Reproduz as suas faixas favoritas
 CommandJPanel.8=<html>[F9] Reproduz a faixa anterior da presente selecção<br />Shift+clique salta para o álbum anterior<br />CTRL+clique reinicia o presente álbum</html>
 CommandJPanel.9=<html>[F10] Reproduz a faixa seguinte da presente selecção<br />Shift+clique salta para o álbum seguinte</html>
 CommandJPanel.10=<html>[Alt-gr F9] Rebobinar rapidamente a presente faixa<br />Shift+clique para reproduzir novamente</html>
@@ -606,14 +568,11 @@ CommandJPanel.19=Gerir as Ambiências
 CommandJPanel.20=Faixa por Faixa
 CommandJPanel.21=Baralhar álbum por álbum
 CommandJPanel.22=Álbum por Álbum
-CommandJPanel.23=Clique para limpar a pesquisa
-CommandJPanel.24=Configurar rádios web
 CommandJPanel.25=Ligar o rádio
 CommandJPanel.26=Modo de repetição total: reproduza todo o alinhamento ciclicamente
 CommandJPanel.27=Modo de Karaoke: retire as vozes da faixa sob escuta (apenas se activa no início da próxima faixa)
 
 InformationJPanel.5=Duração remanescente no alinhamento [Nº de faixas remanescentes]
-InformationJPanel.6=Taxa de bits da faixa
 InformationJPanel.7=Progressão da faixa sob escuta
 # %xxx are patterns, don't translate them !
 InformationJPanel.8=%title por %artist de %album
@@ -624,21 +583,17 @@ AbstractPlaylistEditorView.0=Título
 AbstractPlaylistEditorView.1=Localização
 AbstractPlaylistEditorView.2=Reproduzir esta lista
 AbstractPlaylistEditorView.3=Guardar esta lista
-AbstractPlaylistEditorView.4=Adicionar um item nesta lista
 AbstractPlaylistEditorView.5=Remover um item desta lista
 AbstractPlaylistEditorView.6=Mover acima
 AbstractPlaylistEditorView.7=Mover abaixo
 AbstractPlaylistEditorView.9=Apagar esta lista
 AbstractPlaylistEditorView.10=Adicionar uma faixa nesta lista
 AbstractPlaylistEditorView.15=Listas de reprodução
-AbstractPlaylistEditorView.17=Está prestes a actualizar as seguintes listas: 
 AbstractPlaylistEditorView.18=Faixa no alinhamento
 AbstractPlaylistEditorView.19=Faixa repetida
 AbstractPlaylistEditorView.20=Faixa planeada
-AbstractPlaylistEditorView.21=Faixa de lista de reprodução
 AbstractPlaylistEditorView.22=Lista de reprodução guardada
 AbstractPlaylistEditorView.27=Preparar festa
-AbstractPlaylistEditorView.28=Pasta criada com sucesso em 
 
 StatView.0=Outros
 StatView.1=Géneros
@@ -685,7 +640,6 @@ TracksTreeView.41=menor do que dois anos
 TracksTreeView.42=menor do que cinco anos
 TracksTreeView.43=menor do que dez anos
 TracksTreeView.44=menor do que três meses
-TracksTreeView.45=Ano
 
 CoverView.2=Apagar esta capa do disco
 CoverView.3=Capa
@@ -693,11 +647,8 @@ CoverView.4=Imagem anterior no disco e/ou da Web se a opção de baixar as capas
 CoverView.5=Imagem seguinte no disco e/ou da Web se a opção de baixar as capas automaticamente estivar verificada
 CoverView.6=<html><p>Guardar a capa com o seu nome original</p><p>Com CTRL: Guardar capa como...</p></html>
 CoverView.8=Utilizar esta capa como a capa predefinida deste álbum
-CoverView.9=capas
 CoverView.10=Guardar capa como...
 CoverView.11=Capa guardada
-CoverView.12=Álbum 
-CoverView.13=Título
 
 AnimationView.0=Animação
 
@@ -709,14 +660,11 @@ FilesTreeView.7=Eliminar
 FilesTreeView.14=Dessincronizar
 FilesTreeView.15=Ressincronizar
 FilesTreeView.16=Criar Lista de Reprodução
-FilesTreeView.17=Copiar
-FilesTreeView.18=Cortar
 FilesTreeView.28=Montar
 FilesTreeView.29=Desmontar
 FilesTreeView.30=Forçar actualização
 FilesTreeView.31=Sincronizar
 FilesTreeView.32=Testar
-FilesTreeView.33=Criar Listas de Reprodução
 FilesTreeView.40=Copiar
 FilesTreeView.41=Cortar
 FilesTreeView.42=Colar
@@ -744,9 +692,6 @@ TracksTableView.16=Colocar no alinhamento já a seguir
 AbstractTableView.0=Filtro: 
 AbstractTableView.1=Propriedade a filtrar
 AbstractTableView.3=Termos utilizados pelo filtro 
-AbstractTableView.4=Aplicar filtro
-AbstractTableView.5=Limpar filtro
-AbstractTableView.6=Fazer uma filtragem avançada
 AbstractTableView.7=contém: 
 AbstractTableView.8=Qualquer
 AbstractTableView.10=<não disponível>
@@ -756,39 +701,17 @@ AboutView.7=Sobre
 AboutView.8=Licença
 AboutView.9=Sistema
 AboutView.10=Sobre
-AboutView.11=<html>Copyright 2003-2011<br>equipa Jajuk</html>"
+AboutView.11=<html>Copyright 2003-2012<br>equipa Jajuk</html>"
 
-PhysicalPlaylistRepositoryView.0=Reproduzir
-PhysicalPlaylistRepositoryView.1=Editar
 PhysicalPlaylistRepositoryView.2=Guardar como
-PhysicalPlaylistRepositoryView.3=Eliminar
-PhysicalPlaylistRepositoryView.4=Propriedades
-PhysicalPlaylistRepositoryView.6=Listas de Reprodução Físicas
-PhysicalPlaylistRepositoryView.8=Inteligente
 PhysicalPlaylistRepositoryView.9=Alinhamento
-PhysicalPlaylistRepositoryView.10=Alinhamento actual: arraste faixas para as reproduzir
-PhysicalPlaylistRepositoryView.11=Nova Lista
-PhysicalPlaylistRepositoryView.12=Nova Lista de Reprodução: arraste faixas para as adicionar à lista
-PhysicalPlaylistRepositoryView.13=Marcadores
-PhysicalPlaylistRepositoryView.14=Marcar Lista de Reprodução: arraste faixas para as marcar
-PhysicalPlaylistRepositoryView.15=Favoritas
-PhysicalPlaylistRepositoryView.16=Lista de Reprodução de Favoritas: apresenta a selecção das faixas mais ouvidas
-PhysicalPlaylistRepositoryView.17=Novas Entradas
-PhysicalPlaylistRepositoryView.18=Lista das Novas Entradas: apresenta a selecção das faixas mais recentes
-PhysicalPlaylistRepositoryView.19=Preparar Lista de Reprodução para Festa
 
 FilesTableView.0=Tabela de Ficheiros
 FilesTableView.15=Directório da Reprodução
 #Dev: do not use ID = 16, next label is FilesTableView.17 
 
-DeviceView.0=Adicionar dispositivo
 DeviceView.1=Remover um dispositivo desmontado (não elimina nada do disco)
 DeviceView.2=Seleccionar propriedades do dispositivo
-DeviceView.3=Montar dispositivo seleccionado
-DeviceView.4=Desmontar dispositivo seleccionado
-DeviceView.5=Testar a disponibilidade do dispositivo seleccionado
-DeviceView.6=Forçar a actualização do dispositivo seleccionado
-DeviceView.7=Sincronizar dispositivo seleccionado
 DeviceView.8=Montar
 DeviceView.9=Desmontar
 DeviceView.10=Testar
@@ -826,13 +749,9 @@ JajukWindow.26=[Ctrl-p] Pausar/Reproduzir
 JajukWindow.27=[Ctrl-s] Parar
 JajukWindow.31=Reproduzir as faixas mais recentes da colecção
 JajukWindow.32=Finalizar a reprodução do álbum actual
-JajukWindow.33=[Ctrl-Cima/Baixo] Volume
-JajukWindow.34=Posição
-JajukWindow.35=Reproduzindo: 
 JajukWindow.36=Ambiência actual: 
 JajukWindow.37=Nenhuma ambiência definida
 #Do not use JajukWindow.38, next is JajukWindow.39
-JajukWindow.39=Sob Escuta
 JajukWindow.40=Configuração de etiquetas adicionais
 JajukWindow.41=Abre caixa para configuração das etiquetas adicionais activadas
 
@@ -850,27 +769,20 @@ SimpleDeviceWizard.0=Criação rápida de dispositivo
 FirstTimeWizard.0=Começo rápido
 FirstTimeWizard.1=<html><p><br>Bem-vindo! Este utilitário assisti-lo-á na elaboração da sua colecção musical</p></html>
 FirstTimeWizard.2=<html>Por favor especifique a localização da sua música</html>
-FirstTimeWizard.4=Auxiliar-me imediatamente
 FirstTimeWizard.5=Por favor seleccione um directório
 FirstTimeWizard.6=Preferências avançadas
 FirstTimeWizard.7=Definir o directório de trabalho do Jajuk
 FirstTimeWizard.8=Directório seleccionado:
 FirstTimeWizard.9=Nenhum
 
-HelpView.2=Ajuda
 
 DownloadManager.0=<html>O Jajuk precisa da senha do seu Proxy HTTP para requestar capas.<br>Se não as desejar, pode mudar as suas definições no separador de Capas na vista das Preferências.<br>Se não dispõe de um proxy, pode mudar as suas definições no separador de Rede na vista das Preferências.</html>
-DownloadManager.1=Senha requisitada
 
-PropertiesWizard.0=Propriedades do item
 PropertiesWizard.1=Propriedade
 PropertiesWizard.2=Valor
-PropertiesWizard.3=Editável?
 PropertiesWizard.4=Ligação
 PropertiesWizard.6=Selecção
-PropertiesWizard.7=Tipo
 PropertiesWizard.8=Propriedade actualizada com sucesso
-PropertiesWizard.9=Nenhuma propriedade é editável nesta selecção
 PropertiesWizard.10=propriedades foram definidas
 PropertiesWizard.11=Escrevendo etiqueta para: 
 PropertiesWizard.12=Ligação aos detalhes das propriedades do campo em causa
@@ -901,9 +813,6 @@ CatalogView.3=Actualizar o catálogo
 CatalogView.4=Tamanho da miniatura:
 CatalogView.5=Criada miniatura para:
 CatalogView.7=Seleccionar uma capa
-CatalogView.8=Nenhuma capa encontrada
-CatalogView.9=Anterior
-CatalogView.10=Seguinte
 CatalogView.11=Página: 
 CatalogView.12=Apresentar a página de miniaturas anterior
 CatalogView.13=Apresentar a página de miniaturas seguinte
@@ -932,17 +841,12 @@ TipOfTheDayView.0=Dica do dia
 TipOfTheDayView.1=Sabia que...?
 TipOfTheDayView.2=Mostrar no arranque?
 
-CDDBWizard.0=Aceitar
 CDDBWizard.1=Nome do ficheiro
 CDDBWizard.2=Título da faixa actual
 CDDBWizard.3=Título do álbum actual
 CDDBWizard.4=Título da faixa proposto:
 CDDBWizard.5=Nome do álbum proposto:
-CDDBWizard.6=Pronto! Encontrado
-CDDBWizard.7=equivalências possíveis
 CDDBWizard.12=Nenhuma equivalência encontrada!
-CDDBWizard.14=Este directório não contém nenhum ficheiro
-CDDBWizard.16=Género: 
 CDDBWizard.17=Encontrada equivalência exacta!
 CDDBWizard.18=Equivalências
 CDDBWizard.19=Obter etiquetas em linha
@@ -959,11 +863,7 @@ DigitalDJWizard.6=Nome do DJ (*)
 DigitalDJWizard.8=Número mínimo de estrelas: 
 DigitalDJWizard.9=Cross fade (segundos): 
 DigitalDJWizard.10=Faixas reproduzidas apenas uma vez
-DigitalDJWizard.11=Queda
-DigitalDJWizard.12=Dos géneros
-DigitalDJWizard.13=Para géneros
 DigitalDJWizard.14=Selecção de géneros (múltipla selecção permitida)
-DigitalDJWizard.15=Número de faixas
 DigitalDJWizard.16=Pretende...
 DigitalDJWizard.17=Criar um novo DJ?
 DigitalDJWizard.18=Alterar um DJ existente?
@@ -1107,7 +1007,6 @@ ReportAction.19=Saltar para:
 ActionMove.0=Colar
 
 ActionRefresh.0=Forçar actualização
-ActionRefresh.1=Actualizando directório
 
 RenameAction.0=Renomear
 RenameAction.1=Por favor introduza um novo nome para este ficheiro: 
@@ -1128,27 +1027,22 @@ ActionDelete.0=Ficheiros eliminados
 ActionDelete.1=Directórios eliminados
 
 FindDuplicateTracksAction.0=Não foram encontradas faixas duplicadas.
-FindDuplicateTracksAction.1=Foram encontradas faixas duplicadas.
 FindDuplicateTracksAction.2=Procurar faixas duplicadas
 FindDuplicateTracksAction.3=Lista de faixas duplicadas encontrada
 FindDuplicateTracksAction.4=Seleccionar todas as faixas duplicadas
 
-RefreshDialog.0=Preparando actualização de dispositivo...
 RefreshDialog.1=Actualizando dispositivo
 RefreshDialog.2=Actualizando dispositivo:
 RefreshDialog.3=Limpando ficheiros antigos
 
-RadioWizard.0=Por favor seleccione ou crie um rádio web
 RadioWizard.1=Gerir rádios web
 RadioWizard.2=Novo
 RadioWizard.3=Eliminar
 RadioWizard.4=Pré-definições
 RadioWizard.5=Um rádio web com este nome já existe
-RadioWizard.6=Nome do rádio web
 RadioWizard.7=Utilitário Rádio Web
 RadioWizard.8=URL
 RadioWizard.9=Nome
-RadioWizard.10=URL errado
 RadioWizard.11=O nome e URL são obrigatórios
 
 UpdateManager.0=Uma nova versão do Jajuk (
diff --git a/src/main/java/org/jajuk/i18n/jajuk_ru.properties b/src/main/resources/org/jajuk/i18n/jajuk_ru.properties
similarity index 88%
rename from src/main/java/org/jajuk/i18n/jajuk_ru.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_ru.properties
index 7976574..a1cdedf 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_ru.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_ru.properties
@@ -4,7 +4,7 @@
 #Author : Vitaliy Tamm - Selectus
 #Copyright 2007, 2008, 2009, 2010 Vitaliy Tamm, this is part of Jajuk distributed under the GPL V2 license
 #FROM English 6197
-#$Revision$
+#
 
 #--- Generic labels ---
 #DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
@@ -31,9 +31,7 @@ Hide=Больше не показывать
 Path=Пожалуйста, выберите путь
 Later=позже
 Default=По умолчанию
-All=Все
 YestoAll=Да, для всех
-Maximize=Развернуть
 Purge=Очистить
 
 #--- Wizard Strings --- 
@@ -57,7 +55,6 @@ Type.ape=Monkey's Audio format
 Type.aac=Advanced Audio Coding
 Type.real=Real Audio
 Type.mp2=Mpeg Layer 2
-Type.apl=Monkey's Audio format playlist
 Type.mac=Monkey's Audio format
 Type.radio=Web Radio
 Type.video=Video
@@ -68,7 +65,6 @@ unknown_artist=Неизвестно
 unknown_album=Неизвестно
 unknown_genre=Неизвестно
 unknown_year=Неизвестно
-unknown_album-artist=Неизвестно
 
 various_artist=Разные исполнители
 
@@ -87,11 +83,9 @@ Confirmation_clear_history=Вы действительно хотите очис
 Confirmation_reset_ratings=Вы действительно хотите сбросить все рейтинги?
 Confirmation_refactor_files=Вы действительно хотите переименовать выделенные файлы?
 Confirmation_restore_all=Полное восстановление всех начальных видов ракурсов требует перезапуска программы. Хотите выйти сейчас?
-Confirmation_defaults_radios=Это действие сотрет все ранее созданные радиостанции. Вы уверены?
 Confirmation_delete_empty_dirs=Эти папки пусты. Хотите удалить их?
 Confirmation_file_overwrite=Этот файл уже существует. Хотите перезаписать его?
 Confirmation_file_number=Файл(ы) будут удалены.
-Confirmation_alarm_stop=Вы уверены, что хотите остановить этот таймер?
 Confirmation_defaults=Внимание, это приведет к восстановлению к начальному виду всех опций вкладок.(Не только для данной), вы уверены?
 Confirmation_reset_preferences= Вы действительно хотите сбросить настройки треков?
 
@@ -108,7 +102,6 @@ Perspective_Description_Files=Папки
 Perspective_Description_Tracks=Треки
 Perspective_Description_Configuration=Настройки
 Perspective_Description_Statistics=Статистика
-Perspective_Description_Help=Помощь
 Perspective_Description_Display=Экран
 Perspective_Description_Albums=Альбомы
 Perspective_Description_Info=Сведения
@@ -200,17 +193,13 @@ Error.017=Ошибка плейлиста
 Error.018=Доступных треков не найдено.
 Error.019=Уже существует устройство с таким именем
 Error.020=Ошибка ввода-вывода при копировании. Устройство может быть переполнено.
-Error.021=Поле URL является обязательным. Например, "D:/Music" (в Windows) или "/home/music" (В Unix/Linux)
-Error.022=Поле имени является обязательным. Например,"Rock" или "HDD"
 Error.023=Невозможно запустить начальный трек
 Error.024=Невозможно записать файл
 Error.025=Один или несколько файлов, которые вы пытаетесь проиграть, находятся на размонтированном устройстве
 Error.026=Ошибка регистрации плееров
 Error.027=Синхронизация прервана
 Error.028=Ошибка сохранения плейлиста
-Error.029=Существующее устройство является родительской папкой этого устройства, имеет тот же путь, либо дочернюю папку.
 Error.030=Слишком много неудачных соединений. Jajuk прекратил загрузку обложек из Сети.
-Error.101=Устройство не существует, либо недоступно
 Error.102=Ошибка
 Error.103=Ошибка чтения тегов файла
 Error.104=Ошибка записи тегов файла
@@ -218,31 +207,25 @@ Error.105=Ключ ресурса не найден
 Error.106=Недоступное исключение
 Error.107=Устройство уже обновлено или синхронизировано
 Error.108=Ошибка получения файла ракурса
-Error.109=Инструмент для плеера или тега недоступен
 Error.110=Такое имя для поля свойства уже зарезервировано Jajuk. Пожалуйста, выберите другое имя.
 Error.111=Устройство уже примонтировано
 Error.112=Невозможно примонтировать устройство
 Error.113=Невозможно сохранить пользовательскую конфигурацию
 Error.114=Невозможно прочитать пользовательскую конфигурацию
-Error.118=Ошибка процесса запроса
 Error.119=Ошибка получения файла истории или пустой файл истории
 Error.120=Невозможно получить доступ к устройству: Оно либо не смонтировано, либо обновляется, либо синхронизируется
 Error.121=Устройство используется и не может быть размонтировано
 Error.122=Ошибка в FIFO
-Error.123=Ошибка установки темы
-Error.124=Jajuk уже запущен. Только одна копия программы может работать одновременно
 Error.125=Устройство уже размонтировано
 Error.126=Перемотка не поддерживается в данном формате файла
 Error.127=В данном отрезке времени не найдено новинок. Вы можете установить отрезок в разделе настроек
 Error.128=Текущий трек самый первый в коллекции, невозможно перейти к предыдущему.
-Error.129=Ошибка загрузки обложки
 Error.131=Невозможно удалить файл
 Error.133=Файл вашей коллекции был поврежден по неизвестной причине. Jajuk восстановил ее из резевной копии.
 Error.134=Невозможно переименовать файл
 Error.135=Файл не существует
 Error.136=Операция не выполнена
 Error.137=Неверный формат
-Error.138=Некоторые файлы принадлежат трекам на удаленном устройстве. Они не могут быть изменены
 Error.140=Неверная переменная: использование символов & ' " < или > недопустимо.
 Error.141=Этот плейлист находится на размонтированном устройстве и не может быть изменен.
 Error.142=Этот плейлист содержит треки, расположенные за пределами известного устройства. Они будут проигнорированы
@@ -254,7 +237,6 @@ Error.147=Некоторые файлы не могут быть перемещ
 Error.148=Неизвестное значение поля "год"
 Error.149=Неизвестное значение поля "Альбом"
 Error.150=Неизвестное значение поля "Исполнитель"
-Error.151=Неизвестное значение поля "название трека"
 Error.152=Неизвестное значение поля "трек"
 Error.153=Неизвестное значение поля "жанр"
 Error.154=Невозможно переименовать файл. Проверьте недопустимые символы в имени или тегах
@@ -267,22 +249,17 @@ Error.160=Файл не перемещен, исходное и целевое 
 Error.161=Невозможна запись в папку, проверьте права.
 Error.162=Это пользовательское поле уже существует
 Error.163=Ошибка восстановления вида ракурсов
-Error.164=Нет доступных треков для данного окружения
 Error.165=Ошибка рабочего пути, папка не существует или закрыта для записи
 Error.166=Пустой альбом, невозможно дать обложку
 Error.167=Невозможно создать отчет
-Error.168=Не найдено файлов-дубликатов
-Error.169=Операция не удалась. Имейте ввиду, что эта операция требует подключения к Интернету, для получения списка станций
-Error.170=Ошибка проигрывания веб-радио
 Error.171=Пока нет источника синхронизации. Установите его, используя соответствующее диалоговое окно (В разделе настроек, выберите "новое устройство")
 Error.172=Во время воспроизведения файл и папки, в которых он находися, не могут быть удалены либо изменены.
-Error.173=Во время удаления следующей(их) папки(ок) произошла ошибка.
 Error.174=Ошибка в доступе к сайту Freedb, проверьте соединение с Интернетом
-Error.175=Операция отменена
 Error.176=Ошибка создания плейлиста
 Error.177=Пожалуйста, введите время в корректном формате (ЧЧ24:ММ:СС)
 Error.179=Невозможно открыть системный обозреватель файлов, попробуйте вручную указать путь к нему в разделе "Настройки" вкладка "Расширенные"
 Error.180=Ошибка при копировании файлов
+Error.184=Неверное значение : интервал обновления может быть либо 0, либо числом больше 0.5
 
 #Warnings
 Warning.0=MPlayer не найден по указанному пути. Некоторые аудио форматы (flac, wma, aac, mpg2 и некоторые свойства ogg)не будут поддерживаться. Для использования MPlayer вручную укажите точное местоположение, если он установлен.(Раздел "Настройки" вкладка "Расширенные")
@@ -296,7 +273,7 @@ Warning.7=Jajuk необходимо полностью пересканиров
 
 #--- Strings by class ---
 ParameterView.0=Длительность списка истории:
-ParameterView.2=<html>Установите время в днях для сохранения списка истории воспроизведенных композиций. <br/> Введите -1, чтобы не вести список истории, 0 - для постоянного списка истории</html>
+ParameterView.2=<html>Установите время в днях для сохранения списка истории воспроизведенных композиций. <br/> Введите 0, чтобы не вести список истории, -1 - для постоянного списка истории</html>
 ParameterView.3=Очистить историю
 ParameterView.4=Очистить историю
 ParameterView.8=История
@@ -318,8 +295,6 @@ ParameterView.29=Перед выходом из Jajuk
 ParameterView.30=Спросить перед выходом из Jajuk.
 ParameterView.33=Опции
 ParameterView.35=Скрывать треки, расположенные на размонтированных устройствах
-ParameterView.36=Сначала, когда достигнут конец коллекции.
-ParameterView.37=<html>Перезапустить проигрывание всей коллекции,<br/>когда достигнут ее конец, при включенном "бесконечном режиме"</html>
 ParameterView.38=Язык:
 ParameterView.42=Выберите язык интерфейса:
 ParameterView.43=Тема:
@@ -339,8 +314,6 @@ ParameterView.85=Применить
 ParameterView.86=Восстановить умолчания
 ParameterView.87=Настройки
 ParameterView.98=Атрибуты
-ParameterView.99=Произвести глубокое сканирование тегов
-ParameterView.100=<html>Форсировать перечитывание актуальных id3 тегов.<p> Это может использоваться для обновления тегов треков, измененных внешней программой.</p></html>
 ParameterView.101=Использовать имя папки для названия альбома
 ParameterView.102=<html>Если отмечено, имя родительской папки будет использоваться<br/> для установления названия альбома, для треков без id3 тега</html>
 ParameterView.109=Настройки сохранены
@@ -352,7 +325,6 @@ ParameterView.114=Использовать регулярные выражени
 ParameterView.115=Расширенные
 ParameterView.116=Файл резервной копии коллекции
 ParameterView.117=<html>Отметьте опцию если хотите сделать<br/> резервную копию коллекции. Используется xml формат</html>
-ParameterView.118=Размер копии (МБ)
 ParameterView.119=Размер резервной копии в МБ
 ParameterView.120=Кодировка коллекции
 ParameterView.121=<html>Кодировка. UTF-16 оптимизирована для азиатских языков,<br/> UTF-8 для европейских</html>
@@ -382,14 +354,10 @@ ParameterView.158=Высокое (поиск исключительно всей
 ParameterView.159=Обложки
 ParameterView.160=Таймаут соединения (сек.)
 ParameterView.161=<html>Таймаут соединения в секундах.<br/> Если сервер не отвечает в течение этого срока, соединение считается неудачным.</html>
-ParameterView.162=Таймаут передачи (сек.)
-ParameterView.163=<html>В секундах. Если в течение этого срока данные не были загружены,<br/> соединение прерывается и считается неудачным</html>
 ParameterView.164=Перед извлечением устройства
 ParameterView.165=Спросить перед извлечением устройства
 ParameterView.166=Случайная обложка
 ParameterView.167=Демонстрировать случайную обложку
-ParameterView.169=Предзагрузка обложек
-ParameterView.170=<html>Загрузить все доступные обложки,<br/> когда это будет возможно</html>
 ParameterView.171=Перед удалением с диска обложки
 ParameterView.172=Спросить перед удалением обложки с диска
 ParameterView.177=Количество видимых планируемых треков
@@ -463,8 +431,6 @@ ParameterView.250=Сбросить настройки программы к на
 ParameterView.251=История успешно очищена
 ParameterView.252=Рейтинги и счетчики проигрывания успешно сброшены
 ParameterView.253=Настройки успешно сброшены
-ParameterView.254=Использовать краткие имена Windows
-ParameterView.255=<html>[Только в 32-х битной Windows]<br/>Если отмечено, заставляет mplayer использовать имена аудио файлов в кратком формате Windows,<br/>для исправления ошибок в некоторых локалях</html>
 ParameterView.256=Имена файлов обложек по умолчанию
 ParameterView.257=Jajuk использует этот текст при поиске файлов обложек в папке (без расширения). Несколько значений отделяются знаком ";" . Например: "папка;обложка;folder;cover"
 ParameterView.260=Сохранять обложки в режиме совместимости в Проводником Windows
@@ -491,7 +457,6 @@ ParameterView.280=Этот шаблон устанавливает текст, 
 ParameterView.281=Сворачивать в трей
 ParameterView.282=Если отмечено, главное окно Jajuk, будет сворачиваться в значок в трее без появления в панели задач
 
-Main.21=Подтверждения
 Main.22=Проверка/Загрузка MPlayer
 
 Player.0=Ожидание аудиолинии (занята)
@@ -540,7 +505,6 @@ DeviceWizard.52=Выберите устройство-источник
 DeviceWizard.53=Обновлять устройство каждые
 #limited string size
 DeviceWizard.54=мин.
-DeviceWizard.55=Неверное значение : интервал обновления может быть либо 0, либо числом больше 0.5
 
 JajukJMenuBar.0=Файл
 JajukJMenuBar.1=Открыть файл
@@ -592,8 +556,6 @@ CommandJPanel.1=<html>[Ctrl-t] Режим повтора:<br/> Играть тр
 CommandJPanel.2=<html>[Ctrl-h] Случайно: Играть треки<br/>в случайном порядке</html>
 CommandJPanel.3=<html>Бесконечный режим: Продолжить воспроизведение<br/>с автоматически запланированными треками</html>
 CommandJPanel.4=<html>Режим ознакомления: Играть только часть трека<br/>(время и место, см. настройки)</html>
-CommandJPanel.5=Играть случайно выбранный трек из всей коллекции.
-CommandJPanel.6=Играть избранные треки
 CommandJPanel.8=<html>[F9] Вернуться к предыдущему треку в выбранной секции<br/>Щелчок правой кнопкой повторит текущий трек<br/>Shift+щелчок - предыдущий альбом<br/>CTRL+щелчок - повторить текущий альбом</html>
 CommandJPanel.9=<html>[F10] Перейти к следующему треку в выбранной секции<br/>Shift+щелчок - следующий альбом</html>
 CommandJPanel.10=<html>[Alt-gr F9] Перемотка назад<br/>Shift+щелчок в начало трека</html>
@@ -606,14 +568,11 @@ CommandJPanel.19=Управление Окружением
 CommandJPanel.20=Перемешивать потреково
 CommandJPanel.21=Перемешивать поальбомно
 CommandJPanel.22=Перемешивать внутри альбомов
-CommandJPanel.23=Щелкните здесь для очистки поиска
-CommandJPanel.24=Настроить веб-радио
 CommandJPanel.25=Включить радио
 CommandJPanel.26=Режим Повторить все: Играть очередь в цикле
 CommandJPanel.27=<html>Режим Караоке: заглушить голос в проигрываемых треках <br/>(вступит в силу только со следующего трека)</html>
 
 InformationJPanel.5=Осталось времени всего [кол-во треков в очереди]
-InformationJPanel.6=Битрейт трека
 InformationJPanel.7=Позиция
 # %xxx are patterns, don't translate them !
 InformationJPanel.8=%title исполняет %artist из альбома %album
@@ -625,21 +584,17 @@ AbstractPlaylistEditorView.0=Название
 AbstractPlaylistEditorView.1=Расположение
 AbstractPlaylistEditorView.2=Запустить этот плейлист
 AbstractPlaylistEditorView.3=Сохранить этот плейлист
-AbstractPlaylistEditorView.4=Добавить в этот плейлист
 AbstractPlaylistEditorView.5=Удалить элемент
 AbstractPlaylistEditorView.6=Переместить вверх
 AbstractPlaylistEditorView.7=Переместить вниз
 AbstractPlaylistEditorView.9=Очистить плейлист
 AbstractPlaylistEditorView.10=Добавить случайный трек в плейлист
 AbstractPlaylistEditorView.15=Плейлисты
-AbstractPlaylistEditorView.17=Вы обновляете следующие плейлисты:
 AbstractPlaylistEditorView.18=Трек в очереди
 AbstractPlaylistEditorView.19=Повторяемый трек
 AbstractPlaylistEditorView.20=Запланированный трек
-AbstractPlaylistEditorView.21=Трек плейлиста
 AbstractPlaylistEditorView.22=Плейлист сохранен
 AbstractPlaylistEditorView.27=<html>Подготовить вечеринку.<br/> Создать копию файлов из плейлиста в выбранное место</html>
-AbstractPlaylistEditorView.28=Папка успешно создана в
 AbstractPlaylistEditorView.29=Играющий трек
 
 StatView.0=Другие
@@ -687,7 +642,6 @@ TracksTreeView.41=менее чем 2 года
 TracksTreeView.42=менее чем 5 лет
 TracksTreeView.43=менее чем 10 лет
 TracksTreeView.44=менее чем 3 месяца
-TracksTreeView.45=Год
 
 CoverView.2=Удалить эту обложку с диска
 CoverView.3=Обложка
@@ -695,11 +649,8 @@ CoverView.4=<html><p>Предыдущее изображение с диска 
 CoverView.5=<html><p>Следующее изображение с диска и/или из Интернета,</p><p>если активна опция автообложек</p></html>
 CoverView.6=<html><p>Сохранить обложку под ее оригинальным именем</p><p>С клавишей CTRL: Сохранить обложку как...</p></html>
 CoverView.8=Использовать эту обложку по умолчанию для этого альбома
-CoverView.9=обложек
 CoverView.10=Сохранить обложку как...
 CoverView.11=Обложка сохранена
-CoverView.12=Альбом
-CoverView.13=Название
 
 AnimationView.0=Анимация
 
@@ -711,14 +662,11 @@ FilesTreeView.7=Удалить
 FilesTreeView.14=Рассинхронизировать
 FilesTreeView.15=Пересинхронизировать
 FilesTreeView.16=Создать плейлист
-FilesTreeView.17=Копировать
-FilesTreeView.18=Вырезать
 FilesTreeView.28=Монтировать
 FilesTreeView.29=Размонтировать
 FilesTreeView.30=Форсировать обновление
 FilesTreeView.31=Синхронизировать
 FilesTreeView.32=Тест
-FilesTreeView.33=Создать плейлист
 FilesTreeView.40=Копировать
 FilesTreeView.41=Вырезать
 FilesTreeView.42=Вставить
@@ -746,9 +694,6 @@ TracksTableView.16=Вставить следующей
 AbstractTableView.0=Фильтр:
 AbstractTableView.1=Поле для фильтра
 AbstractTableView.3=Значение, используемое для фильтра
-AbstractTableView.4=Установить фильтр
-AbstractTableView.5=Очистить фильтр
-AbstractTableView.6=Применить расширенный фильтр
 AbstractTableView.7=содержит:
 AbstractTableView.8=Что угодно
 AbstractTableView.10=(Недоступно)
@@ -758,39 +703,17 @@ AboutView.7=О программе
 AboutView.8=Лицензия
 AboutView.9=Система
 AboutView.10=О программе
-AboutView.11=<html>Copyright 2003-2011<br/>команда разработчиков Jajuk</html>"
+AboutView.11=<html>Copyright 2003-2012<br/>команда разработчиков Jajuk</html>"
 
-PhysicalPlaylistRepositoryView.0=Играть
-PhysicalPlaylistRepositoryView.1=Править
 PhysicalPlaylistRepositoryView.2=Сохранить как...
-PhysicalPlaylistRepositoryView.3=Удалить
-PhysicalPlaylistRepositoryView.4=Свойства
-PhysicalPlaylistRepositoryView.6=Физические Плейлисты
-PhysicalPlaylistRepositoryView.8=Автосписки
 PhysicalPlaylistRepositoryView.9=Очередь проигрывания
-PhysicalPlaylistRepositoryView.10=Текущая очередь: перетащите треки для проигрывания
-PhysicalPlaylistRepositoryView.11=Новый
-PhysicalPlaylistRepositoryView.12=Новый плейлист: перетащите треки для добавления в плейлист
-PhysicalPlaylistRepositoryView.13=Закладки
-PhysicalPlaylistRepositoryView.14=Плейлист закладок: перетащите треки для добавления в закладки
-PhysicalPlaylistRepositoryView.15=Лучшие треки
-PhysicalPlaylistRepositoryView.16=Плейлист лучших: содержит самые прослушиваемые треки
-PhysicalPlaylistRepositoryView.17=Новые треки
-PhysicalPlaylistRepositoryView.18=Плейлист новинок: содержит новые треки
-PhysicalPlaylistRepositoryView.19=<html>Подготовить вечеринку.<br/> Создать копию файлов из плейлиста в выбранную папку</html>
 
 FilesTableView.0=Таблица файлов
 FilesTableView.15=Играть файлы в папке
 #Dev: do not use ID = 16, next label is FilesTableView.17 
 
-DeviceView.0=Добавить устройство
 DeviceView.1=Удалить размонтированное устройство (ничего не удаляет с диска)
 DeviceView.2=Свойства выбранного устройства
-DeviceView.3=Примонтировать выбранное устройство
-DeviceView.4=Размонтировать выбранное устройство
-DeviceView.5=Тестировать устройство на доступность
-DeviceView.6=Форсировать обновление на выбранном устройстве
-DeviceView.7=Синхронизировать выбранное устройство
 DeviceView.8=Монтировать
 DeviceView.9=Размонтировать
 DeviceView.10=Тестировать
@@ -828,13 +751,9 @@ JajukWindow.26=[Ctrl-p] Пауза/Возобновить
 JajukWindow.27=[Ctrl-s] Стоп
 JajukWindow.31=Играть самые новые треки из коллекции
 JajukWindow.32=Полностью доиграть текущий альбом
-JajukWindow.33=[Ctrl-UP/DOWN] Громкость
-JajukWindow.34=Позиция
-JajukWindow.35=Играет:
 JajukWindow.36=Текущее окружение:
 JajukWindow.37=Не установлено окружения
 #Do not use JajukWindow.38, next is JajukWindow.39
-JajukWindow.39=Сейчас играет 
 JajukWindow.40=Правка дополнительных тегов
 JajukWindow.41=Открывает диалог для правки активных дополнительных тегов
 
@@ -852,27 +771,20 @@ SimpleDeviceWizard.0=экспресс создание устройства
 FirstTimeWizard.0=Быстрый старт
 FirstTimeWizard.1=<html><p><br/>Добро Пожаловать! Это первый запуск Jajuk, поэтому вначале давайте создадим вашу коллекцию</p></html>
 FirstTimeWizard.2=<html><p>Пожалуйста, укажите расположение вашей музыки,</p><p>щелкнув на кнопку справа.</p><p>(Первое обновление потребует времени)</p></html>
-FirstTimeWizard.4=Показать помощь по программе прямо сейчас. (Онлайн)
 FirstTimeWizard.5=Пожалуйста выберите папку
 FirstTimeWizard.6=Расширенные настройки
 FirstTimeWizard.7=Установить рабочую папку Jajuk :
 FirstTimeWizard.8=Выбранная папка:  
 FirstTimeWizard.9=Не выбрано
 
-HelpView.2=Помощь
 
 DownloadManager.0=<html>Jajuk требуется пароль прокси-сервера HTTP для загрузки обложек из Интернета<br/>Если вы не хотите этого, пожалуйста измените ваши настройки во вкладке "Обложки" в настройках.<br/> Если вы не используете прокси-сервер, пожалуйста измените настройки соответствующим образом во вкладке "Сеть" в настройках</html>
-DownloadManager.1=Требуется пароль
 
-PropertiesWizard.0=Свойства объекта
 PropertiesWizard.1=Поле
 PropertiesWizard.2=Значение
-PropertiesWizard.3=Редактируемое?
 PropertiesWizard.4=Ссылка
 PropertiesWizard.6=Выбор
-PropertiesWizard.7=Тип
 PropertiesWizard.8=Успешное обновление тега
-PropertiesWizard.9=Нет редактируемого тега для текущего выбора
 PropertiesWizard.10=тегов прописано
 PropertiesWizard.11=Записать тег в:
 PropertiesWizard.12=Ссылка на получение деталей тега
@@ -903,9 +815,6 @@ CatalogView.3=Обновить каталог
 CatalogView.4=Размер миниатюр
 CatalogView.5=Создать миниатюру для:
 CatalogView.7=Выберите обложку
-CatalogView.8=Не найдено обложки
-CatalogView.9=Назад
-CatalogView.10=Дальше
 CatalogView.11=Стр.:
 CatalogView.12=На предыдущую стр. миниатюр:
 CatalogView.13=На следующую стр. миниатюр:
@@ -934,17 +843,12 @@ TipOfTheDayView.0=Совет дня
 TipOfTheDayView.1=Знаете ли вы...?
 TipOfTheDayView.2=Показать при загрузке
 
-CDDBWizard.0=Подтвердить
 CDDBWizard.1=Имя файла
 CDDBWizard.2=Текущее название трека
 CDDBWizard.3=Текущее название альбома
 CDDBWizard.4=Предлагаемое название трека
 CDDBWizard.5=Предлагаемое имя альбома
-CDDBWizard.6=Готово! Найдено 
-CDDBWizard.7=Возможные значения
 CDDBWizard.12=Не найдено вариантов!
-CDDBWizard.14=Эта папка не содержит каких-либо файлов
-CDDBWizard.16=Жанр:
 CDDBWizard.17=Найдено точное совпадение!
 CDDBWizard.18=Совпадения
 CDDBWizard.19=Получить теги онлайн
@@ -961,11 +865,7 @@ DigitalDJWizard.6=Имя ДиДжея (*)
 DigitalDJWizard.8=Минимум звезд у трека:
 DigitalDJWizard.9=Время перетекания (сек.):
 DigitalDJWizard.10=Играть Без повторов
-DigitalDJWizard.11=Бросить
-DigitalDJWizard.12=Из жанров
-DigitalDJWizard.13=В жанры
 DigitalDJWizard.14=Выбор жанров (возможно множественное выделение):
-DigitalDJWizard.15=Количество треков
 DigitalDJWizard.16=Вы хотите...
 DigitalDJWizard.17=Пригласить нового ДиДжея?
 DigitalDJWizard.18=Изменить существующего ДиДжея?
@@ -1109,7 +1009,6 @@ ReportAction.19=Перейти к:
 ActionMove.0=Вставить
 
 ActionRefresh.0=Обновить
-ActionRefresh.1=Обновить папку
 
 RenameAction.0=Переименовать
 RenameAction.1=Пожалуйста, введите новое имя для этого файла:
@@ -1130,29 +1029,14 @@ ActionDelete.0=Файлы удалены
 ActionDelete.1=Папки удалены
 
 FindDuplicateTracksAction.0=Не найдено дубликатов
-FindDuplicateTracksAction.1=Найдены дубликаты
 FindDuplicateTracksAction.2=Поиск дублированных треков
 FindDuplicateTracksAction.3=Список найденных дубликатов треков
 FindDuplicateTracksAction.4=Выбрать все треки-дубликаты
 
-RefreshDialog.0=Подготовка к обновлению устройства...
 RefreshDialog.1=Обновление устройства
 RefreshDialog.2=Обновляемое устройство:
 RefreshDialog.3=Почистить старые файлы
 
-RadioWizard.0=Пожалуйста, выберите или создайте станцию веб-радио
-RadioWizard.1=Управление станциями веб-радио
-RadioWizard.2=Новая
-RadioWizard.3=Удалить
-RadioWizard.4=По умолчанию
-RadioWizard.5=Станция с таким именем уже существует
-RadioWizard.6=Имя станции
-RadioWizard.7=Помощник веб-радиостанций
-RadioWizard.8=URL
-RadioWizard.9=Имя
-RadioWizard.10=Неверный адрес URL
-RadioWizard.11=Имя и URL обязательны
-
 UpdateManager.0=Доступна новая версия Jajuk (
 UpdateManager.1=)! Вы можете загрузить ее с сайта http://jajuk.info
 UpdateManager.2=Пока что нет новых релизов
diff --git a/src/main/java/org/jajuk/i18n/jajuk_sv.properties b/src/main/resources/org/jajuk/i18n/jajuk_sv.properties
similarity index 86%
rename from src/main/java/org/jajuk/i18n/jajuk_sv.properties
rename to src/main/resources/org/jajuk/i18n/jajuk_sv.properties
index fc16fc1..6fd64a2 100644
--- a/src/main/java/org/jajuk/i18n/jajuk_sv.properties
+++ b/src/main/resources/org/jajuk/i18n/jajuk_sv.properties
@@ -5,7 +5,7 @@
 #Copyright 2003,2004 Bertrand Florat, this is part of Jajuk distributed under the GPL V2 license
 #REFERENCE
 #FROM en 1.54
-#$Revision$
+#
 
 #General Strings 
 Type.mp3=Mpeg layer 3
@@ -32,7 +32,6 @@ Perspective_Description_Files=Fysisk
 Perspective_Description_Tracks=Logisk
 Perspective_Description_Configuration=Konfiguration
 Perspective_Description_Statistics=Statistik
-Perspective_Description_Help=Hjälp
 
 Info=Information
 Warning=Varning
@@ -71,14 +70,11 @@ Error.017=Fel vid läsning av fil för spellista
 Error.018=Inget åtkomligt spår kan läsas från denna spellista
 Error.019=En existerande enhet har redan detta namn
 Error.020=IO-fel vid kopiering av fil
-Error.021=Url-fält är obligatoriskt. Ex: 'd:\mp3' i MS Windows, '/opt/mp3' i Unix 
-Error.022=Namnfältet är obligatoriskt. Ex: 'Hårddisk', 'CD ROCK' 
 Error.024=Kan inte skriva filen
 Error.025=En av filerna du vill läsa finns på en avmonterad enhet
 Error.026=Fel vid registrering av spelaren
 Error.027=Synchronisering avbruten
 Error.028=Fel vid sparande av spellistan
-Error.101=Enheten finns inte eller kan inte nås
 Error.102=Fel
 Error.103=Fel vid läsning av metainformation
 Error.104=Fel vid skrivning av metainformation
@@ -86,7 +82,6 @@ Error.105=Nyckeln till ResourceBundle hittades inte
 Error.106=Ofångat undantag
 Error.107=Uppdaterar redan
 Error.108=Fel vid läsning av perspektivfil
-Error.109=Implementationsklassen för spelaren eller metainformationen kan inte nås
 Error.110=Detta egenskapsnamn är reserverat av Jajuks interna system, vänligen välj ett annat
 Error.111=Enheten redan monterad
 Error.112=Kan inte montera enhet
@@ -94,19 +89,16 @@ Error.113=Kan inte lagra användarinformation
 Error.114=Kan inte läsa användarinformation
 Error.116=Kan inte registrera perspektivet, klassen hittas inte eller fel i konstruktorn, se felstacken
 Error.117=Kan inte registrera vy, klassen hittas inte
-Error.118=Fel vid behandling av händelseförfrågan
 Error.119=Fel vid läsning av historiefil
 Error.120=Kan inte komma åt enheten : den är antingen inte monterad eller håller på att uppdateras/synkroniseras
 Error.121=Enheten används och kan inte avmonteras
 Error.122=Fel i FIFO (kön)
-Error.123=Fel vid val av tema
-Error.124=En annan Jajuk-instans hittades, man kan bara köra en instans av Jajuk åt gången
 Error.125=Enheten är redan avmonterad
 
 
 #Strings from a class
 ParameterView.0=Historielängd: 
-ParameterView.2=Sätt tiden i dagar som du vill komma ihåg spelade spår. Sätt till -1 om du inte vill ha någon historia och 0 om du vill ha en permanent historia
+ParameterView.2=Sätt tiden i dagar som du vill komma ihåg spelade spår. Sätt till 0 om du inte vill ha någon historia och -1 om du vill ha en permanent historia
 ParameterView.3=Rensa historia
 ParameterView.4=Rensa historia
 ParameterView.8=Historia
@@ -129,8 +121,6 @@ ParameterView.30=Fråga före Jajuk avslutas
 ParameterView.33=Alternativ
 ParameterView.34=Visa endast monterade enheter
 ParameterView.35=Döljer spår på omonterade enheter
-ParameterView.36=Starta om när slutet på samlingen nås
-ParameterView.37=Starta om hela samlingen när slutet nås i fortsätt-läge
 ParameterView.38=Språk : 
 ParameterView.40=Engelska (en)
 ParameterView.41=Franska (fr)
@@ -164,8 +154,6 @@ ParameterView.87=Parametrar
 ParameterView.96=Visa omslag om tillgängligt
 ParameterView.97=Visa omslag i fysiskt och logiskt perspektiv. Filen som används är 'cover.jpg' eller den första bilden som hittas i albumkatalogen
 ParameterView.98=Metadata
-ParameterView.99=Genomför en djup metadatasökning
-ParameterView.100=<html>Tvinga Jajuk att läsa om id3-metadata.<p>Detta kan vara användbart för att uppdatera metadata som du ändrat via ett annat program</html>
 ParameterView.101=ANvänd katalognamnet som albumnamn
 ParameterView.102=Låt Jajuk använda katalognamnet som albumnamn till en låt om det intekan fås via id3-metadata
 ParameterView.103=Språkbyte träder i kraft nästa gång Jajuk startas
@@ -178,7 +166,6 @@ ParameterView.112=Sätt antal spår i 'Best-of'-spellistan (från 1 to 100)
 Main.10=Jajuk : Advanced Jukebox
 Main.12=Detta är din första Jajuk-session, för att använda den måste du först skapa minst en enhet i enhetsvyn
 Main.13=Jajuk korrekt uppstartad
-Main.21=Bekräftelse
 
 Device.21=Uppdaterar [
 Device.22=]  Går in i [
@@ -258,8 +245,6 @@ CommandJPanel.1=Repetitionsläge : spela spår i en loop
 CommandJPanel.2=Blandningsläge : spela slumpvis valda spår
 CommandJPanel.3=Fortsättningsläge : fortsätt spela nästa spår efter det aktuella
 CommandJPanel.4=Introläge : spela bara en bit av varje spår. Position och längd kan sättas i parametervyn
-CommandJPanel.5=Spela en blandning från hela samlingen
-CommandJPanel.6=Spela dina egna favoritspår
 CommandJPanel.7=Stäng av ljudet
 CommandJPanel.8=Spela föregående spår i aktuellt urval
 CommandJPanel.9=Spela nästa låt i aktuellt urval
@@ -271,21 +256,18 @@ CommandJPanel.14=Volym
 CommandJPanel.15=Gå till denna position i aktuellt spår
 
 InformationJPanel.5=Total återstående speltid
-InformationJPanel.6=Spårets bitrate
 InformationJPanel.7=Position i aktuellt spår
 
 AbstractPlaylistEditorView.0=Spår
 AbstractPlaylistEditorView.1=Position
 AbstractPlaylistEditorView.2=Kör denna spellista
 AbstractPlaylistEditorView.3=Spara denna spellista
-AbstractPlaylistEditorView.4=Lägg till i denna spellista
 AbstractPlaylistEditorView.5=Ta bort från denna spellista
 AbstractPlaylistEditorView.6=Flytta till högre position i listan
 AbstractPlaylistEditorView.7=Flytta till lägre position i listan
 AbstractPlaylistEditorView.8=Visa spellista som spelas
 AbstractPlaylistEditorView.9=Radera denna spellista
 AbstractPlaylistEditorView.15=Spellisteredigerare
-AbstractPlaylistEditorView.17=Du kommer att uppdatera följande spellistor tillsammans till skiva :
 
 StatView.0=Andra
 StatView.1=Uppdelning i stilar
@@ -367,8 +349,6 @@ FilesTreeView.13=Spela upprepat
 FilesTreeView.14=Avsynkronisera
 FilesTreeView.15=Återsynkronisera
 FilesTreeView.16=Skapa spellista
-FilesTreeView.17=Kopiera
-FilesTreeView.18=Klipp ut
 FilesTreeView.19=Klistra in
 FilesTreeView.20=Döp om
 FilesTreeView.21=Radera
@@ -383,7 +363,6 @@ FilesTreeView.29=Avmontera
 FilesTreeView.30=Uppdatera
 FilesTreeView.31=Synkronisera
 FilesTreeView.32=Test
-FilesTreeView.33=Skapa spellistor
 FilesTreeView.34=Sätt en egenskap
 FilesTreeView.35=Egenskaper
 FilesTreeView.36=Spela
@@ -413,9 +392,6 @@ TracksTableView.6=Betygsätt
 AbstractTableView.0=Filter: 
 AbstractTableView.1=Filteregenskap
 AbstractTableView.3=Värde att användas av filtret
-AbstractTableView.4=Använd filter
-AbstractTableView.5=Rensa filtret
-AbstractTableView.6=Använd ett avancerat filter
 AbstractTableView.7=innehåller :
 
 AboutView.7=Om
@@ -423,21 +399,8 @@ AboutView.8=Licens
 AboutView.9=System
 AboutView.10=Om
 
-PhysicalPlaylistRepositoryView.0=Spela
-PhysicalPlaylistRepositoryView.1=Ändra
 PhysicalPlaylistRepositoryView.2=Spara som
-PhysicalPlaylistRepositoryView.3=Radera
-PhysicalPlaylistRepositoryView.4=Egenskaper
-PhysicalPlaylistRepositoryView.6=Spellistor
-PhysicalPlaylistRepositoryView.8=Special
 PhysicalPlaylistRepositoryView.9=Kö
-PhysicalPlaylistRepositoryView.10=Aktuell kö : dra-och-släpp in i den för att spela
-PhysicalPlaylistRepositoryView.11=Ny
-PhysicalPlaylistRepositoryView.12=Ny spellista : dra-och-släpp in i den för att lägga till filer
-PhysicalPlaylistRepositoryView.13=Bokmärken
-PhysicalPlaylistRepositoryView.14=Bokmärk spellista : dra-och-släpp in i den för att lägga till
-PhysicalPlaylistRepositoryView.15=Best-of
-PhysicalPlaylistRepositoryView.16=Best-of-spelllista : innehåller toppspår
 
 FilesTableView.0=Fysisk tabell
 FilesTableView.1=Spela
@@ -455,14 +418,8 @@ FilesTableView.12=Enhet
 FilesTableView.13=Fil
 FilesTableView.14=Betygsätt
 
-DeviceView.0=Lägg till en enhet
 DeviceView.1=Ta bort en enhet (tar inte bort något fysiskt från disken)
 DeviceView.2=Valda enhetsegenskaper
-DeviceView.3=Montera vald enhet
-DeviceView.4=Avmontera vald enhet
-DeviceView.5=Testa vald enhets tillgänglighet
-DeviceView.6=Uppdatera vald enhet
-DeviceView.7=Synkronisera vald enhet
 DeviceView.8=Montera
 DeviceView.9=Avmontera
 DeviceView.10=Testa
@@ -489,5 +446,4 @@ JajukWindow.12=SPela >
 JajukWindow.13=Föregående <--
 JajukWindow.14=Nästa -->
 
-HelpView.2=Hjälp
 ]]></body>
\ No newline at end of file
diff --git a/src/main/resources/org/jajuk/i18n/jajuk_zh.properties b/src/main/resources/org/jajuk/i18n/jajuk_zh.properties
new file mode 100644
index 0000000..bf1db00
--- /dev/null
+++ b/src/main/resources/org/jajuk/i18n/jajuk_zh.properties
@@ -0,0 +1,1182 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<body><![CDATA[
+#Jajuk Simplified Chinese langpack. 
+#Author: Gilbert Zhang
+#Copyright 2003-2013 The Jajuk Team, this is part of Jajuk distributed under the GPL V2 license
+#FROM en 2013/05/13
+#
+ 
+#--- Generic labels ---
+# DO NOT CREATE GENERIC LABELS WITH DIFFERENT GENDERS IN SOME LANGUAGES LIKE ADJECTIVES
+# YOU PROBABLY DON'T WANT TO CREATE A LABEL HERE, CREATE ONE ONLY IF VERY GENERICAL 
+# AND USED MANY TIMES  
+Info=信息
+Warning=警告
+Error=错误
+Ok=确定
+Cancel=取消
+Close=关闭
+Stop=停止
+Save=保存
+Apply=应用
+Delete=删除
+Details=详细信息
+Yes=是
+No=否
+Success=操作成功
+Sort=排序方式:
+Option=请选择一个选项:
+Help=帮助
+Hide=不再显示
+Path=请选择路径
+Later=稍后
+Default=默认
+YestoAll=全部选是
+Purge=清除
+
+#--- Wizard Strings --- 
+#These strings are used in the context of a basic wizard
+Wizard_Next=下一步
+Wizard_Prev=上一步
+Wizard_Finish=完成
+
+#--- General Strings --- 
+Type=类型
+Type.mp3=Mpeg Layer 3
+Type.playlist=播放列表
+Type.ogg=Ogg Vorbis
+Type.wav=Audio WAVE/SPEEX
+Type.au=Sun Audio
+Type.aiff=Apple Audio Interchange
+Type.flac=Free Lossless Audio Codec
+Type.mpc=MusePack
+Type.wma=Windows Media Audio
+Type.ape=Monkey's Audio format
+Type.aac=Advanced Audio Coding
+Type.real=Real Audio
+Type.mp2=Mpeg Layer 2
+Type.mac=Monkey's Audio format
+Type.radio=网络电台
+Type.video=视频
+Type.wavpack=WavPack
+
+unknown=未知
+unknown_artist=未知
+unknown_album=未知
+unknown_genre=未知
+unknown_year=未知
+
+various_artist=群星
+
+Note.0=Jajuk检测到重要的版本升级.你的观点已被重置到新的默认值.
+Note.1=Jajuk评级系统改变(参见Jajuk在线帮助->评价系统页).您之前的评级已被重置到0到100的范围内,但我们建议在"偏好"视图->"历史"选项卡重置所有评级(注意:将丢失所有当前评级)
+
+#Write confirmation so replies are: yes / no / cancel
+Confirmation_exit=你确定要退出Jajuk吗?
+Confirmation_delete=警告!你将要从硬盘中删除以下文件,你确定要删除吗?
+Confirmation_void_refresh=警告!你将要访问无效设备.在Unix中,请确保该设备已安装,否则你将失去此设备上的jajuk的信息.你确定继续吗?
+Confirmation_remove_device=你确定要移除此设备吗?
+Confirmation_delete_cover=你确定要从硬盘上删除该封面吗?
+Confirmation_delete_files=你确定要从硬盘上删除这些文件吗?
+Confirmation_delete_dirs=你确定要从硬盘上删除这些目录吗?
+Confirmation_clear_history=你确定要清除历史吗?
+Confirmation_reset_ratings=你真的要重置所有曲目评级到零吗?
+Confirmation_refactor_files=你确定要重命名这些所选文件吗?
+Confirmation_restore_all=恢复完整的视图需要重新启动Jajuk,你想要现在退出吗?
+Confirmation_delete_empty_dirs=以下目录是空的.你想要删除它们吗?
+Confirmation_file_overwrite=此文件已存在.你想要重写此文件吗?
+Confirmation_file_number=文件将会被删除.
+Confirmation_defaults=注意这将会重置所有标签设置到默认值(不仅是当前的一个),你确定吗??
+Confirmation_reset_preferences=你确定要重置曲目首选项吗?
+Confirmation_reset_ratings_overwrite=导入的文件中的任何评级将会在Jajuk安装中重写此文件的当前评级.你确定要进行此操作吗?
+Confirmation_tag_write=一个或多个标签将会写入磁盘.你确定吗?
+
+Device_type.directory=目录
+Device_type.file_cd=音乐文件CD
+Device_type.extdd=外部硬盘
+Device_type.player=数字音频播放器
+Device_type.network_drive=网络驱动
+
+Perspective_Description_Simple=简单
+Perspective_Description_Files=文件
+Perspective_Description_Tracks=轨道
+Perspective_Description_Configuration=配置
+Perspective_Description_Statistics=统计
+Perspective_Description_Display=显示
+Perspective_Description_Albums=专辑
+Perspective_Description_Info=信息
+Perspective_Description_Playlists=播放列表
+
+Item_Playlist_File=播放列表
+Item_Track=轨道
+Item_Album=专辑
+Item_Artist=艺术家
+Item_Genre=类型
+Item_Device=设备
+Item_File=文件
+Item_Directory=目录
+Item_Year=年
+Item_AlbumArtist=专辑-艺术家
+
+Property_id=Id
+Property_name=名称
+Property_type=类型
+Property_url=Url
+Property_mount_point=挂载点
+Property_auto_refresh=自动刷新
+Property_auto_mount=自动挂载
+Property_album=专辑
+Property_style=类型
+Property_author=艺术家
+Property_album_artist=专辑艺术家
+Property_disc_number=碟片#
+Property_length=长度
+Property_year=年
+Property_rate=评级
+Property_files=文件
+Property_hits=下载数
+Property_filename=文件
+Property_date=创建日期
+Property_added=发现日期
+Property_parent=上级目录
+Property_device=设备
+Property_directory=目录
+Property_track=曲目
+Property_size=Size (MB)
+Property_quality=质量
+Property_hashcode=哈希值
+Property_playlist_files=播放列表
+Property_comment=注释
+Property_order=顺序
+Property_path=完整路径
+Property_tracks=曲目
+Property_file_date=文件日期
+Property_Format_Number=编号
+Property_Format_String=串
+Property_Format_Boolean=布尔值
+Property_Format_Float=浮动
+Property_Format_Date=日期
+Property_Format_URL=Url
+Property_pf=首选项
+Property_tpt=总共播放时间(秒)
+Property_ban=已禁止
+Property_disc_id=碟片ID
+Property_keywords=关键词
+Property_label=描述
+Property_bitrate=比特率(kbps)
+Property_frequency=频率(Hz)
+Property_origin=来源
+
+Language_desc_en=英语
+Language_desc_fr=法语
+Language_desc_de=德语
+Language_desc_it=意大利语
+Language_desc_sv=瑞典语
+Language_desc_nl=荷兰语
+Language_desc_zh=汉语
+Language_desc_es=西班牙语
+Language_desc_ca=加泰罗尼亚语
+Language_desc_ko=韩语
+Language_desc_el=希腊语
+Language_desc_ru=俄语
+Language_desc_gl=加利西亚语
+Language_desc_cs=捷克语
+Language_desc_pt=西班牙语
+
+#--- Error codes ---
+Error.000=未知错误
+Error.005=收藏文件解析错误
+Error.007=播放文件时出现错误,也许MPlayer没有开始播放,直到超时达到:
+Error.008=停止文件时出现错误
+Error.009=无法读取文件
+Error.010=无法在安装的设备上找到与此项目有关的文件
+Error.011=安装设备或取消设备时出现技术错误
+Error.012=卸载设备时出现技术错误,它可能正被其它应用程序使用
+Error.013=无法移除设备:它被安装或正在刷新
+Error.016=无法访问指定设备.请输入设备挂载点. Ex: '/cdrom'在Unix下,'e:'在MS Windows下
+Error.017=解析播放列表时出现错误
+Error.018=未找到可访问的文件
+Error.019=已存在的设备已使用此名称
+Error.020=复制文件时出现IO错误.磁盘可能没有空间
+Error.023=无法运行启动跟踪
+Error.024=无法写入文件
+Error.025=你要读取的一个文件在未安装的设备上
+Error.026=注册播放器时发生错误
+Error.027=同步中止
+Error.028=E保存播放列表时出现错误
+Error.030=过多的连接失败.Jajuk已停止搜索在线封面
+Error.102=错误
+Error.103=读取标签信息时出现错误
+Error.104=写入标签信息时出现错误
+Error.105=没有找到资源包密匙
+Error.106=未捕获的异常
+Error.107=设备正在刷新或正在同步
+Error.108=视图文件解析错误
+Error.110=此属性名称由Jajuk内部系统预留.请使用另一个
+Error.111=设备已安装
+Error.112=无法安装设备
+Error.113=无法存储用户配置
+Error.114=无法读取用户配置
+Error.119=无历史文件或解析错误
+Error.120=无法访问设备:它没有被安装,当前正在刷新或正在同步
+Error.121=设备正被占用,无法卸载
+Error.122=FIFO错误
+Error.125=设备已卸载
+Error.126=此音频格式不支持查找
+Error.127=在指定的期限内没有发现新曲目.你可以在首选项视图中设置时间限制
+Error.128=当前音曲目是音乐集中的第一个.上一个曲目无效
+Error.131=无法删除文件
+Error.133=您的集文件已损坏,原因未知.Jajuk已设法恢复备份文件
+Error.134=无法重命名文件
+Error.135=文件不存在
+Error.136=操作失败
+Error.137=格式错误
+Error.140=无效字串:不应包含& ' " < 或 >字符
+Error.141=此播放列表位于已卸载或正在刷新的设备中,无法使用
+Error.142=此播放列表包含不存在的曲目或位于Jajuk已知设备外的曲目.这些歌曲已被忽略
+Error.143=无法达到设备位置
+Error.144=解析DJ错误
+Error.145=无法提交DJ
+Error.146=<html>当前的管理模式是错误的.<br/>有效的项目有:%artist(艺术家名);%album_artist(专辑艺术家);%title(曲目标题);%album(专辑名称);<br/>%n(曲目前导零);%genre(曲目流派);%year(年);%disc(碟片标号)<br/>%CUSTOM_PROPERTY_NAME<br/>模式必须包含至少一个斜线</html> 
+Error.147=一些文件没有被移除(查看详细获取更多信息)
+Error.148=年字段未知
+Error.149=专辑字段未知
+Error.150=艺术家字段未知
+Error.152=曲目字段未知
+Error.153=流派字段未知
+Error.154=无法重命名文件,检查文件名或标签中的错误字符
+Error.155=重新标记文件时出现错误,检查权限
+Error.156=空集
+Error.157=错误的DJ,DJ请从命令视图DJ按钮选择或创建DJ
+Error.158=不能遵守DJ限制或没有曲目可用
+Error.159=已删除相关联的环境
+Error.160=文件没有被移动,元和目标文件名相同.
+Error.161=无法写入到目录,检查许可
+Error.162=此自定义属性已存在
+Error.163=恢复默认视图时出现错误
+Error.165=错误的集路径,目录没有被找到或不能写入
+Error.166=空的专辑,无法占取封面
+Error.167=无法创建报告
+Error.171=此设备没有同步源,使用设备配置对话框设置(在设备视图中,点击设备).
+Error.172=不能删除或修改当前播放的文件和它的上级目录
+Error.174=访问Freedb未知出现错误,检查你的网络连接 
+Error.176=生成播放列表时出现错误
+Error.177=请输入(HH24:MM:SS)格式的有效时间
+Error.179=无法打开系统文件浏览器,尝试首选项视图/高级选项卡中设置路径
+Error.180=复制文件时出现错误
+Error.181=未找到指定的文件
+Error.182=无法访问指定的配置路径,我们使用用户主路径代替。如果需要,在“配置”视图,“增强”选项卡中修改它
+Error.184=错误的值:刷新间隔可以是0或>=0.5的数字
+
+
+#Warnings
+Warning.0=未找到MPlayer.一些音频和视频格式flac, wma, aac, mpg2 ... )将会被禁用.如果已安装MPlayer,请在首选项视图/高级选项卡中手动设置它的路径.
+Warning.1=错误的MPlayer版本,MPlayer1.0Pre8或更高版本是必需的.一些音频格式将被禁用. 
+Warning.3=无法下载Mplayer.如果你使用HTTP代理,请在首选项视图/网络标签中配置它并重新启动Jajuk. 
+Warning.4=需要Mplayer来收听网络电台
+Warning.5=目标目录已存在,一些文件可能会被覆盖,你确定吗? 
+Warning.6=没有可播放的曲目(小提示:尝试安装设备或改变环境音效)
+Warning.7=Jajuk检测到由于升级而需要深度刷新.你想要现在进行此操作吗?(你还可以从设备视图随时进行此操作)  
+
+#--- Strings by class ---
+ParameterView.0=历史所用时间: 
+ParameterView.2=设定保存已播放曲目历史的天数. 如果你不想保存任何历史,输入0;如果你想要永久地保存历史,输入-1.
+ParameterView.3=清除历史
+ParameterView.4=清除历史
+ParameterView.8=历史/评级
+ParameterView.9=播放:
+ParameterView.10=无
+ParameterView.11=Jajuk启动时不播放音乐
+ParameterView.12=上一曲目从开始位置开始
+ParameterView.13=从开始位置播放上一曲目
+ParameterView.14=随机选择曲目
+ParameterView.15=从整个集中随即选择曲目
+ParameterView.16=曲目/音频:
+ParameterView.17=启动时选择要播放的文件
+ParameterView.18=启动时选择要播放的文件.开始输入查看过滤列表.
+ParameterView.19=启动
+ParameterView.26=确认
+ParameterView.27=在从磁盘删除文件之前
+ParameterView.28=在从磁盘删除文件之前询问
+ParameterView.29=退出Jajuk之前
+ParameterView.30=退出Jajuk之前询问
+ParameterView.33=选项
+ParameterView.35=隐藏未安装的设备上的曲目
+ParameterView.38=语言:
+ParameterView.42=选择界面语言
+ParameterView.43=主题: 
+ParameterView.44=<html>选择主题p>(Jajuk可能需要重新启动来完整地刷新)</html>
+ParameterView.46=日志级别: 
+ParameterView.47=重大
+ParameterView.48=错误
+ParameterView.49=警告
+ParameterView.50=信息
+ParameterView.51=调试
+ParameterView.52=Jajuk冗长:重大:只显示关键错误,Error:+显示错误,Info:+显示信息消息,警告:+显示警告,调试:任何消息
+ParameterView.59=介绍开始位置(%): 
+ParameterView.60=曲目内的介绍位置百分比从0(曲目开始)到99(曲目结束)
+ParameterView.61=介绍长度(秒): 
+ParameterView.62=介绍长度(秒)
+ParameterView.85=应用
+ParameterView.86=恢复到默认
+ParameterView.87=首选项
+ParameterView.98=样式
+ParameterView.101=使用上级目录名称作为专辑名称
+ParameterView.102=如果勾选,会为ID3标签不能使用的曲目使用上级目录名称作为专辑名称.
+ParameterView.109=首选项已保存
+ParameterView.110=已设置首选项到默认
+ParameterView.111=最佳的播放列表大小:
+ParameterView.112=设置最佳播放列表的曲目数量(从1到100)
+ParameterView.113=在过滤器中使用正则表达式
+ParameterView.114=在桌面过滤器中使用正则表达式(Regexp 格式).例如: .*foo.*
+ParameterView.115=高级
+ParameterView.116=备份集文件
+ParameterView.117=若果你想要备份你的集文件到collection-<date>.xml文件,请勾选此项
+ParameterView.119=备份大小(MB)
+ParameterView.129=新文件的时间限制(天):
+ParameterView.130=新文件的天数限制:所有在该天数以内添加的曲目会在新文件播放列表中显示
+ParameterView.131=最佳曲目
+ParameterView.132=启动项播放一首你最喜欢的曲目
+ParameterView.133=新曲目
+ParameterView.134=启动时从你的集中播放新文件
+ParameterView.135=上一曲目从上一位置
+ParameterView.136=从上一次停止的位置播放上一次播放的曲目
+ParameterView.139=网络
+ParameterView.142=代理服务器用户名
+ParameterView.143=用于身份验证的代理服务器登录名
+ParameterView.144=代理服务器主机名
+ParameterView.145=代理服务器主机名或IP地址
+ParameterView.146=代理服务器端口
+ParameterView.147=代理服务器TCP-IP端口(经常是3128)
+ParameterView.148=在线获取封面
+ParameterView.149=使用自动封面来从网络下载专辑封面(如果需要,在网络标签中配置代理服务器)
+ParameterView.150=封面大小
+ParameterView.151=下载的封面大小
+ParameterView.155=搜索精确度.精确度越高,你获取的错误封面图像越少.
+ParameterView.156=低精确度(搜索全部文字)
+ParameterView.157=中(搜索分组的文字)
+ParameterView.158=高(强制搜索分组的文字)
+ParameterView.159=封面
+ParameterView.160=连接超时(秒)
+ParameterView.161=连接超时的秒数:如果服务器在这一时间内没有回复,则远程操作失败.
+ParameterView.164=移除设备之前
+ParameterView.165=在移除设备之前询问
+ParameterView.166=随机封面
+ParameterView.167=显示随机封面
+ParameterView.171=从磁盘中删除封面之前
+ParameterView.172=在从磁盘中删除封面之前询问
+ParameterView.179=强制选择
+ParameterView.180=如果勾选,双击曲目或选择项目强制加入队伍
+ParameterView.181=强制拖放
+ParameterView.182=如果勾选,集曲目可以被拖放到播放列表中
+ParameterView.186=重置评级
+ParameterView.187=重置所有曲目评级到零
+ParameterView.188=清理历史之前
+ParameterView.189=重置评级之前
+ParameterView.190=淡入淡出耗时(秒)
+ParameterView.191=曲目之间淡入淡出的秒数
+ParameterView.192=文件管理器:
+ParameterView.193=<html>可用的样式:%artist(艺术家名);<br>%album_artist(专辑艺术家,如果没有定义的艺术家名被使用);<br>%title(曲目标题);%album(专辑名);%n(曲目);%genre(曲目流派);<br>%year(年);%disc(磁盘编号); %CUSTOM_PROPERTY_NAME</html>
+ParameterView.194=在管理文件之前
+ParameterView.195=标题视图:
+ParameterView.196=启用热键
+ParameterView.197=启用例如F8的按键即使Jajuk不在焦点
+ParameterView.198=一些改变只会在Jajuk下一次启动后生效
+ParameterView.199=在我的所听音乐中寻找
+ParameterView.200=此选项发送信息到Last.fm
+ParameterView.201=Last.FM 用户名
+ParameterView.202=Last.FM上使用的用户名
+ParameterView.203=Last.FM密码
+ParameterView.204=Last.FM上使用的密码
+ParameterView.205=Mplayer arguments
+ParameterView.206=<html>附加的MPlayer arguments例如'-ao esd','-ao arts' <br>或'-novideo(整理播放视频)'由ie使用<br>请注意如果使用比特完美选项,声音处理选项会被忽略。</html>
+ParameterView.207=Jajuk配置路径
+ParameterView.208=设置包含Jajuk配置的目录(默认为用户的主目录)
+ParameterView.209=Jajuk配置路径已被修改为当前用户(原有的集被存储在原来的位置).Jajuk现在将会关闭,可以重新启动.
+ParameterView.210=If cross fade doesn't work,尝试在声音引擎附加arguments字段在Gnome下添加<-ao esd>或在KDE下添加<-ao arts>(首选项视图/高级标签).
+ParameterView.211=只有小
+ParameterView.212=小和中
+ParameterView.213=只有中
+ParameterView.214=中和大
+ParameterView.215=只有大
+ParameterView.216=使用艺术家名搜索
+ParameterView.217=使用专辑名搜索
+ParameterView.218=使用曲目名称搜索
+ParameterView.219=环境变量
+ParameterView.220=设置音频播放器使用的环境变量(在KDE下的ARTS_SERVER或在Gnome下的ESPEAKER由ie使用).格式:var1=xx var2=yyy... 
+#Respect English size for next item
+ParameterView.221=目录视图页面大小(0:所有专辑在同一页面中)
+ParameterView.222=设置目录视图中每页中的专辑数量.0:在同一页面中显示所有专辑.
+ParameterView.223=字体大小
+ParameterView.224=设置文字字体大小
+ParameterView.225=GUI
+ParameterView.226=模式
+ParameterView.228=当鼠标悬停在专辑上时显示提示
+ParameterView.229=目录视图首选项
+ParameterView.233=主题将会在Jajuk下一次启动时完整地应用
+ParameterView.234=检查Jajuk更新
+ParameterView.235=Last.FM
+ParameterView.236=不使用代理服务器
+ParameterView.237=HTTP代理服务器
+ParameterView.238=SOCKS代理服务器
+ParameterView.239代理服务器密码
+ParameterView.240=启用Last.FM信息查询
+ParameterView.241=如果勾选,Jajuk将会从Last.FM网站获取专辑等方面的许多信息(查看建议视图) 
+ParameterView.242=Mplayer路径
+ParameterView.243=<html>设置mplayer可执行文件的完整路径(允许空格)<br/>例如:/Applications/MPlayer OSX.app/Contents/Resources/External_Binaries/mplayer_intel.app/Contents/MacOS/mplayer</html>
+ParameterView.244=发现日期=文件日期 
+ParameterView.245=<html>如果勾选,jajuk会使用音频文件系统日期作为发现日期<br/>需要深度刷新才能生效</html>
+ParameterView.246=透视栏图标大小(像素)
+ParameterView.247=目标路径包含原有的Jajuk配置.配置已为当前用户更换到此路径(原有的配置被存储在原来的位置).Jajuk现在将会关闭,可以重新启动.
+ParameterView.248=框架标题:
+ParameterView.249=重置首选项
+ParameterView.250=重置用户定义的首选项
+ParameterView.251=成功重置历史
+ParameterView.252=成功重置评级和播放次数
+ParameterView.253=成功重置首选项
+ParameterView.256=标准封面文件名
+ParameterView.257=Jajuk识别文件名中包含此文字(不含扩展名)的标准封面文件.可以提供由';'分开的几个值.例如:"Folder;front".
+ParameterView.260=Windows文件管理器友好地保存
+ParameterView.261=保存下载的封面为文件夹.jpg/png/...使windows文件浏览器使用它们作为文件夹图标.
+ParameterView.262=使用音频正常化
+ParameterView.263=增加音量到最大而不损失音质
+ParameterView.264=禁止Jajuk访问网络
+ParameterView.265=禁用Jajuk访问网络(LastFM,封面或歌词下载...).
+ParameterView.268=代理服务器配置
+ParameterView.269=文件浏览器可执行文件路径
+ParameterView.270=外部文件浏览器可执行文件的路径
+ParameterView.271=在系统托盘显示
+ParameterView.272=如果勾选,可以在通知区域管理jajuk(不支持所有的操作系统)
+ParameterView.273=Mirrow封面
+ParameterView.274=如果勾选,封面会倾斜和mirrowed 
+ParameterView.275=曲目变化时弹出提示窗口:
+ParameterView.276=选择曲目变化时的通知类型(小消息是一个会短暂地出现在屏幕上并自己消失的提示窗口) 
+ParameterView.277=气泡样式:
+ParameterView.278=此样式设置显示曲目变化时在气泡提示上的文字
+ParameterView.279=信息样式:
+ParameterView.280=此样式设置显示在信息视图上的文字(屏幕较低的部分)
+ParameterView.281=最小化到托盘
+ParameterView.282=如果勾选,Jajuk主窗口在最小化时只会在系统托盘中显示,而不在任务栏中显示
+ParameterView.283=全屏模式下使用Mirrow封面
+ParameterView.284=如果勾选,全屏模式下封面会倾斜和mirrowed 
+ParameterView.285=启用比特完美
+ParameterView.286=<html>禁用混音器(声音音量)和其它任何可能会影响<br>音质的选项例如音频正常化.<br>一旦启用,你需要使用操作系统混音器来改变音量或静音.</html>   
+ParameterView.287=声音
+ParameterView.288=启用标题视图动画效果
+ParameterView.289=标题视图选项
+ParameterView.290=启动时显示启动画面
+ParameterView.291=在主窗口模式下启动时显示启动画面(它在迷你工具栏或全屏模式下总是被禁用) 
+ParameterView.292=当鼠标移至专辑表或缩略图上时显示含有专辑详细信息的弹出窗口
+ParameterView.301=显示视频
+ParameterView.302=如果未设置,jajuk不会显示视频类型的文件(启动必需).
+ParameterView.303=点击系统托盘强制显示
+ParameterView.304=点击系统托盘强制窗口显示到前端(默认操作显示/隐藏窗口)
+ParameterView.305=保存文件日期
+ParameterView.306=设置标签时保存文件"上次修改日期"
+ParameterView.307=手动评级
+ParameterView.308=不依赖基于播放次数和首选项的自动评级系统而是直接使用首选项级别设置设置评级.
+ParameterView.309=在写入一个或更多标签之前
+ParameterView.310=重置"不再显示"选项
+ParameterView.311=再次显示选择你要求隐藏的选项是可能的.
+
+Main.22=正在检查/正在下载 MPlayer
+
+Player.0=正在等待音频线(被占用)
+
+Device.25=] 刷新在
+Device.27= 新文件
+Device.31=同步. [
+Device.33=同步完成在
+Device.35= 创建文件 (
+Device.36= MB) 
+Device.41=同步. [
+Device.42=]  正在复制 [
+Device.43= 不可读的标签
+Device.44=正在输入
+Device.45=正在复制 [
+Device.46=正在转换 [
+Device.47=] 到 [
+Device.48= 文件或播放列表参考下落
+
+FIFO.4=). 你想要尝试挂载它吗?
+FIFO.10=正在播放: 
+FIFO.13= Kbps
+FIFO.14=正在播放网络电台:
+
+HistoryItem.0=yy/MM/dd HH:mm
+
+DeviceWizard.0=设备配置
+DeviceWizard.1=设备类型*: 
+DeviceWizard.2=设备名称*: 
+DeviceWizard.3=设备位置*: 
+DeviceWizard.7=进行快速刷新
+DeviceWizard.8=启动时自动挂载
+DeviceWizard.10=同步与: 
+DeviceWizard.11=单向同步
+DeviceWizard.12=在源设备上找到的所有新文件已被复制到此设备.原设备将不会被写入.
+DeviceWizard.13=双向同步
+DeviceWizard.14=在一个设备上找到的所有新文件已被复制到另一个设备
+DeviceWizard.43=请选择目录
+DeviceWizard.44=设备已创建
+DeviceWizard.45=请命名新设备.例如:CD A,Laptop...
+DeviceWizard.46=请给出设备位置.例如:Windows下d:\music,Unix下/home/foo/music
+DeviceWizard.48=<html>如果你想要进行此设备的快速刷新,勾选此项(建议).<p>注意此操作对于大设备会花费一会儿时间.</p></html>
+DeviceWizard.49=<html>如果你想要在Jajuk启动时自动挂载设备,勾选此项.<p>对于当前硬盘上的目录推荐,但对于CD不推荐.</p></html>
+DeviceWizard.50=<html>给出自动搜索新文件的分钟间隔(0:不扫描,0.5分钟是最小的间隔)</html>
+DeviceWizard.51=如果你想要此设备与另一设备同步,勾选此项
+DeviceWizard.52=选择源设备
+DeviceWizard.53=刷新设备每
+#limited string size
+DeviceWizard.54=分钟
+
+JajukJMenuBar.0=文件
+JajukJMenuBar.1=打开文件
+JajukJMenuBar.3=退出
+JajukJMenuBar.5=属性
+JajukJMenuBar.6=创建用户属性
+JajukJMenuBar.7=移除用户属性
+JajukJMenuBar.8=视图
+JajukJMenuBar.9=模式
+JajukJMenuBar.10=重复
+JajukJMenuBar.11=拖曳
+JajukJMenuBar.12=继续
+JajukJMenuBar.13=介绍
+JajukJMenuBar.14=帮助
+JajukJMenuBar.15=帮助目录
+JajukJMenuBar.16=关于
+JajukJMenuBar.17=恢复视图(当前角度)
+JajukJMenuBar.18=设备向导
+JajukJMenuBar.19=报告错误或特性要求
+JajukJMenuBar.20=每日提示
+JajukJMenuBar.21=配置
+JajukJMenuBar.22=首选项
+JajukJMenuBar.23=显示调试痕迹
+JajukJMenuBar.24=只显示可用曲目
+JajukJMenuBar.25=显示视图
+JajukJMenuBar.26=恢复视图(所有角度)
+JajukJMenuBar.27=检查Jajuk更新
+JajukJMenuBar.28=工具
+JajukJMenuBar.29=智慧
+JajukJMenuBar.30=重复播放全部
+JajukJMenuBar.31=卡拉OK
+# Next two lines are only used in development/test mode, translation is therefore optional 
+JajukJMenuBar.32=Call a full GC (test mode only)
+JajukJMenuBar.33=Perform a manual commit of the collection data (test mode only)
+
+PlaylistFileItem.1=新文件
+PlaylistFileItem.2=新播放列表
+PlaylistFileItem.3=书签
+PlaylistFileItem.4=最佳
+PlaylistFileItem.5=队列
+
+JajukFileChooser.0=文件选择
+
+SearchBox.0=在曲目,艺术家,流派,目录中进行搜索...
+
+CommandJPanel.0=查看播放历史
+CommandJPanel.1=[Ctrl-t]重复播放模式:在一个循环中播放曲目
+CommandJPanel.2=[Ctrl-h]拖曳模式:随机播放所选曲目
+CommandJPanel.3=继续模式:结束时继续播放计划的曲目
+CommandJPanel.4=介绍模式:只播放每个曲目的一部分.可以在首选项视图中配置时间和开始位置
+CommandJPanel.8=<html>[F9]使用当前选择播放上一曲目<br/>右键点击重新播放当前曲目<br/>Shift+单击开始上一专辑<br/>Ctrl+单击 重新播放当前专辑</html>
+CommandJPanel.9=<html>[F10]使用不同的选择播放上一专辑<br/>Shift+单击播放下一专辑</html>
+CommandJPanel.10=<html>[Alt-gr F9]在当前曲目快退<br/>Shift+单击重新播放</html>
+CommandJPanel.13=[Alt-gr F0]在当前曲目快进
+CommandJPanel.15=<html>单击这里修改时间显示格式</html> 
+CommandJPanel.16=开始DJ选择
+CommandJPanel.17=管理DJ
+CommandJPanel.18=开始默认DJ选择
+CommandJPanel.19=管理环境音效
+CommandJPanel.20=逐个曲目
+CommandJPanel.21=随机逐个专辑
+CommandJPanel.22=逐个专辑
+CommandJPanel.25=打开电台
+CommandJPanel.26=重复全部模式: 在一个循环中播放队列
+CommandJPanel.27=卡拉OK模式,从已播放的曲目中隐藏声音(下一曲目开始后应用)
+
+InformationJPanel.5=总共剩余排队时间[剩余曲目Nb]
+InformationJPanel.7=当前曲目进程
+# %xxx are patterns, don't translate them !
+InformationJPanel.8=%artist %album上的标题%title 
+# Keep next label short
+InformationJPanel.9=<无选择>
+
+AbstractPlaylistEditorView.0=标题
+AbstractPlaylistEditorView.1=位置
+AbstractPlaylistEditorView.2=运行此播放列表
+AbstractPlaylistEditorView.3=保存此播放列表
+AbstractPlaylistEditorView.5=移除项目
+AbstractPlaylistEditorView.6=上移
+AbstractPlaylistEditorView.7=下移
+AbstractPlaylistEditorView.9=删除此播放列表
+AbstractPlaylistEditorView.10=随机增加曲目到此播放列表
+AbstractPlaylistEditorView.15=播放列表
+AbstractPlaylistEditorView.18=队列中的曲目
+AbstractPlaylistEditorView.19=重复的曲目
+AbstractPlaylistEditorView.20=计划的曲目
+AbstractPlaylistEditorView.22=已保存播放列表
+AbstractPlaylistEditorView.27=准备舞会
+AbstractPlaylistEditorView.29=正在播放的曲目
+AbstractPlaylistEditorView.30=搁置播放列表
+
+StatView.0=其它
+StatView.1=流派
+StatView.2=无可用的数据
+StatView.3=其它
+StatView.4=通过设备的大小(GB)
+StatView.5=无可用的数据
+StatView.7=由月的收集大小
+StatView.8=月
+StatView.9=大小(GB)
+StatView.10=无可用的数据
+StatView.12=由月的曲目总数
+StatView.13=月
+StatView.14=曲目编号
+StatView.15=无可用的数据
+StatView.16=统计数据
+StatView.24=更旧的
+
+CDScanView.0=CD标签: 
+CDScanView.1=CD标签.例如: CD1, ROCK...
+CDScanView.2=CD标签.例如: CD1, ROCK...
+CDScanView.3=CD位置: 
+CDScanView.4=能够找到CD的位置.例如:Unix下'/cdrom',MS Windows下'e:'...
+CDScanView.5=能够找到CD的位置.例如:Unix下'/cdrom',MS Windows下'e:'...
+CDScanView.6=扫描
+CDScanView.12=CD扫描器
+CDScanView.18=扫描CD并添加所有音乐文件到集中
+CDScanView.19=选择CD位置
+
+AbstractTreeView.0=折叠全部
+
+TracksTreeView.0=曲目树
+TracksTreeView.27=集
+TracksTreeView.31= 曲目
+TracksTreeView.33=创建报告
+TracksTreeView.34=在线获取标签
+TracksTreeView.35=发现日期
+TracksTreeView.36=不到一周
+TracksTreeView.37=不到一个月
+TracksTreeView.38=不到六个月
+TracksTreeView.39=更旧
+TracksTreeView.40=不到一年
+TracksTreeView.41=不到两年
+TracksTreeView.42=不到五年
+TracksTreeView.43=不到十年
+TracksTreeView.44=不到三个月
+
+CoverView.2=从磁盘删除此封面
+CoverView.3=封面
+CoverView.4=如果勾选自动封面选项,从磁盘和/或网络获取上一图像
+CoverView.5=如果勾选自动封面选项,从磁盘和/或网络获取下一图像
+CoverView.6=<html><p>使用原文件名保存封面</p><p>+CTRL:保存封面为...</p></html>
+CoverView.8=使用此封面作为此专辑的默认封面
+CoverView.10=保存封面为
+CoverView.11=已保存封面
+
+AnimationView.0=标题
+
+FilesTreeView.0=文件数
+FilesTreeView.3=复制
+FilesTreeView.4=剪切
+FilesTreeView.5=粘贴
+FilesTreeView.7=删除
+FilesTreeView.14=取消同步
+FilesTreeView.15=重新同步
+FilesTreeView.16=创建播放列表
+FilesTreeView.28=挂载
+FilesTreeView.29=卸载
+FilesTreeView.30=强制刷新
+FilesTreeView.31=同步
+FilesTreeView.32=测试
+FilesTreeView.40=复制
+FilesTreeView.41=剪切
+FilesTreeView.42=粘贴
+FilesTreeView.47=集
+FilesTreeView.52= 文件: 
+FilesTreeView.53= GB
+FilesTreeView.54= MB
+FilesTreeView.55=配置文件
+FilesTreeView.59=你想要进行快速或深度(重新读取标签)刷新吗?
+FilesTreeView.60=快速
+FilesTreeView.61=深度
+FilesTreeView.62=整理文件
+
+TracksTableView.0=曲目表
+TracksTableView.7=播放
+TracksTableView.8=强制
+TracksTableView.9=随机播放
+TracksTableView.10=重复播放
+TracksTableView.11=播放专辑
+TracksTableView.12=播放艺术及
+TracksTableView.14=属性
+TracksTableView.15=书签
+TracksTableView.16=强制下一个
+
+AbstractTableView.0=过滤:
+AbstractTableView.1=要过滤的属性
+AbstractTableView.3=过滤使用的值
+AbstractTableView.7=包含:
+AbstractTableView.8=任何
+AbstractTableView.10=(不可用)
+AbstractTableView.11=使表可编辑
+
+AboutView.7=关于
+AboutView.8=许可证
+AboutView.9=系统
+AboutView.10=关于
+AboutView.11=<html>版权所有2003-2012<br/>Jajuk team</html>"
+
+PhysicalPlaylistRepositoryView.2=保存为
+PhysicalPlaylistRepositoryView.9=播放队列
+
+FilesTableView.0=文件表
+FilesTableView.15=播放目录
+
+DeviceView.1=移除已卸载的设置(不会从磁盘中删除任何文件)
+DeviceView.2=已选的设备属性
+DeviceView.8=挂载
+DeviceView.9=卸载
+DeviceView.10=测试
+DeviceView.11=强制刷新
+DeviceView.12=刷新
+DeviceView.13=移除设备
+DeviceView.14=配置
+DeviceView.17=新
+DeviceView.18=添加设备
+DeviceView.21=此设备可用
+DeviceView.22=不能访问此设备
+DeviceView.23=设备
+
+JajukWindow.1=取消静音
+JajukWindow.2=静音
+JajukWindow.3=Jajuk
+JajukWindow.4=退出
+JajukWindow.5=关于Jajuk
+JajukWindow.6=随机播放
+JajukWindow.7=播放最佳
+JajukWindow.10=暂停
+JajukWindow.12=继续
+JajukWindow.13=上一个
+JajukWindow.14=下一个
+JajukWindow.15=播放新文件
+JajukWindow.16=完成专辑
+JajukWindow.17=Jajuk:高级点唱机
+JajukWindow.18=准备播放
+JajukWindow.19=<html>[F8]静音/取消静音<br/>使用鼠标滚轮设置音量</html>
+JajukWindow.21=退出
+JajukWindow.22=关于Jajuk
+JajukWindow.23=从集中随机播放曲目
+JajukWindow.24=从集中随机播放最受欢迎的曲目
+JajukWindow.26=[Ctrl-p]暂停/继续
+JajukWindow.27=[Ctrl-s]停止
+JajukWindow.31=从集中播放最新的曲目
+JajukWindow.32=完成播放当前专辑
+JajukWindow.36=当前环境音效:
+JajukWindow.37=没有设置环境音效
+JajukWindow.40=附加的标签配置
+JajukWindow.41=打开对话框配置激活的附加标签
+
+JajukDonate.1=捐助
+JajukDonate.2=Jajuk项目的基础设施需要资金,在我们的预算页面上了解更多.
+JajukDonate.3=预算
+JajukDonate.4=如果你想要支持Jajuk,请进行捐助.
+
+ActiveTagsWizard.1=可用的标签
+ActiveTagsWizard.2=已激活的标签
+ActiveTagsWizard.3=这会配置你想要Jajuk现实的附加标签.信息从音频文件被直接读取(例如从id3标签).如果你激活新的标签,深度刷新会完成.根据你集的大小,这可能需要几分钟.
+
+SimpleDeviceWizard.0=快速设备创建
+
+FirstTimeWizard.0=快速启动
+FirstTimeWizard.1=<html><p><br/>欢迎!此向导帮助你建立你的音乐集</p></html>
+FirstTimeWizard.2=<html>请选择你的音乐位置</html>
+FirstTimeWizard.5=Please choose a directory
+FirstTimeWizard.6=高级首选项
+FirstTimeWizard.7=设置Jajuk配置目录:
+FirstTimeWizard.8=已选择的目录: 
+FirstTimeWizard.9=无
+
+
+DownloadManager.0=<html>Jajuk需要你的HTTP代理服务器密码来获取封面.<br/>如果你不需要它们, 请在首选项视图中的封面选项卡中修改设置.<br/>如果你不使用代理服务器,请在首选项视图中的网络选项卡中修改设置.</html>
+
+PropertiesWizard.1=属性
+PropertiesWizard.2=值
+PropertiesWizard.4=链接
+PropertiesWizard.6=选择
+PropertiesWizard.8=成功更新属性
+PropertiesWizard.10=属性已设置
+PropertiesWizard.11=写入标签到:
+PropertiesWizard.12=链接到给出的元素属性详细信息
+PropertiesWizard.13=复制
+PropertiesWizard.14=复制值到系统剪贴板
+
+NewPropertyWizard.0=创建用户自定义属性
+NewPropertyWizard.3=(*)类型
+NewPropertyWizard.4=格式
+NewPropertyWizard.5=默认值
+
+CustomPropertyWizard.0=(*)项目
+CustomPropertyWizard.1=(*)自定义属性名称
+
+RemovePropertyWizard.0=移除自定义属性
+
+QualityFeedbackWizard.20=现在将在外部浏览器中打开一个新窗口来提交您的请求.你的最后一个匿名的痕迹已经被复制到剪贴板,如果这是一个错误报告,请将它粘贴在粘贴在说明区域(这将大大增加我们解决您问题的机会).
+
+IncRateAction.0=增加当前曲目的评级
+
+SplashScreen.0=初步检查
+SplashScreen.1=正在加载集
+SplashScreen.2=正在启动音乐引擎
+SplashScreen.3=正在启动图形用户界面
+
+CatalogView.0=专辑目录
+#Next line : Respect English size
+CatalogView.2=显示无封面的专辑
+CatalogView.3=刷新目录
+CatalogView.4=缩略图大小:
+CatalogView.5=创建的缩略图为:
+CatalogView.7=选择封面
+CatalogView.11=页:
+CatalogView.12=显示上一缩略图页
+CatalogView.13=显示下一缩略图页
+CatalogView.14=选择要显示的缩略图页
+CatalogView.15=缩略图大小:
+CatalogView.16=专辑
+CatalogView.17=/页
+CatalogView.18=封面选择
+CatalogView.19=重建缩略图
+CatalogView.20=显示详细信息
+CatalogView.21=显示全部专辑
+CatalogView.22=显示有封面的专辑
+
+WikipediaView.0=维基百科
+WikipediaView.1=选择语言:
+WikipediaView.3=没有找到结果
+WikipediaView.5=搜索艺术家名
+WikipediaView.6=搜索专辑名
+WikipediaView.7=搜索标题名
+WikipediaView.8=正在加载
+WikipediaView.9=从维基百科加载信息失败
+WikipediaView.10=无法搜索位置艺术家.
+
+TipOfTheDayView.0=每日提示
+TipOfTheDayView.1=你知道...吗?
+TipOfTheDayView.2=启动时显示吗?
+
+CDDBWizard.1=文件名
+CDDBWizard.2=当前曲目标题
+CDDBWizard.3=当前专辑标题
+CDDBWizard.4=建议的曲目标题
+CDDBWizard.5=Prop建议的专辑标题:
+CDDBWizard.12=没有找到匹配项!
+CDDBWizard.17=找到确切的匹配项!
+CDDBWizard.18=匹配
+CDDBWizard.19=在线获取标签
+
+RefactorWizard.0=已移动的文件: 
+
+DigitalDJWizard.0=选择新的DJ模式
+DigitalDJWizard.1=基于变调的程序(摇滚->流行)
+DigitalDJWizard.2=基于比例的程序(20%爵士乐,30%摇滚)
+DigitalDJWizard.3=基于的程序环境音效(轻柔,舞会...)
+DigitalDJWizard.4=数字DJ向导
+DigitalDJWizard.5=DJ常规配置
+DigitalDJWizard.6=DJ名称(*)
+DigitalDJWizard.8=明星的最小数:
+DigitalDJWizard.9=交叉淡入(秒):
+DigitalDJWizard.10=只播放过一次的曲目
+DigitalDJWizard.14=流派选择(允许多个选择)
+DigitalDJWizard.16=你想要...
+DigitalDJWizard.17=创建新的DJ?
+DigitalDJWizard.18=修改已存在的DJ?
+DigitalDJWizard.19=删除DJ?
+DigitalDJWizard.20=新的基于变调的DJ 
+#limited string size
+DigitalDJWizard.21=移除
+#limited string size
+DigitalDJWizard.22=起源
+#limited string size
+DigitalDJWizard.23=目标
+#limited string size
+DigitalDJWizard.24=Nb
+DigitalDJWizard.26=请选择至少一项变调
+#limited string size
+DigitalDJWizard.27=流派选择
+#limited string size
+DigitalDJWizard.28=%
+DigitalDJWizard.29=新的基于比例的DJ 
+DigitalDJWizard.30=请创建至少一个比例
+DigitalDJWizard.31=新的基于环境音效的DJ
+DigitalDJWizard.32=新的
+DigitalDJWizard.33=创建新的环境音效
+DigitalDJWizard.34=删除
+DigitalDJWizard.35=删除选择的环境音效
+DigitalDJWizard.36=环境音效名称
+DigitalDJWizard.37=名称
+DigitalDJWizard.38=请创建至少一个环境音效
+DigitalDJWizard.39=请填写环境音效名称并选择环境音效流派
+DigitalDJWizard.40=请选择DJ
+DigitalDJWizard.41=请提供DJ名称
+DigitalDJWizard.42=次名称的DJ已存在
+DigitalDJWizard.43=DJ修改
+DigitalDJWizard.44=选择要配置的DJ
+DigitalDJWizard.45=操作选择
+DigitalDJWizard.46=DJ类型选择
+DigitalDJWizard.47=请选择或创建一个环境音效
+DigitalDJWizard.48=常规属性
+DigitalDJWizard.49=请填写DJ常规属性
+DigitalDJWizard.50=请定义属性
+DigitalDJWizard.51=DJ移除
+DigitalDJWizard.52=请定义变调
+DigitalDJWizard.53=选择的曲目评级明星的最小数值(1:所有曲目)
+DigitalDJWizard.54=曲目间的交叉淡入
+DigitalDJWizard.55=如果勾选,选择每次只会包括一个曲目
+DigitalDJWizard.56=环境音效向导
+DigitalDJWizard.57=管理环境音效
+DigitalDJWizard.58=环境音效选择:
+DigitalDJWizard.59=所有属性的和应< 100 %
+DigitalDJWizard.60=已存在的环境音效名称
+DigitalDJWizard.61=移除DJ
+#limited string size
+DigitalDJWizard.62=默认
+DigitalDJWizard.63=添加默认环境音效
+DigitalDJWizard.64=任何
+DigitalDJWizard.66=默认环境音效选择(环境音效是一组流派,查看手册)
+DigitalDJWizard.67=排队曲目的限制值
+DigitalDJWizard.68=排队曲目的最大值
+
+PreparePartyWizard.1=准备舞会
+PreparePartyWizard.2=选择曲目的源
+PreparePartyWizard.3=首先定义你的舞会曲目
+PreparePartyWizard.4=选择限制
+PreparePartyWizard.5=请的源约束
+PreparePartyWizard.6=DJ
+PreparePartyWizard.7=环境音效
+PreparePartyWizard.8=播放列表
+PreparePartyWizard.9=随机曲目
+PreparePartyWizard.10=最大曲目
+PreparePartyWizard.11=最多包括多少曲目.
+PreparePartyWizard.12=最大大小(MB)
+PreparePartyWizard.13=你最多想要创建多少MB的数据.
+PreparePartyWizard.14=最大长度(分钟)
+PreparePartyWizard.15=产生的舞会最多应为多长.
+PreparePartyWizard.16=限制类型
+PreparePartyWizard.17=选择只使用一种音频文件.如果音频播放器只支持特定类型的媒体时,它是有用的.
+PreparePartyWizard.18=选择位置
+PreparePartyWizard.19=选择舞会用音乐储存的位置.为文件创建子目录. 
+PreparePartyWizard.20=请选择目标位置. 
+PreparePartyWizard.21=已选的目录: 
+PreparePartyWizard.22=请选择目标目录. 
+PreparePartyWizard.23=文件已复制
+PreparePartyWizard.24=最佳播放列表
+PreparePartyWizard.25=新播放列表
+PreparePartyWizard.26=正常化文件名
+PreparePartyWizard.27=正常化文件名来代替外语字符,使文件在操作系统之间和不同编码之间是便携的
+PreparePartyWizard.31=目标位置:
+PreparePartyWizard.32=排队的文件
+PreparePartyWizard.33=加书签的文件
+PreparePartyWizard.34=试图转换其它媒体类型
+PreparePartyWizard.35=使用外部工具'pacpl - Perl Audio Converter'转换音频如果需要
+PreparePartyWizard.36=无法转换文件到所选的媒体格式.
+PreparePartyWizard.37=<html>(需要PACPL,查看<a href="http://jajuk.info/index.php/Installing_Perl_Audio_Converter">Perl Audio Converter</a>)</html>
+PreparePartyWizard.38=配置转换设置
+PreparePartyWizard.39=<html>请定义启动Perl Audio Converter的命令.<br/>Linux中这通常仅仅是"pacpl"或"perl <install-location>/pacpl.<br/>Windows这通常是"perl <install-location>\pacpl</html>
+PreparePartyWizard.40=配置...
+
+Ambience.0=摇滚/流行
+Ambience.1=说唱
+Ambience.2=硬摇滚
+Ambience.3=高科技舞曲
+Ambience.4=电子
+Ambience.5=古典
+Ambience.6=轻柔
+Ambience.7=舞会
+Ambience.8=爵士
+Ambience.9=世界
+Ambience.10=其他
+Ambience.11=民歌/老歌
+Ambience.12=Inde
+Ambience.13=拉丁
+
+DebugLogAction.0=调试痕迹列表
+DebugLogAction.1=刷新
+DebugLogAction.2=复制到剪贴板
+
+CopyClipboardAction.0=复制地址到剪贴板
+
+LaunchInBrowserAction.0=在默认浏览器中打开弟子
+
+ReportAction.0=成功创建报告
+ReportAction.1=Jajuk音乐报告
+ReportAction.2=请考虑环境,在必要时进行打印
+ReportAction.3=专辑列表
+ReportAction.4=曲目每专辑
+ReportAction.5=专辑列表
+ReportAction.6=专辑每艺术家
+ReportAction.7=专辑列表
+ReportAction.8=专辑每流派
+ReportAction.9=艺术家/专辑每流派
+ReportAction.10=目录列表
+ReportAction.11=文件每目录
+ReportAction.12=文件名
+ReportAction.13=曲目名称
+ReportAction.14=设备列表
+ReportAction.15=D目录每设备
+ReportAction.16=目录/文件
+ReportAction.17=集
+ReportAction.18=艺术家/专辑/曲目每流派
+ReportAction.19=跳到:
+
+ActionMove.0=粘贴
+
+ActionRefresh.0=强制刷新
+
+RenameAction.0=重命名
+RenameAction.1=请输入此文件的新名称:
+RenameAction.2=请输入此目录的新名称:
+
+NewFolderAction.0=新文件夹
+NewFolderAction.1=请输入新文件夹的名称:
+NewFolderAction.2=相同名称的文件夹已存在.
+
+LyricsView.0=歌词
+LyricsView.1=无歌词,网络访问已禁用,使用配置菜单启用它.
+LyricsView.2=进入歌词编辑模式
+LyricsView.3=退出歌词编辑模式
+LyricsView.4=保存歌词
+LyricsView.5=删除歌词
+
+ActionDelete.0=文件已删除
+ActionDelete.1=目录已删除
+
+FindDuplicateTracksAction.0=未找到重复的曲目.
+FindDuplicateTracksAction.2=找到重复的曲目
+FindDuplicateTracksAction.3=找到的重复的曲目列表
+FindDuplicateTracksAction.4=选择所以重复的曲目
+
+RefreshDialog.1=刷新设备
+RefreshDialog.2=正在刷新的设备: 
+RefreshDialog.3=清理旧文件
+
+UpdateManager.0=新的Jajuk版本(
+UpdateManager.1=)已检测到,你可以从http://jajuk.info下载它
+UpdateManager.2=目前未找到可用的新版本
+
+SuggestionView.0=建议
+SuggestionView.1=喜好
+SuggestionView.2=最新
+SuggestionView.3=其它专辑
+SuggestionView.4=相似的艺术家
+SuggestionView.5=很少听
+SuggestionView.7=<html><b>无可显示的项目</b><br/><br/><i>显示Last.FM 信息只有当:<ul><li>曲目正在播放</li><li>正在播放的曲目艺术家已知(正确的标签)</li><li>首选项视图/Last.FM选项卡中的"启用Last.FM信息查询"选项已勾选</li><li>首选项视图/网络选项卡中的"禁用Jajuk的任何网络访问"选项未勾选</li><li>运行Jajuk的计算机已连接到网络</li></ul></i></html>
+
+AbstractThumbnail.0=打开LAST.FM页面
+
+AlbumsTableView.0=专辑列表
+AlbumsTableView.1=专辑数量
+
+AlarmClock.0=设置警告
+
+AlarmDialog.0=时间(HH24:MM:SS)
+AlarmDialog.1=时
+AlarmDialog.2=分
+AlarmDialog.3=秒
+AlarmDialog.4=警告行为
+AlarmDialog.5=下载警告行为
+
+ShowPropertiesAction.0=显示项目属性
+
+QueueView.1=删除队列
+QueueView.2=自动滚动列表到当前播放的曲目
+QueueView.3=在当前曲目结束时停止播放
+
+JajukSlimWindow.0=显示/隐藏Jajuk迷你工具栏
+
+JajukFullscreen.0=启用/禁用全屏播放器
+
+BanSelectionAction.0=禁止
+BanSelectionAction.1=禁止此项目,它将不会被选择
+
+UnBanSelectionAction.0=宽恕
+UnBanSelectionAction.1=宽恕项目,它们将会被重新提出
+
+OpenExplorerAction.0=使用文件管理器打开
+OpenExplorerAction.1=使用外部文件管理器程序打开目录
+
+Preference.0=<html>为当前曲目设置个人首选项<br/>最终评级计算会考虑它</html>
+Preference.1=垃圾
+Preference.2=差
+Preference.3=平均
+Preference.4=好
+Preference.5=优秀
+Preference.6=古典
+Preference.7=首选项...
+Preference.8=无首选项
+
+ArtistView.0=艺术家视图
+
+Notificator.NONE=无
+Notificator.TOAST=通知
+Notificator.BALLOON=气球
+Notificator.track_change.webradio_title=推出的网络电台 : 
+Notificator.track_change.track_title=推出的曲目: 
+
+SyncTreeTableAction.0=同步树和列表视图
+SyncTreeTableAction.1=<html>同步树和列表视图<br/>当在对树视图中使用时,在表视图中选择的一个项目将会扩大并在树中滚动.<br/>当在列表视图中使用时,在树视图中选择的一个项目将会相应地过滤表格.</html>
+
+ShowCurrentlyPlayingAction.0=在通知区域中显示当前正在播放的标题
+ShowCurrentlyPlayingAction.1=如果在配置中启用,此操作会显示独立于系统的通知窗口,它显示关于当前正在播放曲目的信息. 
+
+ExportRatingsAction.1=导出评级
+ExportRatingsAction.2=将所有曲目的评级写入到一个文件中,你可以导入到另一份具有相同文件的Jajuk安装中
+ExportRatingsAction.3=请选择你要导入评级的XML文件 
+
+ImportRatingsAction.1=导入评级
+ImportRatingsAction.2=读取从另一份Jajuk安装中导出的评级.所有匹配文件的评级会被更新.
+ImportRatingsAction.3=Please chose the XML file from where ratings should be imported
+
+WebRadioView.0=网络电台
+WebRadioView.1=网络电台
+WebRadioView.2=原始
+WebRadioView.8=新的网络电台
+WebRadioView.10=重置预设
+WebRadioView.11=从Jajuk网站重置网络电台预设(保留自定义关键词).
+
+TipOfTheDay.0=   小提示0:  你可以在快退键上使用[Shift+click]从开始位置重新播放当前曲目
+TipOfTheDay.1=   小提示1:  你可以在"播放上一个"按钮上使用从首个曲目重新播放当前专辑
+TipOfTheDay.2=   小提示2:  你可以在播放列表编辑器中使用?按钮随机添加曲目到播放列表
+TipOfTheDay.3=   小提示3:  你可以使用首选项视图中的网络选项卡在使用代理服务器的情况下在线获取封面
+TipOfTheDay.4=   小提示4:  Jajuk可以通过迷你工具栏(菜单右上侧的按钮)来控制播放,只占用很少的桌面空间
+TipOfTheDay.5=   小提示5:  你可以通过选择"只显示可用曲目"选项隐藏不可用的曲目
+TipOfTheDay.6=   小提示6:  你可以使用键盘操作几乎任何Jajuk功能
+TipOfTheDay.7=   小提示7:  你可以从树视图中拖放文件到播放列表编辑器和播放列表库 
+TipOfTheDay.8=   小提示8:  你可以使用介绍模式听曲目介绍
+TipOfTheDay.9=   小提示9:  你可以在首选项视图中配置交叉淡入时间
+TipOfTheDay.10=   小提示10:  通过在工具菜单中可用的警告特性可以把Jajuk作为高级闹钟使用  
+TipOfTheDay.11=   小提示11:  你可以只是用托盘控制Jajuk的主要功能(Linux & Windows)  
+TipOfTheDay.12=   小提示12:  在首选项视图中的GUI选项卡中配置Jajuk主题
+TipOfTheDay.13=   小提示13:  你可以在首选项视图中的选项选项卡中配置双击和拖放动作(推和播放)
+TipOfTheDay.14=   小提示14:  Jajuk"计划的"曲目是在当前曲目选择后播放的曲目
+TipOfTheDay.15=   小提示15:  Jajuk图形界面是完全可停靠的,你可以拖放试图来重新组织它们
+TipOfTheDay.16=   小提示16:  你可以通过在文件或曲目树视图中选择"集"节点获取文件和曲目的总数
+TipOfTheDay.17=   小提示17:  你可以通过文件或曲目树视图中的"在线获取标签"功能在线获取标签
+TipOfTheDay.18=   小提示18:  Jajuk历史栏(窗口的中上部)显示所有之前播放的曲目
+TipOfTheDay.19=   小提示19:  你可以使用搜索框(窗口底部)进行快速搜索
+TipOfTheDay.20=   小提示20:  你可以使用品质代理报告错误或特性请求(帮助,报告错误)  
+TipOfTheDay.21=   小提示21:  Jajuk DJ可以按照你的规则创建智慧播放列表
+TipOfTheDay.22=   小提示22:  你可以使用"歌词视图"获取曲目歌词
+TipOfTheDay.23=   小提示23:  建议视图显示LAST.FM信息例如相似艺术家
+TipOfTheDay.24=   小提示24:  你可以在迷你工具栏或控制面板中禁用你不喜欢的曲目
+TipOfTheDay.25=   小提示25:  你可以在"配置"工具栏中一键显示/隐藏未挂载的曲目
+TipOfTheDay.26=   小提示26:  你可以现在选择Jajuk数据目录(例如外部磁盘)来在任何电脑上保存你的数据和首选项(查看首选项视图中的"高级"选项卡)  
+TipOfTheDay.27=   小提示27:  你可以使用"视图"工具栏添加任何透视的视图
+TipOfTheDay.28=   小提示28:  你可以使用"在默认浏览器中打开地址"图标在你的默认浏览器中打开维基百科页面<a href="../images/3/30/Launch_16x16.png" title="Image:launch_16x16.png" class="internal"> <img src='../images/3/30/Launch_16x16.png' alt="Image:launch_16x16.png"/> </a>   
+TipOfTheDay.29=   小提示29:  Jajuk支持网络电台<a href="../images/9/9d/Webradio_32x32.png" title="Image:webradio_32x32.png" class="internal"> <img src='../images/9/9d/Webradio_32x32.png' alt="Image:webradio_32x32.png"/> </a>   
+TipOfTheDay.30=   小提示30:  如果在当前平台上可用,可以通过D-Bus远程控制Jajuk(例如不通过Windows).这允许使用键盘上的多媒体键控制Jajuk.查看在线手册获取更多信息.    
+TipOfTheDay.31=   小提示31:  在首选项视图/声音选项卡中尝试音频正常化来在曲目中保持声音级别相等
+TipOfTheDay.32=   小提示32:  你可以使用准备舞会特性从你的集中导出曲目并生成播放列表
+TipOfTheDay.33=   小提示33:  封面视图中在封面图片上的左键单击从3D切换到2D显示.
+
+]]></body>
+
diff --git a/src/main/resources/perspectives/FilesPerspective.xml b/src/main/resources/perspectives/FilesPerspective.xml
index 9f97090..ecf94d2 100644
--- a/src/main/resources/perspectives/FilesPerspective.xml
+++ b/src/main/resources/perspectives/FilesPerspective.xml
@@ -11,12 +11,22 @@
 						<Key dockName="org.jajuk.ui.views.FilesTableView/0" />
 					</Dockable>
 					<Split orientation="1" location="0.55">
-						<Dockable>
-							<Key dockName="org.jajuk.ui.views.QueueView/0" />
-						</Dockable>
-						<Dockable>
-							<Key dockName="org.jajuk.ui.views.CoverView/0" />
-						</Dockable>
+						<TabbedDockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.QueueView/0" />
+							</Dockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.WebRadioView/1222744456" />
+							</Dockable>
+						</TabbedDockable>
+						<TabbedDockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.CoverView/0" />
+							</Dockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.LyricsView/867116" />
+							</Dockable>
+						</TabbedDockable>
 					</Split>
 				</Split>
 			</Split>
diff --git a/src/main/resources/perspectives/PlaylistsPerspective.xml b/src/main/resources/perspectives/PlaylistsPerspective.xml
index c96c574..1b76b18 100644
--- a/src/main/resources/perspectives/PlaylistsPerspective.xml
+++ b/src/main/resources/perspectives/PlaylistsPerspective.xml
@@ -2,10 +2,15 @@
 <VLDocking version="2.1">
 	<DockingDesktop name="">
 		<DockingPanel>
-			<Split orientation="1" location="0.30">
-				<Dockable>
-					<Key dockName="org.jajuk.ui.views.FilesTreeView/1" />
-				</Dockable>
+			<Split orientation="1" location="0.40">
+				<Split orientation="0" location="0.60">
+					<Dockable>
+						<Key dockName="org.jajuk.ui.views.FilesTreeView/1" />
+					</Dockable>
+					<Dockable>
+						<Key dockName="org.jajuk.ui.views.QueueView/0" />
+					</Dockable>
+				</Split>
 				<Dockable>
 					<Key dockName="org.jajuk.ui.views.PlaylistView/0" />
 				</Dockable>
diff --git a/src/main/resources/perspectives/TracksPerspective.xml b/src/main/resources/perspectives/TracksPerspective.xml
index 1948e14..c9de2e0 100644
--- a/src/main/resources/perspectives/TracksPerspective.xml
+++ b/src/main/resources/perspectives/TracksPerspective.xml
@@ -10,12 +10,22 @@
 					<Key dockName="org.jajuk.ui.views.TracksTableView/1" dockLabel="key1" />
 				</Dockable>
 				<Split orientation="1" location="0.55">
-					<Dockable>
-						<Key dockName="org.jajuk.ui.views.QueueView/1" dockLabel="key2" />
-					</Dockable>
-					<Dockable>
-						<Key dockName="org.jajuk.ui.views.CoverView/1" dockLabel="key4" />
-					</Dockable>
+					<TabbedDockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.QueueView/0" />
+							</Dockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.WebRadioView/1222744456" />
+							</Dockable>
+						</TabbedDockable>
+						<TabbedDockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.CoverView/0" />
+							</Dockable>
+							<Dockable>
+								<Key dockName="org.jajuk.ui.views.LyricsView/867116" />
+							</Dockable>
+						</TabbedDockable>
 				</Split>
 			</Split>
 		</Split>
diff --git a/src/packaging/IzPack/installDirectory.unix.txt b/src/packaging/IzPack/installDirectory.unix.txt
deleted file mode 100644
index bfbcfdb..0000000
--- a/src/packaging/IzPack/installDirectory.unix.txt
+++ /dev/null
@@ -1 +0,0 @@
-/usr/share/jajuk
\ No newline at end of file
diff --git a/src/packaging/IzPack/jajuk.izpack b/src/packaging/IzPack/jajuk.izpack
deleted file mode 100644
index 3e0b5a1..0000000
--- a/src/packaging/IzPack/jajuk.izpack
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<installation version='1.0'>
-	<info>
-		<appname>Jajuk</appname>
-		<appversion>VERSION_REPLACED_BY_ANT</appversion>
-		<javaversion>1.6</javaversion>
-		<url>http://jajuk.info</url>
-	</info>
-	<guiprefs height='600' resizable='yes' width='800'>
-		<laf name='substance'>
-			<os family='unix' />
-			<os family='windows' />
-			<os family='mac' />
-		</laf>
-	</guiprefs>
-
-	<!-- See ISO3 country codes in /prog/IzPack/bin/langpacks/installer -->
-	<locale>
-		<langpack iso3='eng' />
-		<langpack iso3='cat' />
-		<langpack iso3='chn' />
-		<langpack iso3='deu' />
-		<langpack iso3='ell' />
-		<langpack iso3='fra' />
-		<langpack iso3='hun' />
-		<langpack iso3='ita' />
-		<langpack iso3='jpn' />
-		<langpack iso3='ned' />
-		<langpack iso3='pol' />
-		<langpack iso3='por' />
-		<langpack iso3='rus' />
-		<langpack iso3='spa' />
-		<langpack iso3='swe' />
-		<langpack iso3='glg' />
-		<langpack iso3='cze' />
-	</locale>
-	<native name='ShellLink.dll' type='izpack' />
-	<resources>
-		<res id='LicencePanel.licence' src='legals/LICENSE-GPL.txt' />
-		<res id='shortcutSpec.xml' src='/tmp/jajuk-dist/java/shortcutSpec.xml' />
-		<res id='installer.langsel.img' src='main/resources/images/jajuk-installer.jpg' />
-		<res id='ImgPacksPanel.img.0' src='main/resources/images/core.png' />
-		<res id='ImgPacksPanel.img.1' src='main/resources/images/src.png' />
-		<res id='TargetPanel.dir.unix' src='/tmp/jajuk-dist/java/installDirectory.unix.txt' />
-	</resources>
-	<panels>
-		<panel classname='LicencePanel' />
-		<panel classname='TargetPanel' />
-		<panel classname='InstallPanel' />
-		<panel classname='ShortcutPanel' />
-		<panel classname='SimpleFinishPanel' />
-	</panels>
-	<packs>
-		<pack name='main pack' required='yes'>
-			<description>Main pack</description>
-
-			<!-- Files to include in every platform -->
-			<file override='true' targetdir='$INSTALL_PATH/bin'
-				src='/tmp/jajuk-dist/jajuk/bin/jajuk.jar'>
-			</file>
-			<fileset override='true' targetdir='$INSTALL_PATH/dist-files'
-				dir='/tmp/jajuk-dist/jajuk/dist-files' />
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/jajuk/jajuk-icon-shortcut_64x64.png' />
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/jajuk/LICENSE-GPL.txt' />
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/jajuk/DERIVATED.txt' />
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/jajuk/README.html' />
-
-			<!-- Windows specific -->
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/windows/jajuk.exe'>
-				<os family='windows' />
-			</file>
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/mplayer/windows/mplayer.exe'>
-				<os family='windows' />
-			</file>
-			<dir override='true' targetdir='$INSTALL_PATH/lib'
-				src='/tmp/jajuk-dist/jajuk/lib/windows'>
-				<os family='windows' />
-			</dir>
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/jajuk/dist-files/images/jajuk-icon.ico'>
-				<os family='windows' />
-			</file>
-			<fileset override='true' targetdir='$INSTALL_PATH/lib'
-				dir='/tmp/jajuk-dist/jajuk/lib'>
-				<os family='windows' />
-				<exclude name="lib*" />
-			</fileset>
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/jajuk/dist-files/images/jajuk-uninstall.ico'>
-				<os family='windows' />
-			</file>
-			<file override='true' targetdir='$INSTALL_PATH/bin'
-				src='/tmp/jajuk-dist/jajuk/lib/JIntellitype.dll'>
-				<os family='windows' />
-			</file>
-			<file override='true' targetdir='$INSTALL_PATH'
-				src='/tmp/jajuk-dist/jajuk/dist-files/images/jajuk-uninstall.png'>
-				<os family='windows' />
-			</file>
-
-			<!--Unix specific -->
-			<file override='true' targetdir='$INSTALL_PATH' src='/tmp/jajuk-dist/jajuk/jajuk'>
-				<os family='unix' />
-			</file>
-			<executable targetfile="$INSTALL_PATH/jajuk" stage="never">
-				<os family='unix' />
-			</executable>
-			<fileset override='true' targetdir='$INSTALL_PATH/lib'
-				dir='/tmp/jajuk-dist/jajuk/lib'>
-				<os family='unix' />
-				<exclude name="**/*.dll" />
-			</fileset>
-
-			<!--OSX specific -->
-			<!-- We don't include the mplayer binary here to save space. The binary 
-				will be embedded into the .app only -->
-			<executable targetfile="$INSTALL_PATH/jajuk" stage="never">
-				<os family='mac' />
-			</executable>
-		</pack>
-	</packs>
-</installation>
\ No newline at end of file
diff --git a/src/packaging/IzPack/shortcutSpec.xml b/src/packaging/IzPack/shortcutSpec.xml
deleted file mode 100644
index 6d3cdb4..0000000
--- a/src/packaging/IzPack/shortcutSpec.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<shortcuts>
-	<programGroup defaultName='Jajuk' location='applications' />
-	<skipIfNotSupported />
-	<!-- Unix -->
-	<shortcut name='Jajuk' programGroup='yes' desktop='yes'
-		terminal='false' startup='no' target='sh' type='Application'
-		encoding='UTF-8' commandLine="jajuk"
-		workingDirectory='$INSTALL_PATH' description='Jajuk advanced JukeBox'
-		iconFile='$INSTALL_PATH/jajuk-icon-shortcut_64x64.png'
-		initialState='normal' os='unix'>
-		<createForPack name='main pack' />
-	</shortcut>
-
-	<shortcut name='Uninstall' programGroup='yes' desktop='no'
-		applications='no' startMenu='no' startup='no' type='Application'
-		encoding='UTF-8' 
-		target="java" commandLine="-jar $INSTALL_PATH/Uninstaller/uninstaller.jar"
-		workingDirectory='' description='Uninstall Jajuk' 
-		iconFile='$INSTALL_PATH/jajuk-uninstall.png' initialState='normal' os='unix'>
-		<createForPack name='main pack' />
-	</shortcut>
-
-	<!-- Windows -->
-	<shortcut name='Jajuk' programGroup='yes' desktop='yes'
-		applications='no' startMenu='no' startup='no' target='$INSTALL_PATH/jajuk.exe'
-		commandLine='' workingDirectory='' description='Jajuk advanced JukeBox'
-		iconIndex='0' iconFile='$INSTALL_PATH/jajuk-icon.ico' initialState='noShow'
-		os='windows'>
-		<createForPack name='main pack' />
-	</shortcut>
-	
-	<shortcut name='Uninstall' programGroup='yes' desktop='no'
-		applications='no' startMenu='no' startup='no' 
-		target="$INSTALL_PATH\Uninstaller\uninstaller.jar"
-          commandLine=""
-          workingDirectory="$INSTALL_PATH\Uninstaller"
-        	description='Uninstall Jajuk'
-		iconIndex='0' iconFile='$INSTALL_PATH/jajuk-uninstall.ico'
-		initialState='noShow' os='windows'>
-		<createForPack name='main pack' />
-	</shortcut>
-</shortcuts>
diff --git a/src/packaging/MANIFEST.MF b/src/packaging/MANIFEST.MF
index 0bedd32..43d60bf 100644
--- a/src/packaging/MANIFEST.MF
+++ b/src/packaging/MANIFEST.MF
@@ -1,5 +1,5 @@
 Manifest-Version: 2.0
 Main-Class: org.jajuk.Main
 Created-By: Jajuk team
-Class-Path: ../lib/guava-11.0.1.jar ../lib/filters-2.0.235.jar ../lib/jfreechart-1.0.13.jar ../lib/jcommon-1.0.0.jar ../lib/jlayer-1.0.jar ../lib/substance-5.3.jar ../lib/log4j_reduced-1.2.6.jar ../lib/basicplayer-3.0.jar ../lib/entagged-audioformats-0.15.jar ../lib/jogg-0.0.7.jar ../lib/jorbis-0.0.13.jar ../lib/jspeex-0.9.3.jar ../lib/mp3spi-1.9.4.jar ../lib/tritonus_share-release.jar ../lib/vorbisspi-1.0.1.jar ../lib/animation-1.2.0.jar ../lib/commons-logging-1.0.jar ../lib/looks-2.0.4 [...]
+Class-Path: ../lib/guava-11.0.1.jar ../lib/filters-2.0.235.jar ../lib/jfreechart-1.0.13.jar ../lib/jcommon-1.0.0.jar ../lib/jlayer-1.0.jar ../lib/substance-7.3.jar ../lib/trident-7.3.jar ../lib/laf-plugin-7.3.jar ../lib/laf-widget-7.3.jar ../lib/log4j_reduced-1.2.6.jar ../lib/basicplayer-3.0.jar ../lib/entagged-audioformats-0.15.jar ../lib/jogg-0.0.7.jar ../lib/jorbis-0.0.13.jar ../lib/jspeex-0.9.3.jar ../lib/mp3spi-1.9.5.jar ../lib/tritonus_share-release.jar ../lib/vorbisspi-1.0.1.jar . [...]
 Specification-Title: Jajuk
diff --git a/src/packaging/NSIS/jajuk.nsis b/src/packaging/NSIS/jajuk.nsis
new file mode 100644
index 0000000..25a683a
--- /dev/null
+++ b/src/packaging/NSIS/jajuk.nsis
@@ -0,0 +1,269 @@
+# ===================================================================
+# This NSIS Script has been generated by SFX Tool
+# Version 1.01
+# Written by MuldeR (MuldeR2 at GMX.de)
+# Visit http://mulder.at.gg for further information!
+# ===================================================================
+
+
+# -------------------------------------------------------------------
+# Set Working Directory
+# -------------------------------------------------------------------
+
+!cd "/data/build_tools/NSIS-SFX/Resources"
+!verbose 2
+
+# -------------------------------------------------------------------
+# Choosing Compressor
+# -------------------------------------------------------------------
+
+SetCompressor LZMA
+SetCompressorDictSize 32
+SetCompress Auto
+SetDatablockOptimize On
+
+# -------------------------------------------------------------------
+# Definitions
+# -------------------------------------------------------------------
+
+!define AppID "{23131D94-868A-4F2D-935A-6E89A7F19D00}"; a unique ID (It's real GUID)
+!define Title "Jajuk"; the installer title
+!define InstallDir "$PROGRAMFILES\Jajuk"; the *default* destination directory
+!define OutFile "/tmp/jajuk-dist/windows/jajuk-VERSION_REPLACED_BY_ANT-setup.exe"; the file to save the installer EXE to
+!define IconFile "Modern-Default"; the installer icon
+!define HeaderImage "NSIS"; the header image
+!define WizardImage "Win"; the wizard image
+
+
+# -------------------------------------------------------------------
+# Reserve Files
+# -------------------------------------------------------------------
+
+ReserveFile "Plugins\InstallOptions.dll"
+ReserveFile "Plugins\LangDLL.dll"
+ReserveFile "Plugins\StartMenu.dll"
+ReserveFile "Plugins\UserInfo.dll"
+ReserveFile "Contrib\Graphics\Icons\orange-install.ico"
+ReserveFile "Contrib\Graphics\Icons\orange-uninstall.ico"
+ReserveFile "Contrib\Graphics\Header\orange-r.bmp"
+ReserveFile "Contrib\Graphics\Wizard\orange.bmp"
+ReserveFile "Contrib\Modern UI\ioSpecial.ini"
+
+
+# -------------------------------------------------------------------
+# General Settings
+# -------------------------------------------------------------------
+
+XPStyle On
+CRCCheck Force
+ShowInstDetails Show
+ShowUninstDetails Show
+Name "${Title}"
+OutFile "${OutFile}"
+InstallDir "${InstallDir}"
+InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "InstallDirectory"
+
+
+# -------------------------------------------------------------------
+# Modern Interface Settings
+# -------------------------------------------------------------------
+
+!include "MUI.nsh"
+
+; MUI Settings / Icons
+!define MUI_ICON "Contrib\Graphics\Icons\orange-install.ico"
+!define MUI_UNICON "Jajuk\jajuk-icon.ico"
+; MUI Settings / Header
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_RIGHT
+!define MUI_HEADERIMAGE_BITMAP "Contrib\Graphics\Header\orange-r.bmp"
+!define MUI_HEADERIMAGE_UNBITMAP "Contrib\Graphics\Header\orange-uninstall-r.bmp"
+ 
+; MUI Settings / Wizard
+!define MUI_WELCOMEFINISHPAGE_BITMAP "Contrib\Graphics\Wizard\orange.bmp"
+!define MUI_UNWELCOMEFINISHPAGE_BITMAP "Contrib\Graphics\Wizard\orange-uninstall.bmp"
+!define MUI_HEADERIMAGE_BITMAP_RTL "Contrib\Graphics\Header\orange-uninstall-r.bmp"
+
+!define MUI_ABORTWARNING
+!define MUI_WELCOMEPAGE_TITLE_3LINES
+!define MUI_FINISHPAGE_TITLE_3LINES
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
+!define MUI_LANGDLL_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallLanguage"
+!define MUI_LANGDLL_ALWAYSSHOW
+!define MUI_FINISHPAGE_RUN "$INSTDIR\jajuk.exe"
+!define MUI_FINISHPAGE_RUN_PARAMETERS ""
+!define MUI_FINISHPAGE_LINK "Release notes"
+!define MUI_FINISHPAGE_LINK_LOCATION "http://www.jajuk.info/release_notes_1.10.html"
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}"
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "StartmenuFolder"
+!define MUI_LICENSEPAGE_RADIOBUTTONS
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE
+!define MUI_UNABORTWARNING
+
+!insertmacro MUI_PAGE_LICENSE "/tmp/jajuk-dist/jajuk/LICENSE-GPL.txt"
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+
+!include "x64.nsh"
+
+
+# -------------------------------------------------------------------
+# Multi-Language Support
+# -------------------------------------------------------------------
+
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "French"
+!insertmacro MUI_LANGUAGE "German"
+!insertmacro MUI_LANGUAGE "Spanish"
+!insertmacro MUI_LANGUAGE "SimpChinese"
+!insertmacro MUI_LANGUAGE "Korean"
+!insertmacro MUI_LANGUAGE "Italian"
+!insertmacro MUI_LANGUAGE "Dutch"
+!insertmacro MUI_LANGUAGE "Greek"
+!insertmacro MUI_LANGUAGE "Russian"
+!insertmacro MUI_LANGUAGE "Portuguese"
+!insertmacro MUI_LANGUAGE "Czech"
+!insertmacro MUI_LANGUAGE "Catalan"
+
+
+# -------------------------------------------------------------------
+# Install Files Section
+# -------------------------------------------------------------------
+
+Section
+  SetOutPath "$INSTDIR"
+  File /r "/tmp/jajuk-dist/jajuk/bin"
+  File /r "/tmp/jajuk-dist/jajuk/DERIVATED.txt"
+  File /r "/tmp/jajuk-dist/jajuk/dist-files"
+  File /r "/tmp/jajuk-dist/windows/jajuk.exe"
+  File /r "/tmp/jajuk-dist/jajuk/jajuk-icon.ico"
+  File /r "/tmp/jajuk-dist/jajuk/jajuk-icon-shortcut_64x64.png"
+  File /r "/tmp/jajuk-dist/jajuk/jajuk-uninstall.ico"
+  File /r "/tmp/jajuk-dist/jajuk/jajuk-uninstall.png"
+  File /r "/tmp/jajuk-dist/jajuk/lib"
+  File /r "/tmp/jajuk-dist/jajuk/LICENSE-GPL.txt"
+  File /r "/tmp/mplayer/windows/mplayer.exe"
+  File /r "/tmp/jajuk-dist/jajuk/README.html"
+  ${If} ${RunningX64}
+    Rename "$INSTDIR\lib\lib64\JIntellitype.dll" "$INSTDIR\bin\JIntellitype.dll"
+  ${else}
+    Rename "$INSTDIR\lib\lib32\JIntellitype.dll" "$INSTDIR\bin\JIntellitype.dll"
+  ${EndIf}
+   
+SectionEnd
+
+
+# -------------------------------------------------------------------
+# Create Uninstaller Section
+# -------------------------------------------------------------------
+
+Section
+  SetOutPath "$INSTDIR"
+  WriteUninstaller "$INSTDIR\Uninstall.exe"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "DisplayName" "${Title}"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "DisplayIcon" "$\"$INSTDIR\Uninstall.exe$\""
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\""
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "NoModify" 1
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "NoRepair" 1
+SectionEnd
+
+# -------------------------------------------------------------------
+# Desktop Section
+# -------------------------------------------------------------------
+
+Section
+  SetShellVarContext all
+  CreateShortCut "$DESKTOP\Jajuk.lnk" "$INSTDIR\jajuk.exe"
+  CreateShortCut "$SMPROGRAMS\Jajuk.lnk" "$INSTDIR\jajuk.exe"
+  SetShellVarContext current
+SectionEnd
+
+
+# -------------------------------------------------------------------
+# Registry Section
+# -------------------------------------------------------------------
+
+Section
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "" "${Title}"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}" "InstallDirectory" "$INSTDIR"
+SectionEnd
+
+
+# -------------------------------------------------------------------
+# Initialization Functions
+# -------------------------------------------------------------------
+
+Function .onInit
+  InitPluginsDir
+
+  ClearErrors
+  UserInfo::GetName
+  IfErrors RunTheInstaller
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+
+  StrCmp $1 "Admin" RunTheInstaller
+  StrCmp $1 "Power" RunTheInstaller
+  MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "The user $\"$0$\" is not allowed to install this application.$\nPlease ask your administrator's permission !!!"
+  Quit
+
+  RunTheInstaller:
+  !insertmacro MUI_LANGDLL_DISPLAY
+FunctionEnd
+
+
+
+# -------------------------------------------------------------------
+# Uninstaller Section
+# -------------------------------------------------------------------
+
+Section "Uninstall"
+  RMDir /r "$INSTDIR"
+
+  !insertmacro MUI_STARTMENU_GETFOLDER Application $R0
+  SetShellVarContext all
+  RMDir /r "$SMPROGRAMS\$R0"
+  SetShellVarContext current
+
+  SetShellVarContext all
+  Delete "$DESKTOP\Jajuk.lnk"
+  Delete "$SMPROGRAMS\Jajuk.lnk"
+  SetShellVarContext current
+
+  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AppID}"
+SectionEnd
+
+
+# -------------------------------------------------------------------
+# Uninstaller Initialization Function
+# -------------------------------------------------------------------
+
+Function un.onInit
+  InitPluginsDir
+
+  ClearErrors
+  UserInfo::GetName
+  IfErrors RunTheUninstaller
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+
+  StrCmp $1 "Admin" RunTheUninstaller
+  StrCmp $1 "Power" RunTheUninstaller
+  MessageBox MB_OK|MB_ICONSTOP|MB_TOPMOST "The user $\"$0$\" is not allowed to uninstall this application.$\nPlease ask your administrator's permission !!!"
+  Quit
+
+  RunTheUninstaller:
+  !insertmacro MUI_LANGDLL_DISPLAY
+FunctionEnd
+
+
diff --git a/src/packaging/RPMS/jajuk.spec b/src/packaging/RPMS/jajuk.spec
index 508ab6f..a28e4ec 100644
--- a/src/packaging/RPMS/jajuk.spec
+++ b/src/packaging/RPMS/jajuk.spec
@@ -38,3 +38,4 @@ Jajuk main principles are :
 
 %postun
    
+%define _binaries_in_noarch_packages_terminate_build   0
diff --git a/src/packaging/jnlp/animation.jnlp b/src/packaging/jnlp/animation.jnlp
deleted file mode 100644
index 9e0fba7..0000000
--- a/src/packaging/jnlp/animation.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="animation.jnlp">
-    <information>
-        <title>Animation</title>
-        <vendor>JGoodies</vendor>
-    </information>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <resources>
-        <jar href="animation-1.2.0.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/apache_commons.jnlp b/src/packaging/jnlp/apache_commons.jnlp
deleted file mode 100644
index 597e5b3..0000000
--- a/src/packaging/jnlp/apache_commons.jnlp
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="apache_commons.jnlp">
-    <information>
-        <title>Apache Commons libs</title>
-        <vendor>Apache Fondation</vendor>
-    </information>
-    <resources>
-        <jar href="commons-codec-1.3.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <resources>
-        <jar href="commons-collections-3.2.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <resources>
-        <jar href="commons-logging-1.0.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <resources>
-        <jar href="commons-lang-2.4.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <resources>
-        <jar href="commons-io-1.4.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-     <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/basic_player.jnlp b/src/packaging/jnlp/basic_player.jnlp
deleted file mode 100644
index 717b38b..0000000
--- a/src/packaging/jnlp/basic_player.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="basic_player.jnlp">
-    <information>
-        <title>BasicPlayer</title>
-        <vendor>Javazoom</vendor>
-    </information>
-    <resources>
-        <jar href="basicplayer-3.0.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/bindings.jnlp b/src/packaging/jnlp/bindings.jnlp
deleted file mode 100644
index f17ce22..0000000
--- a/src/packaging/jnlp/bindings.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="bindings.jnlp">
-    <information>
-        <title>Bindings</title>
-        <vendor>Bindings</vendor>
-    </information>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <resources>
-        <jar href="last.fm-bindings-7.3.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/cobra.jnlp b/src/packaging/jnlp/cobra.jnlp
deleted file mode 100644
index 994e1d1..0000000
--- a/src/packaging/jnlp/cobra.jnlp
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="cobra.jnlp">
-    <information>
-        <title>Cobra WebBrowser</title>
-        <vendor>Cobra Team</vendor>
-    </information>
-    <resources>
-        <jar href="cobra-0.98.4.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="js-0.98.4.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/dbus.jnlp b/src/packaging/jnlp/dbus.jnlp
deleted file mode 100644
index ca7b5e9..0000000
--- a/src/packaging/jnlp/dbus.jnlp
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="animation.jnlp">
-    <information>
-        <title>D-Bus for Java</title>
-        <vendor>Matthew Johnson - dbus at matthew.ath.cx</vendor>
-    </information>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <resources>
-        <jar href="libdbus-java-2.6.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="unix-0.5.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="hexdump-0.2.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/entagged_freedb.jnlp b/src/packaging/jnlp/entagged_freedb.jnlp
deleted file mode 100644
index 8a7f026..0000000
--- a/src/packaging/jnlp/entagged_freedb.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="animation.jnlp">
-    <information>
-        <title>EntaggedFreedb</title>
-        <vendor>Entagged team</vendor>
-    </information>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <resources>
-        <jar href="entagged-freedb-0.04.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/guava.jnlp b/src/packaging/jnlp/guava.jnlp
deleted file mode 100644
index 6726fc0..0000000
--- a/src/packaging/jnlp/guava.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="log4j.jnlp">
-    <information>
-        <title>Guava</title>
-        <vendor>Google</vendor>
-    </information>
-    <resources>
-        <jar href="guava-11.0.1.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/jajuk-icon_64x64.gif b/src/packaging/jnlp/jajuk-icon_64x64.gif
deleted file mode 100644
index c90672a..0000000
Binary files a/src/packaging/jnlp/jajuk-icon_64x64.gif and /dev/null differ
diff --git a/src/packaging/jnlp/jfreechart.jnlp b/src/packaging/jnlp/jfreechart.jnlp
deleted file mode 100644
index 65e0324..0000000
--- a/src/packaging/jnlp/jfreechart.jnlp
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="jfreechart.jnlp">
-    <information>
-        <title>JFreechart and JCommon</title>
-        <vendor>Object Refinery Limited</vendor>
-    </information>
-    <resources>
-        <jar href="jcommon-1.0.0.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <resources>
-        <jar href="jfreechart-1.0.13.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/jintellitype.jnlp b/src/packaging/jnlp/jintellitype.jnlp
deleted file mode 100644
index 0afab8f..0000000
--- a/src/packaging/jnlp/jintellitype.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="jintellitype.jnlp">
-    <information>
-        <title>Jintellitype</title>
-        <vendor>melloware.com</vendor>
-    </information>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <resources>
-        <jar href="jintellitype-1.3.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/jlayer.jnlp b/src/packaging/jnlp/jlayer.jnlp
deleted file mode 100644
index c7d9f4b..0000000
--- a/src/packaging/jnlp/jlayer.jnlp
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="jlayer.jnlp">
-    <information>
-        <title>Jlayer</title>
-        <vendor>Javazoom</vendor>
-    </information>
-    <resources>
-        <jar href="jlayer-1.0.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="jspeex-0.9.3.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="mp3spi-1.9.4.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="tritonus_share-release.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="vorbisspi-1.0.1.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="jorbis-0.0.13.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-        <jar href="jogg-0.0.7.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/jnlp-servlet.jar b/src/packaging/jnlp/jnlp-servlet.jar
deleted file mode 100644
index 96e4b43..0000000
Binary files a/src/packaging/jnlp/jnlp-servlet.jar and /dev/null differ
diff --git a/src/packaging/jnlp/launch.jnlp b/src/packaging/jnlp/launch.jnlp
deleted file mode 100644
index 7997615..0000000
--- a/src/packaging/jnlp/launch.jnlp
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?> 
-    <!-- Jajuk JNLP File --> 
-    <jnlp spec='1.0+' codebase='$$codebase' href='$$name'> 
-        <information> 
-            <title>Jajuk-Webstart</title> 
-            <vendor>Jajuk team</vendor> 
-            <description>Jajuk advanced jukebox</description> 
-            <description kind='short'>Jajuk advanced jukebox</description> 
-            <homepage href="http://jajuk.info"/>
-            <icon href='jajuk-icon_64x64.gif'/>
-		    <icon kind='splash' href='jajuk-splashscreen.jpg'/>
-		    <shortcut online='true'>
-      			<desktop/>
-      			<menu submenu='Jajuk'/>
-    		</shortcut>
-           <offline-allowed/> 
-       </information> 
-       <security> 
-           <all-permissions/>
-       </security> 
-       <resources>
-           <j2se version='1.6+' java-vm-args='-client -Xms20M -Xmx2G -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10'/>
-           <property name='test' value='TEST_FLAG_REPLACED_BY_ANT'/>
-           <jar href='jajuk.jar' version='JNLP_VERSION_REPLACED_BY_ANT'/> 
-   		<extension name='Animation' href='animation.jnlp' />
-        	<extension name='BasicPlayer' href='basic_player.jnlp'/>
-        	<extension name='ApacheCommons' href='apache_commons.jnlp'/>
-        	<extension name='tags' href='tags.jnlp'/>
-        	<extension name='Jfreechart' href='jfreechart.jnlp'/>
-        	<extension name='Substance Look And Feel' href='substance.jnlp'/>
-        	<extension name='JLayer' href='jlayer.jnlp'/>
-        	<extension name='Log4j' href='log4j.jnlp'/>
-        	<extension name='Swingx' href='swingx.jnlp'/>
-        	<extension name='LayoutManager' href='layout.jnlp'/>
-        	<extension name='EntaggedFreedb' href='entagged_freedb.jnlp'/>
-        	<extension name='VLDocking' href='vldocking.jnlp'/>
-        	<extension name='JIntellitype' href='jintellitype.jnlp'/>
-        	<extension name='Cobra' href='cobra.jnlp'/>
-        	<extension name='dbus' href='dbus.jnlp'/>
-        	<extension name='xml' href='xml.jnlp'/>
-        	<extension name='bindings' href='bindings.jnlp'/>
-       </resources>
-       <resources os='Windows'>
-      	<nativelib href='windows/jintellitype-native.jar' version='JNLP_VERSION_REPLACED_BY_ANT'/>
-       </resources>
-       <application-desc main-class='org.jajuk.Main'>
-      	<argument>TEST_FLAG_REPLACED_BY_ANT</argument>
-      </application-desc>
-</jnlp>
\ No newline at end of file
diff --git a/src/packaging/jnlp/layout.jnlp b/src/packaging/jnlp/layout.jnlp
deleted file mode 100644
index e2c17ae..0000000
--- a/src/packaging/jnlp/layout.jnlp
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="layout.jnlp">
-    <information>
-        <title>Layouts</title>
-        <vendor>Various</vendor>
-    </information>
-    <resources>
-        <jar href="miglayout-swing-3.7.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-        
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/log4j.jnlp b/src/packaging/jnlp/log4j.jnlp
deleted file mode 100644
index f32c990..0000000
--- a/src/packaging/jnlp/log4j.jnlp
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="log4j.jnlp">
-    <information>
-        <title>Log4j</title>
-        <vendor>Apache Fondation</vendor>
-    </information>
-    <resources>
-        <jar href="log4j_reduced-1.2.6.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/substance.jnlp b/src/packaging/jnlp/substance.jnlp
deleted file mode 100644
index 65be04d..0000000
--- a/src/packaging/jnlp/substance.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="substance.jnlp">
-    <information>
-        <title>Substance Look And Feel</title>
-        <vendor>Kirillcool</vendor>
-    </information>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <resources>
-        <jar href="substance-5.3.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/swingx.jnlp b/src/packaging/jnlp/swingx.jnlp
deleted file mode 100644
index 8b91d44..0000000
--- a/src/packaging/jnlp/swingx.jnlp
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="swingx.jnlp">
-    <information>
-        <title>Swingx</title>
-        <vendor>Sun</vendor>
-    </information>
-    <resources>
-        <jar href="swingx-1.6.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <resources>
-        <jar href="filters-2.0.235.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <resources>
-        <jar href="simple_validation-0.4.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/tags.jnlp b/src/packaging/jnlp/tags.jnlp
deleted file mode 100644
index e046ca4..0000000
--- a/src/packaging/jnlp/tags.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="entagged_audioformats.jnlp">
-    <information>
-        <title>Tag librairies</title>
-        <vendor>JAudiotagger Team</vendor>
-    </information>
-    <resources>
-        <jar href="jaudiotagger-2.0.2.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/vldocking.jnlp b/src/packaging/jnlp/vldocking.jnlp
deleted file mode 100644
index ea0e8db..0000000
--- a/src/packaging/jnlp/vldocking.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="vldocking.jnlp">
-    <information>
-        <title>Tiny</title>
-        <vendor>Hans Bickel</vendor>
-    </information>
-    <resources>
-        <jar href="vldocking-2.1.5.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/jnlp/web.xml b/src/packaging/jnlp/web.xml
deleted file mode 100644
index 745d324..0000000
--- a/src/packaging/jnlp/web.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<web-app>
-	<display-name>Jajuk</display-name>
-	<servlet>
-		<servlet-name>JnlpDownloadServlet</servlet-name>
-		<servlet-class>jnlp.sample.servlet.JnlpDownloadServlet</servlet-class>
-
-		<init-param>
-			<param-name>logLevel</param-name>
-			<param-value>DEBUG</param-value>
-		</init-param>
-
-		<init-param>
-			<param-name>logPath</param-name>
-			<param-value>/tmp/jnlpdownloadservlet.log</param-value>
-		</init-param>
-
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>JnlpDownloadServlet</servlet-name>
-		<url-pattern>/app/*</url-pattern>
-	</servlet-mapping>
-</web-app>
diff --git a/src/packaging/jnlp/windows/jintellitype-native.jar b/src/packaging/jnlp/windows/jintellitype-native.jar
deleted file mode 100644
index 45ffe99..0000000
Binary files a/src/packaging/jnlp/windows/jintellitype-native.jar and /dev/null differ
diff --git a/src/packaging/jnlp/xml.jnlp b/src/packaging/jnlp/xml.jnlp
deleted file mode 100644
index da70593..0000000
--- a/src/packaging/jnlp/xml.jnlp
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <jnlp spec="1.0+" codebase="$$codebase" href="xml.jnlp">
-    <information>
-        <title>XML utilities</title>
-        <vendor>Thoughtworks</vendor>
-    </information>
-    <security> 
-           <all-permissions/>
-    </security> 
-    <resources>
-        <jar href="xstream-1.3.1.jar" version='JNLP_VERSION_REPLACED_BY_ANT'/>
-    </resources>
-    <component-desc/>
-</jnlp>
diff --git a/src/packaging/native_launcher/installer.launch4j b/src/packaging/native_launcher/installer.launch4j
index 0955cb3..4a72fa9 100644
--- a/src/packaging/native_launcher/installer.launch4j
+++ b/src/packaging/native_launcher/installer.launch4j
@@ -5,12 +5,12 @@
   <outfile>/tmp/jajuk-dist/windows/jajuk-VERSION_REPLACED_BY_ANT-setup.exe</outfile>
   <priority>normal</priority>
   <downloadUrl>http://java.com/download</downloadUrl>
-  <supportUrl>http://trac.jajuk.info/</supportUrl>
+  <supportUrl>http://github.com/jajuk-team/jajuk/issues</supportUrl>
   <customProcName>false</customProcName>
   <stayAlive>false</stayAlive>
   <icon>/tmp/jajuk-dist/jajuk/dist-files/images/jajuk-icon.ico</icon>
   <jre>
-    <minVersion>1.6.0</minVersion>
+    <minVersion>1.7.0</minVersion>
     <jdkPreference>preferJre</jdkPreference>
   </jre>
 </launch4jConfig>
\ No newline at end of file
diff --git a/src/packaging/native_launcher/jajuk.launch4j b/src/packaging/native_launcher/jajuk.launch4j
index c236faa..23c9a02 100644
--- a/src/packaging/native_launcher/jajuk.launch4j
+++ b/src/packaging/native_launcher/jajuk.launch4j
@@ -8,18 +8,18 @@
   <cmdLine>TEST_FLAG_REPLACED_BY_ANT</cmdLine>
   <priority>normal</priority>
   <downloadUrl>http://java.com/download</downloadUrl>
-  <supportUrl>http://trac.jajuk.info/</supportUrl>
+  <supportUrl>http://www.java.com/en/download/help/</supportUrl>
   <customProcName>false</customProcName>
   <stayAlive>false</stayAlive>
   <manifest></manifest>
   <icon>/tmp/jajuk-dist/jajuk/dist-files/images/jajuk-icon.ico</icon>
   <jre>
     <path></path>
-    <minVersion>1.6.0</minVersion>
+    <minVersion>1.7.0</minVersion>
     <maxVersion></maxVersion>
     <jdkPreference>preferJre</jdkPreference>
     <initialHeapSize>20</initialHeapSize>
     <maxHeapSize>512</maxHeapSize>
-    <opt>-client -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10</opt>
+    <opt>-client -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Xverify:none</opt>
   </jre>
 </launch4jConfig>
\ No newline at end of file
diff --git a/src/packaging/pad/jajuk-icon_32x32.gif b/src/packaging/pad/jajuk-icon_32x32.gif
deleted file mode 100644
index d109c23..0000000
Binary files a/src/packaging/pad/jajuk-icon_32x32.gif and /dev/null differ
diff --git a/src/packaging/pad/jajuk_pad.xml b/src/packaging/pad/jajuk_pad.xml
deleted file mode 100644
index 9dc2d16..0000000
--- a/src/packaging/pad/jajuk_pad.xml
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<XML_DIZ_INFO>
-	<MASTER_PAD_VERSION_INFO>
-		<MASTER_PAD_VERSION>3.10</MASTER_PAD_VERSION>
-		<MASTER_PAD_EDITOR>Online PAD Generator 1.33 -
-			http://www.padbuilder.com</MASTER_PAD_EDITOR>
-		<MASTER_PAD_INFO>Portable Application Description, or PAD for short,
-			is a data set that is used by shareware authors to disseminate
-			information to anyone interested in their software products. To find
-			out more go to http://www.asp-shareware.org/pad</MASTER_PAD_INFO>
-	</MASTER_PAD_VERSION_INFO>
-	<Company_Info>
-		<Company_Name>Jajuk team</Company_Name>
-		<Address_1>Internet</Address_1>
-		<Address_2>Internet</Address_2>
-		<City_Town>Internet</City_Town>
-		<State_Province>Internet</State_Province>
-		<Zip_Postal_Code>00000</Zip_Postal_Code>
-		<Country>Internet</Country>
-		<Company_WebSite_URL>http://jajuk.info</Company_WebSite_URL>
-		<Contact_Info>
-			<Author_First_Name>Jajuk Team</Author_First_Name>
-			<Author_Last_Name>Jajuk Team</Author_Last_Name>
-			<Author_Email>jajuk-developers at lists.sourceforge.net</Author_Email>
-			<Contact_First_Name>Jajuk Team</Contact_First_Name>
-			<Contact_Last_Name>Jajuk Team</Contact_Last_Name>
-			<Contact_Email>jajuk-developers at lists.sourceforge.net</Contact_Email>
-		</Contact_Info>
-		<Support_Info>
-			<Sales_Email>jajuk-developers at lists.sourceforge.net</Sales_Email>
-			<Support_Email>jajuk-developers at lists.sourceforge.net</Support_Email>
-			<General_Email>jajuk-developers at lists.sourceforge.net</General_Email>
-			<Sales_Phone>0000000000</Sales_Phone>
-			<Support_Phone>0000000000</Support_Phone>
-			<General_Phone>0000000000</General_Phone>
-			<Fax_Phone>0000000000</Fax_Phone>
-		</Support_Info>
-	</Company_Info>
-	<Program_Info>
-		<Program_Name>Jajuk</Program_Name>
-		<Program_Version>1.9.6</Program_Version>
-		<Program_Release_Month>02</Program_Release_Month>
-		<Program_Release_Day>20</Program_Release_Day>
-		<Program_Release_Year>2012</Program_Release_Year>
-		<Program_Cost_Dollars />
-		<Program_Cost_Other_Code />
-		<Program_Cost_Other />
-		<Program_Type>Freeware</Program_Type>
-		<Program_Release_Status>New Release</Program_Release_Status>
-		<Program_Install_Support>No Install Support</Program_Install_Support>
-		<Program_OS_Support>Java,Linux,Linux Gnome,Linux GPL,Linux Open
-			Source,Mac OS X,Unix,Win2000,Win7 x32,Win7
-			x64,Win98,WinOther,WinVista,WinVista x64,WinXP</Program_OS_Support>
-		<Program_Language>English,French,German,Greek,Korean,Russian,Spanish</Program_Language>
-		<Program_Change_Info />
-		<Program_Specific_Category>Audio</Program_Specific_Category>
-		<Program_Category_Class>Audio & Multimedia::Audio File Players</Program_Category_Class>
-		<Program_Categories>jukebox</Program_Categories>
-		<Program_System_Requirements>P3 600Mhz, 512 MB RAM</Program_System_Requirements>
-		<File_Info>
-			<File_Size_Bytes>22470983</File_Size_Bytes>
-			<File_Size_K>21944</File_Size_K>
-			<File_Size_MB>21.43</File_Size_MB>
-		</File_Info>
-		<Expire_Info>
-			<Has_Expire_Info>N</Has_Expire_Info>
-			<Expire_Count />
-			<Expire_Based_On>Days</Expire_Based_On>
-			<Expire_Other_Info />
-			<Expire_Month />
-			<Expire_Day />
-			<Expire_Year />
-		</Expire_Info>
-	</Program_Info>
-	<Program_Descriptions>
-		<English>
-			<Keywords>java,jukebox,mp3,ogg,music,collection,player</Keywords>
-			<Char_Desc_45>Jajuk is a powerful music organizer</Char_Desc_45>
-			<Char_Desc_80>Jajuk is a powerful music organizer for all platforms</Char_Desc_80>
-			<Char_Desc_250>Jajuk is a powerful music organizer for all platforms.
-				The main goal of this project is to provide a fully-featured
-				application to advanced users with large or scattered music
-				collections.</Char_Desc_250>
-			<Char_Desc_450>Jajuk is a powerful music organizer for all platforms.
-				The main goal of this project is to provide a fully-featured
-				application to advanced users with large or scattered music
-				collections. Jajuk main principles are maximum features, maximum
-				portability and maximum usability</Char_Desc_450>
-			<Char_Desc_2000>Jajuk is a powerful music organizer for all
-				platforms. The main goal of this project is to provide a
-				fully-featured application to advanced users with large or scattered
-				music collections. Jajuk is a Free Software published under GPL
-				license. Jajuk main principles are maximum features, maximum
-				portability and maximum usability.</Char_Desc_2000>
-		</English>
-	</Program_Descriptions>
-	<Web_Info>
-		<Application_URLs>
-			<Application_Info_URL>http://jajuk.info</Application_Info_URL>
-			<Application_Order_URL />
-			<Application_Screenshot_URL>http://jajuk.info/upload/f/fe/Mainpage_screenshot.png</Application_Screenshot_URL>
-			<Application_Icon_URL>http://gitorious.org/jajuk/jajuk/blobs/raw/master/jajuk/src/packaging/pad/jajuk-icon_32x32.gif</Application_Icon_URL>
-			<Application_XML_File_URL>http://repository.jajuk.info/jajuk_pad.xml</Application_XML_File_URL>
-		</Application_URLs>
-		<Download_URLs>
-			<Primary_Download_URL>http://sourceforge.net/projects/jajuk/files/jajuk/1.9.6/jajuk-1.9.6-setup.exe</Primary_Download_URL>
-			<Secondary_Download_URL />
-			<Additional_Download_URL_1 />
-			<Additional_Download_URL_2 />
-		</Download_URLs>
-	</Web_Info>
-	<Permissions>
-		<Distribution_Permissions>This program is free software; you can
-			redistribute
-			it and/or modify it under the terms of the GNU General
-			Public License
-			as published by the Free Software Foundation; either
-			version 2 of the
-			License, or any later version.
-
-			This program is
-			distributed in the hope that it will be useful, but
-			WITHOUT ANY
-			WARRANTY; without even the implied warranty of
-			MERCHANTABILITY
-			or
-			FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-			General Public License
-			for more details.
-
-			You should have received a copy of the GNU General
-			Public License along
-			with this program; if not, write to the Free
-			Software Foundation,
-			Inc., 59 Temple Place - Suite 330, Boston, MA
-			02111-1307,USA</Distribution_Permissions>
-		<EULA>This program is free software; you can redistribute
-			it and/or
-			modify it under the terms of the GNU General Public License
-			as
-			published by the Free Software Foundation; either version 2 of the
-			License, or any later version.
-
-			This program is distributed in the hope
-			that it will be useful, but
-			WITHOUT ANY WARRANTY; without even the
-			implied warranty of
-			MERCHANTABILITY
-			or FITNESS FOR A PARTICULAR
-			PURPOSE. See the GNU
-			General Public License for more details.
-
-			You
-			should have received a copy of the GNU General Public License along
-			with this program; if not, write to the Free Software Foundation,
-			Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA</EULA>
-	</Permissions>
-</XML_DIZ_INFO>
diff --git a/src/scripts/build.xml b/src/scripts/build.xml
index b8eccd4..7414f3a 100644
--- a/src/scripts/build.xml
+++ b/src/scripts/build.xml
@@ -1,6 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <!--Ant script for users (target package_jar) and packagers (other targets)-->
-<!--void 20080323 -->
 
 <project default='package_jar' name='jajuk' basedir='../..'>
 	<!--VARIABLES-->
@@ -9,57 +8,33 @@
 		<format property='TODAY' pattern='yyyyMMdd' locale='en,UK' />
 	</tstamp>
 
-	<!-- JNLP date -->
-	<tstamp>
-		<format property='JNLP_DATE' pattern='yyyyMMdd_hhmm' locale='en,UK' />
-	</tstamp>
-
-	<!--Build type : 'unstable', 'final' or 'maintenance' -->
+	<!--Build type : 'unstable', 'final', 'pre-release' or 'maintenance' -->
 	<property name='type' value='final' />
-	
-	<!--Distribution release  
-	!!! DO NOT USE '-' CHARACTER IN VERSION !!!-->
-	<property name='version' value='1.9.6' />
 
-	<!--JNLP version-->
-	<!-- In final releases (including RC), jnlp_version=${version} 
-	In maintenance or unstable daily builds, jnlp_version=${JNLP_DATE} : we don't use regular version 
-	so the version changes each day -->
-	<!--<property name='jnlp_version' value='${JNLP_DATE}' />-->
-	<property name='jnlp_version' value='${version}' />
+	<!--Distribution release
+	!!! DO NOT USE '-' CHARACTER IN VERSION !!!-->
+	<property name='version' value='1.10.9' />
 
-	<!--Test flag: values: 'test' or 'notest' 
-	'test' for 'unstable branch, 'notest' for master and maintenance branch (including RC releases)
+	<!--Test flag: values: 'test' or 'notest'
+	'test' for 'unstable' branches, 'notest' for master, pre-release and maintenance branches
 	-->
 	<property name='test' value='notest' />
-				
 
 	<!-- ======================= -->
 	<!-- | Configuration paths | -->
 	<!-- ======================= -->
-	<property name='conf_izpackdir' value='/data/build_tools/IzPack' />
-	<property name='conf_jnlp-dist' value='/tmp/jajuk-dist/jnlp-dist' />
-	<property name='conf_homeuser' value='/home/tomcat55' />
-	<property name='conf_uploaddir' value='/tmp/jajuk-dist/packages/' />
 	<property name='conf_jarbundler' value='/data/build_tools/jarbundler' />
-	<property name='conf_jarbundler-jar' value='jarbundler-1.9.jar' />
+	<property name='conf_jarbundler-jar' value='jarbundler-2.4.0.jar' />
 	<property name="launch4j.dir" location="/data/build_tools/launch4j" />
-
-	<!-- ============================== -->
-	<!-- | End of configuration paths | -->
-	<!-- ============================== -->
-
-	<!--CONST-->
-	<property name='jajuk.java.build.version6' value='1.6' />
-	<property name='jajuk.java.build.version7' value='1.7' />
 	<property name='rootdir' value='/tmp/jajuk-dist' />
+	<property name='conf_uploaddir' value='${rootdir}/packages/' />
 	<property name='installdir' value='/usr/share/jajuk/' />
 	<property name='jnidir' value='/usr/lib/jajuk/' />
 	<property name='distdir' value='${rootdir}/jajuk' />
 	<property name='rpmbuilddir' value='${rootdir}/RPMBUILD' />
-	<property name='rpmdistdir' value='${rpmbuilddir}/jajuk' />
+	<property name='rpmdistdir' value='${rpmbuilddir}/BUILDROOT/jajuk-${version}-1.noarch' />
 	<property name='windowsdir' value='${rootdir}/windows' />
-	<property name='izpackdir' value='${rootdir}/java' />
+	<property name='nsisdir' value='${rootdir}/java' />
 	<property name='sourcesdir' value='${rootdir}/sources' />
 	<property name='libdir' value='lib' />
 	<property name='distfiles' value='dist-files' />
@@ -71,31 +46,9 @@
 	<property name='distjarname' value='jajuk-java-installer-' />
 	<property name='sourcesdist' value='${sourcesdir}/jajuk-sources-${version}.zip' />
 	<property name='mplayerdir' value='/tmp/mplayer' />
-
-	<!-- This used to be the intermediate directory used to build war file, we used a persisitent 
- 	directory to use jar files in next war (each war contains current and previous jars for 
- 	incremental upgrade). We don't use incremental udated anymore as it does require too much 
- 	disk space -->
-	<property name='jnlpdir' value='${conf_jnlp-dist}/${version}' />
 	<property name='srcdir' value='${basedir}/src' />
 
-	<target name='get-jvm'>
-		<echo message='Verifying Java Version used for building, found version ${java.specification.version}, expecting ${jajuk.java.build.version6} or ${jajuk.java.build.version7}' />
-		<condition property='jvm.not.ok'>
-			<not>
-				<or>
-					<equals arg1='${java.specification.version}' arg2='${jajuk.java.build.version6}' />
-					<equals arg1='${java.specification.version}' arg2='${jajuk.java.build.version7}' />
-				</or>
-			</not>
-		</condition>
-	</target>
-
-	<target name='check-jvm' depends='get-jvm' if='jvm.not.ok'>
-		<fail message='Wrong Java version used for building: ${java.specification.version}, the build requires version ${jajuk.java.build.version6} or ${jajuk.java.build.version7}' />
-	</target>
-
-	<target name='startup' depends='check-jvm'>
+	<target name='startup' >
 		<echo message='Building Jajuk release: ${version} using Java ${java.specification.version}' />
 		<echo message='Building Jajuk release: ${version}' />
 		<echo message='Basedir: ${basedir}' />
@@ -106,9 +59,8 @@
 	</target>
 
 	<target name='clean' description='o Clean up previous build files'>
-		<delete failonerror='true' dir='${rootdir}' />
-		<delete failonerror='true' dir='${jnlpdir}' />
-		<delete failonerror='true' dir='${mplayerdir}' />
+		<delete failonerror='false' dir='${rootdir}' />
+		<delete failonerror='false' dir='${mplayerdir}' />
 	</target>
 
 
@@ -139,11 +91,6 @@
 			<fileset file='${basedir}/src/doc/README.html' />
 			<fileset file='${basedir}/src/legals/AUTHORS.txt' />
 		</copy>
-
-		<!--copy native dll to bin directory-->
-		<copy todir='${distdir}/bin'>
-			<fileset file='${basedir}/lib/*.dll' />
-		</copy>
 		<copy todir='${distdir}/src'>
 			<fileset file='${srcdir}/packaging/MANIFEST.MF' />
 		</copy>
@@ -209,12 +156,12 @@
 		<get src='http://repository.jajuk.info/mplayer/osx/1.0rc2/mplayer' dest='${mplayerdir}/osx/mplayer' />
 		<!-- Windows mplayer -->
 		<mkdir dir='${mplayerdir}/windows' />
-		<get src='http://repository.jajuk.info/mplayer/20090114/mplayer.exe' dest='${mplayerdir}/windows/mplayer.exe' />
+		<get src='http://repository.jajuk.info/mplayer/20130411/mplayer.exe' dest='${mplayerdir}/windows/mplayer.exe' />
 	</target>
 
 	<target name='compile'>
 		<echo message='Compile the code' />
-		<javac destdir='${distdir}/${classdir}' source='1.6' target='1.6' deprecation='true' debug='true' optimize='true' excludes='**/package.html' encoding='UTF-8'>
+		<javac destdir='${distdir}/${classdir}' source='1.7' target='1.7' deprecation='true' debug='true' optimize='true' excludes='**/package.html' encoding='UTF-8'>
 			<compilerarg value='-Xlint:all' />
 			<src>
 				<pathelement path='${distdir}/src'>
@@ -238,11 +185,10 @@
 			<fileset file='${srcdir}/main/resources/images/included/*' />
 		</copy>
 		<copy todir='${distdir}/${classdir}/org/jajuk/i18n'>
-			<fileset file='${javadir}/org/jajuk/i18n/*.properties' />
+			<fileset file='${srcdir}/main/resources/org/jajuk/i18n/*.properties' />
 		</copy>
-		<copy todir='${distdir}/${classdir}/org/jajuk/util/log'>
-			<fileset file='${javadir}/org/jajuk/util/log/*.xml' />
-			<fileset file='${javadir}/org/jajuk/util/log/*.properties' />
+		<copy todir='${distdir}/${classdir}'>
+			<fileset file='${srcdir}/main/resources/jajuk-log4j-conf.xml' />
 		</copy>
 		<copy todir='${distdir}/${classdir}/perspectives'>
 			<fileset file='${srcdir}/main/resources/perspectives/*.xml' />
@@ -262,26 +208,30 @@
 	</target>
 
 
-	<target name='package_all' description='o Create all packages' depends='package_exe,package_izpack,package_rpm,package_source,package_sfx,package_jnlp,package_macos'>
+	<target name='package_all' description='o Create all packages' depends='package_exe,package_nsis,package_rpm,package_source,package_macos'>
 		<echo message='Successfully built packages:' />
 		<echo message=' Jajuk Jar file in:     ${distdir}/bin/${jarname}' />
 		<echo message=' RPM package in:        ${rpmbuilddir}/RPMS/noarch/jajuk-${version}-1.noarch.rpm' />
 		<echo message=' Windows executable in: ${windowsdir}/jajuk-${version}-setup.exe' />
-		<echo message=' Java installer in:     ${izpackdir}/jajuk-java-installer-${version}.jar' />
 		<echo message=' MAC OS X in:           ${distdir}/jajuk-macos-${version}.zip' />
 		<echo message=' Source archive in:     ${sourcesdist}' />
-		<echo message=' JNLP war file in:      ${rootdir}/jajuk-${type}.war' />
 		<echo message=' Jajuk binary file in:  ${distdir}/bin/${jarname}' />
 	</target>
 
 
-	<!--IzPack package creation -->
+	<!--NSIS package creation -->
+	<taskdef name="nsis" classname="com.danielreese.nsisant.Task">
+		<classpath location="/data/build_tools/nsis-ant/nsisant-1.3.jar" />
+	</taskdef>
 
-	<target name='package_izpack' description='o Create Jajuk IzPack package' depends='download_mplayer,startup,clean,package_jar,mkdist_izpack'>
-		<taskdef name='izpack' classpath='${conf_izpackdir}/lib/compiler.jar' classname='com.izforge.izpack.ant.IzPackTask' />
-		<echo message='Create Jajuk IzPack package' />
-		<echo message='Makes the installer using IzPack' />
-		<izpack input='${izpackdir}/jajuk.izpack' output='${izpackdir}/${distjarname}${version}.jar' basedir='${srcdir}' izPackDir='${conf_izpackdir}' />
+	<target name='package_nsis' description='o Create Jajuk NSIS package' depends='download_mplayer,startup,clean,package_jar'>
+		<echo message='Create Jajuk NSIS installer' />
+		<mkdir dir='${nsisdir}' />
+		<!-- Set release in nsis descriptor files-->
+		<replace file="${srcdir}/packaging/NSIS/jajuk.nsis" value='${version}'>
+			<replacetoken>VERSION_REPLACED_BY_ANT</replacetoken>
+		</replace>
+		<nsis script="${srcdir}/packaging/NSIS/jajuk.nsis" />
 	</target>
 
 
@@ -297,40 +247,44 @@
 		<chmod file='${rpmdistdir}/usr/share/applications/jajuk.desktop' perm='ugo+rwx' />
 
 		<!--RPM, see http://forgeftp.novell.com//library/SUSE%20Package%20Conventions/spc_desktop_menu.html-->
-		<copy todir='${conf_homeuser}' overwrite='yes'>
-			<fileset file='${srcdir}/packaging/RPMS/.rpmmacros' />
-		</copy>
 		<rpm failOnError='true' specFile='jajuk.spec' topDir='${rpmbuilddir}' cleanBuildDir='yes' removeSpec='no' command='-bb -vv --target noarch' />
 	</target>
 
+	<!--jarbundler Mac OS X package creation (Jajuk.app)-->
+	<target name='jarbundler' depends='package_jar'>
+		<taskdef name='jarbundler' classpath='${conf_jarbundler}/${conf_jarbundler-jar}' classname='net.sourceforge.jarbundler.JarBundler' />
+		<echo message='jarbundler' />
+		<mkdir dir='${distdir}/jarbundler/' />
+		<jarbundler dir='${distdir}/jarbundler/' name='Jajuk' shortname="Jajuk" mainclass='org.jajuk.Main' icon='${distdir}/dist-files/images/jajuk-icon_source.icns' jvmversion='1.7+' version='${version}' useJavaXKey='true' stubfile='${basedir}/src/packaging/OSX/universalJavaApplicationStub' build='${version}' vmoptions='-client -Xms20M -Xmx2G -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Xverify:none' arguments='-${test}' verbose='true'>
+			<jarfileset dir='${distdir}/lib'>
+				<include name='**/*.jar' />
+			</jarfileset>
+			<jarfileset dir='${distdir}/bin'>
+				<include name='**/*.jar' />
+			</jarfileset>
+			<execfilelist dir='${mplayerdir}/osx' files="mplayer" />
+		</jarbundler>
+	</target>
 
-	<!--jarbundler Mac OS zip package creation -->
-	<target name='package_macos' description='o Create Jajuk MAC OS package' depends='startup,clean,mkdist_macos,package_jar,jarbundler'>
+	<!--Create jarbundler zip -->
+	<target name='package_macos' description='o Create Jajuk MAC OS package' depends='startup,clean,package_jar,jarbundler'>
 		<echo message='Create Jajuk MAC OS package' />
-		<!-- Create the distribution directory -->
-		<mkdir dir='${distdir}/macos' />
-		<!-- Copy mplayer OSX binary into it -->
-		<mkdir dir='${distdir}/jarbundler/Jajuk.app/Contents/Resources/External_Binaries' />
-		<copy file='${mplayerdir}/osx/mplayer' todir='${distdir}/jarbundler/Jajuk.app/Contents/Resources/External_Binaries' />
 		<zip zipfile='${distdir}/jajuk-macos-${version}.zip'>
-			<zipfileset dir='${distdir}/jarbundler/Jajuk.app/Contents' filemode='755' prefix='Jajuk.app/Contents'>
-				<include name='MacOS/JavaApplicationStub' />
-				<include name='PkgInfo' />
-				<include name='Info.plist' />
-				<include name='Resources/**' />
+			<zipfileset dir='${distdir}/jarbundler' filemode='755'>
+				<include name='*/**' />
 			</zipfileset>
 			<fileset file='${basedir}/src/doc/README.html' />
-			<fileset file='${basedir}/src/legals/LICENSE.txt' />
-			<fileset file='${basedir}/src/legals/AUTHORS.txt' />
+			<fileset file='${basedir}/src/legals/*' />
 		</zip>
 	</target>
 
 	<target name='package_source' description='o Create Jajuk source package (zip)' depends='startup,clean,mkdist_source'>
 		<echo message='Create Jajuk source package' />
 		<zip basedir='${sourcesdir}' destfile='${sourcesdist}' />
+		<delete dir='{sourcesdir}' />
 	</target>
 
-	<!-- Windows EXE creation using launch4j-->
+	<!-- Windows jajuk.exe creation using launch4j-->
 	<target name='package_exe' description='o Create Jajuk Windows executable file' depends='package_jar,mkdist_windows'>
 		<taskdef name="launch4j" classname="net.sf.launch4j.ant.Launch4jTask" classpath="${launch4j.dir}/launch4j.jar
 	        :${launch4j.dir}/lib/xstream.jar" />
@@ -338,97 +292,6 @@
 		<launch4j configFile="${windowsdir}/jajuk.launch4j" />
 	</target>
 
-	<!-- Windows installer EXE creation from IzPack jar-->
-	<target name='package_sfx' description='o Create IzPack Windows executable file' depends='package_exe,package_izpack'>
-		<taskdef name="launch4j" classname="net.sf.launch4j.ant.Launch4jTask" classpath="${launch4j.dir}/launch4j.jar
-			        :${launch4j.dir}/lib/xstream.jar" />
-				<echo message='Create Jajuk Windows executable file' />
-				<launch4j configFile="${windowsdir}/installer.launch4j" />
-	</target>
-
-	<target name='package_jnlp' description='o Create Java Web Start war distribution' depends='startup,clean,package_jar'>
-		<echo message='Create Java Web Start war distribution' />
-		<!--Note that all jars (including jajuk-native.jar must be signed with the same certificate), we do this manually -->
-		<mkdir dir='${jnlpdir}' />
-		<mkdir dir='${jnlpdir}/app' />
-		<mkdir dir='${jnlpdir}/app/windows' />
-		<!--Copy current jars -->
-		<copy todir='${jnlpdir}/app'>
-			<fileset file='${distdir}/lib/*.jar' />
-		</copy>
-		<copy todir='${jnlpdir}/app'>
-			<fileset file='${distdir}/bin/*.jar' />
-		</copy>
-		<copy todir='${jnlpdir}/app'>
-			<fileset file='${srcdir}/packaging/jnlp/*.jnlp' />
-		</copy>
-		<copy todir='${jnlpdir}/app'>
-			<fileset file='${srcdir}/packaging/jnlp/*.gif' />
-		</copy>
-		<copy todir='${jnlpdir}/app'>
-			<fileset file='${srcdir}/main/resources/images/included/jajuk-splashscreen.jpg' />
-		</copy>
-		<!--Copy native jars -->
-		<copy todir='${jnlpdir}/app/windows'>
-			<fileset file='${srcdir}/packaging/jnlp/windows/*.jar' />
-		</copy>
-		<!-- Rename all jars to add JNLP-way release: <name>__V<release>.jar -->
-		<move todir='${jnlpdir}'>
-			<fileset dir='${jnlpdir}'>
-				<include name='**/*.jar' />
-			</fileset>
-			<mapper type='glob' from='*.jar' to='*__V${jnlp_version}.jar' />
-		</move>
-
-		<!-- Set test or no test in jnlp file-->
-		<replace dir='${jnlpdir}/app' value='-${test}'>
-			<include name='*.jnlp' />
-			<replacetoken>TEST_FLAG_REPLACED_BY_ANT</replacetoken>
-		</replace>
-
-		<!-- Set JNLP_VERSION -->
-		<replace dir='${jnlpdir}/app' value='${jnlp_version}'>
-			<include name='*.jnlp' />
-			<replacetoken>JNLP_VERSION_REPLACED_BY_ANT</replacetoken>
-		</replace>
-		
-		<!-- Sign all jars -->
-		<signjar alias='jajukteam' storepass='passpass'>
-			<fileset dir='${jnlpdir}'>
-				<include name='**/*.jar' />
-			</fileset>
-		</signjar>
-
-
-		<!-- Create the war file -->
-		<war destfile='${rootdir}/jajuk-${type}.war' webxml='${srcdir}/packaging/jnlp/web.xml'>
-			<fileset dir='${jnlpdir}' />
-			<lib file='${srcdir}/packaging/jnlp/jnlp-servlet.jar' />
-		</war>
-	</target>
-
-
-	<target name='mkdist_izpack'>
-		<echo message='Prepare files to build IzPack package' />
-		<mkdir dir='${izpackdir}' />
-		<!--Izpack specific -->
-		<copy todir='${izpackdir}'>
-			<fileset file='${srcdir}/packaging/IzPack/jajuk.izpack' />
-			<fileset file='${srcdir}/packaging/IzPack/shortcutSpec.xml' />
-			<fileset file='${srcdir}/packaging/IzPack/installDirectory.unix.txt' />
-		</copy>
-		<!-- Set release in IzPack descriptor file -->
-		<replace dir='${izpackdir}' value='${version}'>
-			<include name='jajuk.izpack' />
-			<replacetoken>VERSION_REPLACED_BY_ANT</replacetoken>
-		</replace>
-		<replace dir='${izpackdir}' value='-${test}'>
-			<include name='shortcutSpec.xml' />
-			<replacetoken>TEST_FLAG_REPLACED_BY_ANT</replacetoken>
-		</replace>
-	</target>
-
-
 	<target name='mkdist_rpm'>
 		<echo message='Prepare files to build RPM package' />
 		<!--RPM specific-->
@@ -501,14 +364,12 @@
 		</replace>
 	</target>
 
-
-	<target name='mkdist_macos'>
-		<echo message='Prepare files to build MAC OS X package' />
-	</target>
-
-
 	<target name='mkdist_windows'>
 		<echo message='Prepare files to build Windows executable' />
+		<!--copy native dll to bin directory-->
+		<copy todir='${distdir}/bin'>
+			<fileset file='${basedir}/lib/*.dll' />
+		</copy>
 		<mkdir dir='${windowsdir}' />
 		<!--Windows specific -->
 		<copy todir='${windowsdir}'>
@@ -532,41 +393,10 @@
 		<mkdir dir='${sourcesdir}/jajuk-src-${version}' />
 		<copy todir='${sourcesdir}/jajuk-src-${version}'>
 			<!--Exclude files created during the maven execution -->
-			<fileset file='${basedir}/**' excludes='test*,**/target/**' />
+			<fileset file='${distdir}/**' excludes='test*,**/target/**' />
 		</copy>
 	</target>
 
-	<target name='javadoc'>
-		<delete dir='${javadocdir}' />
-		<mkdir dir='${javadocdir}' />
-		<property name='copyright' value='Copyright &copy;  Jajuk team. All Rights Reserved.' />
-		<javadoc destdir='${javadocdir}' access='private' use='true' notree='false' nonavbar='false' noindex='false' splitindex='true' author='true' version='true' nodeprecatedlist='false' nodeprecated='false' packagenames='org.jajuk.base,org.jajuk.ui.views,org.jajuk,org.jajuk.i18n,org.jajuk.ui.perspectives,org.jajuk.util.log,org.jajuk.ui,org.jajuk.util,org.jajuk.util.error,org.jajuk.players' sourcepath='src' source='1.6' Windowtitle='Jajuk ${version} API'>
-			<classpath>
-				<fileset dir='${libdir}'>
-					<include name='*.jar'>
-					</include>
-				</fileset>
-				<pathelement location='target/${final.name}.jar' />
-			</classpath>
-		</javadoc>
-	</target>
-
-
-	<!--jarbundler Mac OS X package creation -->
-	<target name='jarbundler' depends='package_jar'>
-		<taskdef name='jarbundler' classpath='${conf_jarbundler}/${conf_jarbundler-jar}' classname='net.sourceforge.jarbundler.JarBundler' />
-		<echo message='jarbundler' />
-		<mkdir dir='${distdir}/jarbundler/' />
-		<jarbundler dir='${distdir}/jarbundler/' name='Jajuk' mainclass='org.jajuk.Main' icon='${distdir}/dist-files/images/jajuk-icon_source.icns' jvmversion='1.6+' version='${version}' infostring='Jajuk' stubfile='${basedir}/src/packaging/OSX/JavaApplicationStub' build='${version}' vmoptions='-client -Xms20M -Xmx2G -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10' arguments='-${test}' verbose='true'>
-			<jarfileset dir='${distdir}/lib'>
-				<include name='**/*.jar' />
-			</jarfileset>
-			<jarfileset dir='${distdir}/bin'>
-				<include name='**/*.jar' />
-			</jarfileset>
-		</jarbundler>
-	</target>
-
 	<!-- Create hash files and upload packages-->
 	<target name='deploy_new_release' description='o Put all generated packages and checksums into Jajuk webserver repository directory' depends='package_all'>
 		<mkdir dir='${conf_uploaddir}' />
@@ -574,7 +404,6 @@
 			<fileset file='${sourcesdist}' />
 			<fileset file='${rpmbuilddir}/RPMS/noarch/*' />
 			<fileset file='${windowsdir}/jajuk-${version}-setup.exe' />
-			<fileset file='${izpackdir}/jajuk-java-installer-${version}.jar' />
 			<fileset file='${distdir}/jajuk-macos-${version}.zip' />
 		</copy>
 	</target>
diff --git a/src/scripts/jajuk b/src/scripts/jajuk
index 6834dcd..5028d6c 100644
--- a/src/scripts/jajuk
+++ b/src/scripts/jajuk
@@ -1,10 +1,9 @@
 #!/bin/bash
-## Main starting script for Jajuk VERSION_REPLACED_BY_ANT
 
 ###########################
 ### CONFIGURATION START ###
 
-#to use your default java on your system use JAVA_BIN="java", or you can give the full path of java.
+#to use your default jre on your system use JAVA_BIN="java", or you can give the full path of java.
 JAVA_BIN="java"
 
 #JVM arguments used by Jajuk. It's important  to notice that some of this tuning is useful only when using Java player (when mplayer is not available)
@@ -12,47 +11,27 @@ JAVA_BIN="java"
 # * -Xms : Initial Heap (total JVM reserved memory) size. We set it to a pretty large value because it requires resources to expand heap size and it causes a blanck when using java player. [it can be reduced to 25M by some users if required]
 # * -Xmx: Maximal Heap size. We set a large size because Out Of Memory errors make the application crash. In some rare cases, very large collection (>200Gb) users could increase this setting (see Performance section in the manual) [Change this setting only if you have very large collection, do not reduce it]
 # * -XX:MinHeapFreeRatio -XX:MaxHeapFreeRatio : fine running parameters that optimizes JVM to garbage collecting as rarely as possible (because a gc 'end of the world' causes an audio blanck). These values have been set by experience [keep these parameters as it]
-
-JAVA_OPTIONS="-client -Xms20M -Xmx2G -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10"
-
+JAVA_OPTIONS="-client -Xms20M -Xmx2G -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -Xverify:none"
 
 #Jajuk options
 JAJUK_OPTIONS="TEST_FLAG_REPLACED_BY_ANT"
 
-#Do you want this script to try to find and use an alternate java version installed on your system that will be more suitable for Jajuk? Use "true" or "false".
-FIND_OTHER_JAVA="true"
-
 ### CONFIGURATION END ###
 #########################
 
-JAJUK_VERSION="VERSION_REPLACED_BY_ANT"
 PROGNAME=`basename $0`
 
 ## find java version in the default path
 JAVA_VER=$($JAVA_BIN -version 2>&1 | grep version | cut -d\" -f 2-2 | cut -c 1-3)
 
 find_java () {
-    if [ "$JAVA_VER" = "1.6" ] ; then       
-        echo " Java version in the default path is: $JAVA_VER"
-    elif [ "$FIND_OTHER_JAVA" = "true" ] ; then
-        echo " Java version in the default path is: $JAVA_VER"
-        echo "   Java version in the default path may not be the best or compatible with Jajuk. Let's try other places in case a better version is present..."
-        echo "   To turn off this auto-detection funtion, edit $0 and set FIND_OTHER_JAVA to false"
-        echo " Search for other java..." 
-        #Search for Java SUN 1.6
-        if [ -e /usr/lib/j2re1.6-sun/bin/java ] ; then
-            JAVA_BIN="/usr/lib/j2re1.5-sun/bin/java"
-            echo "  j2re1.6-sun detected in $JAVA_BIN"
-        elif [ -e /usr/lib/jvm/java-6-sun/jre/bin/java ] ; then
-            JAVA_BIN="/usr/lib/jvm/java-6-sun/jre/bin/java"
-            echo "  j2re1.6-sun detected in $JAVA_BIN"
-        fi
-     else
-        echo " Java version in the default path is: $JAVA_VER"    
-        echo "   No Java compatible version detected, but let's still try to run it!"
+    if [[ "$JAVA_VER" = "1.7" || "$JAVA_VER" = "1.8" || "$JAVA_VER" = "1.9" ]] ; then
+        echo "Java version in the default path is: $JAVA_VER"
+    else
+        echo "Java version in the default path is: $JAVA_VER"
+        echo "No Java compatible version detected, but let's still try to run it!"
      fi
-}    
-
+}
 
 ##Go in the right /bin directory
 #test if jajuk has been installed in default directory /usr/lib/jajuk/ via RPM/Deb package
@@ -77,7 +56,7 @@ EOF
             exit 1
             ;;
         -v|--version)
-            echo "$PROGNAME ($JAJUK_HOME): $JAJUK_VERSION"
+            echo "$PROGNAME ($JAJUK_HOME)"
             echo "Jajuk options: $JAJUK_OPTIONS"                        
             find_java 
             echo "   Java bin: $JAVA_BIN"
@@ -98,14 +77,10 @@ else
 	RPMLIB=lib
 fi
 
-echo "$PROGNAME ($JAJUK_HOME): $JAJUK_VERSION"
-
 
 ## find installed java version 
 find_java 
 
-
 ##let's finally start Jajuk:
-echo " "
 echo $JAVA_BIN $JAVA_OPTIONS -Djava.library.path=/usr/lib/jni:/usr/lib:/usr/share/jajuk/$RPMLIB:$JAJUK_HOME/../lib/$ARCHLIB -jar jajuk.jar $JAJUK_OPTIONS
-$JAVA_BIN $JAVA_OPTIONS -Djava.library.path=/usr/lib/jni:/usr/lib:/usr/share/jajuk/$RPMLIB:"$JAJUK_HOME"/../lib/$ARCHLIB -jar jajuk.jar $JAJUK_OPTIONS
+$JAVA_BIN $JAVA_OPTIONS -Djava.library.path=/usr/lib/jni:/usr/lib:/usr/share/jajuk/$RPMLIB:"$JAJUK_HOME"/../lib/$ARCHLIB -jar jajuk.jar $JAJUK_OPTIONS
\ No newline at end of file
diff --git a/src/scripts/nsisant-1.3.jar b/src/scripts/nsisant-1.3.jar
new file mode 100755
index 0000000..b85c89a
Binary files /dev/null and b/src/scripts/nsisant-1.3.jar differ
diff --git a/src/test/java/ext/TestAutoCompleteDecorator.java b/src/test/java/ext/TestAutoCompleteDecorator.java
index 9563bdc..9ba8f78 100644
--- a/src/test/java/ext/TestAutoCompleteDecorator.java
+++ b/src/test/java/ext/TestAutoCompleteDecorator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext;
 
@@ -29,14 +29,12 @@ import javax.swing.text.JTextComponent;
 import junit.framework.TestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAutoCompleteDecorator extends TestCase {
-
   /**
    * Test method for {@link ext.AutoCompleteDecorator#decorate(javax.swing.text.JTextComponent, java.util.List, boolean)}.
    */
-
   public void testDecorateJTextComponentListOfObjectBoolean() {
     // TODO: make working
     // AutoCompleteDecorator.decorate(null, null, false);
@@ -45,7 +43,6 @@ public class TestAutoCompleteDecorator extends TestCase {
   /**
    * Test method for {@link ext.AutoCompleteDecorator#decorate(javax.swing.text.JTextComponent, java.util.List, boolean, org.jdesktop.swingx.autocomplete.ObjectToStringConverter)}.
    */
-
   public void testDecorateJTextComponentListOfObjectBooleanObjectToStringConverter() {
     // TODO: make working
     // AutoCompleteDecorator.decorate(null, null, false, null);
@@ -54,10 +51,8 @@ public class TestAutoCompleteDecorator extends TestCase {
   /**
    * Test method for {@link ext.AutoCompleteDecorator#decorate(javax.swing.JList, javax.swing.text.JTextComponent)}.
    */
-
   public void testDecorateJListJTextComponent() {
     AutoCompleteDecorator.decorate(new JList(), new JTextComponent() {
-
       private static final long serialVersionUID = 1L;
 
       /* (non-Javadoc)
@@ -67,14 +62,12 @@ public class TestAutoCompleteDecorator extends TestCase {
       public String getText() {
         return "testtext";
       }
-
     });
   }
 
   /**
    * Test method for {@link ext.AutoCompleteDecorator#decorate(javax.swing.JList, javax.swing.text.JTextComponent, org.jdesktop.swingx.autocomplete.ObjectToStringConverter)}.
    */
-
   public void testDecorateJListJTextComponentObjectToStringConverter() {
     // TODO: make working
     //AutoCompleteDecorator.decorate(new JList(), new JTextComponent() {
@@ -84,7 +77,6 @@ public class TestAutoCompleteDecorator extends TestCase {
   /**
    * Test method for {@link ext.AutoCompleteDecorator#decorate(javax.swing.JComboBox)}.
    */
-
   public void testDecorateJComboBox() {
     // TODO: make working
     // AutoCompleteDecorator.decorate(null);
@@ -93,7 +85,6 @@ public class TestAutoCompleteDecorator extends TestCase {
   /**
    * Test method for {@link ext.AutoCompleteDecorator#decorate(javax.swing.JComboBox, org.jdesktop.swingx.autocomplete.ObjectToStringConverter)}.
    */
-
   public void testDecorateJComboBoxObjectToStringConverter() {
     // TODO: make working
     // AutoCompleteDecorator.decorate((JComboBox)null, null);
@@ -102,7 +93,6 @@ public class TestAutoCompleteDecorator extends TestCase {
   /**
    * Test method for {@link ext.AutoCompleteDecorator#decorate(javax.swing.text.JTextComponent, ext.AutoCompleteDocument, org.jdesktop.swingx.autocomplete.AbstractAutoCompleteAdaptor)}.
    */
-
   public void testDecorateJTextComponentAutoCompleteDocumentAbstractAutoCompleteAdaptor() {
     // TODO: make working
     // AutoCompleteDecorator.decorate((JTextComponent)null, null, null);
@@ -110,15 +100,10 @@ public class TestAutoCompleteDecorator extends TestCase {
 
   ///////////////////////7
   // Tests from singx itself
-
-  /** DOCUMENT_ME. */
   private JComboBox combo;
 
-  /* (non-Javadoc)
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
-  protected void setUp() {
+  protected void setUp() throws Exception {
     combo = new JComboBox(new String[] { "Alpha", "Bravo", "Charlie", "Delta" });
   }
 
@@ -131,7 +116,6 @@ public class TestAutoCompleteDecorator extends TestCase {
     int expectedFocusListenerCount = editor.getFocusListeners().length + 3;
     AutoCompleteDecorator.decorate(combo);
     assertEquals(expectedFocusListenerCount, editor.getFocusListeners().length);
-
     //redecorating should not increase listener count
     AutoCompleteDecorator.decorate(combo);
     // TODO: make working
@@ -147,7 +131,6 @@ public class TestAutoCompleteDecorator extends TestCase {
     int expectedKeyListenerCount = editor.getKeyListeners().length + 1;
     AutoCompleteDecorator.decorate(combo);
     assertEquals(expectedKeyListenerCount, editor.getKeyListeners().length);
-
     //redecorating should not increase listener count
     AutoCompleteDecorator.decorate(combo);
     // TODO: make working
@@ -162,11 +145,9 @@ public class TestAutoCompleteDecorator extends TestCase {
     int expectedPropListenerCount = combo.getPropertyChangeListeners("editor").length + 1;
     AutoCompleteDecorator.decorate(combo);
     assertEquals(expectedPropListenerCount, combo.getPropertyChangeListeners("editor").length);
-
     //redecorating should not increase listener count
     AutoCompleteDecorator.decorate(combo);
     // TODO: make working
     // assertEquals(expectedPropListenerCount, combo.getPropertyChangeListeners("editor").length);
   }
-
 }
diff --git a/src/test/java/ext/TestAutoCompleteDocument.java b/src/test/java/ext/TestAutoCompleteDocument.java
index 7be16a8..c194261 100644
--- a/src/test/java/ext/TestAutoCompleteDocument.java
+++ b/src/test/java/ext/TestAutoCompleteDocument.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext;
 
@@ -27,31 +27,28 @@ import javax.swing.JTextField;
 import javax.swing.text.Document;
 import javax.swing.text.JTextComponent;
 
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
+
 import org.jdesktop.swingx.autocomplete.AbstractAutoCompleteAdaptor;
 import org.jdesktop.swingx.autocomplete.ComboBoxAdaptor;
 import org.jdesktop.swingx.autocomplete.ObjectToStringConverter;
 import org.jdesktop.swingx.autocomplete.TextComponentAdaptor;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestAutoCompleteDocument extends JajukTestCase {
-
+public class TestAutoCompleteDocument extends TestCase {
   /**
    * Test method for {@link ext.AutoCompleteDocument#remove(int, int)}.
    *
    * @throws Exception the exception
    */
-
   public void testRemove() throws Exception {
     String[] items = new String[] { "exact", "exacter", "exactest" };
-
     JTextComponent textComponent = new JTextField();
     TextComponentAdaptor adaptor = new TextComponentAdaptor(textComponent, Arrays.asList(items));
     Document document = new AutoCompleteDocument(adaptor, true);
     document.insertString(0, "test", null);
-
     // TODO: this does not work for some reason....
     // document.remove(0, 2);
   }
@@ -62,14 +59,13 @@ public class TestAutoCompleteDocument extends JajukTestCase {
    * {@link ext.AutoCompleteDocument#AutoCompleteDocument(org.jdesktop.swingx.autocomplete.AbstractAutoCompleteAdaptor, boolean, org.jdesktop.swingx.autocomplete.ObjectToStringConverter)}
    * .
    */
-
   public void testAutoCompleteDocumentAbstractAutoCompleteAdaptorBooleanObjectToStringConverter() {
     new AutoCompleteDocument(new ComboBoxAdaptor(new JComboBox()), false, null);
   }
 
   /**
    * Test auto complete document abstract auto complete adaptor boolean object to string converter selected.
-   * DOCUMENT_ME
+   * 
    */
   public void testAutoCompleteDocumentAbstractAutoCompleteAdaptorBooleanObjectToStringConverterSelected() {
     AbstractAutoCompleteAdaptor adaptor = new ComboBoxAdaptor(new JComboBox(new Object[] {
@@ -79,7 +75,6 @@ public class TestAutoCompleteDocument extends JajukTestCase {
     assertNotNull(adaptor.getSelectedItem());
     assertNotNull(adaptor.getSelectedItemAsString());
     new AutoCompleteDocument(adaptor, false, new ObjectToStringConverter() {
-
       @Override
       public String getPreferredStringForItem(Object obj) {
         return null;
@@ -93,7 +88,6 @@ public class TestAutoCompleteDocument extends JajukTestCase {
    * {@link ext.AutoCompleteDocument#AutoCompleteDocument(org.jdesktop.swingx.autocomplete.AbstractAutoCompleteAdaptor, boolean)}
    * .
    */
-
   public void testAutoCompleteDocumentAbstractAutoCompleteAdaptorBoolean() {
     new AutoCompleteDocument(new ComboBoxAdaptor(new JComboBox()), false);
   }
@@ -101,12 +95,10 @@ public class TestAutoCompleteDocument extends JajukTestCase {
   /**
    * Test method for {@link ext.AutoCompleteDocument#isStrictMatching()}.
    */
-
   public void testIsStrictMatching() {
     AutoCompleteDocument document = new AutoCompleteDocument(new ComboBoxAdaptor(new JComboBox()),
         false);
     assertFalse(document.isStrictMatching());
-
     document = new AutoCompleteDocument(new ComboBoxAdaptor(new JComboBox()), true);
     assertTrue(document.isStrictMatching());
   }
@@ -118,10 +110,8 @@ public class TestAutoCompleteDocument extends JajukTestCase {
    * {@link ext.AutoCompleteDocument#insertString(int, java.lang.String, javax.swing.text.AttributeSet)}
    * .
    */
-
   public void testInsertStringIntStringAttributeSetStrictMatching() throws Exception {
     String[] items = new String[] { "exact", "exacter", "exactest" };
-
     JTextComponent textComponent = new JTextField();
     TextComponentAdaptor adaptor = new TextComponentAdaptor(textComponent, Arrays.asList(items));
     Document document = new AutoCompleteDocument(adaptor, true);
@@ -130,13 +120,12 @@ public class TestAutoCompleteDocument extends JajukTestCase {
 
   /**
    * Test insert string int string attribute set.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testInsertStringIntStringAttributeSet() throws Exception {
     String[] items = new String[] { "exact", "exacter", "exactest" };
-
     JTextComponent textComponent = new JTextField("012345");
     TextComponentAdaptor adaptor = new TextComponentAdaptor(textComponent, Arrays.asList(items));
     Document document = new AutoCompleteDocument(adaptor, false);
@@ -145,26 +134,21 @@ public class TestAutoCompleteDocument extends JajukTestCase {
 
   /**
    * Test prefer exact match over currently selected.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPreferExactMatchOverCurrentlySelected() throws Exception {
     String[] items = new String[] { "exact", "exacter", "exactest" };
-
     JTextComponent textComponent = new JTextField();
     TextComponentAdaptor adaptor = new TextComponentAdaptor(textComponent, Arrays.asList(items));
     Document document = new AutoCompleteDocument(adaptor, true);
     textComponent.setDocument(document);
-
     textComponent.setText("exacter");
     assertTrue(adaptor.getSelectedItem().equals("exacter"));
-
     document.remove(4, 3);
     assertTrue(adaptor.getSelectedItem().equals("exacter"));
-
     document.insertString(4, "t", null);
     assertTrue(adaptor.getSelectedItem().equals("exact"));
   }
-
 }
diff --git a/src/test/java/ext/TestJScrollingText.java b/src/test/java/ext/TestJScrollingText.java
index 3c9fcfd..c43441b 100644
--- a/src/test/java/ext/TestJScrollingText.java
+++ b/src/test/java/ext/TestJScrollingText.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext;
 
@@ -45,13 +45,12 @@ import java.awt.image.renderable.RenderableImage;
 import java.text.AttributedCharacterIterator;
 import java.util.Map;
 
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestJScrollingText extends JajukTestCase {
-
+public class TestJScrollingText extends TestCase {
   /**
    * Test method for {@link ext.JScrollingText#JScrollingText(String)}.
    */
@@ -89,38 +88,34 @@ public class TestJScrollingText extends JajukTestCase {
   public void testPaintComponent() {
     JScrollingText t = new JScrollingText("teststring");
     assertNotNull(t);
-
     t.paintComponent(new MyGraphics2D());
   }
 
   /**
    * Test paint component opaque.
-   * DOCUMENT_ME
+   * 
    */
   public void testPaintComponentOpaque() {
     JScrollingText t = new JScrollingText("teststring");
-
     t.setOpaque(true);
     t.paintComponent(new MyGraphics2D());
   }
 
   /**
    * Test paint component speed.
-   * DOCUMENT_ME
+   * 
    */
   public void testPaintComponentSpeed() {
     JScrollingText t = new JScrollingText("teststring", 1000);
-
     t.paintComponent(new MyGraphics2D());
   }
 
   /**
    * Test paint component speed zero.
-   * DOCUMENT_ME
+   * 
    */
   public void testPaintComponentSpeedZero() {
     JScrollingText t = new JScrollingText("teststring", 0);
-
     t.paintComponent(new MyGraphics2D());
   }
 
@@ -133,22 +128,19 @@ public class TestJScrollingText extends JajukTestCase {
     JScrollingText t = new JScrollingText("teststring");
     assertNotNull(t);
     t.start();
-
     // have to sleep some time here to make the Timer run at least once
     Thread.sleep(1100);
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private final class MyGraphics2D extends Graphics2D {
-    
     /* (non-Javadoc)
      * @see java.awt.Graphics#setXORMode(java.awt.Color)
      */
     @Override
     public void setXORMode(Color c1) {
-
     }
 
     /* (non-Javadoc)
@@ -156,7 +148,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setPaintMode() {
-
     }
 
     /* (non-Javadoc)
@@ -164,7 +155,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setFont(Font font) {
-
     }
 
     /* (non-Javadoc)
@@ -172,7 +162,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setColor(Color c) {
-
     }
 
     /* (non-Javadoc)
@@ -180,7 +169,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setClip(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -188,7 +176,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setClip(Shape clip) {
-
     }
 
     /* (non-Javadoc)
@@ -196,7 +183,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public FontMetrics getFontMetrics(Font f) {
-
       return new FontMetrics(f) {
         private static final long serialVersionUID = 9139781111511738969L;
 
@@ -214,7 +200,6 @@ public class TestJScrollingText extends JajukTestCase {
         public int getAscent() {
           return 10;
         }
-
       };
     }
 
@@ -223,7 +208,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Font getFont() {
-
       return null;
     }
 
@@ -232,7 +216,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Color getColor() {
-
       return null;
     }
 
@@ -241,7 +224,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Rectangle getClipBounds() {
-
       return null;
     }
 
@@ -250,7 +232,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Shape getClip() {
-
       return null;
     }
 
@@ -259,7 +240,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
-
     }
 
     /* (non-Javadoc)
@@ -267,7 +247,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void fillRect(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -275,7 +254,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
-
     }
 
     /* (non-Javadoc)
@@ -283,7 +261,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void fillOval(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -291,7 +268,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
-
     }
 
     /* (non-Javadoc)
@@ -299,7 +275,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
-
     }
 
     /* (non-Javadoc)
@@ -307,7 +282,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
-
     }
 
     /* (non-Javadoc)
@@ -315,7 +289,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
-
     }
 
     /* (non-Javadoc)
@@ -323,7 +296,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawOval(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -331,7 +303,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawLine(int x1, int y1, int x2, int y2) {
-
     }
 
     /* (non-Javadoc)
@@ -340,7 +311,6 @@ public class TestJScrollingText extends JajukTestCase {
     @Override
     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
         int sx2, int sy2, Color bgcolor, ImageObserver observer) {
-
       return false;
     }
 
@@ -350,7 +320,6 @@ public class TestJScrollingText extends JajukTestCase {
     @Override
     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
         int sx2, int sy2, ImageObserver observer) {
-
       return false;
     }
 
@@ -360,7 +329,6 @@ public class TestJScrollingText extends JajukTestCase {
     @Override
     public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor,
         ImageObserver observer) {
-
       return false;
     }
 
@@ -369,7 +337,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
-
       return false;
     }
 
@@ -378,7 +345,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) {
-
       return false;
     }
 
@@ -387,7 +353,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
-
       return false;
     }
 
@@ -396,7 +361,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
-
     }
 
     /* (non-Javadoc)
@@ -404,7 +368,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void dispose() {
-
     }
 
     /* (non-Javadoc)
@@ -412,7 +375,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Graphics create() {
-
       return null;
     }
 
@@ -421,7 +383,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void copyArea(int x, int y, int width, int height, int dx, int dy) {
-
     }
 
     /* (non-Javadoc)
@@ -429,7 +390,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void clipRect(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -437,7 +397,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void clearRect(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -445,7 +404,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void translate(double tx, double ty) {
-
     }
 
     /* (non-Javadoc)
@@ -453,7 +411,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void translate(int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -461,7 +418,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void transform(AffineTransform Tx) {
-
     }
 
     /* (non-Javadoc)
@@ -469,7 +425,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void shear(double shx, double shy) {
-
     }
 
     /* (non-Javadoc)
@@ -477,7 +432,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setTransform(AffineTransform Tx) {
-
     }
 
     /* (non-Javadoc)
@@ -485,7 +439,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setStroke(Stroke s) {
-
     }
 
     /* (non-Javadoc)
@@ -493,7 +446,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setRenderingHints(Map<?, ?> hints) {
-
     }
 
     /* (non-Javadoc)
@@ -501,7 +453,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setRenderingHint(Key hintKey, Object hintValue) {
-
     }
 
     /* (non-Javadoc)
@@ -509,7 +460,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setPaint(Paint paint) {
-
     }
 
     /* (non-Javadoc)
@@ -517,7 +467,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setComposite(Composite comp) {
-
     }
 
     /* (non-Javadoc)
@@ -525,7 +474,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void setBackground(Color color) {
-
     }
 
     /* (non-Javadoc)
@@ -533,7 +481,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void scale(double sx, double sy) {
-
     }
 
     /* (non-Javadoc)
@@ -541,7 +488,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void rotate(double theta, double x, double y) {
-
     }
 
     /* (non-Javadoc)
@@ -549,7 +495,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void rotate(double theta) {
-
     }
 
     /* (non-Javadoc)
@@ -557,7 +502,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
-
       return false;
     }
 
@@ -566,7 +510,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public AffineTransform getTransform() {
-
       return null;
     }
 
@@ -575,7 +518,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Stroke getStroke() {
-
       return null;
     }
 
@@ -584,7 +526,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public RenderingHints getRenderingHints() {
-
       return null;
     }
 
@@ -593,7 +534,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Object getRenderingHint(Key hintKey) {
-
       return null;
     }
 
@@ -602,7 +542,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Paint getPaint() {
-
       return null;
     }
 
@@ -611,7 +550,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public FontRenderContext getFontRenderContext() {
-
       return null;
     }
 
@@ -620,7 +558,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public GraphicsConfiguration getDeviceConfiguration() {
-
       return null;
     }
 
@@ -629,7 +566,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Composite getComposite() {
-
       return null;
     }
 
@@ -638,7 +574,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public Color getBackground() {
-
       return null;
     }
 
@@ -647,7 +582,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void fill(Shape s) {
-
     }
 
     /* (non-Javadoc)
@@ -655,7 +589,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawString(AttributedCharacterIterator iterator, float x, float y) {
-
     }
 
     /* (non-Javadoc)
@@ -663,7 +596,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawString(AttributedCharacterIterator iterator, int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -671,7 +603,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawString(String str, float x, float y) {
-
     }
 
     /* (non-Javadoc)
@@ -679,7 +610,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawString(String str, int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -687,7 +617,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
-
     }
 
     /* (non-Javadoc)
@@ -695,7 +624,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
-
     }
 
     /* (non-Javadoc)
@@ -703,7 +631,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -711,7 +638,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
-
       return false;
     }
 
@@ -720,7 +646,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void drawGlyphVector(GlyphVector g, float x, float y) {
-
     }
 
     /* (non-Javadoc)
@@ -728,7 +653,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void draw(Shape s) {
-
     }
 
     /* (non-Javadoc)
@@ -736,7 +660,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void clip(Shape s) {
-
     }
 
     /* (non-Javadoc)
@@ -744,7 +667,6 @@ public class TestJScrollingText extends JajukTestCase {
      */
     @Override
     public void addRenderingHints(Map<?, ?> hints) {
-
     }
   }
 }
diff --git a/src/test/java/ext/TestJSplash.java b/src/test/java/ext/TestJSplash.java
index 118dc07..f309ab4 100644
--- a/src/test/java/ext/TestJSplash.java
+++ b/src/test/java/ext/TestJSplash.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,20 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext;
 
 import java.awt.HeadlessException;
 import java.net.URL;
 
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestJSplash extends JajukTestCase {
-
+public class TestJSplash extends TestCase {
   /**
    * Test method for.
    *
@@ -47,7 +46,7 @@ public class TestJSplash extends JajukTestCase {
 
   /**
    * Test j splash2.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -62,7 +61,7 @@ public class TestJSplash extends JajukTestCase {
 
   /**
    * Test j splash null url.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -87,7 +86,6 @@ public class TestJSplash extends JajukTestCase {
       JSplash splash = new JSplash(new URL("http://www.example.com"), true, true, true,
           "copyright", "version", null);
       splash.splashOn();
-
       splash.splashOff();
     } catch (HeadlessException e) {
       // expected when tests are executed without UI support
@@ -143,7 +141,7 @@ public class TestJSplash extends JajukTestCase {
 
   /**
    * Test set progress int string2.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -157,5 +155,4 @@ public class TestJSplash extends JajukTestCase {
       // expected when tests are executed without UI support
     }
   }
-
 }
diff --git a/src/test/java/ext/TestJSplashLabel.java b/src/test/java/ext/TestJSplashLabel.java
index 0190b0d..2e9afea 100644
--- a/src/test/java/ext/TestJSplashLabel.java
+++ b/src/test/java/ext/TestJSplashLabel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext;
 
@@ -46,14 +46,14 @@ import java.net.URL;
 import java.text.AttributedCharacterIterator;
 import java.util.Map;
 
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
+
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestJSplashLabel extends JajukTestCase {
-
+public class TestJSplashLabel extends TestCase {
   /**
    * Test method for.
    *
@@ -67,7 +67,7 @@ public class TestJSplashLabel extends JajukTestCase {
 
   /**
    * Test j splash label url.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -77,7 +77,7 @@ public class TestJSplashLabel extends JajukTestCase {
 
   /**
    * Test j splash label font.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -98,16 +98,14 @@ public class TestJSplashLabel extends JajukTestCase {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private final class MyGraphics2D extends Graphics2D {
-    
     /* (non-Javadoc)
      * @see java.awt.Graphics#setXORMode(java.awt.Color)
      */
     @Override
     public void setXORMode(Color c1) {
-
     }
 
     /* (non-Javadoc)
@@ -115,7 +113,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setPaintMode() {
-
     }
 
     /* (non-Javadoc)
@@ -123,7 +120,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setFont(Font font) {
-
     }
 
     /* (non-Javadoc)
@@ -131,7 +127,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setColor(Color c) {
-
     }
 
     /* (non-Javadoc)
@@ -139,7 +134,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setClip(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -147,7 +141,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setClip(Shape clip) {
-
     }
 
     /* (non-Javadoc)
@@ -155,7 +148,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public FontMetrics getFontMetrics(Font f) {
-
       return new FontMetrics(f) {
         private static final long serialVersionUID = 9139781111511738969L;
 
@@ -173,7 +165,6 @@ public class TestJSplashLabel extends JajukTestCase {
         public int getAscent() {
           return 10;
         }
-
       };
     }
 
@@ -182,7 +173,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Font getFont() {
-
       return null;
     }
 
@@ -191,7 +181,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Color getColor() {
-
       return null;
     }
 
@@ -200,7 +189,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Rectangle getClipBounds() {
-
       return null;
     }
 
@@ -209,7 +197,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Shape getClip() {
-
       return null;
     }
 
@@ -218,7 +205,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
-
     }
 
     /* (non-Javadoc)
@@ -226,7 +212,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void fillRect(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -234,7 +219,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
-
     }
 
     /* (non-Javadoc)
@@ -242,7 +226,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void fillOval(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -250,7 +233,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
-
     }
 
     /* (non-Javadoc)
@@ -258,7 +240,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
-
     }
 
     /* (non-Javadoc)
@@ -266,7 +247,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
-
     }
 
     /* (non-Javadoc)
@@ -274,7 +254,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
-
     }
 
     /* (non-Javadoc)
@@ -282,7 +261,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawOval(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -290,7 +268,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawLine(int x1, int y1, int x2, int y2) {
-
     }
 
     /* (non-Javadoc)
@@ -299,7 +276,6 @@ public class TestJSplashLabel extends JajukTestCase {
     @Override
     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
         int sx2, int sy2, Color bgcolor, ImageObserver observer) {
-
       return false;
     }
 
@@ -309,7 +285,6 @@ public class TestJSplashLabel extends JajukTestCase {
     @Override
     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
         int sx2, int sy2, ImageObserver observer) {
-
       return false;
     }
 
@@ -319,7 +294,6 @@ public class TestJSplashLabel extends JajukTestCase {
     @Override
     public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor,
         ImageObserver observer) {
-
       return false;
     }
 
@@ -328,7 +302,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
-
       return false;
     }
 
@@ -337,7 +310,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) {
-
       return false;
     }
 
@@ -346,7 +318,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
-
       return false;
     }
 
@@ -355,7 +326,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
-
     }
 
     /* (non-Javadoc)
@@ -363,7 +333,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void dispose() {
-
     }
 
     /* (non-Javadoc)
@@ -371,7 +340,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Graphics create() {
-
       return null;
     }
 
@@ -380,7 +348,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void copyArea(int x, int y, int width, int height, int dx, int dy) {
-
     }
 
     /* (non-Javadoc)
@@ -388,7 +355,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void clipRect(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -396,7 +362,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void clearRect(int x, int y, int width, int height) {
-
     }
 
     /* (non-Javadoc)
@@ -404,7 +369,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void translate(double tx, double ty) {
-
     }
 
     /* (non-Javadoc)
@@ -412,7 +376,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void translate(int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -420,7 +383,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void transform(AffineTransform Tx) {
-
     }
 
     /* (non-Javadoc)
@@ -428,7 +390,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void shear(double shx, double shy) {
-
     }
 
     /* (non-Javadoc)
@@ -436,7 +397,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setTransform(AffineTransform Tx) {
-
     }
 
     /* (non-Javadoc)
@@ -444,7 +404,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setStroke(Stroke s) {
-
     }
 
     /* (non-Javadoc)
@@ -452,7 +411,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setRenderingHints(Map<?, ?> hints) {
-
     }
 
     /* (non-Javadoc)
@@ -460,7 +418,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setRenderingHint(Key hintKey, Object hintValue) {
-
     }
 
     /* (non-Javadoc)
@@ -468,7 +425,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setPaint(Paint paint) {
-
     }
 
     /* (non-Javadoc)
@@ -476,7 +432,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setComposite(Composite comp) {
-
     }
 
     /* (non-Javadoc)
@@ -484,7 +439,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void setBackground(Color color) {
-
     }
 
     /* (non-Javadoc)
@@ -492,7 +446,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void scale(double sx, double sy) {
-
     }
 
     /* (non-Javadoc)
@@ -500,7 +453,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void rotate(double theta, double x, double y) {
-
     }
 
     /* (non-Javadoc)
@@ -508,7 +460,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void rotate(double theta) {
-
     }
 
     /* (non-Javadoc)
@@ -516,7 +467,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
-
       return false;
     }
 
@@ -525,7 +475,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public AffineTransform getTransform() {
-
       return null;
     }
 
@@ -534,7 +483,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Stroke getStroke() {
-
       return null;
     }
 
@@ -543,7 +491,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public RenderingHints getRenderingHints() {
-
       return null;
     }
 
@@ -552,7 +499,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Object getRenderingHint(Key hintKey) {
-
       return null;
     }
 
@@ -561,7 +507,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Paint getPaint() {
-
       return null;
     }
 
@@ -570,7 +515,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public FontRenderContext getFontRenderContext() {
-
       return null;
     }
 
@@ -579,7 +523,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public GraphicsConfiguration getDeviceConfiguration() {
-
       return null;
     }
 
@@ -588,7 +531,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Composite getComposite() {
-
       return null;
     }
 
@@ -597,7 +539,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public Color getBackground() {
-
       return null;
     }
 
@@ -606,7 +547,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void fill(Shape s) {
-
     }
 
     /* (non-Javadoc)
@@ -614,7 +554,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawString(AttributedCharacterIterator iterator, float x, float y) {
-
     }
 
     /* (non-Javadoc)
@@ -622,7 +561,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawString(AttributedCharacterIterator iterator, int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -630,7 +568,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawString(String str, float x, float y) {
-
     }
 
     /* (non-Javadoc)
@@ -638,7 +575,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawString(String str, int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -646,7 +582,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
-
     }
 
     /* (non-Javadoc)
@@ -654,7 +589,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
-
     }
 
     /* (non-Javadoc)
@@ -662,7 +596,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {
-
     }
 
     /* (non-Javadoc)
@@ -670,7 +603,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
-
       return false;
     }
 
@@ -679,7 +611,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void drawGlyphVector(GlyphVector g, float x, float y) {
-
     }
 
     /* (non-Javadoc)
@@ -687,7 +618,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void draw(Shape s) {
-
     }
 
     /* (non-Javadoc)
@@ -695,7 +625,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void clip(Shape s) {
-
     }
 
     /* (non-Javadoc)
@@ -703,7 +632,6 @@ public class TestJSplashLabel extends JajukTestCase {
      */
     @Override
     public void addRenderingHints(Map<?, ?> hints) {
-
     }
   }
 }
diff --git a/src/test/java/ext/scrollablepopupmenu/TestXCheckedButton.java b/src/test/java/ext/scrollablepopupmenu/TestXCheckedButton.java
index be463f3..9887776 100644
--- a/src/test/java/ext/scrollablepopupmenu/TestXCheckedButton.java
+++ b/src/test/java/ext/scrollablepopupmenu/TestXCheckedButton.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.scrollablepopupmenu;
 
@@ -31,14 +31,14 @@ import javax.swing.DefaultButtonModel;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
 
+import junit.framework.TestCase;
+
 import org.apache.commons.lang.ArrayUtils;
-import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestXCheckedButton extends JajukTestCase {
-
+public class TestXCheckedButton extends TestCase {
   /**
    * Test method for.
    *
@@ -56,20 +56,17 @@ public class TestXCheckedButton extends JajukTestCase {
    */
   public final void testXCheckedButtonAction() {
     new XCheckedButton(new Action() {
-
       @Override
       public void addPropertyChangeListener(PropertyChangeListener listener) {
       }
 
       @Override
       public Object getValue(String key) {
-
         return null;
       }
 
       @Override
       public boolean isEnabled() {
-
         return false;
       }
 
@@ -129,7 +126,6 @@ public class TestXCheckedButton extends JajukTestCase {
   public final void testDisplayIcon() {
     XCheckedButton button = new XCheckedButton("testtext", new DummyIcon());
     button.displayIcon(false);
-
     button.displayIcon(true);
   }
 
@@ -178,16 +174,14 @@ public class TestXCheckedButton extends JajukTestCase {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public class DummyIcon implements Icon {
-    
     /* (non-Javadoc)
      * @see javax.swing.Icon#getIconHeight()
      */
     @Override
     public int getIconHeight() {
-
       return 0;
     }
 
@@ -196,7 +190,6 @@ public class TestXCheckedButton extends JajukTestCase {
      */
     @Override
     public int getIconWidth() {
-
       return 0;
     }
 
@@ -210,14 +203,13 @@ public class TestXCheckedButton extends JajukTestCase {
 
   /**
    * Test mouse adapter.
-   * DOCUMENT_ME
+   * 
    */
   public void testMouseAdapter() {
     XCheckedButton button = new XCheckedButton("testtext", new DummyIcon());
     // we should have at least one a mouse listener on the button
     assertTrue(ArrayUtils.toString(button.getMouseListeners()),
         button.getMouseListeners().length > 0);
-
     // none of them looks at the actual event right now...
     button.getMouseListeners()[1].mousePressed(null);
     button.getMouseListeners()[1].mouseEntered(null);
@@ -226,17 +218,14 @@ public class TestXCheckedButton extends JajukTestCase {
 
   /**
    * Test model.
-   * DOCUMENT_ME
+   * 
    */
   public void testModel() {
     XCheckedButton button = new XCheckedButton("testtext", new DummyIcon());
     assertNotNull(button.getModel());
-
     button.setSelected(true);
     button.setSelected(false);
-
     ((DefaultButtonModel) button.getModel()).setGroup(new ButtonGroup());
-
     button.setSelected(true);
     button.setSelected(false);
   }
diff --git a/src/test/java/ext/scrollablepopupmenu/TestXJPopupMenu.java b/src/test/java/ext/scrollablepopupmenu/TestXJPopupMenu.java
index 202578f..df66ab8 100644
--- a/src/test/java/ext/scrollablepopupmenu/TestXJPopupMenu.java
+++ b/src/test/java/ext/scrollablepopupmenu/TestXJPopupMenu.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.scrollablepopupmenu;
 
@@ -24,13 +24,12 @@ import java.awt.HeadlessException;
 
 import javax.swing.AbstractButton;
 
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestXJPopupMenu extends JajukTestCase {
-
+public class TestXJPopupMenu extends TestCase {
   /**
    * Test method for {@link ext.scrollablepopupmenu.XJPopupMenu#removeAll()}.
    */
@@ -140,5 +139,4 @@ public class TestXJPopupMenu extends JajukTestCase {
       // happens if run without GUI support
     }
   }
-
 }
diff --git a/src/test/java/ext/services/lastfm/TestFullSubmissionData.java b/src/test/java/ext/services/lastfm/TestFullSubmissionData.java
index f55e8d4..b148b7d 100644
--- a/src/test/java/ext/services/lastfm/TestFullSubmissionData.java
+++ b/src/test/java/ext/services/lastfm/TestFullSubmissionData.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,17 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.lastfm;
 
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestFullSubmissionData extends JajukTestCase {
-
+public class TestFullSubmissionData extends TestCase {
   /**
    * Test method for.
    *
diff --git a/src/test/java/ext/services/lastfm/TestLastFmAlbum.java b/src/test/java/ext/services/lastfm/TestLastFmAlbum.java
index 19fd511..2e11694 100644
--- a/src/test/java/ext/services/lastfm/TestLastFmAlbum.java
+++ b/src/test/java/ext/services/lastfm/TestLastFmAlbum.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.lastfm;
 
@@ -25,43 +25,41 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Locale;
 
-import net.roarsoftware.lastfm.Album;
-import net.roarsoftware.lastfm.CallException;
-import net.roarsoftware.lastfm.Playlist;
+import junit.framework.TestCase;
+import de.umass.lastfm.Album;
+import de.umass.lastfm.CallException;
+import de.umass.lastfm.Playlist;
 
-import org.jajuk.JUnitHelpers;
-import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.util.IconLoader;
 import org.jajuk.util.UtilString;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestLastFmAlbum extends JajukTestCase {
-  
-  /** The Constant API_KEY.  DOCUMENT_ME */
+public class TestLastFmAlbum extends TestCase {
+  /** The Constant API_KEY.   */
   private static final String API_KEY = "711591ss6q695ps349o6681pr1oq1467";
 
   /**
    * Test method for.
    *
-   * {@link ext.services.lastfm.LastFmAlbum#getAlbum(net.roarsoftware.lastfm.Album, net.roarsoftware.lastfm.Playlist)}
+   * {@link ext.services.lastfm.LastFmAlbum#getAlbum(de.umass.lastfm.Album, de.umass.lastfm.Playlist)}
    * .
    */
   public void testGetAlbum() {
-    Album a = Album.getInfo("Red Hot Chilli Peppers", "By The Way", UtilString.rot13(API_KEY));
+    Album a = Album.getInfo("Red Hot Chili Peppers", "By The Way", UtilString.rot13(API_KEY));
     assertNotNull(a);
     LastFmAlbum.getAlbum(a, null);
   }
 
   /**
    * Test get album playlist.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetAlbumPlaylist() {
-    Album a = Album.getInfo("Red Hot Chilli Peppers", "By The Way", UtilString.rot13(API_KEY));
+    Album a = Album.getInfo("Red Hot Chili Peppers", "By The Way", UtilString.rot13(API_KEY));
     assertNotNull(a);
-
     try { // may fail if internet is not available
       Playlist p = Playlist.fetchAlbumPlaylist(a.getId(), UtilString.rot13(API_KEY));
       assertNotNull(p);
@@ -69,7 +67,6 @@ public class TestLastFmAlbum extends JajukTestCase {
       // ignore for now if it contains an UnknownHostException inside
       assertTrue(e.getMessage(), e.getCause() instanceof UnknownHostException);
     }
-
     /**
      * TODO: find out how to get a Session here...
      * 
@@ -97,14 +94,11 @@ public class TestLastFmAlbum extends JajukTestCase {
   public void testGetArtistUrl() {
     LastFmAlbum album = new LastFmAlbum();
     assertNull(album.getArtistUrl());
-
     album.setUrl("testurl");
     assertEquals("testurl", album.getArtistUrl());
-
     // cuts off after last path...
     album.setUrl("http://test.url/url1/url2/url3/test123.html");
     assertEquals("http://test.url/url1/url2/url3", album.getArtistUrl());
-
   }
 
   /**
@@ -115,7 +109,6 @@ public class TestLastFmAlbum extends JajukTestCase {
     assertNull(album.getBigCoverURL());
     album.setBigCoverURL("bigurl");
     assertEquals("bigurl", album.getBigCoverURL());
-
   }
 
   /**
@@ -124,7 +117,6 @@ public class TestLastFmAlbum extends JajukTestCase {
   public void testGetCover() {
     LastFmAlbum album = new LastFmAlbum();
     assertNull(album.getCover());
-
     assertNotNull(IconLoader.getNoCoverIcon(50));
     album.setCover(IconLoader.getNoCoverIcon(50));
     assertNotNull(album.getCover());
@@ -149,14 +141,14 @@ public class TestLastFmAlbum extends JajukTestCase {
     LastFmAlbum album = new LastFmAlbum();
     assertNull(album.getReleaseDate());
     album.setReleaseDateString("1 January 2009, 00:00");
-    assertEquals(new SimpleDateFormat("d MMM yyyy, HH:mm", Locale.ENGLISH)
-        .parse("1 January 2009, 00:00"), album.getReleaseDate());
-
+    assertEquals(
+        new SimpleDateFormat("d MMM yyyy, HH:mm", Locale.ENGLISH).parse("1 January 2009, 00:00"),
+        album.getReleaseDate());
   }
 
   /**
    * Test get release date invalid.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetReleaseDateInvalid() {
     LastFmAlbum album = new LastFmAlbum();
@@ -206,7 +198,6 @@ public class TestLastFmAlbum extends JajukTestCase {
     ArrayList<TrackInfo> tracks = new ArrayList<TrackInfo>();
     album.setTracks(tracks);
     assertNotNull(album.getTracks());
-
     album.setTracks(null);
     assertNull(album.getTracks());
   }
@@ -318,13 +309,11 @@ public class TestLastFmAlbum extends JajukTestCase {
    */
   public void testToString() {
     LastFmAlbum album = new LastFmAlbum();
-    JUnitHelpers.ToStringTest(album);
-
+    TestHelpers.ToStringTest(album);
     album.setArtist("artist");
     album.setBigCoverURL("url");
-    JUnitHelpers.ToStringTest(album);
-
+    TestHelpers.ToStringTest(album);
     album.setTitle("title");
-    JUnitHelpers.ToStringTest(album);
+    TestHelpers.ToStringTest(album);
   }
 }
diff --git a/src/test/java/ext/services/lastfm/TestLastFmAlbumList.java b/src/test/java/ext/services/lastfm/TestLastFmAlbumList.java
index 58fe9fd..74c99a3 100644
--- a/src/test/java/ext/services/lastfm/TestLastFmAlbumList.java
+++ b/src/test/java/ext/services/lastfm/TestLastFmAlbumList.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,24 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.lastfm;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import net.roarsoftware.lastfm.Album;
+import junit.framework.TestCase;
+import de.umass.lastfm.Album;
 
-import org.jajuk.JajukTestCase;
 import org.jajuk.util.UtilString;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestLastFmAlbumList extends JajukTestCase {
-  
-  /** The Constant API_KEY.  DOCUMENT_ME */
+public class TestLastFmAlbumList extends TestCase {
+  /** The Constant API_KEY.   */
   private static final String API_KEY = "711591ss6q695ps349o6681pr1oq1467";
 
   /**
@@ -44,8 +43,7 @@ public class TestLastFmAlbumList extends JajukTestCase {
    */
   public void testGetAlbumList() {
     List<Album> list = getAlbumList();
-
-    AlbumListInfo info = LastFmAlbumList.getAlbumList(list, "Red Hot Chilli Peppers");
+    AlbumListInfo info = LastFmAlbumList.getAlbumList(list, "Red Hot Chili Peppers");
     assertNotNull(info);
     assertEquals(2, info.getAlbums().size());
   }
@@ -56,9 +54,9 @@ public class TestLastFmAlbumList extends JajukTestCase {
    * @return the album list
    */
   private List<Album> getAlbumList() {
-    Album a1 = Album.getInfo("Red Hot Chilli Peppers", "By The Way", UtilString.rot13(API_KEY));
-    Album a2 = Album.getInfo("Red Hot Chilli Peppers", "Stadium Arcadium", UtilString
-        .rot13(API_KEY));
+    Album a1 = Album.getInfo("Red Hot Chili Peppers", "By The Way", UtilString.rot13(API_KEY));
+    Album a2 = Album.getInfo("Red Hot Chili Peppers", "Stadium Arcadium",
+        UtilString.rot13(API_KEY));
     List<Album> list = new ArrayList<Album>();
     list.add(a1);
     list.add(a2);
@@ -70,16 +68,12 @@ public class TestLastFmAlbumList extends JajukTestCase {
    */
   public void testGetAlbums() {
     LastFmAlbumList list = new LastFmAlbumList();
-
     List<AlbumInfo> info = new ArrayList<AlbumInfo>();
     LastFmAlbum album = new LastFmAlbum();
     album.setTitle("testtitle");
     info.add(album);
-
     list.setAlbums(info);
-
     assertNotNull(list.getAlbums());
-
     list.setAlbums(null);
     assertNull(list.getAlbums());
   }
@@ -90,7 +84,6 @@ public class TestLastFmAlbumList extends JajukTestCase {
   public void testGetArtist() {
     LastFmAlbumList list = new LastFmAlbumList();
     assertNull(list.getArtist());
-
     list.setArtist("testartist");
     assertEquals("testartist", list.getArtist());
   }
diff --git a/src/test/java/ext/services/lastfm/TestLastFmAlbumsRunnable.java b/src/test/java/ext/services/lastfm/TestLastFmAlbumsRunnable.java
index bda11a4..27acfb4 100644
--- a/src/test/java/ext/services/lastfm/TestLastFmAlbumsRunnable.java
+++ b/src/test/java/ext/services/lastfm/TestLastFmAlbumsRunnable.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,26 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.lastfm;
 
 import java.awt.Image;
-import java.io.File;
 import java.util.List;
 
 import javax.swing.SwingUtilities;
 
-import org.jajuk.JUnitHelpers;
-import org.jajuk.JajukTestCase;
-import org.jajuk.base.Track;
-import org.jajuk.util.Const;
+import junit.framework.TestCase;
+
+import org.jajuk.TestHelpers;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestLastFmAlbumsRunnable extends JajukTestCase {
-
+public class TestLastFmAlbumsRunnable extends TestCase {
   /**
    * Test method for.
    *
@@ -66,17 +63,14 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
     // first run it normally
     new LastFmAlbumsRunnable(new MyContextListener(), LastFmService.getInstance(),
         new MyAudioObject(), 1).run();
-
     // then run it in the background
-    LastFmAlbumsRunnable runnable = new LastFmAlbumsRunnable(new MyContextListener(), LastFmService
-        .getInstance(), new MyAudioObject(), 1);
+    LastFmAlbumsRunnable runnable = new LastFmAlbumsRunnable(new MyContextListener(),
+        LastFmService.getInstance(), new MyAudioObject(), 1);
     SwingUtilities.invokeLater(runnable);
-
     // and tell it to interrupt at some point
     runnable.interrupt();
-
     // now wait for it to finish
-    JUnitHelpers.clearSwingUtilitiesQueue();
+    TestHelpers.clearSwingUtilitiesQueue();
   }
 
   /**
@@ -92,98 +86,14 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
   }
 
   /**
-   * Test method for.
-   *
-   * @throws Exception the exception
-   * {@link ext.services.lastfm.LastFmAlbumsRunnable#getImageForAudioFile(org.jajuk.base.Track, int, int)}
    * .
    */
-  public void testGetImageForAudioFileNone() throws Exception {
-    LastFmAlbumsRunnable.getImageForAudioFile(JUnitHelpers.getTrack(2), 100, 100);
-  }
-
-  /**
-   * Test get image for audio file not exists.
-   * DOCUMENT_ME
-   */
-  public void testGetImageForAudioFileNotExists() {
-    Track track = JUnitHelpers.getTrack(3);
-    track.getAlbum().setProperty(Const.XML_ALBUM_DISCOVERED_COVER,
-        System.getProperty("java.io.tmpdir") + "nonexist"); // don't read covers
-    // for
-    LastFmAlbumsRunnable.getImageForAudioFile(track, 100, 100);
-  }
-
-  /**
-   * Test get image for audio file exists.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testGetImageForAudioFileExists() throws Exception {
-    Track track = JUnitHelpers.getTrack(3);
-    File file = File.createTempFile("test", ".img");
-    track.getAlbum().setProperty(Const.XML_ALBUM_DISCOVERED_COVER, file.getAbsolutePath()); 
-    assertNotNull(LastFmAlbumsRunnable.getImageForAudioFile(track, 200, 100));
-
-    // TODO: cleanup does not work on Windows because the file seems to still be
-    // used somewhere
-    file.delete();
-  }
-
-  /**
-   * Test get image for audio file exists max size.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testGetImageForAudioFileExistsMaxSize() throws Exception {
-    Track track = JUnitHelpers.getTrack(3);
-    File file = File.createTempFile("test", ".img");
-    track.getAlbum().setProperty(Const.XML_ALBUM_DISCOVERED_COVER, file.getAbsolutePath()); // don't
-    // read
-    // covers
-    // for
-
-    assertNotNull(LastFmAlbumsRunnable.getImageForAudioFile(track, 100, 200));
-
-    // TODO: cleanup does not work on Windows because the file seems to still be
-    // used somewhere
-    file.delete();
-  }
-
-  /**
-   * Test get image for audio file exists no resize.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testGetImageForAudioFileExistsNoResize() throws Exception {
-    Track track = JUnitHelpers.getTrack(3);
-    File file = File.createTempFile("test", ".img");
-    track.getAlbum().setProperty(Const.XML_ALBUM_DISCOVERED_COVER, file.getAbsolutePath()); // don't
-    // read
-    // covers
-    // for
-
-    assertNotNull(LastFmAlbumsRunnable.getImageForAudioFile(track, -1, -1));
-
-    // TODO: cleanup does not work on Windows because the file seems to still be
-    // used somewhere
-    file.delete();
-  }
-
-  /**
-   * DOCUMENT_ME.
-   */
   private final class MyContextListener implements ContextListener {
-    
     /* (non-Javadoc)
      * @see ext.services.lastfm.ContextListener#setLastArtistRetrieved(java.lang.String, long)
      */
     @Override
     public void setLastArtistRetrieved(String artist, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -191,7 +101,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void setLastAlbumRetrieved(String album, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -199,7 +108,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void setImage(Image img, AudioObject ao, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -207,7 +115,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void setAlbums(List<? extends AlbumInfo> album, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -215,7 +122,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void setAlbum(AlbumInfo album, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -223,7 +129,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void notifyWikiInfoRetrieved(String wikiText, String wikiURL, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -231,7 +136,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void notifyStartRetrievingCovers(long id) {
-
     }
 
     /* (non-Javadoc)
@@ -239,7 +143,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void notifyStartRetrievingArtistImages(long id) {
-
     }
 
     /* (non-Javadoc)
@@ -247,7 +150,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void notifyFinishGetSimilarArtist(ArtistInfo a, Image img, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -255,7 +157,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void notifyCoverRetrieved(AlbumInfo album, Image cover, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -263,7 +164,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void notifyArtistImage(Image img, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -271,7 +171,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void notifyAlbumRetrieved(AudioObject file, long id) {
-
     }
 
     /* (non-Javadoc)
@@ -279,16 +178,14 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public List<AlbumInfo> getAlbums() {
-
       return null;
     }
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private class MyAudioObject implements AudioObject {
-
     /*
      * (non-Javadoc)
      * 
@@ -296,7 +193,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getAlbum() {
-
       return "By The Way";
     }
 
@@ -307,8 +203,7 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getAlbumArtist() {
-
-      return "Red Hot Chilli Peppers";
+      return "Red Hot Chili Peppers";
     }
 
     /*
@@ -318,7 +213,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getArtist() {
-
       return "Red Hot Chilli Peppers";
     }
 
@@ -329,7 +223,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public long getBitrate() {
-
       return 0;
     }
 
@@ -340,7 +233,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getComposer() {
-
       return null;
     }
 
@@ -351,7 +243,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public Integer getDiscNumber() {
-
       return null;
     }
 
@@ -362,7 +253,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public long getDuration() {
-
       return 0;
     }
 
@@ -373,7 +263,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public int getFrequency() {
-
       return 0;
     }
 
@@ -384,7 +273,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getGenre() {
-
       return null;
     }
 
@@ -395,7 +283,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getLyrics() {
-
       return null;
     }
 
@@ -406,7 +293,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public int getStars() {
-
       return 0;
     }
 
@@ -417,7 +303,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getTitle() {
-
       return null;
     }
 
@@ -428,7 +313,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getTitleOrFileName() {
-
       return null;
     }
 
@@ -439,7 +323,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public Integer getTrackNumber() {
-
       return null;
     }
 
@@ -450,7 +333,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getUrl() {
-
       return null;
     }
 
@@ -461,7 +343,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public String getYear() {
-
       return null;
     }
 
@@ -472,7 +353,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public boolean isSeekable() {
-
       return false;
     }
 
@@ -483,8 +363,6 @@ public class TestLastFmAlbumsRunnable extends JajukTestCase {
      */
     @Override
     public void setStars(int stars) {
-
     }
-
   }
 }
diff --git a/src/test/java/ext/services/lastfm/TestLastFmCache.java b/src/test/java/ext/services/lastfm/TestLastFmCache.java
index 466d962..6c479dd 100644
--- a/src/test/java/ext/services/lastfm/TestLastFmCache.java
+++ b/src/test/java/ext/services/lastfm/TestLastFmCache.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.lastfm;
 
@@ -25,29 +25,19 @@ import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.jajuk.JUnitHelpers;
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestLastFmCache extends JajukTestCase {
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
+public class TestLastFmCache extends TestCase {
   @Override
   protected void setUp() throws Exception {
-    JUnitHelpers.createSessionDirectory();
-
+    super.setUp();
     // make sure the cache is cleaned up front to not find items from previous
     // runs
     LastFmCache cache = new LastFmCache();
     cache.clearCache();
-
-    super.setUp();
   }
 
   /**
@@ -66,7 +56,6 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveAlbumCover() {
     LastFmCache cache = new LastFmCache();
-
     LastFmAlbum album = new LastFmAlbum();
     album.setBigCoverURL("testurl");
     assertNull(cache.retrieveAlbumCover(album));
@@ -80,7 +69,6 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveAlbumInfo() {
     LastFmCache cache = new LastFmCache();
-
     assertNull(cache.retrieveAlbumInfo("Red Hot Chili Peppers", "By the way"));
   }
 
@@ -92,7 +80,6 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveArtistInfo() {
     LastFmCache cache = new LastFmCache();
-
     assertNull(cache.retrieveArtistInfo("Red Hot Chili Peppers"));
   }
 
@@ -104,10 +91,8 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveArtistImage() {
     LastFmCache cache = new LastFmCache();
-
     LastFmSimilarArtists artists = new LastFmSimilarArtists();
     artists.setArtistName("Red Hot Chili Peppers");
-
     assertNull(cache.retrieveArtistImage(artists));
   }
 
@@ -119,7 +104,6 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveAlbumList() {
     LastFmCache cache = new LastFmCache();
-
     assertNull(cache.retrieveAlbumList("Red Hot Chili Peppers"));
   }
 
@@ -131,7 +115,6 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveArtistSimilar() {
     LastFmCache cache = new LastFmCache();
-
     assertNull(cache.retrieveArtistSimilar("Red Hot Chili Peppers"));
   }
 
@@ -143,7 +126,6 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveArtistThumbImage() {
     LastFmCache cache = new LastFmCache();
-
     LastFmArtist artist = new LastFmArtist();
     artist.setName("Red Hot Chili Peppers");
     assertNull(cache.retrieveArtistThumbImage(artist));
@@ -157,7 +139,6 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testRetrieveArtistWiki() {
     LastFmCache cache = new LastFmCache();
-
     assertNull(cache.retrieveArtistWiki("Red Hot Chili Peppers"));
   }
 
@@ -169,14 +150,10 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreAlbumCover() {
     LastFmCache cache = new LastFmCache();
-
     LastFmAlbum album = new LastFmAlbum();
     album.setBigCoverURL("testurl");
-
     Image cover = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
-
     cache.storeAlbumCover(album, cover);
-
     assertNotNull(cache.retrieveAlbumCover(album));
     assertEquals(10, cache.retrieveAlbumCover(album).getHeight(null));
   }
@@ -189,12 +166,9 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreAlbumInfo() {
     LastFmCache cache = new LastFmCache();
-
     LastFmAlbum album = new LastFmAlbum();
     album.setBigCoverURL("testurl");
-
     cache.storeAlbumInfo("Red Hot Chili Peppers", "By the way", album);
-
     assertNotNull(cache.retrieveAlbumInfo("Red Hot Chili Peppers", "By the way"));
   }
 
@@ -206,12 +180,9 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreArtistInfo() {
     LastFmCache cache = new LastFmCache();
-
     LastFmArtist artist = new LastFmArtist();
     artist.setName("Red Hot Chili Peppers");
-
     cache.storeArtistInfo("Red Hot Chili Peppers", artist);
-
     assertNotNull(cache.retrieveArtistInfo("Red Hot Chili Peppers"));
     assertEquals("Red Hot Chili Peppers", cache.retrieveArtistInfo("Red Hot Chili Peppers")
         .getName());
@@ -225,13 +196,10 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreArtistImage() {
     LastFmCache cache = new LastFmCache();
-
     LastFmSimilarArtists artists = new LastFmSimilarArtists();
     artists.setArtistName("Red Hot Chili Peppers");
-
     Image cover = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
     cache.storeArtistImage(artists, cover);
-
     assertNotNull(cache.retrieveArtistImage(artists));
     assertEquals(10, cache.retrieveArtistImage(artists).getHeight(null));
   }
@@ -244,9 +212,7 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreAlbumList() {
     LastFmCache cache = new LastFmCache();
-
     LastFmAlbumList list = new LastFmAlbumList();
-
     LastFmAlbum album1 = new LastFmAlbum();
     album1.setTitle("Test1");
     LastFmAlbum album2 = new LastFmAlbum();
@@ -254,16 +220,12 @@ public class TestLastFmCache extends JajukTestCase {
     List<AlbumInfo> alist = new ArrayList<AlbumInfo>();
     alist.add(album1);
     alist.add(album2);
-
     list.setAlbums(alist);
-
     cache.storeAlbumList("Red Hot Chili Peppers", list);
-
     assertNotNull(cache.retrieveAlbumList("Red Hot Chili Peppers"));
     assertNotNull(cache.retrieveAlbumList("Red Hot Chili Peppers").getAlbums());
     assertEquals(cache.retrieveAlbumList("Red Hot Chili Peppers").getAlbums().toString(), 2, cache
         .retrieveAlbumList("Red Hot Chili Peppers").getAlbums().size());
-
     /*
      * assertTrue(cache.retrieveAlbumList("Red Hot Chili Peppers").getAlbums().toString
      * (),
@@ -284,12 +246,9 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreArtistSimilar() {
     LastFmCache cache = new LastFmCache();
-
     LastFmSimilarArtists artists = new LastFmSimilarArtists();
     artists.setArtistName("Hed Rot Phili Ceppers");
-
     cache.storeArtistSimilar("Red Hot Chili Peppers", artists);
-
     assertNotNull(cache.retrieveArtistSimilar("Red Hot Chili Peppers"));
     assertEquals("Hed Rot Phili Ceppers", cache.retrieveArtistSimilar("Red Hot Chili Peppers")
         .getArtistName());
@@ -303,13 +262,10 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreArtistThumbImage() {
     LastFmCache cache = new LastFmCache();
-
     LastFmArtist artist = new LastFmArtist();
     artist.setName("Red Hot Chili Peppers");
     Image cover = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
-
     cache.storeArtistThumbImage(artist, cover);
-
     assertNotNull(cache.retrieveArtistThumbImage(artist));
     assertEquals(10, cache.retrieveArtistThumbImage(artist).getHeight(null));
   }
@@ -322,9 +278,7 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testStoreArtistWiki() {
     LastFmCache cache = new LastFmCache();
-
     cache.storeArtistWiki("Red Hot Chili Peppers", "TestWikiText");
-
     assertNotNull(cache.retrieveArtistWiki("Red Hot Chili Peppers"));
     assertEquals("TestWikiText", cache.retrieveArtistWiki("Red Hot Chili Peppers"));
   }
@@ -337,10 +291,8 @@ public class TestLastFmCache extends JajukTestCase {
    */
   public void testAddSubmissionData() {
     LastFmCache cache = new LastFmCache();
-
     FullSubmissionData data = new FullSubmissionData("Red Hot Chili Peppers", "title",
         "By The Way", 10, 1, "Source", 10);
-
     cache.addSubmissionData(data);
   }
 
@@ -392,5 +344,4 @@ public class TestLastFmCache extends JajukTestCase {
      * assertEquals(0, cache.getSubmissionData().size());
      */
   }
-
 }
diff --git a/src/test/java/ext/services/network/TestNetworkUtils.java b/src/test/java/ext/services/network/TestNetworkUtils.java
index 1dadfcf..2dab663 100644
--- a/src/test/java/ext/services/network/TestNetworkUtils.java
+++ b/src/test/java/ext/services/network/TestNetworkUtils.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.network;
 
@@ -26,37 +26,28 @@ import java.net.Proxy.Type;
 import java.net.ServerSocket;
 import java.net.Socket;
 
+import junit.framework.TestCase;
+
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
-import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestNetworkUtils extends JajukTestCase {
-
-  /** The Constant PROXY_PORT.  DOCUMENT_ME */
+public class TestNetworkUtils extends TestCase {
+  /** The Constant PROXY_PORT.   */
   private static final int PROXY_PORT = 0; // auto-choose
-  
-  /** The Constant URL.  DOCUMENT_ME */
+  /** The Constant URL.   */
   private static final String URL = "http://www.google.com/";
-  
-  /** The Constant FTP_URL.  DOCUMENT_ME */
+  /** The Constant FTP_URL.   */
   private static final String FTP_URL = "ftp://www.google.com/";
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
   protected void setUp() throws Exception {
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "false");
-
-    super.setUp();
   }
 
   /**
@@ -70,7 +61,6 @@ public class TestNetworkUtils extends JajukTestCase {
     // null when no connection is allowed
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "true");
     assertNull(NetworkUtils.getConnection(URL, null));
-
     // useful content when inet access is allowed
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "false");
     HttpURLConnection connection = NetworkUtils.getConnection(URL, null);
@@ -80,14 +70,13 @@ public class TestNetworkUtils extends JajukTestCase {
 
   /**
    * Test get connection string proxy invalid url.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testGetConnectionStringProxyInvalidURL() throws Exception {
     // useful content when inet access is allowed
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "false");
-
     try {
       NetworkUtils.getConnection(FTP_URL, null);
       fail("Should fail here");
@@ -108,7 +97,6 @@ public class TestNetworkUtils extends JajukTestCase {
     // null when no connection is allowed
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "true");
     assertNull(NetworkUtils.getConnection(new java.net.URL(URL), null));
-
     // useful content when inet access is allowed
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "false");
     HttpURLConnection connection = NetworkUtils.getConnection(new java.net.URL(URL), null);
@@ -116,24 +104,21 @@ public class TestNetworkUtils extends JajukTestCase {
     connection.disconnect();
   }
 
-  /** DOCUMENT_ME. */
   boolean bStop = false;
 
   /**
    * Test get connection url proxy with proxy.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testGetConnectionURLProxyWithProxy() throws Exception {
     final ServerSocket socket = new ServerSocket(PROXY_PORT);
-
     Thread thread = new Thread("ProxySocketAcceptThread") {
       @Override
       public void run() {
         try {
           while (!bStop) {
-
             Socket sock = socket.accept();
             Log.debug("Accepted connection, sending back garbage and close socket...");
             sock.getOutputStream().write(1);
@@ -142,12 +127,10 @@ public class TestNetworkUtils extends JajukTestCase {
         } catch (IOException e) {
           Log.error(e);
         }
-
       }
     };
     thread.setDaemon(true); // to finish tests even if this is still running
     thread.start();
-
     Log.debug("Using local port: " + socket.getLocalPort());
     try {
       // useful content when inet access is allowed
@@ -181,7 +164,7 @@ public class TestNetworkUtils extends JajukTestCase {
 
   /**
    * Test read urlurl connection string disabled.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -219,7 +202,6 @@ public class TestNetworkUtils extends JajukTestCase {
     HttpURLConnection connection = NetworkUtils.getConnection(URL, null);
     assertNotNull(connection);
     connection.setDoOutput(true);
-
     // TODO: currently I do not have an URL that works via POST, therefore we
     // get an invalid return code
     try {
@@ -233,7 +215,7 @@ public class TestNetworkUtils extends JajukTestCase {
 
   /**
    * Test read post url disabled.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -241,7 +223,6 @@ public class TestNetworkUtils extends JajukTestCase {
     HttpURLConnection connection = NetworkUtils.getConnection(URL, null);
     assertNotNull(connection);
     connection.setDoOutput(true);
-
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "true");
     assertNull(NetworkUtils.readPostURL(connection, "post"));
     connection.disconnect();
@@ -257,13 +238,12 @@ public class TestNetworkUtils extends JajukTestCase {
     HttpURLConnection connection = NetworkUtils.getConnection(URL, null);
     assertNotNull(connection);
     connection.setDoOutput(true);
-
     assertNull(NetworkUtils.getImage(connection));
   }
 
   /**
    * Test get image disabled.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -271,7 +251,6 @@ public class TestNetworkUtils extends JajukTestCase {
     HttpURLConnection connection = NetworkUtils.getConnection(URL, null);
     assertNotNull(connection);
     connection.setDoOutput(true);
-
     Conf.setProperty(Const.CONF_NETWORK_NONE_INTERNET_ACCESS, "true");
     assertNull(NetworkUtils.getImage(connection));
   }
@@ -291,13 +270,12 @@ public class TestNetworkUtils extends JajukTestCase {
   // helper method to emma-coverage of the unused constructor
   /**
    * Test private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPrivateConstructor() throws Exception { // For EMMA
     // code-coverage tests
-    JUnitHelpers.executePrivateConstructor(NetworkUtils.class);
+    TestHelpers.executePrivateConstructor(NetworkUtils.class);
   }
-
 }
diff --git a/src/test/java/ext/services/network/TestProxy.java b/src/test/java/ext/services/network/TestProxy.java
index fd9730a..39f38d3 100644
--- a/src/test/java/ext/services/network/TestProxy.java
+++ b/src/test/java/ext/services/network/TestProxy.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.network;
 
@@ -27,38 +27,27 @@ import java.net.Socket;
 import java.net.URL;
 import java.net.UnknownHostException;
 
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
+
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestProxy extends JajukTestCase {
-  
-  /** The Constant PROXY_PORT.  DOCUMENT_ME */
+public class TestProxy extends TestCase {
+  /** The Constant PROXY_PORT.   */
   private static final int PROXY_PORT = 0; // auto-choose
-  
-  /** DOCUMENT_ME. */
   ServerSocket socket;
-
-  /** DOCUMENT_ME. */
   boolean bStop = false;
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
   protected void setUp() throws Exception {
     socket = new ServerSocket(PROXY_PORT);
-
     Thread thread = new Thread("ProxySocketAcceptThread") {
       @Override
       public void run() {
         try {
           while (!bStop) {
-
             Socket sock = socket.accept();
             Log.debug("Accepted connection, sending back garbage and close socket...");
             sock.getOutputStream().write(1);
@@ -67,13 +56,10 @@ public class TestProxy extends JajukTestCase {
         } catch (IOException e) {
           Log.error(e);
         }
-
       }
     };
     thread.setDaemon(true); // to finish tests even if this is still running
     thread.start();
-
-    super.setUp();
   }
 
   /*
@@ -85,7 +71,6 @@ public class TestProxy extends JajukTestCase {
   protected void tearDown() throws Exception {
     bStop = true;
     socket.close();
-
     super.tearDown();
   }
 
diff --git a/src/test/java/ext/services/xml/TestXMLBuilder.java b/src/test/java/ext/services/xml/TestXMLBuilder.java
index 6d5a6c9..a75a081 100644
--- a/src/test/java/ext/services/xml/TestXMLBuilder.java
+++ b/src/test/java/ext/services/xml/TestXMLBuilder.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,18 +16,18 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.xml;
 
-import org.jajuk.JUnitHelpers;
-import org.jajuk.JajukTestCase;
+import junit.framework.TestCase;
+
+import org.jajuk.TestHelpers;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestXMLBuilder extends JajukTestCase {
-
+public class TestXMLBuilder extends TestCase {
   /**
    * Test method for.
    *
@@ -36,11 +36,9 @@ public class TestXMLBuilder extends JajukTestCase {
   public void testGetXMLDocument() {
     // simple xml...
     assertNotNull(XMLBuilder.getXMLDocument("<xml></xml>"));
-
     // empty values should be silently ignored
     assertNull(XMLBuilder.getXMLDocument(null));
     assertNull(XMLBuilder.getXMLDocument(""));
-
     // some invalid XML should cause an exception internally but report null
     assertNull(XMLBuilder.getXMLDocument("<xml>invliad document without end tag..."));
   }
@@ -48,12 +46,11 @@ public class TestXMLBuilder extends JajukTestCase {
   // helper method to emma-coverage of the unused constructor
   /**
    * Test private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPrivateConstructor() throws Exception {
-    JUnitHelpers.executePrivateConstructor(XMLBuilder.class);
+    TestHelpers.executePrivateConstructor(XMLBuilder.class);
   }
-
 }
diff --git a/src/test/java/ext/services/xml/TestXMLUtils.java b/src/test/java/ext/services/xml/TestXMLUtils.java
index b4fcce2..339444d 100644
--- a/src/test/java/ext/services/xml/TestXMLUtils.java
+++ b/src/test/java/ext/services/xml/TestXMLUtils.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package ext.services.xml;
 
@@ -25,27 +25,27 @@ import java.io.IOException;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.util.log.Log;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestXMLUtils extends JajukTestCase {
-
   // helper method to emma-coverage of the unused constructor
   /**
    * Test serializable utilities private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testSerializableUtilitiesPrivateConstructor() throws Exception {
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(XMLUtils.class);
+    TestHelpers.executePrivateConstructor(XMLUtils.class);
   }
 
   /**
@@ -57,13 +57,12 @@ public class TestXMLUtils extends JajukTestCase {
   public void testGetChildElement() {
     Document doc = XMLUtils.getDocument("<xml><test/></xml>");
     assertNotNull(doc);
-
     assertNotNull(XMLUtils.getChildElement(doc.getDocumentElement(), "test"));
   }
 
   /**
    * Test get child element null.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetChildElementNull() {
     assertNull(XMLUtils.getChildElement(null, "test"));
@@ -71,12 +70,11 @@ public class TestXMLUtils extends JajukTestCase {
 
   /**
    * Test get child element not existing.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetChildElementNotExisting() {
     Document doc = XMLUtils.getDocument("<xml><test/></xml>");
     assertNotNull(doc);
-
     assertNull(XMLUtils.getChildElement(doc.getDocumentElement(), "notexist"));
   }
 
@@ -89,10 +87,8 @@ public class TestXMLUtils extends JajukTestCase {
   public void testGetAttributeValue() {
     Document doc = XMLUtils.getDocument("<xml><test value=\"1\"/></xml>");
     assertNotNull(doc);
-
     Element test = XMLUtils.getChildElement(doc.getDocumentElement(), "test");
     assertNotNull(test);
-
     assertNotNull(XMLUtils.getAttributeValue(test, "value"));
     assertEquals("", XMLUtils.getAttributeValue(test, "notexist"));
     assertEquals("", XMLUtils.getAttributeValue(doc.getDocumentElement(), "value"));
@@ -100,7 +96,7 @@ public class TestXMLUtils extends JajukTestCase {
 
   /**
    * Test get attribute value null.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetAttributeValueNull() {
     assertNull(XMLUtils.getAttributeValue(null, "value"));
@@ -115,13 +111,12 @@ public class TestXMLUtils extends JajukTestCase {
   public void testGetChildElementContent() {
     Document doc = XMLUtils.getDocument("<xml><test value=\"1\">testcontent</test></xml>");
     assertNotNull(doc);
-
     assertEquals("testcontent", XMLUtils.getChildElementContent(doc.getDocumentElement(), "test"));
   }
 
   /**
    * Test get child element content null.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetChildElementContentNull() {
     assertEquals("", XMLUtils.getChildElementContent(null, "test"));
@@ -130,17 +125,15 @@ public class TestXMLUtils extends JajukTestCase {
   /**
    * Test method for {@link ext.XMLUtils#getDocument(java.lang.String)}.
    */
-
   public void testGetDocument() {
     Document doc = XMLUtils.getDocument("<xml><test value=\"1\"/></xml>");
     assertNotNull(doc);
-
     assertEquals("xml", doc.getDocumentElement().getTagName());
   }
 
   /**
    * Test get document parse error.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetDocumentParseError() {
     Document doc = XMLUtils.getDocument("<xmlinvalid>adsasd<asdksdtest value=\"1\"/></xml>");
@@ -159,22 +152,18 @@ public class TestXMLUtils extends JajukTestCase {
    * .
    */
   public final void testWriteBeanToFile() throws Exception {
-
     PersonBean bean = new PersonBean();
     bean.setName("testvalue");
-
-    File file = File.createTempFile("test", ".bean");
-    assertTrue(file.delete()); // delte file to create it from scratch
+    File file = File.createTempFile("test", ".bean", new java.io.File(ConstTest.TECH_TESTS_PATH));
+    assertTrue(file.delete()); // delete file to create it from scratch
     assertFalse(file.exists());
     XMLUtils.writeBeanToFile(bean, file.getAbsolutePath());
-
     { // check file
       assertTrue(file.exists());
       String contents = FileUtils.readFileToString(file);
       Log.debug("Contents: " + contents);
       assertTrue(contents, file.length() > 0);
     }
-
     /*
      * TODO: somehow this test does not work, we should find out and fix this
      * test...
@@ -188,13 +177,11 @@ public class TestXMLUtils extends JajukTestCase {
 
   /**
    * Test write bean to file invalid file.
-   * DOCUMENT_ME
+   * 
    */
   public final void testWriteBeanToFileInvalidFile() {
-
     PersonBean bean = new PersonBean();
     bean.setName("testvalue");
-
     try {
       XMLUtils.writeBeanToFile(bean,
           "&@#$@(*^)!#!@#@#)}{?M<>?<?,/.,/.,\"'\\][|}{{:2zqwq;sInvalidFileName/\\/");
@@ -208,14 +195,9 @@ public class TestXMLUtils extends JajukTestCase {
    * Class <code>PersonBean</code>.
    */
   public class PersonBean implements java.io.Serializable {
-    
     /** Generated serialVersionUID. */
     private static final long serialVersionUID = 1124123276327532379L;
-
-    /** DOCUMENT_ME. */
     private String name;
-
-    /** DOCUMENT_ME. */
     private boolean deceased;
 
     /** No-arg constructor (takes no arguments). */
@@ -286,19 +268,14 @@ public class TestXMLUtils extends JajukTestCase {
    */
   public final void testReadObjectFromString() throws Exception {
     String str = new String("teststring");
-
-    File file = File.createTempFile("test", ".bean");
+    File file = File.createTempFile("test", ".bean", new java.io.File(ConstTest.TECH_TESTS_PATH));
     assertTrue(file.delete()); // delte file to create it from scratch
     assertFalse(file.exists());
     XMLUtils.writeObjectToFile(str, file.getAbsolutePath());
-
     assertTrue(file.exists());
-
     String xml = FileUtils.readFileToString(file);
-
     assertTrue(StringUtils.isNotBlank(xml));
     assertNotNull(XMLUtils.getDocument(xml));
-
     /*
      * TODO: currently this reports an error about xpp3 pull parser missing, not
      * sure how this works inside Jajuk...
@@ -319,14 +296,11 @@ public class TestXMLUtils extends JajukTestCase {
    */
   public final void testWriteObjectToFile() throws Exception {
     String str = new String("teststring");
-
-    File file = File.createTempFile("test", ".bean");
+    File file = File.createTempFile("test", ".bean", new java.io.File(ConstTest.TECH_TESTS_PATH));
     assertTrue(file.delete()); // delte file to create it from scratch
     assertFalse(file.exists());
     XMLUtils.writeObjectToFile(str, file.getAbsolutePath());
-
     assertTrue(file.exists());
-
     /*
      * TODO: currently this reports an error about xpp3 pull parser missing, not
      * sure how this works inside Jajuk...
@@ -340,11 +314,10 @@ public class TestXMLUtils extends JajukTestCase {
 
   /**
    * Test write object to file invalid file.
-   * DOCUMENT_ME
+   * 
    */
   public final void testWriteObjectToFileInvalidFile() {
     String str = new String("teststring");
-
     try {
       XMLUtils.writeObjectToFile(str,
           "&@#$@(*^)!#!@#@#)}{?M<>?<?,/.,/.,\"'\\][|}{{:2zqwq;sInvalidFileName/\\/");
diff --git a/src/test/java/org/jajuk/ConstTest.java b/src/test/java/org/jajuk/ConstTest.java
index 1bd596a..7d28cbf 100644
--- a/src/test/java/org/jajuk/ConstTest.java
+++ b/src/test/java/org/jajuk/ConstTest.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,22 +16,22 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk;
 
-import java.io.File;
-
 /**
  * Contains common constants shared by jajuk unit tests.
  */
 public interface ConstTest {
-
-  // sometimes temporary path has trailing separator, we try to handle this here
-  /** DOCUMENT_ME. */
-  String PATH_DEVICE = (System.getProperty("java.io.tmpdir").endsWith(File.separator) ? System
-      .getProperty("java.io.tmpdir")
-      + "jajuk_tests" + File.separator + "device_1" : System.getProperty("java.io.tmpdir")
-      + File.separator + "jajuk_tests" + File.separator + "device_1");
-
+  /** Temporary directory */
+  String TEMP_PATH = System.getProperty("java.io.tmpdir");
+  /** Path of all unit tests created files, dropped before each test **/
+  String BASE_DIRECTORY_PATH = TEMP_PATH + "/jajuk_tests";
+  /** Parent folder for sample devices (with music) */
+  String DEVICES_BASE_PATH = BASE_DIRECTORY_PATH + "/sample_devices";
+  /** Tech tests folder */
+  String TECH_TESTS_PATH = BASE_DIRECTORY_PATH + "/tech_tests";
+  /** Sample workspace path  */
+  String SAMPLE_WORKSPACE_PATH = BASE_DIRECTORY_PATH + "/sample_workspace";
 }
diff --git a/src/test/java/org/jajuk/JUnitHelpers.java b/src/test/java/org/jajuk/JUnitHelpers.java
deleted file mode 100644
index 827f67a..0000000
--- a/src/test/java/org/jajuk/JUnitHelpers.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2009 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision: 3132 $
- */
-package org.jajuk;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import javax.swing.SwingUtilities;
-
-import junit.framework.Assert;
-
-import org.jajuk.base.Album;
-import org.jajuk.base.AlbumManager;
-import org.jajuk.base.Artist;
-import org.jajuk.base.ArtistManager;
-import org.jajuk.base.Device;
-import org.jajuk.base.DeviceManager;
-import org.jajuk.base.Directory;
-import org.jajuk.base.DirectoryManager;
-import org.jajuk.base.FileManager;
-import org.jajuk.base.Genre;
-import org.jajuk.base.GenreManager;
-import org.jajuk.base.Track;
-import org.jajuk.base.TrackManager;
-import org.jajuk.base.Type;
-import org.jajuk.base.TypeManager;
-import org.jajuk.base.Year;
-import org.jajuk.base.YearManager;
-import org.jajuk.events.JajukEvents;
-import org.jajuk.events.ObservationManager;
-import org.jajuk.services.bookmark.History;
-import org.jajuk.services.core.SessionService;
-import org.jajuk.services.players.IPlayerImpl;
-import org.jajuk.services.players.QueueModel;
-import org.jajuk.services.webradio.WebRadio;
-import org.jajuk.util.Const;
-import org.jajuk.util.log.Log;
-
-/**
- * Small helper class with functionality that is used in multiple unit tests
- */
-public class JUnitHelpers {
-
-  /**
-   * Set a temporary session directory and make sure it exists and is writeable.
-   *
-   * @throws IOException
-   *           If the temporary directory can not be created or is not writeable
-   */
-  public static void createSessionDirectory() throws IOException {
-    // get a temporary file name
-    File tempdir = File.createTempFile("test", "");
-    if (!tempdir.delete()) {
-      throw new IOException("Could not create the temporary session directory at "
-          + tempdir.getAbsolutePath() + ", could not remove the temporary file.");
-    }
-
-    // set the directory as base directory for the workspace
-    SessionService.setWorkspace(tempdir.getAbsolutePath());
-
-    // read the session directory that we are using now for caching
-    File sessiondir = SessionService.getConfFileByPath(Const.FILE_CACHE);
-
-    // create the directory structure
-    sessiondir.mkdirs();
-
-    // do some checks
-    if (!sessiondir.exists()) {
-      throw new IOException("Could not create the temporary session directory at "
-          + sessiondir.getAbsolutePath());
-    }
-    if (!sessiondir.isDirectory()) {
-      throw new IOException("Could not create the temporary session directory at "
-          + sessiondir.getAbsolutePath() + ", not a directory!");
-    }
-    if (!sessiondir.canWrite()) {
-      throw new IOException("Could not create the temporary session directory at "
-          + sessiondir.getAbsolutePath() + ", not writeable!");
-    }
-
-    // make sure the directory is removed at the end of the tests again
-    sessiondir.getParentFile().deleteOnExit();
-  }
-
-  /**
-   * Helper method for removing emma-reports for classes with only static
-   * methods
-   * <p/>
-   * see
-   * http://sourceforge.net/tracker/index.php?func=detail&aid=1173251&group_id
-   * =108932&atid=651900
-   *
-   * add this to the test case for any class that has only static methods where
-   * EMMA reports the default constructor as not covered
-   *
-   * Template: <code>
-
-   // helper method to emma-coverage of the unused constructor
-   public void testPrivateConstructor() throws Exception {
-     JUnitHelpers.executePrivateConstructor(<yourclass>.class);
-   }
-
-   * </code>
-   *
-   * @param targetClass
-   */
-  public static <T> T executePrivateConstructor(final Class<T> targetClass) throws Exception {
-    final Constructor<T> c = targetClass.getDeclaredConstructor(new Class[] {});
-    c.setAccessible(true);
-    return c.newInstance((Object[]) null);
-  }
-
-  public static void EqualsTest(final Object obj, final Object equal, final Object notequal) {
-    // none of the three should be null
-    Assert.assertNotNull("Object in EqualsTest should not be null!", obj);
-    Assert.assertNotNull("Equals-object in EqualsTest should not be null!", equal);
-    Assert.assertNotNull("Non-equal-object in EqualsTest should not be null!", notequal);
-
-    // make sure different objects are passed in
-    Assert.assertFalse("Object and equals-object in EqualsTest should not be identical",
-        obj == equal);
-    Assert.assertFalse("Object and non-equals-object in EqualsTest should not be identical",
-        obj == notequal);
-
-    // make sure correct objects are passed
-    Assert.assertTrue("Classes of objects in EqualsTest should be equal!", obj.getClass().equals(
-        equal.getClass()));
-    Assert.assertTrue("Classes of objects in EqualsTest should be equal!", obj.getClass().equals(
-        notequal.getClass()));
-
-    // make sure correct parameters are passed
-    // equal should be equal to obj, not-equal should not be equal to obj!
-    Assert.assertTrue("Object and equal-object should be equal in EqualsTest!", obj.equals(equal));
-    Assert.assertFalse("Object and non-equal-object should not be equal in EqualsTest!", obj
-        .equals(notequal));
-
-    // first test some general things that should be true with equals
-
-    // reflexive: equals to itself
-    Assert
-        .assertTrue("Reflexive: object should be equal to itself in EqualsTest!", obj.equals(obj));
-    Assert.assertTrue("Reflexive: equal-object should be equal to itself in EqualsTest!", equal
-        .equals(equal));
-    Assert.assertTrue("Reflexive: non-equal-object should be equal to itself in EqualsTest!",
-        notequal.equals(notequal));
-
-    // not equals to null
-    Assert.assertFalse("Object should not be equal to null in EqualsTest!", obj.equals(null));
-    Assert.assertFalse("Equal-object should not be equal to null in EqualsTest!", equal
-        .equals(null));
-    Assert.assertFalse("Non-equal-object should not be equal to null in EqualsTest!", notequal
-        .equals(null));
-
-    // not equals to a different type of object
-    Assert.assertFalse("Object should not be equal to an arbitrary string in EqualsTest!", obj
-        .equals("TestString"));
-
-    // then test some things with another object that should be equal
-
-    // symmetric, if one is (not) equal to another then the reverse must be true
-    Assert.assertTrue("Symmetric: Object should be equal to equal-object in EqualsTest", obj
-        .equals(equal));
-    Assert.assertTrue("Symmetric: Equals-object should be equal to object in EqualsTest!", equal
-        .equals(obj));
-    Assert.assertFalse("Symmetric: Object should NOT be equal to non-equal-object in EqualsTest",
-        obj.equals(notequal));
-    Assert.assertFalse("Symmetric: Non-equals-object should NOT be equal to object in EqualsTest!",
-        notequal.equals(obj));
-
-    // transitive: if a.equals(b) and b.equals(c) then a.equals(c)
-    // not tested right now
-
-    // hashCode: equal objects should have equal hash code
-    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!", obj
-        .hashCode() == equal.hashCode());
-    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!", obj
-        .hashCode() == obj.hashCode());
-    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!", equal
-        .hashCode() == equal.hashCode());
-    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!",
-        notequal.hashCode() == notequal.hashCode());
-  }
-
-  @SuppressWarnings("unchecked")
-  public static <T> void CompareToTest(final Comparable<T> obj, final Comparable<T> equal,
-      final Comparable<T> notequal) {
-    // none of the three should be null
-    Assert.assertNotNull("Object in CompareToTest should not be null!", obj);
-    Assert.assertNotNull("Equals-object in CompareToTest should not be null!", equal);
-    Assert.assertNotNull("Non-equal-object in CompareToTest should not be null!", notequal);
-
-    // make sure different objects are passed in
-    Assert.assertFalse("Object and equals-object in CompareToTest should not be identical",
-        obj == equal);
-    Assert.assertFalse("Object and non-equals-object in CompareToTest should not be identical",
-        obj == notequal);
-
-    // make sure correct parameters are passed
-    // equal should be equal to obj, not-equal should not be equal to obj!
-    Assert.assertEquals("Object and equal-object should compare in CompareToTest!", 0, obj
-        .compareTo((T) equal));
-    Assert.assertFalse("Object and non-equal-object should not compare in CompareToTest!", 0 == obj
-        .compareTo((T) notequal));
-
-    // first test some general things that should be true with equals
-
-    // reflexive: equals to itself
-    Assert.assertEquals("Reflexive: object should be equal to itself in CompareToTest!", 0, obj
-        .compareTo((T) obj));
-    Assert.assertEquals("Reflexive: equal-object should be equal to itself in CompareToTest!", 0,
-        equal.compareTo((T) equal));
-    Assert.assertEquals("Reflexive: non-equal-object should be equal to itself in CompareToTest!",
-        0, notequal.compareTo((T) notequal));
-
-    // not equals to null
-    Assert.assertFalse("Object should not be equal to null in CompareToTest!", 0 == obj
-        .compareTo(null));
-    Assert.assertFalse("Equal-object should not be equal to null in CompareToTest!", 0 == equal
-        .compareTo(null));
-    Assert.assertFalse("Non-equal-object should not be equal to null in CompareToTest!",
-        0 == notequal.compareTo(null));
-
-    // not equals to a different type of object
-    /*
-     * Assert.assertFalse("Object should not be equal to an arbitrary string in CompareToTest!" , 0
-     * == obj.compareTo("TestString"));
-     */
-
-    // then test some things with another object that should be equal
-
-    // symmetric, if one is (not) equal to another then the reverse must be true
-    Assert.assertEquals("Symmetric: Object should be equal to equal-object in CompareToTest", 0,
-        obj.compareTo((T) equal));
-    Assert.assertEquals("Symmetric: Equals-object should be equal to object in CompareToTest!", 0,
-        equal.compareTo((T) obj));
-    Assert.assertFalse(
-        "Symmetric: Object should NOT be equal to non-equal-object in CompareToTest", 0 == obj
-            .compareTo((T) notequal));
-    Assert.assertFalse(
-        "Symmetric: Non-equals-object should NOT be equal to object in CompareToTest!",
-        0 == notequal.compareTo((T) obj));
-
-    // transitive: if a.equals(b) and b.equals(c) then a.equals(c)
-    // not tested right now
-  }
-
-  /**
-   * Run some general tests on the toString method. This static method is used
-   * in tests for classes that overwrite toString().
-   *
-   * @param obj
-   *          The object to test toString(). This should be an object of a type
-   *          that overwrites toString()
-   *
-   */
-  public static void ToStringTest(final Object obj) {
-    // toString should not return null
-    Assert.assertNotNull("A derived toString() should not return null!", obj.toString());
-
-    // toString should not return an empty string
-    Assert.assertFalse("A derived toString() should not return an empty string!", obj.toString()
-        .equals(""));
-
-    // check that calling it multiple times leads to the same value
-    String value = obj.toString();
-    for (int i = 0; i < 10; i++) {
-      Assert.assertEquals(
-          "toString() is expected to result in the same result across repeated calls!", value, obj
-              .toString());
-    }
-  }
-
-  /**
-   * Run some generic tests on the derived clone-method.
-   *
-   * We need to do this via reflection as the clone()-method in Object is
-   * protected and the Cloneable interface does not include a public "clone()".
-   *
-   * @param obj
-   *          The object to test clone for.
-   */
-  public static void CloneTest(final Cloneable obj) throws Exception {
-    final Method m = obj.getClass().getMethod("clone", new Class[] {});
-    Assert.assertNotNull("Need to find a method called 'clone' in object of type '"
-        + obj.getClass().getName() + "' in CloneTest!", m);
-    // Assert.assertTrue("Method 'clone' on object of type '" +
-    // obj.getClass().getName() + "' needs to be accessible in
-    // CloneTest!",
-    // m.isAccessible());
-
-    // clone should return a different object, not the same again
-    Assert.assertTrue("clone() should not return the object itself in CloneTest!", obj != m.invoke(
-        obj, new Object[] {}));
-
-    // should return the same type of object
-    Assert.assertTrue(
-        "clone() should return the same type of object (i.e. the same class) in CloneTest!", m
-            .invoke(obj, new Object[] {}).getClass() == obj.getClass());
-
-    // cloned objects should be equal to the original object
-    Assert.assertTrue(
-        "clone() should return an object that is equal() to the original object in CloneTest!", m
-            .invoke(obj, new Object[] {}).equals(obj));
-  }
-
-  /**
-   * Checks certain assumption that are made for the hashCode() method
-   *
-   * @param obj
-   *          An Object that override the hasCode() method.
-   *
-   * @throws Exception
-   */
-  public static void HashCodeTest(final Object obj, final Object equ) {
-    Assert
-        .assertFalse(
-            "HashCodeTest expects two distinct objects with equal hashCode, but the same object is provided twice!",
-            obj == equ);
-
-    // The same object returns the same hashCode always
-    final int hash = obj.hashCode();
-    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
-        hash, obj.hashCode());
-    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
-        hash, obj.hashCode());
-    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
-        hash, obj.hashCode());
-    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
-        hash, obj.hashCode());
-    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
-        hash, obj.hashCode());
-
-    // equal objects must have the same hashCode
-    // the other way around is not required,
-    // different objects can have the same hashCode!!
-    Assert
-        .assertEquals(
-            "Equal Assert failed, but input to HashCodeTest should be two equal objects! Check if the class implements equals() as well to fullfill this contract",
-            obj, equ);
-    Assert.assertEquals("Equal objects should have equal hashCode() by Java contract!", obj
-        .hashCode(), equ.hashCode());
-  }
-
-  @SuppressWarnings( { "unchecked", "rawtypes" })
-  public static void EnumTest(Enum enumtype, Class enumclass, String element)
-      throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
-    // check valueOf()
-    Assert.assertEquals(enumtype, Enum.valueOf(enumclass, element));
-
-    // check values()
-    Method m = enumclass.getMethod("values", (Class[]) null);
-    Object obj = m.invoke(enumtype, (Object[]) null);
-    Assert.assertNotNull(obj);
-    Assert.assertTrue(obj instanceof Object[]);
-
-    // check existing valeOf()
-    obj = Enum.valueOf(enumclass, element);
-    Assert.assertNotNull(obj);
-    Assert.assertTrue(obj instanceof Enum);
-
-    // check non-existing valueOf
-    try {
-      Enum.valueOf(enumclass, "nonexistingenumelement");
-      Assert
-          .fail("Should catch exception IllegalArgumentException when calling Enum.valueOf() with incorrect enum-value!");
-    } catch (IllegalArgumentException e) {
-      Assert.assertTrue(e.getMessage(), e.getMessage().contains("No enum const class"));
-    }
-  }
-
-  public static void clearSwingUtilitiesQueue() throws InterruptedException,
-      InvocationTargetException {
-    // we try to wait for all items that were sent via
-    // "SwingUtilities.invokeLater()" in order
-    // to have a deterministic state in the tests where we know that the
-    // asynchronous action
-    // done in any "invokeLater()" was actually finished
-
-    SwingUtilities.invokeAndWait(new Runnable() {
-      @Override
-      public void run() {
-        // nothing to do here, we just want the runnable to run...
-      }
-    });
-
-    // Thread.currentThread().
-  }
-
-  public static void waitForThreadToFinish(final String name) throws InterruptedException {
-    int count = Thread.currentThread().getThreadGroup().activeCount();
-
-    Thread[] threads = new Thread[count];
-    /* int received = */Thread.currentThread().getThreadGroup().enumerate(threads);
-
-    /*
-     * we ignore this check as we can not do anything anyway if we receive not all threads if(count
-     * != received) { throw new IllegalStateException("Could not read all threads: Expected: " +
-     * count + " Found: " + received); }
-     */
-
-    for (Thread t : threads) {
-      if (t != null && name.equals(t.getName())) {
-        t.join();
-      }
-    }
-  }
-
-  public static void waitForAllWorkToFinishAndCleanup() throws InterruptedException,
-      InvocationTargetException {
-    ObservationManager.clear();
-
-    QueueModel.stopRequest();
-    QueueModel.clear();
-
-    FileManager.getInstance().clear();
-    DirectoryManager.getInstance().clear();
-    DeviceManager.getInstance().cleanAllDevices();
-    History.getInstance().clear();
-
-    // wait a bit to let deferred actions take place before we shut down
-    JUnitHelpers.waitForThreadToFinish("Cover Refresh Thread");
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-    JUnitHelpers.waitForThreadToFinish("Device Refresh Thread");
-    JUnitHelpers.waitForThreadToFinish("Playlist Prepare Party Thread");
-    JUnitHelpers.waitForThreadToFinish("LastFM Update Thread");
-    JUnitHelpers.waitForThreadToFinish("Parameter Catalog refresh Thread");
-    JUnitHelpers.waitForThreadToFinish("Manual Refresh Thread");
-
-    // clear this for all available events
-    // for(JajukEvents event : JajukEvents.values()) {
-    // JUnitHelpers.waitForThreadToFinish("Event Executor for: " +
-    // event.toString());
-    // }
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.ALARMS_CHANGE.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.ALBUM_CHANGED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.BANNED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.CDDB_WIZARD.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.CLEAR_HISTORY.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.COVER_NEED_REFRESH.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.DEVICE_REFRESH.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.FILE_FINISHED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.FILE_LAUNCHED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.FILE_NAME_CHANGED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.LANGUAGE_CHANGED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.MUTE_STATE.toString());
-    JUnitHelpers
-        .waitForThreadToFinish("Event Executor for: " + JajukEvents.PLAYER_PAUSE.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.PLAYER_PLAY.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.PLAYER_RESUME.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.PLAYER_STOP.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.PLAY_ERROR.toString());
-    JUnitHelpers
-        .waitForThreadToFinish("Event Executor for: " + JajukEvents.PLAY_OPENING.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.PREFERENCES_RESET.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.RATE_RESET.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.GENRE_NAME_CHANGED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.VOLUME_CHANGED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: "
-        + JajukEvents.WEBRADIO_LAUNCHED.toString());
-    JUnitHelpers.waitForThreadToFinish("Event Executor for: " + JajukEvents.ZERO.toString());
-
-    JUnitHelpers.clearSwingUtilitiesQueue();
-  }
-
-  /**
-   * Return a file named "test.tst" on a mounted device.
-   * @return a file named "test.tst" on a mounted device.
-   */
-  public static org.jajuk.base.File getFile() {
-    return getFile("test.tst", true);
-  }
-
-  public static org.jajuk.base.File getFile(String name, boolean mount) {
-    Genre genre = getGenre();
-    Album album = getAlbum("name", 0);
-    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
-    // this test
-
-    Artist artist = getArtist("myartist");
-    Year year = getYear(2000);
-
-    Type type = getType();
-    Track track = TrackManager.getInstance().registerTrack(name, album, genre, artist, 120, year,
-        1, type, 1);
-
-    Device device = getDevice();
-    if (mount & !device.isMounted()) {
-      try {
-        device.mount(true);
-      } catch (Exception e) {
-        throw new RuntimeException(e);
-      }
-    }
-
-    Directory dir = JUnitHelpers.getDirectory();
-
-    return FileManager.getInstance().registerFile(name, dir, track, 120, 70);
-  }
-
-  public static Album getAlbum(String name, int discID) {
-    return AlbumManager.getInstance().registerAlbum(name, discID);
-  }
-
-  public static Album getAlbum() {
-    return getAlbum("name", 0);
-  }
-
-  public static Artist getArtist(String name) {
-    return ArtistManager.getInstance().registerArtist(name);
-  }
-
-  public static Artist getArtist() {
-    return getArtist("name");
-  }
-
-  public static Genre getGenre(String name) {
-    return GenreManager.getInstance().registerGenre(name);
-  }
-
-  public static Genre getGenre() {
-    return getGenre("name");
-  }
-
-  public static Year getYear(int year) {
-    return YearManager.getInstance().registerYear("" + year);
-  }
-
-  public static Year getYear() {
-    return getYear(2000);
-  }
-
-  public static Device getDevice(String name, long type, String url) {
-    return DeviceManager.getInstance().registerDevice(name, type, url);
-  }
-
-  public static Device getDevice() {
-    Device device = getDevice("name", Device.TYPE_DIRECTORY, ConstTest.PATH_DEVICE);
-    // Create the jajuk test device if required
-    new File(device.getUrl()).mkdirs();
-    // Create at least a void file in the device
-    try {
-      new File(device.getUrl() + "/audio1.mp3").createNewFile();
-    } catch (IOException e) {
-      Log.error(e);
-    }
-    return device;
-  }
-
-  public static Directory getDirectory(String name, Directory parent, Device device) {
-    return DirectoryManager.getInstance().registerDirectory(name, parent, device);
-  }
-
-  /** The "any" directory is the top dir of the device pointing toward $java.io.tmpdir*/
-  public static Directory getDirectory() {
-    Device device = getDevice();
-    Directory topdir = getTopDirectory();
-    return DirectoryManager.getInstance().registerDirectory("dir", topdir, device);
-  }
-
-  /** A topdir directory */
-  public static Directory getTopDirectory() {
-    return DirectoryManager.getInstance().registerDirectory(getDevice());
-  }
-
-  @SuppressWarnings("unchecked")
-  public static Type getType() {
-    IPlayerImpl imp = new MockPlayer();
-    Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
-    return TypeManager.getInstance().registerType("type", "mp3", cl, null);
-  }
-
-  // needs to be public to be callable from the outside...
-  public static class MockPlayer implements IPlayerImpl {
-    @Override
-    public void stop() throws Exception {
-
-    }
-
-    @Override
-    public void setVolume(float fVolume) throws Exception {
-
-    }
-
-    @Override
-    public void seek(float fPosition) {
-
-    }
-
-    @Override
-    public void resume() throws Exception {
-
-    }
-
-    @Override
-    public void play(WebRadio radio, float fVolume) throws Exception {
-
-    }
-
-    @Override
-    public void play(org.jajuk.base.File file, float fPosition, long length, float fVolume)
-        throws Exception {
-
-    }
-
-    @Override
-    public void pause() throws Exception {
-
-    }
-
-    @Override
-    public int getState() {
-
-      return 0;
-    }
-
-    @Override
-    public long getElapsedTimeMillis() {
-
-      return 0;
-    }
-
-    @Override
-    public float getCurrentVolume() {
-
-      return 0;
-    }
-
-    @Override
-    public float getCurrentPosition() {
-
-      return 0;
-    }
-
-    @Override
-    public long getDurationSec() {
-
-      return 0;
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#getActuallyPlayedTimeMillis()
-     */
-    @Override
-    public long getActuallyPlayedTimeMillis() {
-      // TODO Auto-generated method stub
-      return 0;
-    }
-  }
-
-  public static Track getTrack(int i) {
-    Genre genre = getGenre();
-    Album album = getAlbum("myalbum", 0);
-    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
-    // this test
-
-    Artist artist = getArtist("myartist_" + i);
-    Year year = getYear(2000);
-
-    Type type = getType();
-    return TrackManager.getInstance().registerTrack("track_" + i, album, genre, artist, 120, year,
-        1, type, 1);
-  }
-}
diff --git a/src/test/java/org/jajuk/JajukTestCase.java b/src/test/java/org/jajuk/JajukTestCase.java
index 9102df2..4c4d3ad 100644
--- a/src/test/java/org/jajuk/JajukTestCase.java
+++ b/src/test/java/org/jajuk/JajukTestCase.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2009 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,32 +16,141 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision: 3132 $
+ *  
  */
 package org.jajuk;
 
+import java.io.File;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.Map;
+
 import junit.framework.TestCase;
 
+import org.apache.commons.io.FileUtils;
 import org.jajuk.base.Collection;
+import org.jajuk.base.TypeManager;
+import org.jajuk.services.bookmark.History;
+import org.jajuk.services.core.SessionService;
+import org.jajuk.services.players.DummyMPlayerImpl;
+import org.jajuk.services.players.Player;
+import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.startup.StartupCollectionService;
+import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.util.Conf;
+import org.jajuk.util.Const;
+import org.jajuk.util.UtilSystem;
+import org.jajuk.util.log.Log;
 
 /**
- * 
+ * Common behavior for every jajuk test. 
+ * <p>EVERY JAJUK UNIT TEST *MUST* EXTEND THIS CLASS (except from the "ext" package).</p>
  */
 public abstract class JajukTestCase extends TestCase {
+  /** The Constant JAVA_PROCESS.   */
+  private static final String JAVA_PROCESS = "java";
+  /** The Constant MAIN_CLASS.   */
+  private static final String MAIN_CLASS = DummyMPlayerImpl.class.getName();
+  java.io.File scriptFile;
+  /** Property which is used to find the current installation location of java. */
+  protected static final String PROPERTY_JAVA_HOME = "java.home";
+  /* Need to initialize workspace here because some src classes call SessionService.getConfFileByPath() 
+   * from class init and then override the workspace path, then use the user home directory instead (and even worst, it's cached in 
+   * SessionService.getConfFileByPath())*/
+  static {
+    // Make sure to use a test workspace
+    SessionService.setTestMode(true);
+    File workspace = new File(ConstTest.SAMPLE_WORKSPACE_PATH);
+    SessionService.setWorkspace(workspace.getAbsolutePath());
+  }
 
-  /*
-   * (non-Javadoc)
+  /**
+   * Find java executable.
    * 
-   * @see junit.framework.TestCase#setUp()
+   *
+   * @return the string
+   */
+  private String findJavaExecutable() {
+    assertNotNull("Need to have a property 'java.home' to run this test!",
+        System.getProperty(PROPERTY_JAVA_HOME));
+    return "\"" + System.getProperty(PROPERTY_JAVA_HOME) + java.io.File.separator + "bin"
+        + java.io.File.separator + JAVA_PROCESS + "\"";
+  }
+
+  /**
+   * Every UT must extend JajukTestCase and implement this method for specific initialization if any
    */
+  protected void specificSetUp() throws Exception {
+    // Does nothing by default
+  }
+
   @Override
-  protected void setUp() throws Exception {
+  protected final void setUp() throws Exception {
+    Log.info("Setting up testcase: " + getClass() + "." + getName() + "()");
+    // Set the exiting state flag to force still running threads to suspend
+    TestHelpers.forceExitState(true);
+    // Wait for all threads to finish
+    TestHelpers.waitForAllThreadToFinish();
     // let's clean up before we begin any test
-    JUnitHelpers.waitForAllWorkToFinishAndCleanup();
+    TestHelpers.cleanup();
+    // do the cleanup twice as the cleanup itself may launch some threads
+    TestHelpers.waitForAllThreadToFinish();
+    // stop any Player from previous tests
+    Player.stop(true);
+    // assert to find cases where we do not clean up correctly
+    assertEquals(-1, QueueModel.getIndex());
+    assertEquals(0, QueueModel.getQueueSize());
     // Clean the collection
     StartupCollectionService.registerItemManagers();
+    TypeManager.getInstance().clear();
     Collection.clearCollection();
-    super.setUp();
+    WebRadioManager.getInstance().clear();
+    // And use a specific workspace
+    File basedir = new File(ConstTest.BASE_DIRECTORY_PATH);
+    File workspace = new File(ConstTest.SAMPLE_WORKSPACE_PATH);
+    File sample_devices = new File(ConstTest.DEVICES_BASE_PATH);
+    File tech_tests = new File(ConstTest.TECH_TESTS_PATH);
+    // Make sure to clear totally the workspace and sample devices and recreate it
+    if (basedir.exists()) {
+      UtilSystem.deleteDir(basedir);
+    }
+    workspace.mkdirs();
+    sample_devices.mkdirs();
+    tech_tests.mkdirs();
+    //create cache directory and expected conf files
+    SessionService.getConfFileByPath(Const.FILE_CACHE).mkdirs();
+    History.commit();
+    // Create a tmp directory as a music folder or tmp trash
+    SessionService.getConfFileByPath("tests").mkdirs();
+    // Force dummy player
+    scriptFile = java.io.File.createTempFile("dummy", "mplayer.sh", new java.io.File(
+        ConstTest.TECH_TESTS_PATH));
+    scriptFile.setExecutable(true);
+    URL thisClassAbsUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
+    String thisClassAbsPath = new java.io.File(thisClassAbsUrl.toURI()).getAbsolutePath();
+    FileUtils.writeStringToFile(scriptFile, "#!/bin/sh\n\n" + findJavaExecutable() + " -cp \""
+        + thisClassAbsPath + "\" " + MAIN_CLASS);
+    Conf.setProperty(Const.CONF_MPLAYER_PATH_FORCED, scriptFile.getAbsolutePath());
+    // Unset exiting state
+    TestHelpers.forceExitState(false);
+    specificSetUp();
+  }
+
+  /* (non-Javadoc)
+   * @see junit.framework.TestCase#tearDown()
+   */
+  @Override
+  protected void tearDown() throws Exception {
+    Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces();
+    Iterator<Thread> i = traces.keySet().iterator();
+    while (i.hasNext()) {
+      Thread thd = i.next();
+      if (thd.getName().contains("MPlayer reader thread")
+          || thd.getName().contains("MPlayer writer thread")) {
+        TestHelpers.dumpThreads();
+        throw new IllegalStateException("Had leftover MPlayer thread: " + thd.getName());
+      }
+    }
+    super.tearDown();
   }
 }
diff --git a/src/test/java/org/jajuk/LogChecker.java b/src/test/java/org/jajuk/LogChecker.java
index 7400ce5..cdbe381 100644
--- a/src/test/java/org/jajuk/LogChecker.java
+++ b/src/test/java/org/jajuk/LogChecker.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk;
 
@@ -25,40 +25,33 @@ import java.io.FileNotFoundException;
 
 import junit.framework.TestCase;
 
+import org.jajuk.services.core.SessionService;
 import org.jajuk.util.UtilSystem;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
  * This Test is used to check conveniently jajuk log content to find special
- * warnings or errors that may imply a problem Note that this test only work
+ * warnings or errors that may imply a problem. 
+ * <br/> Note that this test only work
  * when redirecting stdin et stderr to a file named /tmp/jajuk_out.log
  */
 public class LogChecker extends TestCase {
-
-  /** The Constant FILE_PATH.  DOCUMENT_ME */
-  private static final String FILE_PATH = System.getProperty("java.io.tmpdir") + File.separator
-      + "jajuk_out.log";
-
-  /** DOCUMENT_ME. */
+  /** The Constant FILE_PATH.   */
+  private static final File FILE_PATH = SessionService.getConfFileByPath("jajuk.log");
   private String logs;
 
-  /* (non-Javadoc)
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
   public void setUp() throws Exception {
     try {
-      logs = UtilSystem.readFile(FILE_PATH).toString();
+      logs = UtilSystem.readFile(FILE_PATH.getAbsolutePath()).toString();
     } catch (JajukException e) {
       // if an exception occurs, ensure it is a "FileNotFound"
       assertNotNull("Should have an underlying cause when catching JajukException", e.getCause());
-      assertTrue("We only accept FileNotFoundException as valid exception in this test", e
-          .getCause() instanceof FileNotFoundException);
-
+      assertTrue("We only accept FileNotFoundException as valid exception in this test",
+          e.getCause() instanceof FileNotFoundException);
       // set string to empty to not fail any of the tests in this case
       logs = "";
-
       // also log a warning to indicate that this test did not do anything
       Log.warn("File " + FILE_PATH + " not found, cannot run checks on log file.");
     }
@@ -92,5 +85,4 @@ public class LogChecker extends TestCase {
   public void testOutEDT() {
     assertFalse(logs.matches("creation must be done on Event Dispatch Thread "));
   }
-
 }
diff --git a/src/test/java/org/jajuk/MockPlayer.java b/src/test/java/org/jajuk/MockPlayer.java
new file mode 100644
index 0000000..319aa81
--- /dev/null
+++ b/src/test/java/org/jajuk/MockPlayer.java
@@ -0,0 +1,124 @@
+/*
+ *  Jajuk
+ *  Copyright (C) 2003-2012 The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk;
+
+import org.jajuk.services.players.IPlayerImpl;
+import org.jajuk.services.webradio.WebRadio;
+
+public class MockPlayer implements IPlayerImpl {
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#stop()
+   */
+  @Override
+  public void stop() throws Exception {
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#setVolume(float)
+   */
+  @Override
+  public void setVolume(float fVolume) throws Exception {
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#seek(float)
+   */
+  @Override
+  public void seek(float fPosition) {
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#resume()
+   */
+  @Override
+  public void resume() throws Exception {
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#play(org.jajuk.services.webradio.WebRadio, float)
+   */
+  @Override
+  public void play(WebRadio radio, float fVolume) throws Exception {
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#play(org.jajuk.base.File, float, long, float)
+   */
+  @Override
+  public void play(org.jajuk.base.File file, float fPosition, long length, float fVolume)
+      throws Exception {
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#pause()
+   */
+  @Override
+  public void pause() throws Exception {
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#getState()
+   */
+  @Override
+  public int getState() {
+    return 0;
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#getElapsedTime()
+   */
+  @Override
+  public long getElapsedTimeMillis() {
+    return 0;
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#getCurrentVolume()
+   */
+  @Override
+  public float getCurrentVolume() {
+    return 0;
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#getCurrentPosition()
+   */
+  @Override
+  public float getCurrentPosition() {
+    return 0;
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#getCurrentLength()
+   */
+  @Override
+  public long getDurationSec() {
+    return 0;
+  }
+
+  /* (non-Javadoc)
+   * @see org.jajuk.services.players.IPlayerImpl#getActuallyPlayedTimeMillis()
+   */
+  @Override
+  public long getActuallyPlayedTimeMillis() {
+    // TODO Auto-generated method stub
+    return 0;
+  }
+}
diff --git a/src/test/java/org/jajuk/TestHelpers.java b/src/test/java/org/jajuk/TestHelpers.java
index b336379..63200a1 100644
--- a/src/test/java/org/jajuk/TestHelpers.java
+++ b/src/test/java/org/jajuk/TestHelpers.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,14 +16,27 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk;
 
-import java.util.concurrent.atomic.AtomicInteger;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 import javax.swing.SwingUtilities;
 
+import junit.framework.Assert;
+
 import org.jajuk.base.Album;
 import org.jajuk.base.AlbumManager;
 import org.jajuk.base.Artist;
@@ -32,119 +45,832 @@ import org.jajuk.base.Device;
 import org.jajuk.base.DeviceManager;
 import org.jajuk.base.Directory;
 import org.jajuk.base.DirectoryManager;
-import org.jajuk.base.File;
 import org.jajuk.base.FileManager;
 import org.jajuk.base.Genre;
 import org.jajuk.base.GenreManager;
+import org.jajuk.base.Playlist;
+import org.jajuk.base.PlaylistManager;
 import org.jajuk.base.Track;
 import org.jajuk.base.TrackManager;
 import org.jajuk.base.Type;
 import org.jajuk.base.TypeManager;
 import org.jajuk.base.Year;
 import org.jajuk.base.YearManager;
-import org.jajuk.services.players.MPlayerPlayerImpl;
-import org.jajuk.services.tags.JAudioTaggerTagImpl;
+import org.jajuk.events.ObservationManager;
+import org.jajuk.services.bookmark.History;
+import org.jajuk.services.core.ExitService;
+import org.jajuk.services.players.IPlayerImpl;
+import org.jajuk.services.players.QueueModel;
+import org.jajuk.services.players.StackItem;
+import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioManager;
+import org.jajuk.services.webradio.WebRadioOrigin;
+import org.jajuk.util.Const;
+import org.jajuk.util.MD5Processor;
+import org.jajuk.util.error.JajukException;
+import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * Small helper class with functionality that is used in multiple unit tests.
  */
-public class TestHelpers extends JajukTestCase {
+public class TestHelpers {
+  /**
+   * Helper method for removing emma-reports for classes with only static
+   * methods
+   * <p/>
+   * see
+   * http://sourceforge.net/tracker/index.php?func=detail&aid=1173251&group_id
+   * =108932&atid=651900
+   * 
+   * add this to the test case for any class that has only static methods where
+   * EMMA reports the default constructor as not covered
+   * 
+   * Template: <code>
+   * 
+   * // helper method to emma-coverage of the unused constructor
+   * public void testPrivateConstructor() throws Exception {
+   * JUnitHelpers.executePrivateConstructor(<yourclass>.class);
+   * }
+   * </code>
+   *
+   * @param <T> 
+   * @param targetClass 
+   * @return the t
+   * @throws Exception the exception
+   */
+  public static <T> T executePrivateConstructor(final Class<T> targetClass) throws Exception {
+    final Constructor<T> c = targetClass.getDeclaredConstructor(new Class[] {});
+    c.setAccessible(true);
+    return c.newInstance((Object[]) null);
+  }
 
-  /** DOCUMENT_ME. */
-  Exception exc = null;
-  
-  /** DOCUMENT_ME. */
-  boolean finished = false;
+  /**
+   * Equals test.
+   * 
+   *
+   * @param obj 
+   * @param equal 
+   * @param notequal 
+   */
+  public static void EqualsTest(final Object obj, final Object equal, final Object notequal) {
+    // none of the three should be null
+    Assert.assertNotNull("Object in EqualsTest should not be null!", obj);
+    Assert.assertNotNull("Equals-object in EqualsTest should not be null!", equal);
+    Assert.assertNotNull("Non-equal-object in EqualsTest should not be null!", notequal);
+    // make sure different objects are passed in
+    Assert.assertFalse("Object and equals-object in EqualsTest should not be identical",
+        obj == equal);
+    Assert.assertFalse("Object and non-equals-object in EqualsTest should not be identical",
+        obj == notequal);
+    // make sure correct objects are passed
+    Assert.assertTrue("Classes of objects in EqualsTest should be equal!",
+        obj.getClass().equals(equal.getClass()));
+    Assert.assertTrue("Classes of objects in EqualsTest should be equal!",
+        obj.getClass().equals(notequal.getClass()));
+    // make sure correct parameters are passed
+    // equal should be equal to obj, not-equal should not be equal to obj!
+    Assert.assertTrue("Object and equal-object should be equal in EqualsTest!", obj.equals(equal));
+    Assert.assertFalse("Object and non-equal-object should not be equal in EqualsTest!",
+        obj.equals(notequal));
+    // first test some general things that should be true with equals
+    // reflexive: equals to itself
+    Assert
+        .assertTrue("Reflexive: object should be equal to itself in EqualsTest!", obj.equals(obj));
+    Assert.assertTrue("Reflexive: equal-object should be equal to itself in EqualsTest!",
+        equal.equals(equal));
+    Assert.assertTrue("Reflexive: non-equal-object should be equal to itself in EqualsTest!",
+        notequal.equals(notequal));
+    // not equals to null
+    Assert.assertFalse("Object should not be equal to null in EqualsTest!", obj.equals(null));
+    Assert.assertFalse("Equal-object should not be equal to null in EqualsTest!",
+        equal.equals(null));
+    Assert.assertFalse("Non-equal-object should not be equal to null in EqualsTest!",
+        notequal.equals(null));
+    // not equals to a different type of object
+    Assert.assertFalse("Object should not be equal to an arbitrary string in EqualsTest!",
+        obj.equals("TestString"));
+    // then test some things with another object that should be equal
+    // symmetric, if one is (not) equal to another then the reverse must be true
+    Assert.assertTrue("Symmetric: Object should be equal to equal-object in EqualsTest",
+        obj.equals(equal));
+    Assert.assertTrue("Symmetric: Equals-object should be equal to object in EqualsTest!",
+        equal.equals(obj));
+    Assert.assertFalse("Symmetric: Object should NOT be equal to non-equal-object in EqualsTest",
+        obj.equals(notequal));
+    Assert.assertFalse("Symmetric: Non-equals-object should NOT be equal to object in EqualsTest!",
+        notequal.equals(obj));
+    // transitive: if a.equals(b) and b.equals(c) then a.equals(c)
+    // not tested right now
+    // hashCode: equal objects should have equal hash code
+    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!",
+        obj.hashCode() == equal.hashCode());
+    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!",
+        obj.hashCode() == obj.hashCode());
+    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!",
+        equal.hashCode() == equal.hashCode());
+    Assert.assertTrue("Transitive: Equal objects should have equal hash-code in EqualsTest!",
+        notequal.hashCode() == notequal.hashCode());
+  }
 
   /**
-   * Test clear swing utilities queue.
-   * DOCUMENT_ME
+   * Compare to test.
+   * 
    *
+   * @param <T> 
+   * @param obj 
+   * @param equal 
+   * @param notequal 
+   */
+  @SuppressWarnings("unchecked")
+  public static <T> void CompareToTest(final Comparable<T> obj, final Comparable<T> equal,
+      final Comparable<T> notequal) {
+    // none of the three should be null
+    Assert.assertNotNull("Object in CompareToTest should not be null!", obj);
+    Assert.assertNotNull("Equals-object in CompareToTest should not be null!", equal);
+    Assert.assertNotNull("Non-equal-object in CompareToTest should not be null!", notequal);
+    // make sure different objects are passed in
+    Assert.assertFalse("Object and equals-object in CompareToTest should not be identical",
+        obj == equal);
+    Assert.assertFalse("Object and non-equals-object in CompareToTest should not be identical",
+        obj == notequal);
+    // make sure correct parameters are passed
+    // equal should be equal to obj, not-equal should not be equal to obj!
+    Assert.assertEquals("Object and equal-object should compare in CompareToTest!", 0,
+        obj.compareTo((T) equal));
+    Assert.assertFalse("Object and non-equal-object should not compare in CompareToTest!",
+        0 == obj.compareTo((T) notequal));
+    // first test some general things that should be true with equals
+    // reflexive: equals to itself
+    Assert.assertEquals("Reflexive: object should be equal to itself in CompareToTest!", 0,
+        obj.compareTo((T) obj));
+    Assert.assertEquals("Reflexive: equal-object should be equal to itself in CompareToTest!", 0,
+        equal.compareTo((T) equal));
+    Assert.assertEquals("Reflexive: non-equal-object should be equal to itself in CompareToTest!",
+        0, notequal.compareTo((T) notequal));
+    // not equals to null
+    Assert.assertFalse("Object should not be equal to null in CompareToTest!",
+        0 == obj.compareTo(null));
+    Assert.assertFalse("Equal-object should not be equal to null in CompareToTest!",
+        0 == equal.compareTo(null));
+    Assert.assertFalse("Non-equal-object should not be equal to null in CompareToTest!",
+        0 == notequal.compareTo(null));
+    // not equals to a different type of object
+    /*
+     * Assert.assertFalse("Object should not be equal to an arbitrary string in CompareToTest!" , 0
+     * == obj.compareTo("TestString"));
+     */
+    // then test some things with another object that should be equal
+    // symmetric, if one is (not) equal to another then the reverse must be true
+    Assert.assertEquals("Symmetric: Object should be equal to equal-object in CompareToTest", 0,
+        obj.compareTo((T) equal));
+    Assert.assertEquals("Symmetric: Equals-object should be equal to object in CompareToTest!", 0,
+        equal.compareTo((T) obj));
+    Assert.assertFalse(
+        "Symmetric: Object should NOT be equal to non-equal-object in CompareToTest",
+        0 == obj.compareTo((T) notequal));
+    Assert.assertFalse(
+        "Symmetric: Non-equals-object should NOT be equal to object in CompareToTest!",
+        0 == notequal.compareTo((T) obj));
+    // transitive: if a.equals(b) and b.equals(c) then a.equals(c)
+    // not tested right now
+  }
+
+  /**
+   * Run some general tests on the toString method. This static method is used
+   * in tests for classes that overwrite toString().
+   *
+   * @param obj
+   *          The object to test toString(). This should be an object of a type
+   *          that overwrites toString()
+   *
+   */
+  public static void ToStringTest(final Object obj) {
+    // toString should not return null
+    Assert.assertNotNull("A derived toString() should not return null!", obj.toString());
+    // toString should not return an empty string
+    Assert.assertFalse("A derived toString() should not return an empty string!", obj.toString()
+        .equals(""));
+    // check that calling it multiple times leads to the same value
+    String value = obj.toString();
+    for (int i = 0; i < 10; i++) {
+      Assert.assertEquals(
+          "toString() is expected to result in the same result across repeated calls!", value,
+          obj.toString());
+    }
+  }
+
+  /**
+   * Run some generic tests on the derived clone-method.
+   * 
+   * We need to do this via reflection as the clone()-method in Object is
+   * protected and the Cloneable interface does not include a public "clone()".
+   *
+   * @param obj The object to test clone for.
    * @throws Exception the exception
    */
-  public void testClearSwingUtilitiesQueue() throws Exception {
-    // verify test-helper to clear the Swing Utilities Queue
+  public static void CloneTest(final Cloneable obj) throws Exception {
+    final Method m = obj.getClass().getMethod("clone", new Class[] {});
+    Assert.assertNotNull("Need to find a method called 'clone' in object of type '"
+        + obj.getClass().getName() + "' in CloneTest!", m);
+    // Assert.assertTrue("Method 'clone' on object of type '" +
+    // obj.getClass().getName() + "' needs to be accessible in
+    // CloneTest!",
+    // m.isAccessible());
+    // clone should return a different object, not the same again
+    Assert.assertTrue("clone() should not return the object itself in CloneTest!",
+        obj != m.invoke(obj, new Object[] {}));
+    // should return the same type of object
+    Assert.assertTrue(
+        "clone() should return the same type of object (i.e. the same class) in CloneTest!", m
+            .invoke(obj, new Object[] {}).getClass() == obj.getClass());
+    // cloned objects should be equal to the original object
+    Assert.assertTrue(
+        "clone() should return an object that is equal() to the original object in CloneTest!", m
+            .invoke(obj, new Object[] {}).equals(obj));
+  }
+
+  /**
+   * Checks certain assumption that are made for the hashCode() method.
+   *
+   * @param obj An Object that override the hasCode() method.
+   * @param equ 
+   */
+  public static void HashCodeTest(final Object obj, final Object equ) {
+    Assert
+        .assertFalse(
+            "HashCodeTest expects two distinct objects with equal hashCode, but the same object is provided twice!",
+            obj == equ);
+    // The same object returns the same hashCode always
+    final int hash = obj.hashCode();
+    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
+        hash, obj.hashCode());
+    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
+        hash, obj.hashCode());
+    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
+        hash, obj.hashCode());
+    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
+        hash, obj.hashCode());
+    Assert.assertEquals("hashCode() on object returned different hash after some iterations!",
+        hash, obj.hashCode());
+    // equal objects must have the same hashCode
+    // the other way around is not required,
+    // different objects can have the same hashCode!!
+    Assert
+        .assertEquals(
+            "Equal Assert failed, but input to HashCodeTest should be two equal objects! Check if the class implements equals() as well to fullfill this contract",
+            obj, equ);
+    Assert.assertEquals("Equal objects should have equal hashCode() by Java contract!",
+        obj.hashCode(), equ.hashCode());
+  }
+
+  /**
+   * Enum test.
+   * 
+   *
+   * @param enumtype 
+   * @param enumclass 
+   * @param element 
+   * @throws NoSuchMethodException the no such method exception
+   * @throws InvocationTargetException the invocation target exception
+   * @throws IllegalAccessException the illegal access exception
+   */
+  @SuppressWarnings({ "unchecked", "rawtypes" })
+  public static void EnumTest(Enum enumtype, Class enumclass, String element)
+      throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+    // check valueOf()
+    Assert.assertEquals(enumtype, Enum.valueOf(enumclass, element));
+    // check values()
+    Method m = enumclass.getMethod("values", (Class[]) null);
+    Object obj = m.invoke(enumtype, (Object[]) null);
+    Assert.assertNotNull(obj);
+    Assert.assertTrue(obj instanceof Object[]);
+    // check existing valeOf()
+    obj = Enum.valueOf(enumclass, element);
+    Assert.assertNotNull(obj);
+    Assert.assertTrue(obj instanceof Enum);
+    // check non-existing valueOf
+    try {
+      Enum.valueOf(enumclass, "nonexistingenumelement");
+      Assert
+          .fail("Should catch exception IllegalArgumentException when calling Enum.valueOf() with incorrect enum-value!");
+    } catch (IllegalArgumentException e) {
+      Assert.assertTrue(e.getMessage(), e.getMessage().contains("No enum const class"));
+    }
+  }
 
-    SwingUtilities.invokeLater(new Runnable() {
+  /**
+   * Clear swing utilities queue.
+   * 
+   *
+   * @throws InterruptedException the interrupted exception
+   * @throws InvocationTargetException the invocation target exception
+   */
+  public static void clearSwingUtilitiesQueue() throws InterruptedException,
+      InvocationTargetException {
+    // we try to wait for all items that were sent via
+    // "SwingUtilities.invokeLater()" in order
+    // to have a deterministic state in the tests where we know that the
+    // asynchronous action
+    // done in any "invokeLater()" was actually finished
+    SwingUtilities.invokeAndWait(new Runnable() {
       @Override
       public void run() {
-        try {
-          Thread.sleep(1000);
-
-          finished = true;
-        } catch (InterruptedException e) {
-          exc = e;
-        }
+        // nothing to do here, we just want the runnable to run...
       }
     });
+    // Thread.currentThread().
+  }
 
-    long now = System.currentTimeMillis();
+  /**
+   * Wait for a specific thread to finish.
+   * @param name 
+   * @throws InterruptedException the interrupted exception
+   */
+  public static void waitForThreadToFinish(final String name) throws InterruptedException {
+    int count = Thread.currentThread().getThreadGroup().activeCount();
+    Thread[] threads = new Thread[count];
+    Thread.currentThread().getThreadGroup().enumerate(threads);
+    for (Thread t : threads) {
+      if (t != null && name.equals(t.getName())) {
+        t.join();
+      }
+    }
+  }
 
-    // after this method returns we expect the above invokeLater to be finished
-    JUnitHelpers.clearSwingUtilitiesQueue();
+  public static void push(final List<StackItem> items, final boolean bKeepPrevious,
+      final boolean bPushNext) {
+    try {
+      Class<?> queueModelClass = Class.forName("org.jajuk.services.players.QueueModel");
+      Method pushMethod = queueModelClass.getDeclaredMethod("pushCommand", List.class,
+          boolean.class, boolean.class);
+      pushMethod.setAccessible(true);
+      pushMethod.invoke(null, items, bKeepPrevious, bPushNext);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
 
-    // now the finished needs to be true
-    assertTrue("Elapsed time(ms): " + (System.currentTimeMillis() - now), finished);
+  public static void push(final StackItem item, final boolean bKeepPrevious, final boolean bPushNext) {
+    try {
+      Class<?> queueModelClass = Class.forName("org.jajuk.services.players.QueueModel");
+      Method pushMethod = queueModelClass.getDeclaredMethod("pushCommand", StackItem.class,
+          boolean.class, boolean.class);
+      pushMethod.setAccessible(true);
+      pushMethod.invoke(null, item, bKeepPrevious, bPushNext);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
   }
 
-  /** DOCUMENT_ME. */
-  private final int COUNT = 10;
-  
-  /** DOCUMENT_ME. */
-  private AtomicInteger count = new AtomicInteger(0);
+  /**
+   * Wait for all threads to finish.
+   * 
+   *
+  * @throws InterruptedException the interrupted exception
+   */
+  public static void waitForAllThreadToFinish() throws InterruptedException {
+    int count = Thread.currentThread().getThreadGroup().activeCount();
+    Log.info(count + " threads active");
+    Thread[] threads = new Thread[count];
+    Thread.currentThread().getThreadGroup().enumerate(threads);
+    for (Thread t : threads) {
+      if (t != null && t.getClass().getPackage().getName().startsWith("org.jajuk")) {
+        Log.info(t.getClass().getPackage().getName() + "/" + t.getName());
+        t.join();
+      }
+    }
+  }
 
   /**
-   * Test clear swing utilities queue multiple.
-   * DOCUMENT_ME
+   * Cleanup all the environment
+   * 
    *
-   * @throws Exception the exception
+   * @throws InterruptedException the interrupted exception
+   * @throws InvocationTargetException the invocation target exception
    */
-  public void testClearSwingUtilitiesQueueMultiple() throws Exception {
-    // verify test-helper to clear the Swing Utilities Queue
-
-    for (int i = 0; i < COUNT; i++) {
-      SwingUtilities.invokeLater(new Runnable() {
-        @Override
-        public void run() {
-          try {
-            Thread.sleep(1000 / COUNT);
-
-            count.incrementAndGet();
-          } catch (InterruptedException e) {
-            exc = e;
-          }
-        }
-      });
+  public static void cleanup() throws InterruptedException, InvocationTargetException {
+    ObservationManager.clear();
+    // Reset everything
+    QueueModel.stopRequest();
+    QueueModel.clear();
+    FileManager.getInstance().clear();
+    DirectoryManager.getInstance().clear();
+    cleanAllDevices();
+    History.getInstance().clear();
+    TestHelpers.clearSwingUtilitiesQueue();
+    //Reset everything again as it could have been changed during threads finishing
+    ObservationManager.clear();
+    // Reset everything
+    QueueModel.stopRequest();
+    QueueModel.clear();
+    FileManager.getInstance().clear();
+    DirectoryManager.getInstance().clear();
+    cleanAllDevices();
+    History.getInstance().clear();
+  }
+
+  public static void forceExitState(boolean state) {
+    try {
+      Field exitingField = ExitService.class.getDeclaredField("bExiting");
+      exitingField.setAccessible(true);
+      exitingField.setBoolean(null, state);
+    } catch (SecurityException e) {
+      Log.error(e);
+    } catch (NoSuchFieldException e) {
+      Log.error(e);
+    } catch (IllegalArgumentException e) {
+      Log.error(e);
+    } catch (IllegalAccessException e) {
+      Log.error(e);
     }
+  }
 
-    long now = System.currentTimeMillis();
+  /**
+  * Clean all devices.
+  */
+  public static void cleanAllDevices() {
+    for (Device device : DeviceManager.getInstance().getDevices()) {
+      // Do not auto-refresh CD as several CD may share the same mount
+      // point
+      if (device.getType() == Device.Type.FILES_CD) {
+        continue;
+      }
+      FileManager.getInstance().cleanDevice(device.getName());
+      DirectoryManager.getInstance().cleanDevice(device.getName());
+      PlaylistManager.getInstance().cleanDevice(device.getName());
+    }
+    DeviceManager.getInstance().clear();
+  }
+
+  /**
+     * Return a file named "test.tst" on a mounted device.
+     * @return a file named "test.tst" on a mounted device.
+   * @throws IOException 
+     */
+  public static org.jajuk.base.File getFile() {
+    return getFile("test.tst", true);
+  }
 
-    // after this method returns we expect the above invokeLater to be finished
-    JUnitHelpers.clearSwingUtilitiesQueue();
+  public static org.jajuk.base.File getFile(String name, Directory dir, boolean mount,
+      Class<? extends IPlayerImpl> clazz, Album album) {
+    Genre genre = getGenre();
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
+    // this test
+    Artist artist = getArtist("myartist");
+    Year year = getYear(2000);
+    Type type = getType(clazz);
+    Track track = TrackManager.getInstance().registerTrack(name, album, genre, artist, 120, year,
+        1, type, 1);
+    Device device = getDevice();
+    if (mount & !device.isMounted()) {
+      try {
+        device.mount(true);
+      } catch (Exception e) {
+        throw new RuntimeException(e);
+      }
+    }
+    org.jajuk.base.File file = FileManager.getInstance().registerFile(name, dir, track, 120, 70);
+    try {
+      file.getFIO().createNewFile();
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+    return file;
+  }
 
-    // now the finished needs to be true
-    assertTrue(
-        "Elapsed time(ms): " + (System.currentTimeMillis() - now) + " Count: " + count.get(), count
-            .get() == COUNT);
+  public static org.jajuk.base.File getFile(String name, Directory dir, boolean mount,
+      Class<? extends IPlayerImpl> clazz) {
+    Album album = getAlbum("name", 0);
+    return getFile(name, dir, mount, clazz, album);
   }
 
   /**
-   * Return a mock file for testing purposes.
+   * Gets the file.
    *
-   * @return a mock file for testing purposes
+   * @param name 
+   * @param mount 
+   * @return the file
+   * @throws IOException 
    */
-  public static File getMockFile() {
-    Type type = TypeManager.getInstance().registerType("mp3", "mp3", MPlayerPlayerImpl.class,
-        JAudioTaggerTagImpl.class);
-    Album album = AlbumManager.getInstance().registerAlbum("album name", "album artist", 2222l);
-    Genre genre = GenreManager.getInstance().registerGenre("genre name");
-    Artist artist = ArtistManager.getInstance().registerArtist("artist name");
-    Year year = YearManager.getInstance().registerYear("2000");
-    Track track = TrackManager.getInstance().registerTrack("track name", album, genre, artist, 12l,
-        year, 1l, type, 1l);
-    Device device = DeviceManager.getInstance().registerDevice("device name", 1l, "/tmp");
-    Directory dir = DirectoryManager.getInstance().registerDirectory(device);
-    File file = FileManager.getInstance().registerFile("file name", dir, track, 12, 128);
-    return file;
+  public static org.jajuk.base.File getFile(String name, boolean mount) {
+    Directory dir = TestHelpers.getDirectory();
+    return getFile(name, dir, mount, MockPlayer.class);
+  }
+
+  /**
+   * Gets a playlist listing the default file and located in the default directory
+   *
+   * @return the playlist
+   * @throws IOException 
+   */
+  public static Playlist getPlaylist() throws IOException {
+    Device device = getDevice();
+    Directory dir = TestHelpers.getDirectory();
+    File playlistFile = new File(dir.getAbsolutePath() + "/sample_playlist.m3u");
+    org.jajuk.base.File file1 = getFile("1", true);
+    org.jajuk.base.File file2 = getFile("2", true);
+    BufferedWriter bw = new BufferedWriter(new FileWriter(playlistFile));
+    bw.write(file1.getAbsolutePath() + "\n");
+    bw.write(file2.getAbsolutePath());
+    bw.flush();
+    bw.close();
+    String id = MD5Processor.hash(new StringBuilder(device.getName()).append(dir.getRelativePath())
+        .append(playlistFile.getName()).toString());
+    org.jajuk.base.Playlist playlist = PlaylistManager.getInstance().registerPlaylistFile(id,
+        playlistFile.getName(), dir);
+    // Force playlist loading
+    try {
+      playlist.getFiles();
+    } catch (JajukException e) {
+      Log.error(e);
+    }
+    return playlist;
+  }
+
+  /**
+   * Gets a void playlist
+   *
+   * @return the playlist
+   * @throws IOException 
+   */
+  public static Playlist getVoidPlaylist() throws IOException {
+    Device device = getDevice();
+    Directory dir = TestHelpers.getDirectory();
+    File playlistFile = new File(dir.getAbsolutePath() + "/sample_playlist.m3u");
+    String id = MD5Processor.hash(new StringBuilder(device.getName()).append(dir.getRelativePath())
+        .append(playlistFile.getName()).toString());
+    org.jajuk.base.Playlist playlist = PlaylistManager.getInstance().registerPlaylistFile(id,
+        playlistFile.getName(), dir);
+    return playlist;
+  }
+
+  /**
+   * Gets the album.
+   *
+   * @param name 
+   * @param discID 
+   * @return the album
+   */
+  public static Album getAlbum(String name, int discID) {
+    return AlbumManager.getInstance().registerAlbum(name, discID);
+  }
+
+  /**
+   * Gets the album.
+   *
+   * @return the album
+   */
+  public static Album getAlbum() {
+    return getAlbum("name", 0);
+  }
+
+  /**
+   * Gets the artist.
+   *
+   * @param name 
+   * @return the artist
+   */
+  public static Artist getArtist(String name) {
+    return ArtistManager.getInstance().registerArtist(name);
+  }
+
+  /**
+   * Gets the artist.
+   *
+   * @return the artist
+   */
+  public static Artist getArtist() {
+    return getArtist("name");
+  }
+
+  /**
+   * Gets the genre.
+   *
+   * @param name 
+   * @return the genre
+   */
+  public static Genre getGenre(String name) {
+    return GenreManager.getInstance().registerGenre(name);
+  }
+
+  /**
+   * Gets the genre.
+   *
+   * @return the genre
+   */
+  public static Genre getGenre() {
+    return getGenre("name");
+  }
+
+  /**
+   * Gets the year.
+   *
+   * @param year 
+   * @return the year
+   */
+  public static Year getYear(int year) {
+    return YearManager.getInstance().registerYear("" + year);
+  }
+
+  /**
+   * Gets the year.
+   *
+   * @return the year
+   */
+  public static Year getYear() {
+    return getYear(2000);
+  }
+
+  /**
+   * Gets the device.
+   *
+   * @param name 
+   * @param type 
+   * @param url 
+   * @return the device
+   */
+  public static Device getDevice(String name, Device.Type type, String url) {
+    // Create the jajuk test device if required
+    new File(url).mkdirs();
+    // Create at least a void file in the device
+    try {
+      new File(url + "/audio1.mp3").createNewFile();
+    } catch (IOException e) {
+      Log.error(e);
+    }
+    Device device = DeviceManager.getInstance().registerDevice(name, type, url);
+    //Register the associated root directory
+    DirectoryManager.getInstance().registerDirectory(device);
+    return device;
+  }
+
+  /**
+   * Gets the device., create it on disk if required
+   *
+   * @return the device
+   */
+  public static Device getDevice() {
+    return getDevice("sample_device", Device.Type.DIRECTORY, ConstTest.DEVICES_BASE_PATH
+        + "/sample_device");
+  }
+
+  /**
+   * Gets the directory, create it on disk if required
+   *
+   * @param name 
+   * @param parent 
+   * @param device 
+   * @return the directory
+   */
+  public static Directory getDirectory(String name, Directory parent, Device device) {
+    // create the directory if it doesn't exist yet
+    Directory dir = DirectoryManager.getInstance().registerDirectory(name, parent, device);
+    dir.getFio().mkdirs();
+    return dir;
+  }
+
+  public static Directory getDirectory(String name) {
+    Device device = getDevice();
+    Directory topdir = getTopDirectory();
+    Directory dir = DirectoryManager.getInstance().registerDirectory(name, topdir, device);
+    dir.getFio().mkdirs();
+    return dir;
+  }
+
+  /**
+   * The "any" directory is the top dir of the device 
+   *, create it on disk if required
+   * @return the directory
+   */
+  public static Directory getDirectory() {
+    return getDirectory("dir");
+  }
+
+  /**
+  * Returns a web radio
+  *
+  * @return the webradio
+  */
+  public static WebRadio getWebRadio(String name, String url, WebRadioOrigin origin) {
+    WebRadio radio = WebRadioManager.getInstance().registerWebRadio(name);
+    radio.setProperty(Const.XML_URL, url);
+    radio.setProperty(Const.XML_ORIGIN, origin);
+    return radio;
+  }
+
+  /**
+  * Returns a web radio (invalid URL)
+  *
+  * @return the webradio
+  */
+  public static WebRadio getWebRadio() {
+    return getWebRadio("preset1", "http://preset1", WebRadioOrigin.CUSTOM);
+  }
+
+  /**
+  * Returns a list of web radio
+  *
+  * @return the list of web radio
+  */
+  public static List<WebRadio> getWebRadios() {
+    //Reset radios
+    WebRadioManager.getInstance().cleanup();
+    WebRadio custom1 = getWebRadio("Custom 1", "http://custom1", WebRadioOrigin.CUSTOM);
+    custom1.setProperty(Const.XML_BITRATE, new Long(127));
+    custom1.setProperty(Const.XML_FREQUENCY, new Long(45000));
+    custom1.setProperty(Const.XML_KEYWORDS, "foo,bar");
+    custom1.setProperty(Const.XML_GENRE, "Pop");
+    custom1.setProperty(Const.XML_DESC, "a cool radio");
+    WebRadio custom2 = getWebRadio("Custom 2", "http://custom2", WebRadioOrigin.CUSTOM);
+    WebRadio preset1 = getWebRadio("Preset 1", "http://preset1", WebRadioOrigin.PRESET);
+    WebRadio preset2 = getWebRadio("Preset 2", "http://preset2", WebRadioOrigin.PRESET);
+    List<WebRadio> radios = new ArrayList<WebRadio>();
+    radios.add(custom1);
+    radios.add(custom2);
+    radios.add(preset1);
+    radios.add(preset2);
+    return radios;
+  }
+
+  /**
+   * A topdir directory.
+   *
+   * @return the top directory
+   */
+  public static Directory getTopDirectory() {
+    return DirectoryManager.getInstance().registerDirectory(getDevice());
+  }
+
+  /**
+   * Gets the type.
+   *
+   * @return the type
+   */
+  public static Type getType() {
+    return getType(MockPlayer.class);
+  }
+
+  /**
+  * Gets the type with provided mplayer implementation class
+  * @param playerImpl
+  *
+  * @return the type
+  */
+  public static Type getType(Class<? extends IPlayerImpl> clazz) {
+    return TypeManager.getInstance().registerType("type", "mp3", clazz, null);
+  }
+
+  /**
+   * Gets the track.
+   *
+   * @param i 
+   * @return the track
+   */
+  public static Track getTrack(int i) {
+    Genre genre = getGenre();
+    Album album = getAlbum("myalbum", 0);
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
+    // this test
+    Artist artist = getArtist("myartist_" + i);
+    Year year = getYear(2000);
+    Type type = getType();
+    return TrackManager.getInstance().registerTrack("track_" + i, album, genre, artist, 120, year,
+        1, type, 1);
+  }
+
+  /**
+   * Helper to set a private field.
+   *
+   * @param obj the object to work on
+   * @param fieldName the field name
+   * @param value the field value to set
+   * @throws SecurityException the security exception
+   * @throws NoSuchFieldException the no such field exception
+   * @throws IllegalArgumentException the illegal argument exception
+   * @throws IllegalAccessException the illegal access exception
+   */
+  public static void setAttribute(Object obj, String fieldName, Object value)
+      throws SecurityException, NoSuchFieldException, IllegalArgumentException,
+      IllegalAccessException {
+    Field field = obj.getClass().getDeclaredField(fieldName);
+    field.setAccessible(true);
+    field.set(obj, value);
+  }
+
+  /**
+   * Print a dump of all current threads to System.out
+   */
+  public static void dumpThreads() {
+    Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces();
+    Iterator<Thread> i = traces.keySet().iterator();
+    while (i.hasNext()) {
+      Thread thd = i.next();
+      System.out.println("*** Thread id" + thd.getId() + ":" + thd.getName() + " ***");
+      StackTraceElement[] trace = traces.get(thd);
+      for (int j = 0; j < trace.length; ++j) {
+        System.out.println(trace[j]);
+      }
+      System.out.println();
+    }
   }
 }
diff --git a/src/test/java/org/jajuk/ThreadTestHelper.java b/src/test/java/org/jajuk/ThreadTestHelper.java
index bab210b..e6bae1e 100644
--- a/src/test/java/org/jajuk/ThreadTestHelper.java
+++ b/src/test/java/org/jajuk/ThreadTestHelper.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk;
 
@@ -29,30 +29,33 @@ import org.jajuk.util.log.Log;
 
 /**
  * Helper class to test with many threads.
- * 
+ *
  * Sample usage is as follows:
- * 
- * public void testMultipleThreads() throws Exception { ThreadTestHelper helper
- * = new ThreadTestHelper(NUMBER_OF_THREADS, NUMBER_OF_TESTS);
- * 
- * helper.executeTest(new ThreadTestHelper.TestRunnable() { public void
- * doEnd(int threadnum) throws Exception { // do stuff at the end ... }
- * 
- * public void run(int threadnum, int iter) { // do the actual threaded work ...
- * } }); }
+ *
+ * <code>
+
+  public void testMultipleThreads() throws Exception {
+    ThreadTestHelper helper = new ThreadTestHelper(NUMBER_OF_THREADS, NUMBER_OF_TESTS);
+
+    helper.executeTest(new ThreadTestHelper.TestRunnable() {
+      @Override
+      public void doEnd(int threadnum) throws Exception {
+        // do stuff at the end ...
+      }
+
+      @Override
+      public void run(int threadnum, int iter) {
+        // do the actual threaded work ...
+      }
+    });
+  }
+
+  </code>
  */
 public class ThreadTestHelper {
-  
-  /** DOCUMENT_ME. */
   private final int threadCount;
-  
-  /** DOCUMENT_ME. */
   private final int testsPerThread;
-
-  /** DOCUMENT_ME. */
   private boolean failed = false;
-  
-  /** DOCUMENT_ME. */
   private int executions[] = null;
 
   /**
@@ -64,41 +67,28 @@ public class ThreadTestHelper {
   public ThreadTestHelper(int threadCount, int testsPerThread) {
     this.threadCount = threadCount;
     this.testsPerThread = testsPerThread;
-
     // Initialize array to allow to summarize afterwards
     executions = new int[threadCount];
   }
 
-  /**
-   * Execute test.
-   * DOCUMENT_ME
-   *
-   * @param run DOCUMENT_ME
-   * @throws Exception the exception
-   */
   public void executeTest(TestRunnable run) throws Exception {
     Log.debug("Starting thread test");
-
     List<Thread> threads = new LinkedList<Thread>();
-
     // start all threads
     for (int i = 0; i < threadCount; i++) {
       Thread t = startThread(i, run);
       threads.add(t);
     }
-
     // wait for all threads
     for (int i = 0; i < threadCount; i++) {
       threads.get(i).join();
     }
-
     // make sure the resulting number of executions is correct
     for (int i = 0; i < threadCount; i++) {
       // check if enough items were performed
       Assert.assertEquals("Thread " + i + " did not execute all iterations", testsPerThread,
           executions[i]);
     }
-
     // check that we did not fail in any thread, i.e. no exception occurred...
     Assert.assertFalse(failed);
   }
@@ -106,35 +96,30 @@ public class ThreadTestHelper {
   /**
    * This method is executed to start one thread. The thread will execute the
    * provided runnable a number of times.
-   * 
+   *
    * @param threadnum
    *          The number of this thread
    * @param run
    *          The Runnable object that is used to perform the actual test
    *          operation
-   * 
+   *
    * @return The thread that was started.
-   * 
+   *
    */
   private Thread startThread(final int threadnum, final TestRunnable run) {
     Log.debug("Starting thread number: " + threadnum);
-
     Thread t1 = null;
     t1 = new Thread(new Runnable() {
-
       @Override
       public void run() {
         try {
           for (int iter = 0; iter < testsPerThread; iter++) {
             // Log.debug("Executing iteration " + iter + " in thread" +
             // Thread.currentThread().getName());
-
             // call the actual testcode
             run.run(threadnum, iter);
-
             executions[threadnum]++;
           }
-
           // do end-work here, we don't do this in a finally as we log Exception
           // then anyway
           run.doEnd(threadnum);
@@ -142,20 +127,16 @@ public class ThreadTestHelper {
           Log.error(e);
           failed = true;
         }
-
       }
     }, "Thread " + threadnum);
-
     t1.start();
-
     return t1;
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public interface TestRunnable {
-    
     /**
      * When an object implementing interface <code>Runnable</code> is used to
      * create a thread, starting the thread causes the object's <code>run</code>
@@ -173,10 +154,10 @@ public class ThreadTestHelper {
 
     /**
      * Perform any action that should be done at the end.
-     * 
+     *
      * This method should throw an Exception if any check fails at this point.
      *
-     * @param threadnum DOCUMENT_ME
+     * @param threadnum 
      * @throws Exception the exception
      */
     void doEnd(int threadnum) throws Exception;
@@ -184,7 +165,7 @@ public class ThreadTestHelper {
 
   /**
    * Test dummy.
-   * DOCUMENT_ME
+   * 
    */
   public void testDummy() {
     // small empty test to not fail if this class is executed as test case by
diff --git a/src/test/java/org/jajuk/base/TestAlbum.java b/src/test/java/org/jajuk/base/TestAlbum.java
index 7022089..a019d73 100644
--- a/src/test/java/org/jajuk/base/TestAlbum.java
+++ b/src/test/java/org/jajuk/base/TestAlbum.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,31 +16,30 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
+import java.lang.reflect.Field;
 import java.util.Date;
+import java.util.List;
 
 import org.apache.commons.io.FileUtils;
-import org.jajuk.JUnitHelpers;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 
-/**
- * DOCUMENT_ME.
- */
 public class TestAlbum extends JajukTestCase {
-
   /**
-   * Test method for {@link org.jajuk.base.Album#getDesc()}.
+   * Test method for {@link org.jajuk.base.Album#getTitle()}.
    */
   public final void testGetDesc() {
     Album album = new Album("1", "name", 123);
-    assertNotNull(album.getDesc());
-    assertFalse(album.getDesc().isEmpty());
+    assertNotNull(album.getTitle());
+    assertFalse(album.getTitle().isEmpty());
   }
 
   /**
@@ -49,32 +48,19 @@ public class TestAlbum extends JajukTestCase {
   public final void testGetAny() {
     // need item managers to do this step
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
-    /*
-     * album.getTracksCache().add(getTrack(album));
-     * 
-     * album.setProperty(Const.XML_TRACK_DISCOVERY_DATE, System.) String str = album.getAny();
-     * assertFalse(str.isEmpty());
-     */
-
     // add a genre and year and check again
     album.getTracksCache().add(getTrack(album));
     assertFalse(album.getAny().isEmpty());
-    /*
-     * assertFalse("getAny() should return differently as soon as we have genre and year" ,
-     * str.equals(album.getAny()));
-     */
   }
 
   /**
    * Test get any album artist.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGetAnyAlbumArtist() {
     // need item managers to do this step
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
     /*
      * album.getTracksCache().add(getTrack(album));
@@ -82,7 +68,6 @@ public class TestAlbum extends JajukTestCase {
      * album.setProperty(Const.XML_TRACK_DISCOVERY_DATE, System.) String str = album.getAny();
      * assertFalse(str.isEmpty());
      */
-
     // add a genre and year and check again
     Track track = getTrack(album);
     track.setAlbumArtist(new AlbumArtist("4", "artist"));
@@ -97,7 +82,7 @@ public class TestAlbum extends JajukTestCase {
   /**
    * Gets the track.
    *
-   * @param album DOCUMENT_ME
+   * @param album 
    * @return the track
    */
   private Track getTrack(Album album) {
@@ -133,11 +118,11 @@ public class TestAlbum extends JajukTestCase {
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Album#getLabel()}.
+   * Test method for {@link org.jajuk.base.Album#getXMLTag()}.
    */
   public final void testGetLabel() {
     Album album = new Album("1", "name", 123);
-    assertFalse(album.getLabel().isEmpty());
+    assertFalse(album.getXMLTag().isEmpty());
   }
 
   /**
@@ -149,29 +134,25 @@ public class TestAlbum extends JajukTestCase {
     // some of the lines below can require the ItemManagers to be registered
     // correctly
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
     assertFalse(album.getHumanValue(Const.XML_ALBUM).isEmpty());
-
     // things are empty before adding a track...
     assertTrue(album.getHumanValue(Const.XML_ARTIST).isEmpty());
     assertTrue(album.getHumanValue(Const.XML_GENRE).isEmpty());
     assertTrue(album.getHumanValue(Const.XML_YEAR).isEmpty());
-
     // add a genre and year
     Track track = getTrack(album);
     track.setProperty(Const.XML_TRACK_DISCOVERY_DATE, new Date());
     album.getTracksCache().add(track);
     assertFalse(album.getHumanValue(Const.XML_GENRE).isEmpty());
-
     assertFalse(album.getHumanValue(Const.XML_ARTIST).isEmpty());
     assertFalse(album.getHumanValue(Const.XML_YEAR).isEmpty());
     assertFalse(album.getHumanValue(Const.XML_TRACK_RATE).isEmpty());
     assertFalse(album.getHumanValue(Const.XML_TRACK_LENGTH).isEmpty());
     assertFalse(album.getHumanValue(Const.XML_TRACKS).isEmpty());
     assertFalse(album.getHumanValue(Const.XML_TRACK_DISCOVERY_DATE).isEmpty());
-    assertEquals("Value: " + album.getHumanValue(Const.XML_TRACK_HITS), "0", album
-        .getHumanValue(Const.XML_TRACK_HITS));
+    assertEquals("Value: " + album.getHumanValue(Const.XML_TRACK_HITS), "0",
+        album.getHumanValue(Const.XML_TRACK_HITS));
     assertFalse(album.getHumanValue(Const.XML_ANY).isEmpty());
     assertTrue(album.getHumanValue(Const.XML_ALBUM_ARTIST).isEmpty());
     assertTrue(album.getHumanValue(Const.XML_ALBUM_DISCOVERED_COVER).isEmpty());
@@ -191,7 +172,6 @@ public class TestAlbum extends JajukTestCase {
   public final void testGetRate() {
     Album album = new Album("1", "name", 123);
     assertEquals(0, album.getRate());
-
     // add track to have some useful rate
     Track track = getTrack(album);
     track.setRate(3);
@@ -223,7 +203,6 @@ public class TestAlbum extends JajukTestCase {
   public final void testGetName2() {
     Album album = new Album("1", "name", 123);
     assertEquals("name", album.getName2());
-
     album = new Album("1", Const.UNKNOWN_ALBUM, 123);
     assertEquals(Messages.getString(Const.UNKNOWN_ALBUM), album.getName2());
   }
@@ -233,7 +212,7 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testToString() {
     Album album = new Album("1", "name", 123);
-    JUnitHelpers.ToStringTest(album);
+    TestHelpers.ToStringTest(album);
   }
 
   /**
@@ -245,8 +224,7 @@ public class TestAlbum extends JajukTestCase {
     Album album = new Album("1", "name", 123);
     Album equal = new Album("1", "name", 123);
     Album nonequal = new Album("2", "name", 123);
-
-    JUnitHelpers.CompareToTest(album, equal, nonequal);
+    TestHelpers.CompareToTest(album, equal, nonequal);
   }
 
   /**
@@ -255,7 +233,6 @@ public class TestAlbum extends JajukTestCase {
   public final void testIsUnknown() {
     Album album = new Album("1", "name", 123);
     assertFalse(album.isUnknown());
-
     album = new Album("1", Const.UNKNOWN_ALBUM, 123);
     assertTrue(album.isUnknown());
   }
@@ -265,33 +242,25 @@ public class TestAlbum extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-  public final void testGetCoverFile() throws Exception {
+  public final void testFindCover1() throws Exception {
     Album album = new Album("1", "name", 123);
-
     // no file at first
     assertNull(album.findCover());
-
     // none
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE);
     assertNull(album.findCover());
-
     // set a cover file which does not exist
     // We need to make the cover inside a known device
-    Device tmpDevice = DeviceManager.getInstance().registerDevice("tmp", "tmpDevice",
-        Device.TYPE_DIRECTORY, System.getProperty("java.io.tmpdir"));
+    Device tmpDevice = TestHelpers.getDevice();
     tmpDevice.mount(false);
-    new java.io.File(System.getProperty("java.io.tmpdir"), "cover.tst").delete();
-    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, System.getProperty("java.io.tmpdir")
-        + java.io.File.separator + "cover.tst");
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, tmpDevice.getUrl() + java.io.File.separator
+        + "cover.tst");
     assertNull(album.findCover());
-
     // then create the file and try again
-    FileUtils.writeStringToFile(
-        new java.io.File(System.getProperty("java.io.tmpdir"), "cover.tst"), "");
-    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, System.getProperty("java.io.tmpdir")
-        + java.io.File.separator + "cover.tst");
+    FileUtils.writeStringToFile(new java.io.File(tmpDevice.getUrl(), "cover.tst"), "");
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, tmpDevice.getUrl() + java.io.File.separator
+        + "cover.tst");
     assertNotNull(album.findCover());
-
     // try with a track and no cover file set
     album.removeProperty(Const.XML_ALBUM_DISCOVERED_COVER);
     Track track = getTrack(album);
@@ -299,12 +268,35 @@ public class TestAlbum extends JajukTestCase {
     track.addFile(getFile(8, track));
     album.getTracksCache().add(track);
     assertNull(album.findCover());
-
     // Unregister the tmp device
     DeviceManager.getInstance().removeDevice(tmpDevice);
+  }
 
-    // TODO: some code is still not covered here, need to find out how to do
-    // that...
+  public final void testFindCover2() throws Exception {
+    // need item managers to do this step
+    StartupCollectionService.registerItemManagers();
+    Album album = new Album("1", "name", 123);
+    assertNull("null for new empty album", album.findCover());
+    assertFalse(album.containsCover());
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE);
+    assertNull("still null if we have 'none' set as cover", album.findCover());
+    assertFalse(album.containsCover());
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, "notexist");
+    assertNull("still null if we have an invalid file set as cover", album.findCover());
+    album.removeProperty(Const.XML_ALBUM_DISCOVERED_COVER);
+    album.getTracksCache().add(getTrack(album));
+    assertFalse(album.getAny().isEmpty());
+    assertNull("still null with a track which has no cover in the directory", album.findCover());
+    assertFalse(album.containsCover());
+    java.io.File file = java.io.File.createTempFile("jajuk_test", ".png", new java.io.File(
+        ConstTest.TECH_TESTS_PATH));
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, file.getAbsolutePath());
+    assertNotNull("now we should find the cover", album.findCover());
+    assertTrue(album.containsCover());
+    album.removeProperty(Const.XML_ALBUM_DISCOVERED_COVER);
+    album.setProperty(Const.XML_ALBUM_SELECTED_COVER, file.getAbsolutePath());
+    assertNotNull("now we should find the selected cover", album.findCover());
+    assertFalse("Still not a discovered cover now", album.containsCover());
   }
 
   /**
@@ -313,11 +305,8 @@ public class TestAlbum extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetThumbnail() throws Exception {
-    JUnitHelpers.createSessionDirectory();
-
     Album album = new Album("1", "name", 123);
     assertNotNull(album.getThumbnail(100));
-
     // TODO: actual code is not well covered right now, need to add some more
     // test-code here...
   }
@@ -327,10 +316,8 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testGetGenre() {
     Album album = new Album("1", "name", 123);
-
     // now genre without track
     assertNull(album.getGenre());
-
     // genre with at least one track
     album.getTracksCache().add(getTrack(album));
     assertNotNull(album.getGenre());
@@ -341,18 +328,14 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testGetArtist() {
     Album album = new Album("1", "name", 123);
-
     // no artist without track
     assertNull(album.getArtist());
-
     album.getTracksCache().add(getTrack(album));
     assertNotNull(album.getGenre());
-
     // add a second track with different artist
     Track track = new Track("2", "trackname2", album, getGenre(), new Artist("2", "artistname2"),
         123, getYear(), 1, new Type("4", "typename2", "ext", null, null), 1);
     album.getTracksCache().add(track);
-
     // now null again as multiple different artists are in the list
     assertNull(album.getArtist());
   }
@@ -362,18 +345,14 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testGetYear() {
     Album album = new Album("1", "name", 123);
-
     // no artist without track
     assertNull(album.getYear());
-
     album.getTracksCache().add(getTrack(album));
     assertNotNull(album.getYear());
-
     // add a second track with different year
     Track track = new Track("2", "trackname2", album, getGenre(), getArtist(), 123, new Year("2",
         "yearname2"), 1, new Type("4", "typename2", "ext", null, null), 1);
     album.getTracksCache().add(track);
-
     // now null again as multiple different artists are in the list
     assertNull(album.getYear());
   }
@@ -383,14 +362,11 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testGetDuration() {
     Album album = new Album("1", "name", 123);
-
     // zero without any track
     assertEquals(0, album.getDuration());
-
     // add a track with duration 123
     album.getTracksCache().add(getTrack(album));
     assertEquals(123, album.getDuration());
-
     // another one, this is summed up
     album.getTracksCache().add(getTrack(album));
     assertEquals(246, album.getDuration());
@@ -401,14 +377,11 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testGetNbOfTracks() {
     Album album = new Album("1", "name", 123);
-
     // zero without any track
     assertEquals(0, album.getNbOfTracks());
-
     // add a track with duration 123
     album.getTracksCache().add(getTrack(album));
     assertEquals(1, album.getNbOfTracks());
-
     // another one, this is summed up
     album.getTracksCache().add(getTrack(album));
     assertEquals(2, album.getNbOfTracks());
@@ -419,20 +392,16 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testGetHits() {
     Album album = new Album("1", "name", 123);
-
     // zero without any track
     assertEquals(0, album.getHits());
-
     // still zero as tracks have zero hits usually
     album.getTracksCache().add(getTrack(album));
     assertEquals(0, album.getHits());
-
     // another one, this has some hits
     Track track = getTrack(album);
     track.setHits(3);
     album.getTracksCache().add(track);
     assertEquals(3, album.getHits());
-
     // and another one, now it sums up
     track = getTrack(album);
     track.setHits(5);
@@ -443,18 +412,17 @@ public class TestAlbum extends JajukTestCase {
   /**
    * Gets the file.
    *
-   * @param i DOCUMENT_ME
-   * @param track DOCUMENT_ME
+   * @param i 
+   * @param track 
    * @return the file
    * @throws Exception the exception
    */
   private File getFile(int i, Track track) throws Exception {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     if (!device.isMounted()) {
       device.mount(true);
     }
     Directory dir = new Directory(Integer.valueOf(i).toString(), "", null, device);
-
     return new org.jajuk.base.File(Integer.valueOf(i).toString(), "test.tst", dir, track, 120, 70);
   }
 
@@ -465,10 +433,8 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testContainsReadyFiles() throws Exception {
     Album album = new Album("1", "name", 123);
-
     // no files
     assertFalse(album.containsReadyFiles());
-
     // add a track/file
     Track track = getTrack(album);
     track.addFile(getFile(6, track));
@@ -482,7 +448,6 @@ public class TestAlbum extends JajukTestCase {
   public final void testGetDiscoveryDate() {
     Album album = new Album("1", "name", 123);
     assertNull(album.getDiscoveryDate());
-
     Track track = getTrack(album);
     track.setDiscoveryDate(new Date());
     album.getTracksCache().add(track);
@@ -490,53 +455,25 @@ public class TestAlbum extends JajukTestCase {
   }
 
   /**
-   * Test method for.
-   *
-   * {@link org.jajuk.base.Album#matches(java.lang.String, java.lang.String)}.
-   */
-  public final void testMatches() {
-    Album album = new Album("1", "myname", 123);
-
-    // true if either of both is null !?
-    assertTrue(album.matches(null, null));
-    assertTrue(album.matches(Const.XML_ALBUM, null));
-    assertTrue(album.matches(null, ".*art.*"));
-
-    // false when not "ALBUM" or "GENRE"
-    assertFalse(album.matches(Const.XML_ALBUM_ARTIST, ".*art.*"));
-
-    // useful match?
-    assertTrue(album.matches(Const.XML_ALBUM, "my"));
-    assertTrue(album.matches(Const.XML_ALBUM, "name"));
-    assertFalse(album.matches(Const.XML_ALBUM, "notexist"));
-
-    // false without Genre
-    assertFalse(album.matches(Const.XML_GENRE, "."));
-
-    Track track = getTrack(album);
-    album.getTracksCache().add(track);
-
-    // now the genre should be found as well
-    assertTrue(album.matches(Const.XML_GENRE, "genrename"));
-  }
-
-  /**
    * Test method for {@link org.jajuk.base.Album#resetTracks()}.
+   *
+   * @throws IllegalAccessException the illegal access exception
+   * @throws NoSuchFieldException the no such field exception
    */
-  public final void testResetTracks() {
+  @SuppressWarnings("unchecked")
+  public final void testResetTracks() throws IllegalAccessException, NoSuchFieldException {
     Album album = new Album("1", "name", 123);
-
     // nothing happens without tracks
-    album.resetTracks();
-
+    Field field = Album.class.getDeclaredField("cache");
+    field.setAccessible(true);
+    List<Track> cache = (List<Track>) field.get(album);
+    cache.clear();
     // add tracks
     Track track = getTrack(album);
     album.getTracksCache().add(track);
-
     assertEquals(1, album.getTracksCache().size());
-
     // reset purges the tracks
-    album.resetTracks();
+    cache.clear();
     assertEquals(0, album.getTracksCache().size());
   }
 
@@ -552,14 +489,11 @@ public class TestAlbum extends JajukTestCase {
    */
   public final void testGetAnyTrack() {
     Album album = new Album("1", "name", 123);
-
     // nothing to return without tracks
     assertNull(album.getAnyTrack());
-
     // add tracks
     Track track = getTrack(album);
     album.getTracksCache().add(track);
-
     // now we get back the first track
     assertNotNull(album.getAnyTrack());
   }
@@ -574,7 +508,6 @@ public class TestAlbum extends JajukTestCase {
     assertFalse(album.isThumbAvailable(50));
     album.setAvailableThumb(50, true);
     assertTrue(album.isThumbAvailable(50));
-
     // test once more with a new album to create the thumbs-array there as well
     album = new Album("1", "name", 123);
     album.setAvailableThumb(100, false);
@@ -582,36 +515,30 @@ public class TestAlbum extends JajukTestCase {
 
   /**
    * Test get artist or album artist_ unknown.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGetArtistOrAlbumArtist_Unknown() {
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
-
     // unknown artist is returned without a track
     assertEquals(Const.UNKNOWN_ARTIST, album.getArtistOrALbumArtist());
   }
 
   /**
    * Test get artist or album artist_ album artist.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGetArtistOrAlbumArtist_AlbumArtist() {
     // need item managers to do this step
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
-
     // add a genre and year and check again
     Track track = getTrack(album);
     track.setAlbumArtist(new AlbumArtist("4", "albumartist"));
-
     album.getTracksCache().add(track);
     album.getTracksCache().add(
         new Track("1", "trackname", album, getGenre(), new Artist("2", "artistname2"), 123,
             getYear(), 1, new Type("3", "typename", "ext", null, null), 1));
-
     // here we should get the album artist from the Track because we have two tracks with different
     // artists
     assertEquals("albumartist", album.getArtistOrALbumArtist());
@@ -619,61 +546,62 @@ public class TestAlbum extends JajukTestCase {
 
   /**
    * Test get artist or album artist_ track artist.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGetArtistOrAlbumArtist_TrackArtist() {
     // need item managers to do this step
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
-
     // add a genre and year and check again
     Track track = getTrack(album);
     album.getTracksCache().add(track);
-
     // here we should get the artist from the Track as no album artist is set
     assertEquals("artistname", album.getArtistOrALbumArtist());
   }
 
   /**
    * Test get artist or album artist_ track artist2.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGetArtistOrAlbumArtist_TrackArtist2() {
     // need item managers to do this step
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
-
     // add a genre and year and check again
     Track track = getTrack(album);
     track.setAlbumArtist(new AlbumArtist("4", "albumartist"));
     album.getTracksCache().add(track);
-
     // here we should get the artist from the Track as all tracks have the same artist
     assertEquals("artistname", album.getArtistOrALbumArtist());
   }
 
   /**
    * Test get artist or album artist_ album artist unknown.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGetArtistOrAlbumArtist_AlbumArtistUnknown() {
     // need item managers to do this step
     StartupCollectionService.registerItemManagers();
-
     Album album = new Album("1", "name", 123);
-
     // add a genre and year and check again
     Track track = getTrack(album);
     track.setAlbumArtist(new AlbumArtist("4", Const.UNKNOWN_ARTIST));
-
     album.getTracksCache().add(track);
     album.getTracksCache().add(
         new Track("1", "trackname", album, getGenre(), new Artist("2", "artistname2"), 123,
             getYear(), 1, new Type("3", "typename", "ext", null, null), 1));
-
     // here we should get the artist from the first Track as the album artist is "unknown"
     assertEquals("artistname", album.getArtistOrALbumArtist());
   }
+
+  public final void testSeemsUnknown() {
+    // need item managers to do this step
+    StartupCollectionService.registerItemManagers();
+    Album album = new Album("1", "name", 123);
+    assertFalse(album.seemsUnknown());
+    album = new Album("2", "unknown", 124);
+    assertTrue(album.seemsUnknown());
+    album = new Album("3", Const.UNKNOWN_ALBUM, 125);
+    assertTrue(album.seemsUnknown());
+  }
 }
diff --git a/src/test/java/org/jajuk/base/TestAlbumComparator.java b/src/test/java/org/jajuk/base/TestAlbumComparator.java
index f1daa5a..96dcc55 100644
--- a/src/test/java/org/jajuk/base/TestAlbumComparator.java
+++ b/src/test/java/org/jajuk/base/TestAlbumComparator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -36,6 +36,9 @@ import org.jajuk.JajukTestCase;
  * We should also drop the direct items instantiations but use managers instead.
  */
 public class TestAlbumComparator extends JajukTestCase {
+  @Override
+  protected void specificSetUp() throws Exception {
+  }
 
   /**
    * Test method for {@link org.jajuk.base.AlbumComparator#AlbumComparator(int)}
@@ -60,28 +63,25 @@ public class TestAlbumComparator extends JajukTestCase {
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Genre
     album.getTracksCache().add(getTrack(album));
     equal.getTracksCache().add(getTrack(album));
     notequal.getTracksCache().add(
         new Track("2", "name2", album, new Genre("7", "name7"), new Artist("4", "name4"), 10,
             new Year("5", "name5"), 1, new Type("6", "name6", "ext", null, null), 3));
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare genre2.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareGenre2() {
     AlbumComparator compare = new AlbumComparator(0);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Genre, this time we have the physical same genre
     Genre genre = new Genre("8", "name8");
     album.getTracksCache().add(getTrack(album, genre, new Year("5", "name5")));
@@ -89,21 +89,19 @@ public class TestAlbumComparator extends JajukTestCase {
     notequal.getTracksCache().add(
         new Track("2", "name2", album, new Genre("7", "name7"), new Artist("4", "name4"), 10,
             new Year("5", "name5"), 1, new Type("6", "name6", "ext", null, null), 3));
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare genre4 album artist different.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareGenre4AlbumArtistDifferent() {
     AlbumComparator compare = new AlbumComparator(0);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Genre, this time we have the physical same genre
     Genre genre = new Genre("8", "name8");
     album.getTracksCache().add(getTrack(album, genre, new Year("5", "name5")));
@@ -111,21 +109,19 @@ public class TestAlbumComparator extends JajukTestCase {
     notequal.getTracksCache().add(
         new Track("2", "name2", album, new Genre("7", "name7"), new Artist("4", "name4"), 10,
             new Year("5", "name5"), 1, new Type("6", "name6", "ext", null, null), 3));
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare genre3 same year.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareGenre3SameYear() {
     AlbumComparator compare = new AlbumComparator(0);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Genre, this time we have the physical same genre
     Genre genre = new Genre("8", "name8");
     Year year = new Year("5", "name5");
@@ -134,21 +130,19 @@ public class TestAlbumComparator extends JajukTestCase {
     notequal.getTracksCache().add(
         new Track("2", "name2", album, new Genre("7", "name7"), new Artist("4", "name4"), 10,
             new Year("5", "name5"), 1, new Type("6", "name6", "ext", null, null), 3));
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare artist.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareArtist() {
     AlbumComparator compare = new AlbumComparator(1);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Artist
     album.getTracksCache().add(getTrack(album));
     equal.getTracksCache().add(getTrack(equal));
@@ -158,21 +152,19 @@ public class TestAlbumComparator extends JajukTestCase {
      * Genre("3", "name3"), new Artist("7", "name7"), 10, new Year("5",
      * "name5"), 1, new Type("6", "name6", "ext", null, null), 3));
      */
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare artist same year.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareArtistSameYear() {
     AlbumComparator compare = new AlbumComparator(1);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Artist
     Genre genre = new Genre("8", "name8");
     Year year = new Year("5", "name5");
@@ -184,56 +176,51 @@ public class TestAlbumComparator extends JajukTestCase {
      * Genre("3", "name3"), new Artist("7", "name7"), 10, new Year("5",
      * "name5"), 1, new Type("6", "name6", "ext", null, null), 3));
      */
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare album.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareAlbum() {
     AlbumComparator compare = new AlbumComparator(2);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("2", "name2", 2);
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare year.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareYear() {
     AlbumComparator compare = new AlbumComparator(3);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Year
     album.getTracksCache().add(getTrack(album));
     equal.getTracksCache().add(getTrack(album));
     notequal.getTracksCache().add(
         new Track("2", "name2", album, new Genre("3", "name3"), new Artist("4", "name4"), 10,
             new Year("7", "name7"), 1, new Type("6", "name6", "ext", null, null), 3));
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare year same year.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareYearSameYear() {
     AlbumComparator compare = new AlbumComparator(3);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Year
     Genre genre = new Genre("8", "name8");
     Year year = new Year("5", "name5");
@@ -242,21 +229,19 @@ public class TestAlbumComparator extends JajukTestCase {
     notequal.getTracksCache().add(
         new Track("2", "name2", album, new Genre("3", "name3"), new Artist("4", "name4"), 10,
             new Year("7", "name7"), 1, new Type("6", "name6", "ext", null, null), 3));
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare year same year diff artist.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareYearSameYearDiffArtist() {
     AlbumComparator compare = new AlbumComparator(3);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Year
     Genre genre = new Genre("8", "name8");
     Year year = new Year("5", "name5");
@@ -265,24 +250,21 @@ public class TestAlbumComparator extends JajukTestCase {
     notequal.getTracksCache().add(
         new Track("2", "name2", album, new Genre("3", "name3"), new Artist("5", "name5"), 10,
             new Year("7", "name7"), 1, new Type("6", "name6", "ext", null, null), 3));
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare discovery date.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareDiscoveryDate() {
     AlbumComparator compare = new AlbumComparator(4);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     Date date1 = new Date();
     Date date2 = new Date(12345); // needs to be different to date1
-
     // just differ in DiscoverDate
     album.getTracksCache().add(getTrack(album));
     album.getTracksCache().get(0).setDiscoveryDate(date1);
@@ -290,21 +272,19 @@ public class TestAlbumComparator extends JajukTestCase {
     equal.getTracksCache().get(0).setDiscoveryDate(date1);
     notequal.getTracksCache().add(getTrack(album));
     notequal.getTracksCache().get(0).setDiscoveryDate(date2);
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal) || 0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare rate.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareRate() {
     AlbumComparator compare = new AlbumComparator(5);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Rate
     album.getTracksCache().add(getTrack(album));
     album.getTracksCache().get(0).setRate(3);
@@ -312,21 +292,19 @@ public class TestAlbumComparator extends JajukTestCase {
     equal.getTracksCache().get(0).setRate(3);
     notequal.getTracksCache().add(getTrack(album));
     notequal.getTracksCache().get(0).setRate(4);
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare rate gt.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareRateGT() {
     AlbumComparator compare = new AlbumComparator(5);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Rate
     album.getTracksCache().add(getTrack(album));
     album.getTracksCache().get(0).setRate(4);
@@ -334,21 +312,19 @@ public class TestAlbumComparator extends JajukTestCase {
     equal.getTracksCache().get(0).setRate(4);
     notequal.getTracksCache().add(getTrack(album));
     notequal.getTracksCache().get(0).setRate(3);
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal));
   }
 
   /**
    * Test compare hits.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareHits() {
     AlbumComparator compare = new AlbumComparator(6);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Hits
     album.getTracksCache().add(getTrack(album));
     album.getTracksCache().get(0).setHits(3);
@@ -356,21 +332,19 @@ public class TestAlbumComparator extends JajukTestCase {
     equal.getTracksCache().get(0).setHits(3);
     notequal.getTracksCache().add(getTrack(album));
     notequal.getTracksCache().get(0).setHits(4);
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 > compare.compare(album, notequal));
   }
 
   /**
    * Test compare hits gt.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareHitsGT() {
     AlbumComparator compare = new AlbumComparator(6);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("1", "name", 2);
-
     // just differ in Hits
     album.getTracksCache().add(getTrack(album));
     album.getTracksCache().get(0).setHits(4);
@@ -378,7 +352,6 @@ public class TestAlbumComparator extends JajukTestCase {
     equal.getTracksCache().get(0).setHits(4);
     notequal.getTracksCache().add(getTrack(album));
     notequal.getTracksCache().get(0).setHits(3);
-
     assertEquals(0, compare.compare(album, equal));
     assertTrue(0 < compare.compare(album, notequal));
   }
@@ -386,7 +359,7 @@ public class TestAlbumComparator extends JajukTestCase {
   /**
    * Gets the track.
    *
-   * @param album DOCUMENT_ME
+   * @param album 
    * @return the track
    */
   private Track getTrack(Album album) {
@@ -397,8 +370,8 @@ public class TestAlbumComparator extends JajukTestCase {
   /**
    * Gets the track.
    *
-   * @param album DOCUMENT_ME
-   * @param artist DOCUMENT_ME
+   * @param album 
+   * @param artist 
    * @return the track
    */
   private Track getTrack(Album album, Artist artist) {
@@ -409,9 +382,9 @@ public class TestAlbumComparator extends JajukTestCase {
   /**
    * Gets the track.
    *
-   * @param album DOCUMENT_ME
-   * @param genre DOCUMENT_ME
-   * @param year DOCUMENT_ME
+   * @param album 
+   * @param genre 
+   * @param year 
    * @return the track
    */
   private Track getTrack(Album album, Genre genre, Year year) {
@@ -421,14 +394,13 @@ public class TestAlbumComparator extends JajukTestCase {
 
   /**
    * Test compare no track.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareNoTrack() {
     AlbumComparator compare = new AlbumComparator(0);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("2", "name2", 2);
-
     // without actual tracks, anything compares...
     assertEquals(0, compare.compare(album, equal));
     assertEquals(0, compare.compare(album, notequal));
@@ -436,19 +408,17 @@ public class TestAlbumComparator extends JajukTestCase {
 
   /**
    * Test compare criteria outside.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCompareCriteriaOutside() {
     AlbumComparator compare = new AlbumComparator(99);
     Album album = new Album("1", "name", 2);
     Album equal = new Album("1", "name", 2);
     Album notequal = new Album("2", "name2", 2);
-
     // add the same type of track in all albums to not stop comparison early
     album.getTracksCache().add(getTrack(album));
     equal.getTracksCache().add(getTrack(equal));
     notequal.getTracksCache().add(getTrack(notequal));
-
     // with invalid "criteria", anything compares
     assertEquals(0, compare.compare(album, equal));
     assertEquals(0, compare.compare(album, notequal));
diff --git a/src/test/java/org/jajuk/base/TestAlbumManager.java b/src/test/java/org/jajuk/base/TestAlbumManager.java
index 0f084ca..615b239 100644
--- a/src/test/java/org/jajuk/base/TestAlbumManager.java
+++ b/src/test/java/org/jajuk/base/TestAlbumManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -24,8 +24,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.MockPlayer;
+import org.jajuk.TestHelpers;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.services.covers.Cover;
@@ -34,31 +35,19 @@ import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.services.tags.ITagImpl;
-import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.util.Const;
 import org.jaudiotagger.tag.FieldDataInvalidException;
 import org.jaudiotagger.tag.KeyNotFoundException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAlbumManager extends JajukTestCase {
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see junit.framework.TestCase#setUp()
-   */
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-  }
-
   /**
-   * Test method for {@link org.jajuk.base.AlbumManager#getLabel()}.
+   * Test method for {@link org.jajuk.base.AlbumManager#getXMLTag()}.
    */
   public void testGetLabel() {
-    assertEquals(Const.XML_ALBUMS, AlbumManager.getInstance().getLabel());
+    assertEquals(Const.XML_ALBUMS, AlbumManager.getInstance().getXMLTag());
   }
 
   /**
@@ -96,17 +85,15 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testRegisterAlbumStringStringStringLong() {
     assertNotNull(AlbumManager.getInstance().registerAlbum("1", "name1", 1));
-
     assertNotNull(AlbumManager.getInstance().getAlbumByID("1"));
   }
 
   /**
    * Test register album empty artist.
-   * DOCUMENT_ME
+   * 
    */
   public void testRegisterAlbumEmptyArtist() {
     AlbumManager.getInstance().clear();
-
     assertNotNull(AlbumManager.getInstance().registerAlbum("1", "name1", 1));
   }
 
@@ -118,7 +105,6 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testRegisterAlbumStringStringLong() {
     assertNotNull(AlbumManager.getInstance().registerAlbum("2", "name2", 1));
-
     assertNotNull(AlbumManager.getInstance().getAlbumByName("name2"));
   }
 
@@ -131,74 +117,60 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testChangeAlbumName() throws Exception {
     StartupCollectionService.registerItemManagers();
-
     Album album = AlbumManager.getInstance().registerAlbum("name3", 1);
     assertNotNull(album);
-
     AlbumManager.getInstance().changeAlbumName(album, "name4");
-
     assertNull(AlbumManager.getInstance().getAlbumByName("name3"));
     assertNotNull(AlbumManager.getInstance().getAlbumByName("name4"));
   }
 
   /**
    * Test change album name with track.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testChangeAlbumNameWithTrack() throws Exception {
     Album album = AlbumManager.getInstance().registerAlbum("name3", 1);
     assertNotNull(album);
-
     getTrack(5, album);
     getTrack(6, album);
-
     AlbumManager.getInstance().changeAlbumName(album, "name4");
-
     assertNull(AlbumManager.getInstance().getAlbumByName("name3"));
     assertNotNull(AlbumManager.getInstance().getAlbumByName("name4"));
   }
 
   /**
    * Test change album name with queue.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testChangeAlbumNameWithQueue() throws Exception {
     StartupCollectionService.registerItemManagers();
-
     Album album = AlbumManager.getInstance().registerAlbum("name3", 1);
     assertNotNull(album);
-
     getTrack(5, album);
     getTrack(6, album);
-
     QueueModel.insert(new StackItem(album.getTracksCache().get(0).getFiles().get(0)), 0);
     QueueModel.goTo(0);
-
     AlbumManager.getInstance().changeAlbumName(album, "name4");
-
     assertNull(AlbumManager.getInstance().getAlbumByName("name3"));
     assertNotNull(AlbumManager.getInstance().getAlbumByName("name4"));
   }
 
   /**
    * Test change album name same name.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testChangeAlbumNameSameName() throws Exception {
     StartupCollectionService.registerItemManagers();
-
     Album album = AlbumManager.getInstance().registerAlbum("3", "name3", 1);
     assertNotNull(album);
-
     // nothing happens if we use the same name
     Album album2 = AlbumManager.getInstance().changeAlbumName(album, "name3");
-
     // we expect the same physical item
     assertTrue(album2.toString(), album == album2);
   }
@@ -211,7 +183,6 @@ public class TestAlbumManager extends JajukTestCase {
   public void testFormat() {
     Album album = AlbumManager.getInstance().registerAlbum("3", "name3", 1);
     assertNotNull(album);
-
     assertEquals("Name1", AlbumManager.format("name1"));
     assertEquals("Name1", AlbumManager.format(" name1"));
     assertEquals("Name1", AlbumManager.format("name1 "));
@@ -235,10 +206,8 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testGetAlbums() {
     AlbumManager.getInstance().clear();
-
     assertNotNull(AlbumManager.getInstance().registerAlbum("1", "name1", 1));
     assertNotNull(AlbumManager.getInstance().registerAlbum("2", "name2", 1));
-
     assertEquals(2, AlbumManager.getInstance().getAlbums().size());
   }
 
@@ -247,10 +216,8 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testGetAlbumsIterator() {
     AlbumManager.getInstance().clear();
-
     assertNotNull(AlbumManager.getInstance().registerAlbum("1", "name1", 1));
     assertNotNull(AlbumManager.getInstance().registerAlbum("2", "name2", 1));
-
     assertTrue(AlbumManager.getInstance().getAlbumsIterator().hasNext());
   }
 
@@ -263,25 +230,19 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testGetAssociatedAlbums() throws Exception {
     Album album = AlbumManager.getInstance().registerAlbum("1", "name1", 1);
-
     Track track = getTrack(1, album);
-
     List<Album> albums = AlbumManager.getInstance().getAssociatedAlbums(track);
     assertNotNull(albums);
     assertEquals(albums.toString(), 1, albums.size());
-
     Genre genre = track.getGenre();
     Artist artist = track.getArtist();
     Year year = track.getYear();
-
     albums = AlbumManager.getInstance().getAssociatedAlbums(genre);
     assertNotNull(albums);
     assertEquals(albums.toString(), 1, albums.size());
-
     albums = AlbumManager.getInstance().getAssociatedAlbums(artist);
     assertNotNull(albums);
     assertEquals(albums.toString(), 1, albums.size());
-
     albums = AlbumManager.getInstance().getAssociatedAlbums(year);
     assertNotNull(albums);
     assertEquals(albums.toString(), 1, albums.size());
@@ -295,62 +256,49 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testGetBestOfAlbums() throws Exception {
     AlbumManager.getInstance().clear();
-
     Album album = AlbumManager.getInstance().registerAlbum("1", "name1", 1);
     getTrack(2, album);
     getTrack(3, album);
-
     album = AlbumManager.getInstance().registerAlbum("2", "name2", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name3", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name4", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name5", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     List<Album> albums = AlbumManager.getInstance().getBestOfAlbums(false, 3);
     assertEquals(albums.toString(), 3, albums.size());
-
     // TODO verify with many albums and actual data
   }
 
   /**
    * Test get best of albums less.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testGetBestOfAlbumsLess() throws Exception {
     AlbumManager.getInstance().clear();
-
     Album album = AlbumManager.getInstance().registerAlbum("1", "name1", 1);
     getTrack(2, album);
     getTrack(3, album);
-
     album = AlbumManager.getInstance().registerAlbum("2", "name2", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name3", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name4", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name5", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     // check if we request more than we have, currently we get back some less
     // for some reason...
     List<Album> albums = AlbumManager.getInstance().getBestOfAlbums(false, 10);
@@ -359,11 +307,10 @@ public class TestAlbumManager extends JajukTestCase {
 
   /**
    * Test get best of album zero.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetBestOfAlbumZero() {
     AlbumManager.getInstance().clear();
-
     List<Album> albums = AlbumManager.getInstance().getBestOfAlbums(false, 3);
     assertEquals(albums.toString(), 0, albums.size());
   }
@@ -378,26 +325,20 @@ public class TestAlbumManager extends JajukTestCase {
     Album album = AlbumManager.getInstance().registerAlbum("name1", 1);
     getTrack(2, album);
     getTrack(3, album);
-
     album = AlbumManager.getInstance().registerAlbum("name2", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name3", 1);
     getTrack(6, album);
     getTrack(7, album);
-
     album = AlbumManager.getInstance().registerAlbum("name4", 1);
     getTrack(8, album);
     getTrack(9, album);
-
     album = AlbumManager.getInstance().registerAlbum("name5", 1);
     getTrack(10, album);
     getTrack(11, album);
-
     List<Album> albums = AlbumManager.getInstance().getNewestAlbums(false, 3);
     assertEquals(albums.toString(), 3, albums.size());
-
     // TODO verify with many albums and actual data
   }
 
@@ -409,30 +350,23 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testGetRarelyListenAlbums() throws Exception {
     AlbumManager.getInstance().clear();
-
     Album album = AlbumManager.getInstance().registerAlbum("name1", 1);
     getTrack(2, album);
     getTrack(3, album);
-
     album = AlbumManager.getInstance().registerAlbum("name2", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     album = AlbumManager.getInstance().registerAlbum("name3", 1);
     getTrack(6, album);
     getTrack(7, album);
-
     album = AlbumManager.getInstance().registerAlbum("name4", 1);
     getTrack(8, album);
     getTrack(9, album);
-
     album = AlbumManager.getInstance().registerAlbum("name5", 1);
     getTrack(10, album);
     getTrack(11, album);
-
     List<Album> albums = AlbumManager.getInstance().getRarelyListenAlbums(false, 3);
     assertEquals(albums.toString(), 3, albums.size());
-
     // TODO verify with many albums and actual data
   }
 
@@ -443,43 +377,35 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testGetMaxRate() throws Exception {
     AlbumManager.getInstance().clear();
-
     Album album = AlbumManager.getInstance().registerAlbum("name1", 1);
     Track track = getTrack(1, album);
     track.setRate(12);
     track = getTrack(2, album);
     track.setRate(14);
-
     album = AlbumManager.getInstance().registerAlbum("name2", 1);
     track = getTrack(3, album);
     track.setRate(10);
     track = getTrack(4, album);
     track.setRate(15);
-
     album = AlbumManager.getInstance().registerAlbum("name3", 1);
     track = getTrack(5, album);
     track.setRate(10);
     track = getTrack(6, album);
     track.setRate(15);
-
     album = AlbumManager.getInstance().registerAlbum("name4", 1);
     track = getTrack(7, album);
     track.setRate(10);
     track = getTrack(8, album);
     track.setRate(15);
-
     album = AlbumManager.getInstance().registerAlbum("name5", 1);
     track = getTrack(9, album);
     track.setRate(10);
     track = getTrack(10, album);
     track.setRate(15);
-
     // zero without refresh
     assertEquals(0, AlbumManager.getInstance().getMaxRate());
-
     // refresh it now
     AlbumManager.getInstance().refreshMaxRating();
-
     // now it should be ok, it is the combined rate of all tracks
     assertEquals(26, AlbumManager.getInstance().getMaxRate());
   }
@@ -532,63 +458,53 @@ public class TestAlbumManager extends JajukTestCase {
    */
   public void testOrderCache() throws Exception {
     AlbumManager.getInstance().clear();
-
     Album album = AlbumManager.getInstance().registerAlbum("1", "name1", 1);
     getTrack(2, album);
     getTrack(3, album);
-
     album = AlbumManager.getInstance().registerAlbum("2", "name2", 1);
     getTrack(4, album);
     getTrack(5, album);
-
     AlbumManager.getInstance().orderCache();
   }
 
   /**
    * Gets the track.
    *
-   * @param i DOCUMENT_ME
-   * @param album DOCUMENT_ME
+   * @param i 
+   * @param album 
    * @return the track
    * @throws Exception the exception
    */
   @SuppressWarnings("unchecked")
   private Track getTrack(int i, Album album) throws Exception {
-    Genre genre = JUnitHelpers.getGenre("name");
+    Genre genre = TestHelpers.getGenre("name");
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE);
     // don't read covers for this test
-
-    Artist artist = JUnitHelpers.getArtist("atist_" + i);
+    Artist artist = TestHelpers.getArtist("atist_" + i);
     Year year = YearManager.getInstance().registerYear(Integer.valueOf(i).toString());
-
     IPlayerImpl imp = new MockPlayer();
     Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
     ITagImpl tagimp = new MyTagImpl();
     Class<ITagImpl> tl = (Class<ITagImpl>) tagimp.getClass();
-
     Type type = new Type(Integer.valueOf(i).toString(), "name", "mp3", cl, tl);
     Track track = TrackManager.getInstance().registerTrack("track_" + i, album, genre, artist, 120,
         year, 1, type, 1);
-
-    Device device = JUnitHelpers.getDevice();
-    Directory dir = JUnitHelpers.getDirectory();
+    Device device = TestHelpers.getDevice();
+    Directory dir = TestHelpers.getDirectory();
     if (!device.isMounted()) {
       device.mount(true);
     }
     File file = FileManager.getInstance().registerFile("file_" + i + ".tst", dir, track, 200, 100);
     file.getFIO().createNewFile();
     track.addFile(file);
-
     TypeManager.getInstance().registerType("test", "tst", cl, tl);
-
     return track;
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public static class MyTagImpl implements ITagImpl {
-
     /*
      * (non-Javadoc)
      *
@@ -596,7 +512,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void commit() throws Exception {
-
     }
 
     /*
@@ -606,7 +521,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getAlbumArtist() throws Exception {
-
       return null;
     }
 
@@ -617,7 +531,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getAlbumName() throws Exception {
-
       return null;
     }
 
@@ -628,7 +541,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getArtistName() throws Exception {
-
       return null;
     }
 
@@ -639,7 +551,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getComment() throws Exception {
-
       return null;
     }
 
@@ -650,7 +561,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public long getDiscNumber() throws Exception {
-
       return 0;
     }
 
@@ -661,7 +571,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public long getLength() throws Exception {
-
       return 0;
     }
 
@@ -672,7 +581,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public long getOrder() throws Exception {
-
       return 0;
     }
 
@@ -683,7 +591,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public long getQuality() throws Exception {
-
       return 0;
     }
 
@@ -694,7 +601,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getGenreName() throws Exception {
-
       return null;
     }
 
@@ -705,7 +611,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getTrackName() throws Exception {
-
       return null;
     }
 
@@ -716,7 +621,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getYear() throws Exception {
-
       return null;
     }
 
@@ -727,7 +631,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setAlbumArtist(String sAlbumArtist) throws Exception {
-
     }
 
     /*
@@ -737,7 +640,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setAlbumName(String sAlbumName) throws Exception {
-
     }
 
     /*
@@ -747,7 +649,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setArtistName(String sArtistName) throws Exception {
-
     }
 
     /*
@@ -757,7 +658,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setComment(String sComment) throws Exception {
-
     }
 
     /*
@@ -767,7 +667,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setDiscNumber(long discnumber) throws Exception {
-
     }
 
     /*
@@ -777,7 +676,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setFile(java.io.File fio) throws Exception {
-
     }
 
     /*
@@ -787,7 +685,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setOrder(long lOrder) throws Exception {
-
     }
 
     /*
@@ -797,7 +694,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setGenreName(String genre) throws Exception {
-
     }
 
     /*
@@ -807,7 +703,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setTrackName(String sTrackName) throws Exception {
-
     }
 
     /*
@@ -817,7 +712,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setYear(String sYear) throws Exception {
-
     }
 
     /*
@@ -827,7 +721,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getTagField(String tagFieldKey) throws Exception {
-
       return null;
     }
 
@@ -839,7 +732,6 @@ public class TestAlbumManager extends JajukTestCase {
     @Override
     public void setTagField(String tagFieldKey, String tagFieldValue)
         throws FieldDataInvalidException, KeyNotFoundException {
-
     }
 
     /*
@@ -849,7 +741,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void deleteLyrics() throws Exception {
-
     }
 
     /*
@@ -859,7 +750,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public String getLyrics() throws Exception {
-
       return null;
     }
 
@@ -870,7 +760,6 @@ public class TestAlbumManager extends JajukTestCase {
      */
     @Override
     public void setLyrics(String sLyrics) throws Exception {
-
     }
 
     /*
@@ -893,122 +782,12 @@ public class TestAlbumManager extends JajukTestCase {
       return null;
     }
 
-  }
-
-  // needs to be public to be callable from the outside...
-  /**
-   * DOCUMENT_ME.
-   */
-  public static class MockPlayer implements IPlayerImpl {
-    
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#stop()
-     */
-    @Override
-    public void stop() throws Exception {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#setVolume(float)
-     */
-    @Override
-    public void setVolume(float fVolume) throws Exception {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#seek(float)
-     */
-    @Override
-    public void seek(float fPosition) {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#resume()
-     */
-    @Override
-    public void resume() throws Exception {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#play(org.jajuk.services.webradio.WebRadio, float)
-     */
-    @Override
-    public void play(WebRadio radio, float fVolume) throws Exception {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#play(org.jajuk.base.File, float, long, float)
-     */
-    @Override
-    public void play(File file, float fPosition, long length, float fVolume) throws Exception {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#pause()
-     */
-    @Override
-    public void pause() throws Exception {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#getState()
-     */
-    @Override
-    public int getState() {
-
-      return 0;
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#getElapsedTime()
-     */
-    @Override
-    public long getElapsedTimeMillis() {
-
-      return 0;
-    }
-
     /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#getCurrentVolume()
+     * @see org.jajuk.services.tags.ITagImpl#isTagAvailable()
      */
     @Override
-    public float getCurrentVolume() {
-
-      return 0;
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#getCurrentPosition()
-     */
-    @Override
-    public float getCurrentPosition() {
-
-      return 0;
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#getCurrentLength()
-     */
-    @Override
-    public long getDurationSec() {
-
-      return 0;
-    }
-
-    /* (non-Javadoc)
-     * @see org.jajuk.services.players.IPlayerImpl#getActuallyPlayedTimeMillis()
-     */
-    @Override
-    public long getActuallyPlayedTimeMillis() {
-      // TODO Auto-generated method stub
-      return 0;
+    public boolean isTagAvailable() {
+      return true;
     }
   }
 }
diff --git a/src/test/java/org/jajuk/base/TestArtist.java b/src/test/java/org/jajuk/base/TestArtist.java
index 055a1df..9ccb13a 100644
--- a/src/test/java/org/jajuk/base/TestArtist.java
+++ b/src/test/java/org/jajuk/base/TestArtist.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,35 +16,34 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestArtist extends JajukTestCase {
-
   /**
-   * Test method for {@link org.jajuk.base.Artist#getDesc()}.
+   * Test method for {@link org.jajuk.base.Artist#getTitle()}.
    */
   public final void testGetDesc() {
-    Artist artist = JUnitHelpers.getArtist();
-    assertTrue(StringUtils.isNotBlank(artist.getDesc()));
+    Artist artist = TestHelpers.getArtist();
+    assertTrue(StringUtils.isNotBlank(artist.getTitle()));
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Artist#getLabel()}.
+   * Test method for {@link org.jajuk.base.Artist#getXMLTag()}.
    */
   public final void testGetLabel() {
-    Artist artist = JUnitHelpers.getArtist();
-    assertEquals(Const.XML_ARTIST, artist.getLabel());
+    Artist artist = TestHelpers.getArtist();
+    assertEquals(Const.XML_ARTIST, artist.getXMLTag());
   }
 
   /**
@@ -55,8 +54,7 @@ public class TestArtist extends JajukTestCase {
   public final void testGetHumanValue() {
     // need ArtistManager for MetaInformation here...
     StartupCollectionService.registerItemManagers();
-
-    Artist artist = JUnitHelpers.getArtist();
+    Artist artist = TestHelpers.getArtist();
     assertEquals("name", artist.getHumanValue(Const.XML_NAME));
   }
 
@@ -64,7 +62,7 @@ public class TestArtist extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Artist#getIconRepresentation()}.
    */
   public final void testGetIconRepresentation() {
-    Artist artist = JUnitHelpers.getArtist();
+    Artist artist = TestHelpers.getArtist();
     assertNotNull(artist.getIconRepresentation());
   }
 
@@ -74,20 +72,18 @@ public class TestArtist extends JajukTestCase {
    * {@link org.jajuk.base.Artist#Artist(java.lang.String, java.lang.String)}.
    */
   public final void testArtist() {
-    JUnitHelpers.getArtist();
+    TestHelpers.getArtist();
   }
 
   /**
    * Test method for {@link org.jajuk.base.Artist#getName2()}.
    */
   public final void testGetName2() {
-    Artist artist = JUnitHelpers.getArtist();
-
+    Artist artist = TestHelpers.getArtist();
     // usually equal to getName()
     assertEquals("name", artist.getName2());
-
     // only different for unknown_artist
-    artist = JUnitHelpers.getArtist(Const.UNKNOWN_ARTIST);
+    artist = TestHelpers.getArtist(Const.UNKNOWN_ARTIST);
     // should be replaced by some localized string
     assertFalse(artist.getName2().equals(Const.UNKNOWN_ARTIST));
   }
@@ -97,10 +93,9 @@ public class TestArtist extends JajukTestCase {
    */
   public final void testToString() {
     Artist artist = new Artist("1", "name");
-    JUnitHelpers.ToStringTest(artist);
-
+    TestHelpers.ToStringTest(artist);
     artist = new Artist("1", null);
-    JUnitHelpers.ToStringTest(artist);
+    TestHelpers.ToStringTest(artist);
   }
 
   /**
@@ -113,20 +108,17 @@ public class TestArtist extends JajukTestCase {
     Artist equal = new Artist("1", "name");
     Artist notequal1 = new Artist("1", "name2");
     Artist notequal2 = new Artist("2", "name");
-
-    JUnitHelpers.CompareToTest(artist, equal, notequal1);
-    JUnitHelpers.CompareToTest(artist, equal, notequal2);
+    TestHelpers.CompareToTest(artist, equal, notequal1);
+    TestHelpers.CompareToTest(artist, equal, notequal2);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Artist#isUnknown()}.
    */
   public final void testIsUnknown() {
-    Artist artist = JUnitHelpers.getArtist();
+    Artist artist = TestHelpers.getArtist();
     assertFalse(artist.isUnknown());
-
-    artist = JUnitHelpers.getArtist(Const.UNKNOWN_ARTIST);
+    artist = TestHelpers.getArtist(Const.UNKNOWN_ARTIST);
     assertTrue(artist.isUnknown());
   }
-
 }
diff --git a/src/test/java/org/jajuk/base/TestArtistManager.java b/src/test/java/org/jajuk/base/TestArtistManager.java
index fe66b39..97a3e2e 100644
--- a/src/test/java/org/jajuk/base/TestArtistManager.java
+++ b/src/test/java/org/jajuk/base/TestArtistManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -25,9 +25,9 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
-import org.jajuk.ThreadTestHelper;
+import org.jajuk.MockPlayer;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.covers.Cover;
 import org.jajuk.services.players.IPlayerImpl;
 import org.jajuk.services.players.QueueModel;
@@ -40,21 +40,19 @@ import org.jaudiotagger.tag.FieldDataInvalidException;
 import org.jaudiotagger.tag.KeyNotFoundException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestArtistManager extends JajukTestCase {
-
-  /** The Constant NUMBER_OF_TESTS.  DOCUMENT_ME */
+  /** The Constant NUMBER_OF_TESTS.   */
   private static final int NUMBER_OF_TESTS = 10;
-  
-  /** The Constant NUMBER_OF_THREADS.  DOCUMENT_ME */
+  /** The Constant NUMBER_OF_THREADS.   */
   private static final int NUMBER_OF_THREADS = 10;
 
   /**
-   * Test method for {@link org.jajuk.base.ArtistManager#getLabel()}.
+   * Test method for {@link org.jajuk.base.ArtistManager#getXMLTag()}.
    */
   public final void testGetLabel() {
-    assertEquals(Const.XML_ARTISTS, ArtistManager.getInstance().getLabel());
+    assertEquals(Const.XML_ARTISTS, ArtistManager.getInstance().getXMLTag());
   }
 
   /**
@@ -83,10 +81,8 @@ public class TestArtistManager extends JajukTestCase {
    */
   public final void testCreateID() {
     String id = ItemManager.createID("name");
-
     // same for same name
     assertEquals(id, ItemManager.createID("name"));
-
     // different for other name
     assertFalse(id.equals(ItemManager.createID("name2")));
   }
@@ -113,26 +109,21 @@ public class TestArtistManager extends JajukTestCase {
    */
   public final void testChangeArtistName() throws Exception {
     StartupCollectionService.registerItemManagers();
-
-    Artist artistold = JUnitHelpers.getArtist("nameold");
-
+    Artist artistold = TestHelpers.getArtist("nameold");
     // we get the same object back if we have the same name
     assertTrue(artistold == ArtistManager.getInstance().changeArtistName(artistold, "nameold"));
-
     // now try with a new name
     Artist artist = ArtistManager.getInstance().changeArtistName(artistold, "namenew");
     assertFalse(artistold == artist); // not null
     assertFalse("4".equals(artist.getID())); // new ID
     assertTrue(StringUtils.isNotBlank(artist.getID())); // useful ID
     assertEquals("namenew", artist.getName()); // correct name
-
     // test with Tracks for the artist and Queue Model playing that file
     File track1 = getFile(14, artist);
     List<StackItem> list = new ArrayList<StackItem>();
     list.add(new StackItem(track1));
     QueueModel.insert(list, 0);
     QueueModel.goTo(0); // to have the Queue in playing mode
-
     // verify that Queue is playing now
     assertFalse(QueueModel.isStopped());
     assertNotNull(QueueModel.getPlayingFile());
@@ -140,7 +131,6 @@ public class TestArtistManager extends JajukTestCase {
     assertNotNull(QueueModel.getPlayingFile().getTrack().getArtist());
     assertEquals(track1.getTrack(), QueueModel.getPlayingFile().getTrack());
     assertEquals(artist, QueueModel.getPlayingFile().getTrack().getArtist());
-
     // now try to change again with the track and the item playing in the queue
     artist = ArtistManager.getInstance().changeArtistName(artist, "namenewnew");
     assertFalse(artistold == artist); // not null
@@ -149,79 +139,33 @@ public class TestArtistManager extends JajukTestCase {
     assertEquals("namenewnew", artist.getName()); // correct name
   }
 
-  // test this in a thread as well to cover the synchronized block...
-  /**
-   * Test change artist name threads.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public final void testChangeArtistNameThreads() throws Exception {
-    StartupCollectionService.registerItemManagers();
-
-    final Artist artistold = JUnitHelpers.getArtist("nameold");
-
-    // we get the same object back if we have the same name
-    assertTrue(artistold == ArtistManager.getInstance().changeArtistName(artistold, "nameold"));
-
-    ThreadTestHelper helper = new ThreadTestHelper(NUMBER_OF_THREADS, NUMBER_OF_TESTS);
-
-    helper.executeTest(new ThreadTestHelper.TestRunnable() {
-      @Override
-      public void doEnd(int threadnum) throws Exception {
-        // do stuff at the end, nothing here for now
-      }
-
-      @Override
-      public void run(int threadnum, int iter) throws Exception {
-        // just call the method in a thread multiple times at the same time
-        ArtistManager.getInstance().changeArtistName(artistold, "namenew");
-      }
-    });
-  }
-
-  /**
-   * Test multiple threads.
-   * DOCUMENT_ME
-   */
-  public void testMultipleThreads() {
-  }
-
   /**
-   * Gets the file.
-   *
-   * @param i DOCUMENT_ME
-   * @param artist DOCUMENT_ME
-   * @return the file
-   * @throws Exception the exception
-   */
+  * Gets the file.
+  *
+  * @param i 
+  * @param artist 
+  * @return the file
+  * @throws Exception the exception
+  */
   @SuppressWarnings("unchecked")
   private File getFile(int i, Artist artist) throws Exception {
-    Genre genre = JUnitHelpers.getGenre("name");
-    Album album = JUnitHelpers.getAlbum("myalbum", 0);
+    Genre genre = TestHelpers.getGenre("name");
+    Album album = TestHelpers.getAlbum("myalbum", 0);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read
     // covers for
     // this test
-
     Year year = new Year(Integer.valueOf(i).toString(), "2000");
-
-    IPlayerImpl imp = new JUnitHelpers.MockPlayer();
+    IPlayerImpl imp = new MockPlayer();
     Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
-
     Type type = TypeManager.getInstance().registerType("name", "tst", cl, MyTagImpl.class);
-
     Track track = TrackManager.getInstance().registerTrack("name", album, genre, artist, 120, year,
         1, type, 1);
-
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     device.mount(true);
-    Directory dir = JUnitHelpers.getDirectory();
-
+    Directory dir = TestHelpers.getDirectory();
     File file = new org.jajuk.base.File(Integer.valueOf(i).toString(), "test.tst", dir, track, 120,
         70);
-
     track.addFile(file);
-
     return file;
   }
 
@@ -232,16 +176,12 @@ public class TestArtistManager extends JajukTestCase {
    */
   public final void testFormat() {
     assertEquals("Testname", ItemManager.format("testname"));
-
     // trim spaces
     assertEquals("Testname", ItemManager.format("  testname  "));
-
     // -
     assertEquals("Te s tname", ItemManager.format("  te-s-tname  "));
-
     // _
     assertEquals("Te s tname", ItemManager.format("  te_s_tname  "));
-
     // all of them
     assertEquals("TE s tnam  e ", ItemManager.format("  tE_s_tnam--e-  "));
   }
@@ -252,13 +192,11 @@ public class TestArtistManager extends JajukTestCase {
   public final void testGetArtistsList() {
     List<String> list = ArtistManager.getArtistsList();
     assertNotNull(list);
-
     // not sure how many elements we should expect as this is static and other
     // tests
     // could already have added some items, let's just try to add a new one
     int i = list.size();
     ArtistManager.getInstance().registerArtist("newandnotanywhereelseusedname");
-
     // the vector should be updated directly, we use the same in the
     // combobox-models,
     // this is the reason for using Vector in the first place!
@@ -272,7 +210,6 @@ public class TestArtistManager extends JajukTestCase {
    */
   public final void testGetArtistByID() {
     Artist artist = ArtistManager.getInstance().registerArtist("anothernewartist");
-
     Artist artist2 = ArtistManager.getInstance().getArtistByID(artist.getID());
     assertEquals("anothernewartist", artist2.getName());
   }
@@ -283,13 +220,11 @@ public class TestArtistManager extends JajukTestCase {
   public final void testGetArtists() {
     List<Artist> list = ArtistManager.getInstance().getArtists();
     assertNotNull(list);
-
     // not sure how many elements we should expect as this is static and other
     // tests
     // could already have added some items, let's just try to add a new one
     int i = list.size();
     ArtistManager.getInstance().registerArtist("newname");
-
     // the list is a copy, so we need to get it again
     list = ArtistManager.getInstance().getArtists();
     assertEquals(i + 1, list.size());
@@ -318,17 +253,14 @@ public class TestArtistManager extends JajukTestCase {
     List<Artist> list = ArtistManager.getInstance().getAssociatedArtists(null);
     assertNotNull(list);
     assertEquals(0, list.size());
-
     Artist artist = ArtistManager.getInstance().registerArtist("myartisthere");
     File file = getFile(15, artist); // also registers the Track
     list = ArtistManager.getInstance().getAssociatedArtists(file.getTrack());
     assertNotNull(list);
     assertEquals(1, list.size());
     assertEquals("myartisthere", list.get(0).getName());
-
     Album album = file.getTrack().getAlbum();
     album.getTracksCache().add(file.getTrack());
-
     list = ArtistManager.getInstance().getAssociatedArtists(album);
     assertNotNull(list);
     assertEquals(1, list.size());
@@ -342,26 +274,23 @@ public class TestArtistManager extends JajukTestCase {
    */
   public final void testGetArtistByName() {
     Artist artist = ArtistManager.getInstance().registerArtist("anothernewartist");
-
     Artist artist2 = ArtistManager.getInstance().getArtistByName("anothernewartist");
     assertEquals(artist.getID(), artist2.getID());
   }
 
   /**
    * Test sorting.
-   * DOCUMENT_ME
+   * 
    */
   public final void testSorting() {
     // make sure we have "ordered state"
     ArtistManager.getInstance().switchToOrderState();
-
     List<String> ids = new ArrayList<String>();
     ids.add(ArtistManager.getInstance().registerArtist("anothernewartist").getID());
     ids.add(ArtistManager.getInstance().registerArtist("yet another artist").getID());
     ids.add(ArtistManager.getInstance().registerArtist("one more artist").getID());
     ids.add(ArtistManager.getInstance().registerArtist("number 10").getID());
     ids.add(ArtistManager.getInstance().registerArtist("number 11").getID());
-
     // now they are sorted by name
     Iterator<? extends Item> it = ArtistManager.getInstance().getItemsIterator();
     assertEquals("anothernewartist", it.next().getName());
@@ -370,28 +299,24 @@ public class TestArtistManager extends JajukTestCase {
     assertEquals("one more artist", it.next().getName());
     assertEquals("yet another artist", it.next().getName());
     assertFalse(it.hasNext());
-
     // make sure we can fetch all of these by ID
     for (String id : ids) {
       assertNotNull("Did not find ID: " + id, ArtistManager.getInstance().getArtistByID(id));
     }
-
     assertNull(ArtistManager.getInstance().getArtistByID("notexisting"));
     assertNull(ArtistManager.getInstance().getArtistByID("number 12"));
     assertNull(ArtistManager.getInstance().getArtistByID("number 09"));
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   public static class MyTagImpl implements ITagImpl {
-
     /* (non-Javadoc)
      * @see org.jajuk.services.tags.ITagImpl#commit()
      */
     @Override
     public void commit() throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -399,7 +324,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getAlbumArtist() throws Exception {
-
       return null;
     }
 
@@ -408,7 +332,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getAlbumName() throws Exception {
-
       return null;
     }
 
@@ -417,7 +340,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getArtistName() throws Exception {
-
       return null;
     }
 
@@ -426,7 +348,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getComment() throws Exception {
-
       return null;
     }
 
@@ -435,7 +356,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public long getDiscNumber() throws Exception {
-
       return 0;
     }
 
@@ -444,7 +364,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public long getLength() throws Exception {
-
       return 0;
     }
 
@@ -453,7 +372,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public long getOrder() throws Exception {
-
       return 0;
     }
 
@@ -462,7 +380,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public long getQuality() throws Exception {
-
       return 0;
     }
 
@@ -471,7 +388,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getGenreName() throws Exception {
-
       return null;
     }
 
@@ -480,7 +396,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getTrackName() throws Exception {
-
       return null;
     }
 
@@ -489,7 +404,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getYear() throws Exception {
-
       return null;
     }
 
@@ -498,7 +412,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setAlbumArtist(String albumArtist) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -506,7 +419,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setAlbumName(String albumName) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -514,7 +426,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setArtistName(String artistName) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -522,7 +433,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setComment(String comment) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -530,7 +440,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setDiscNumber(long discnumber) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -538,7 +447,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setFile(java.io.File fio) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -546,7 +454,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setOrder(long order) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -554,7 +461,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setGenreName(String genre) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -562,7 +468,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setTrackName(String trackName) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -570,7 +475,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setYear(String year) throws Exception {
-
     }
 
     /*
@@ -580,7 +484,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getTagField(String tagFieldKey) throws Exception {
-
       return null;
     }
 
@@ -593,7 +496,6 @@ public class TestArtistManager extends JajukTestCase {
     @Override
     public void setTagField(String tagFieldKey, String tagFieldValue)
         throws FieldDataInvalidException, KeyNotFoundException {
-
     }
 
     /*
@@ -603,7 +505,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void deleteLyrics() throws Exception {
-
     }
 
     /*
@@ -613,7 +514,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public String getLyrics() throws Exception {
-
       return null;
     }
 
@@ -624,7 +524,6 @@ public class TestArtistManager extends JajukTestCase {
      */
     @Override
     public void setLyrics(String sLyrics) throws Exception {
-
     }
 
     /* (non-Javadoc)
@@ -645,5 +544,12 @@ public class TestArtistManager extends JajukTestCase {
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.jajuk.services.tags.ITagImpl#isTagAvailable()
+     */
+    @Override
+    public boolean isTagAvailable() {
+      return true;
+    }
   }
 }
diff --git a/src/test/java/org/jajuk/base/TestCollection.java b/src/test/java/org/jajuk/base/TestCollection.java
index 8fecc1c..fec814d 100644
--- a/src/test/java/org/jajuk/base/TestCollection.java
+++ b/src/test/java/org/jajuk/base/TestCollection.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,14 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.services.core.SessionService;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Const;
 import org.jajuk.util.UtilString;
@@ -32,17 +33,15 @@ import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestCollection extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.base.Collection#startDocument()}.
    */
   public final void testStartDocument() {
     Collection coll = Collection.getInstance();
     assertNotNull(coll);
-
     // just call it, this is part of the SAX interfaces
     coll.startDocument();
   }
@@ -53,7 +52,6 @@ public class TestCollection extends JajukTestCase {
   public final void testEndDocument() {
     Collection coll = Collection.getInstance();
     assertNotNull(coll);
-
     // just call it, this is part of the SAX interfaces
     coll.endDocument();
   }
@@ -73,80 +71,36 @@ public class TestCollection extends JajukTestCase {
    */
   public final void testCommit() throws Exception {
     StartupCollectionService.registerItemManagers();
-
     Collection coll = Collection.getInstance();
     assertNotNull(coll);
-
-    java.io.File file = java.io.File.createTempFile("testcoll", ".xml");
-
+    java.io.File file = SessionService.getConfFileByPath(Const.FILE_COLLECTION);
     // delete the file before writing the collection
-    assertTrue(file.delete());
-
+    file.delete();
     // commit without any item
-    Collection.commit(file);
-
+    Collection.commit();
     // now it should exist and have some content
     assertTrue(file.exists());
     String str = FileUtils.readFileToString(file);
     assertTrue(str, StringUtils.isNotBlank(str));
     assertTrue(str, str.contains("<" + Const.XML_COLLECTION));
-
-    // now with some content
-    DeviceManager.getInstance().registerDevice("testdevice", 1,
-        System.getProperty("java.io.tmpdir"));
-    GenreManager.getInstance().registerGenre("cooldown");
-    {
-      Genre genre = GenreManager.getInstance().registerGenre("name");
-      Album album = AlbumManager.getInstance().registerAlbum("name", 23);
-      album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
-      // this test
-
-      Artist artist = ArtistManager.getInstance().registerArtist("name");
-      Year year = YearManager.getInstance().registerYear("2000");
-      YearManager.getInstance().registerYear("2000");
-
-      Type type = TypeManager.getInstance().registerType("MP3", "mp3", null, null);
-
-      TrackManager.getInstance()
-          .registerTrack("name5", album, genre, artist, 120, year, 1, type, 1);
-    }
-    YearManager.getInstance().registerYear("1900");
-    Device device = new Device("6", System.getProperty("java.io.tmpdir"));
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-    Directory dir = JUnitHelpers.getDirectory();
-    PlaylistManager.getInstance().registerPlaylistFile("4", "plf", dir);
-    ArtistManager.getInstance().registerArtist("testartist");
-    AlbumManager.getInstance().registerAlbum("album2", "artist1", 0);
-
-    device = DeviceManager.getInstance().registerDevice("7", 0,
-        System.getProperty("java.io.tmpdir"));
-    DirectoryManager.getInstance().registerDirectory(device);
-    device = new Device("6", System.getProperty("java.io.tmpdir"));
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-    FileManager.getInstance().registerFile("thisfile.mp3", dir,
-        TrackManager.getInstance().getTracks().get(0), 120, 100);
-
+    //Add a sample track and files
+    TestHelpers.getFile();
+    TestHelpers.getTrack(5);
     // delete the file before writing the collection
     assertTrue(file.delete());
-
     // commit without any item
-    Collection.commit(file);
-
+    Collection.commit();
     // now it should exist and have some content
     assertTrue(file.exists());
     str = FileUtils.readFileToString(file);
     assertTrue(str, StringUtils.isNotBlank(str));
     assertTrue(str, str.contains("<" + Const.XML_COLLECTION));
     // it should also contain the content that we added
-    assertTrue(str, str.contains("testdevice"));
-    assertTrue(str, str.contains("cooldown"));
-
+    assertTrue(str, str.contains("sample_device"));
     // add test for strange error in this testcase on hudson
     assertNotNull(UtilString.getAdditionDateFormatter());
-
     // also test loading here
     Collection.load(file);
-
     // TODO: loading needs more testing and verification of results after
     // loading...
   }
@@ -160,7 +114,7 @@ public class TestCollection extends JajukTestCase {
 
   /**
    * Test load not exists.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
diff --git a/src/test/java/org/jajuk/base/TestDevice.java b/src/test/java/org/jajuk/base/TestDevice.java
index dee41f0..90596ee 100644
--- a/src/test/java/org/jajuk/base/TestDevice.java
+++ b/src/test/java/org/jajuk/base/TestDevice.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2009 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,73 +16,58 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision: 3132 $
+ *  
  */
 package org.jajuk.base;
 
-import java.awt.HeadlessException;
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
-import org.jajuk.base.TestAlbumManager.MockPlayer;
+import org.jajuk.MockPlayer;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.core.ExitService;
 import org.jajuk.services.players.IPlayerImpl;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
 import org.jajuk.services.startup.StartupCollectionService;
-import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 import org.xml.sax.Attributes;
 
 /**
- *
+ * .
  */
 public class TestDevice extends JajukTestCase {
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see junit.framework.TestCase#setUp()
-   */
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
-  }
-
   /**
-   * Test method for {@link org.jajuk.base.Device#getDesc()}.
+   * Test method for {@link org.jajuk.base.Device#getTitle()}.
    */
-
   public void testGetDesc() {
     Device device = new Device("1", "testname");
-    assertNotNull(device.getDesc());
-    assertFalse(device.getDesc().length() == 0);
+    assertNotNull(device.getTitle());
+    assertFalse(device.getTitle().length() == 0);
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Device#getLabel()}.
+   * Test method for {@link org.jajuk.base.Device#getXMLTag()}.
    */
-
   public void testGetLabel() {
-    Device device = JUnitHelpers.getDevice();
-    assertEquals(Const.XML_DEVICE, device.getLabel());
+    Device device = TestHelpers.getDevice();
+    assertEquals(Const.XML_DEVICE, device.getXMLTag());
   }
 
   /**
-   * Test method for
+   * Test method for.
+   *
    * {@link org.jajuk.base.Device#populateProperties(org.xml.sax.Attributes)}.
    */
-
   public void testPopulateProperties() {
     StartupCollectionService.registerItemManagers();
-
     Device device = new Device("1", "name");
-
     DeviceManager.getInstance().registerProperty(
         new PropertyMetaInformation("att1", true, false, true, false, false, String.class, null));
     DeviceManager.getInstance().registerProperty(
@@ -92,45 +77,32 @@ public class TestDevice extends JajukTestCase {
     DeviceManager.getInstance().registerProperty(
         new PropertyMetaInformation(Const.XML_DEVICE_AUTO_REFRESH, true, false, true, false, false,
             Double.class, null));
-
     device.populateProperties(new MockAttributes());
-
-    device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
-
+    device = DeviceManager.getInstance().registerDevice("name", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/cd");
     device.populateProperties(new MockAttributes());
-
-    device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_NETWORK_DRIVE,
-        System.getProperty("java.io.tmpdir"));
-
+    device = DeviceManager.getInstance().registerDevice("name", Device.Type.NETWORK_DRIVE,
+        ConstTest.DEVICES_BASE_PATH + "/net");
     device.populateProperties(new MockAttributes());
-
-    device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_EXT_DD,
-        System.getProperty("java.io.tmpdir"));
-
+    device = DeviceManager.getInstance().registerDevice("name", Device.Type.EXTDD,
+        ConstTest.DEVICES_BASE_PATH + "/extdd");
     device.populateProperties(new MockAttributes());
-
-    device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_PLAYER,
-        System.getProperty("java.io.tmpdir"));
-
+    device = DeviceManager.getInstance().registerDevice("name", Device.Type.PLAYER,
+        ConstTest.DEVICES_BASE_PATH + "/player");
     device.populateProperties(new MockAttributes());
   }
 
   /**
-   * Test method for
+   * Test method for.
+   *
    * {@link org.jajuk.base.Device#getHumanValue(java.lang.String)}.
    */
-
   public void testGetHumanValue() {
     // we need the managers registered here
     StartupCollectionService.registerItemManagers();
-    StartupCollectionService.registerDevicesTypes();
-
     Device device = new Device("1", "testname");
     assertEquals("", device.getHumanValue("notexists"));
-
     // TODO: capture correct use of this method as well
-
     DeviceManager.getInstance().registerProperty(
         new PropertyMetaInformation("att1", true, false, true, false, false, String.class, null));
     DeviceManager.getInstance().registerProperty(
@@ -140,10 +112,8 @@ public class TestDevice extends JajukTestCase {
     DeviceManager.getInstance().registerProperty(
         new PropertyMetaInformation(Const.XML_DEVICE_AUTO_REFRESH, true, false, true, false, false,
             Double.class, null));
-
     device.populateProperties(new MockAttributes());
     assertNotNull(device.getHumanValue("att1"));
-
     device.setProperty(Const.XML_TYPE, 2l);
     assertTrue(StringUtils.isNotBlank(device.getHumanValue(Const.XML_TYPE)));
   }
@@ -151,64 +121,40 @@ public class TestDevice extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.Device#getIconRepresentation()}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
-
   public void testGetIconRepresentation() throws Exception {
     // we need the managers registered here
     StartupCollectionService.registerItemManagers();
-
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertNotNull(device.getIconRepresentation());
-
-    device.setProperty(Const.XML_TYPE, (long) Device.TYPE_DIRECTORY);
+    device.setProperty(Const.XML_TYPE, (long) Device.Type.DIRECTORY.ordinal());
     assertNotNull(device.getIconRepresentation());
-
-    device.setProperty(Const.XML_TYPE, (long) Device.TYPE_CD);
+    device.setProperty(Const.XML_TYPE, (long) Device.Type.FILES_CD.ordinal());
     assertNotNull(device.getIconRepresentation());
-
-    device.setProperty(Const.XML_TYPE, (long) Device.TYPE_NETWORK_DRIVE);
+    device.setProperty(Const.XML_TYPE, (long) Device.Type.NETWORK_DRIVE.ordinal());
     assertNotNull(device.getIconRepresentation());
-
-    device.setProperty(Const.XML_TYPE, (long) Device.TYPE_EXT_DD);
+    device.setProperty(Const.XML_TYPE, (long) Device.Type.EXTDD.ordinal());
     assertNotNull(device.getIconRepresentation());
-
-    device.setProperty(Const.XML_TYPE, (long) Device.TYPE_PLAYER);
+    device.setProperty(Const.XML_TYPE, (long) Device.Type.PLAYER.ordinal());
     assertNotNull(device.getIconRepresentation());
-
-    // test with invalid type
-    device.setProperty(Const.XML_TYPE, (long) -1);
-    assertNull(device.getIconRepresentation());
-
     // test with mounted device
-    device.setUrl(System.getProperty("java.io.tmpdir"));
     device.mount(true);
-
-    device.setProperty(Const.XML_TYPE, (long) Device.TYPE_PLAYER);
+    device.setProperty(Const.XML_TYPE, (long) Device.Type.PLAYER.ordinal());
     assertNotNull(device.getIconRepresentation());
   }
 
   /**
-   * Test method for
-   * {@link org.jajuk.base.Device#Device(java.lang.String, java.lang.String)}.
-   */
-
-  public void testDevice() {
-    new Device("1", "name");
-  }
-
-  /**
-   * Test method for
+   * Test method for.
+   *
    * {@link org.jajuk.base.Device#addDirectory(org.jajuk.base.Directory)}.
    */
-
   public void testAddDirectory() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     Directory dir1 = DirectoryManager.getInstance().registerDirectory("dir1",
-        JUnitHelpers.getDirectory(), device);
+        TestHelpers.getDirectory(), device);
     Directory dir2 = DirectoryManager.getInstance().registerDirectory("dir2",
-        JUnitHelpers.getDirectory(), device);
-
+        TestHelpers.getDirectory(), device);
     assertEquals(0, device.getDirectories().size());
     device.addDirectory(dir1);
     assertEquals(1, device.getDirectories().size());
@@ -218,62 +164,44 @@ public class TestDevice extends JajukTestCase {
 
   /**
    * Test method for {@link org.jajuk.base.Device#cleanRemovedFiles()}.
+   *
+   * @throws Exception the exception
    */
-
   public void testCleanRemovedFiles() throws Exception {
-    JUnitHelpers.createSessionDirectory();
-
-    Device device = JUnitHelpers.getDevice();
-    device.mount(true);
-    device.setUrl("notexisting/testparent\\anotherclientparentthing");
-
-    // clean without any stuff
-    assertFalse(device.cleanRemovedFiles(null));
-
-    // add some directory, then the remove should kick in!
-    Directory topdir = DirectoryManager.getInstance().registerDirectory(device);
-    Directory dir = DirectoryManager.getInstance().registerDirectory("notexistingdir", topdir,
-        device);
-    device.addDirectory(dir);
-    DirectoryManager.getInstance().registerDirectory(device);
-
-    File file = getFile(8, dir);
-    PlaylistManager.getInstance().registerPlaylistFile(file.getFIO(), dir);
-
+    Device device = TestHelpers.getDevice();
+    Playlist playlist = TestHelpers.getPlaylist();
     // ensure we are not exiting, this would invalidate the test
     assertFalse(ExitService.isExiting());
-
+    // Delete a file
+    playlist.getFIO().delete();
     // now we have removals
-    assertTrue(device.cleanRemovedFiles(null));
-
-    // enable history to also clean that
-    Conf.setProperty(Const.CONF_HISTORY, "10");
-
-    // no removals any more now
-    assertFalse(device.cleanRemovedFiles(null));
+    List<Directory> dirs = new ArrayList<Directory>();
+    dirs.add(playlist.getDirectory());
+    assertTrue(device.cleanRemovedFiles(dirs));
   }
 
   /**
-   * Test method for
+   * Test method for.
+   *
    * {@link org.jajuk.base.Device#compareTo(org.jajuk.base.Device)}.
    */
   public void testCompareTo() {
     Device device = new Device("1", "name");
     Device equal = new Device("1", "name");
     Device notequal = new Device("1", "name1"); // compares only on name
-
-    JUnitHelpers.CompareToTest(device, equal, notequal);
+    TestHelpers.CompareToTest(device, equal, notequal);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#getDateLastRefresh()}.
+   *
+   * @throws Exception the exception
    */
   public void testGetDateLastRefresh() throws Exception {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertEquals(0, device.getDateLastRefresh());
     device.mount(false);
     device.refreshCommand(false, false, null);
-
     // now it should be set
     assertNotNull(device.getDateLastRefresh());
   }
@@ -282,9 +210,7 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#getDeviceTypeS()}.
    */
   public void testGetDeviceTypeS() {
-    StartupCollectionService.registerDevicesTypes();
-
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertNotNull(device.getDeviceTypeS());
   }
 
@@ -292,9 +218,9 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#getDirectories()}.
    */
   public void testGetDirectories() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertEquals(0, device.getDirectories().size());
-    Directory dir = JUnitHelpers.getDirectory();
+    Directory dir = TestHelpers.getDirectory();
     device.addDirectory(dir);
     assertEquals(1, device.getDirectories().size());
   }
@@ -303,77 +229,68 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#getFilesRecursively()}.
    */
   public void testGetFilesRecursively() {
-    Device device = JUnitHelpers.getDevice();
-    device.setUrl(System.getProperty("java.io.tmpdir") + System.currentTimeMillis());
-
+    Device device = TestHelpers.getDevice();
+    device.setUrl(ConstTest.DEVICES_BASE_PATH + "/" + System.currentTimeMillis());
     // no files without a directory
     List<File> files = device.getFilesRecursively();
     assertEquals(0, files.size()); // no file available
-
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
-
     // still no files without files being registered
     files = device.getFilesRecursively();
     assertEquals(0, files.size()); // no file available
-
     getFile(100, dir);
-
     // now it should find some
     files = device.getFilesRecursively();
     assertEquals(1, files.size());
   }
 
+  /**
+   * Gets the file.
+   *
+   * @param i 
+   * @param dir 
+   * @return the file
+   */
   @SuppressWarnings("unchecked")
   private File getFile(int i, Directory dir) {
-    Genre genre = JUnitHelpers.getGenre("name");
-    Album album = JUnitHelpers.getAlbum("myalbum", 0);
+    Genre genre = TestHelpers.getGenre("name");
+    Album album = TestHelpers.getAlbum("myalbum", 0);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
+    Artist artist = TestHelpers.getArtist("name");
     Year year = new Year(Integer.valueOf(i).toString(), "2000");
-
     IPlayerImpl imp = new MockPlayer();
     Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
-
     Type type = new Type(Integer.valueOf(i).toString(), "name", "mp3", cl, null);
     Track track = new Track(Integer.valueOf(i).toString(), "name", album, genre, artist, 120, year,
         1, type, 1);
-
     return FileManager.getInstance().registerFile(
         "test" + Long.valueOf(System.currentTimeMillis()).toString() + ".tst", dir, track, 120, 70);
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Device#getFio()}.
+   * Test method for {@link org.jajuk.base.Device#getFIO()}.
    */
   public void testGetFio() {
-    Device device = new Device("1", "name");
-
-    assertNull(device.getFio());
-
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-
-    assertNotNull(device.getFio());
+    Device device = TestHelpers.getDevice();
+    device.setUrl(ConstTest.TEMP_PATH);
+    assertNotNull(device.getFIO());
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#getRootDirectory()}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testGetRootDirectory() throws Exception {
     // create a unique id here...
-    Device device = DeviceManager.getInstance().registerDevice("getRootDirectory", Device.TYPE_CD,
-        "/foo");
-
+    Device device = DeviceManager.getInstance().registerDevice("getRootDirectory",
+        Device.Type.FILES_CD, ConstTest.DEVICES_BASE_PATH + "/device");
     assertNull(device.getRootDirectory());
-
-    java.io.File file = java.io.File.createTempFile("test", "tst");
-
+    java.io.File file = java.io.File.createTempFile("test", "tst", new java.io.File(
+        ConstTest.DEVICES_BASE_PATH));
     device.setUrl(file.getAbsolutePath());
     DirectoryManager.getInstance().registerDirectory(device);
-
     assertNotNull(device.getRootDirectory());
   }
 
@@ -381,11 +298,10 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#getType()}.
    */
   public void testGetType() {
-    Device device = JUnitHelpers.getDevice();
-    assertEquals(0, device.getType());
-
+    Device device = TestHelpers.getDevice();
+    assertEquals(Device.Type.DIRECTORY, device.getType());
     device.setProperty(Const.XML_TYPE, 2l);
-    assertEquals(2, device.getType());
+    assertEquals(Device.Type.NETWORK_DRIVE, device.getType());
   }
 
   /**
@@ -393,25 +309,21 @@ public class TestDevice extends JajukTestCase {
    */
   public void testGetUrl() {
     Device device = new Device("1", "name");
-
     assertNull(device.getUrl());
-
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-
+    device.setUrl(ConstTest.DEVICES_BASE_PATH + "/dev");
     assertNotNull(device.getUrl());
-
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#isMounted()}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testIsMounted() throws Exception {
-    Device device = new Device("1", "name");
-    device.setUrl(System.getProperty("java.io.tmpdir"));
+    Device device = TestHelpers.getDevice();
+    device.unmount();
     assertFalse(device.isMounted());
-
+    new java.io.File(device.getUrl()).mkdirs();
     device.mount(true);
     assertTrue(device.isMounted());
   }
@@ -419,13 +331,15 @@ public class TestDevice extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.Device#isReady()}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testIsReady() throws Exception {
     Device device = new Device("1", "name");
-    device.setUrl(System.getProperty("java.io.tmpdir"));
+    device.setUrl(ConstTest.DEVICES_BASE_PATH + "/dev");
     assertFalse(device.isReady());
-
+    new java.io.File(device.getUrl()).mkdirs();
+    // create a file (we need at least a single file in collection)
+    new java.io.File(device.getUrl() + "/audio.mp3").createNewFile();
     device.mount(true);
     assertTrue(device.isReady());
   }
@@ -434,90 +348,36 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#isRefreshing()}.
    */
   public void testIsRefreshing() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertFalse(device.isRefreshing());
-
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#isSynchronizing()}.
    */
   public void testIsSynchronizing() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertFalse(device.isSynchronizing());
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#prepareRefresh(boolean)}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testPrepareRefresh() throws Exception {
-    Device device = new Device("1", "name");
-    device.setUrl(System.getProperty("java.io.tmpdir"));
+    Device device = TestHelpers.getDevice();
     device.prepareRefresh(false);
   }
 
-  public void testPrepareRefreshAsk() throws Exception {
-    Device device = new Device("1", "name");
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-    try {
-      device.prepareRefresh(true);
-    } catch (HeadlessException e) {
-      // ignore this on non-ui machines
-    }
-  }
-
-  public void testPrepareRefreshAskCD() throws Exception {
-    Device device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
-    try {
-      device.prepareRefresh(true);
-    } catch (HeadlessException e) {
-      // ignore this on non-ui machines
-    }
-  }
-
-  public void testPrepareRefreshAskNetworkDrive() throws Exception {
-    Device device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_NETWORK_DRIVE,
-        System.getProperty("java.io.tmpdir"));
-    try {
-      device.prepareRefresh(true);
-    } catch (HeadlessException e) {
-      // ignore this on non-ui machines
-    }
-  }
-
-  public void testPrepareRefreshAskExtDD() throws Exception {
-    Device device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_EXT_DD,
-        System.getProperty("java.io.tmpdir"));
-    try {
-      device.prepareRefresh(true);
-    } catch (HeadlessException e) {
-      // ignore this on non-ui machines
-    }
-  }
-
-  public void testPrepareRefreshAskPlayer() throws Exception {
-    Device device = DeviceManager.getInstance().registerDevice("name", Device.TYPE_PLAYER,
-        System.getProperty("java.io.tmpdir"));
-    try {
-      device.prepareRefresh(true);
-    } catch (HeadlessException e) {
-      // ignore this on non-ui machines
-    }
-  }
-
   /**
    * Test method for {@link org.jajuk.base.Device#mount(boolean)}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testMount() throws Exception {
-    Device device = new Device("1", "name");
-    device.setUrl(System.getProperty("java.io.tmpdir"));
+    Device device = TestHelpers.getDevice();
     device.mount(true);
-
     // try a second time, should fail
     try {
       device.mount(true);
@@ -525,7 +385,6 @@ public class TestDevice extends JajukTestCase {
     } catch (Exception e) {
       Log.error(e);
     }
-
     // try a device that has an invalid URL
     device = new Device("1", "name");
     device.setUrl("notexisting/not/adsf\\dtest");
@@ -539,43 +398,32 @@ public class TestDevice extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.Device#refresh(boolean)}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testRefreshBoolean() throws Exception {
-    Device device = new Device("1", "name");
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-
+    Device device = TestHelpers.getDevice();
     try {
       device.refresh(false, false, false, null);
     } catch (RuntimeException e) {
       // there can be a hidden HeadlessException here
       assertTrue(e.getCause().getMessage(), e.getCause() instanceof InvocationTargetException);
-      // assertTrue(e.getCause().getCause().getMessage(),
-      // e.getCause().getCause()instanceof InvocationTargetException);
-      // assertTrue(e.getCause().getCause().getCause().getMessage(),
-      // e.getCause().getCause().getCause()instanceof HeadlessException);
-
     }
-
     device.refresh(true, false, false, null);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#refresh(boolean, boolean)}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testRefreshBooleanBoolean() throws Exception {
-    Device device = new Device("1", "name");
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-
+    Device device = TestHelpers.getDevice();
     try {
       device.refresh(false, false, false, null);
     } catch (RuntimeException e) {
       // there can be a hidden HeadlessException here
       assertTrue(e.getCause().getMessage(), e.getCause() instanceof InvocationTargetException);
     }
-
     device.refresh(true, false, false, null);
   }
 
@@ -583,28 +431,27 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#refreshCommand(boolean)}.
    */
   public void testRefreshCommand() {
-
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     try {
       device.mount(false);
     } catch (Exception e) {
       Log.error(e);
       fail();
     }
-
     device.refreshCommand(false, false, null);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#refreshCommand(boolean)}.
-   * @throws Exception
+   *
+   * @throws Exception the exception
    */
   public void testRefreshCommandNoMoreAvailable() throws Exception {
     // We check that a device mounted but no more available cannot be refreshed
     Device device = new Device("1", "name");
     // Prepare a sample directory with at least a single file
-    java.io.File fileOKDir = new java.io.File(System.getProperty("java.io.tmpdir") + "/foo643");
-    fileOKDir.mkdir();
+    java.io.File fileOKDir = new java.io.File(ConstTest.DEVICES_BASE_PATH + "/foo643");
+    fileOKDir.mkdirs();
     java.io.File sampleFile = new java.io.File(fileOKDir.getAbsoluteFile() + "/foo.mp3");
     sampleFile.createNewFile();
     device.setUrl(fileOKDir.getAbsolutePath());
@@ -613,81 +460,74 @@ public class TestDevice extends JajukTestCase {
     // fine, now rename the directory
     sampleFile.delete();
     fileOKDir.delete();
-
     // An error should happen here
     device.refreshCommand(false, false, null);
   }
 
   // test for a regression that was added
+  /**
+   * Test refresh command dont readd top directory.
+   * 
+   * @throws Exception the exception
+   */
   public void testRefreshCommandDontReaddTopDirectory() throws Exception {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     device.mount(true);
     device.refreshCommand(false, false, null);
-
     // we should not have more than one top-directory!
     assertEquals(1, device.getDirectories().size());
-
     // even if we refresh some more, we should only have one, not multiple
     device.refreshCommand(false, false, null);
-
     // we should not have more than one top-directory!
     assertEquals(1, device.getDirectories().size());
-
     device.refreshCommand(false, false, null);
-
     // we should not have more than one top-directory!
     assertEquals(1, device.getDirectories().size());
-
     device.refreshCommand(false, false, null);
-
     // we should not have more than one top-directory!
     assertEquals(1, device.getDirectories().size());
-
     device.refreshCommand(false, false, null);
-
     // we should not have more than one top-directory!
     assertEquals(1, device.getDirectories().size());
-
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#setUrl(java.lang.String)}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testSetUrl() throws Exception {
-    Device device = JUnitHelpers.getDevice();
-
+    Device device = TestHelpers.getDevice();
     // add some directory, then the remove should kick in!
-    Directory dir = JUnitHelpers.getDirectory();
+    Directory dir = TestHelpers.getDirectory();
     device.addDirectory(dir);
-
     File file = getFile(8, dir);
     PlaylistManager.getInstance().registerPlaylistFile(file.getFIO(), dir);
-
     // now also the playlist should be reset
-    device.setUrl(System.getProperty("java.io.tmpdir"));
+    device.setUrl(ConstTest.TEMP_PATH);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#synchronize(boolean)}.
    */
   public void testSynchronize() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     device.synchronize(true);
-
     // nothing much happens here as there is no synchro-device set
     device.synchronize(false);
-
   }
 
+  /**
+   * Test synchronize conf set.
+   * 
+   */
   public void testSynchronizeConfSet() {
-    Device device = JUnitHelpers.getDevice();
-    Device dSrc = JUnitHelpers.getDevice("src", 0, "/tmp");
+    Device device = TestHelpers.getDevice();
+    Device dSrc = TestHelpers.getDevice("src", Device.Type.DIRECTORY, ConstTest.DEVICES_BASE_PATH
+        + "/src_device");
     assertNotNull(dSrc);
     assertNotNull(dSrc.getID());
     assertNotNull(DeviceManager.getInstance().getDeviceByID(dSrc.getID()));
-
     // set the synchro-device
     device.setProperty(Const.XML_DEVICE_SYNCHRO_SOURCE, dSrc.getID());
     assertNotNull(DeviceManager.getInstance().getDeviceByID(dSrc.getID()));
@@ -704,14 +544,17 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#synchronizeCommand()}.
    */
   public void testSynchronizeCommand() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     device.synchronizeCommand();
-
     // TODO do some real testing here
   }
 
+  /**
+   * Test synchronize command sync device.
+   * 
+   */
   public void testSynchronizeCommandSyncDevice() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     try {
       device.mount(false);
     } catch (Exception e) {
@@ -719,15 +562,18 @@ public class TestDevice extends JajukTestCase {
       fail();
     }
     // set the synchro-device
-    Device sync = DeviceManager.getInstance().registerDevice("name2", 0,
-        System.getProperty("java.io.tmpdir") + "/device2");
+    Device sync = DeviceManager.getInstance().registerDevice("name2", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/device2");
     device.setProperty(Const.XML_DEVICE_SYNCHRO_SOURCE, sync.getID());
-
     device.synchronizeCommand();
   }
 
+  /**
+   * Test synchronize command sync device bidi.
+   * 
+   */
   public void testSynchronizeCommandSyncDeviceBidi() {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     try {
       if (!device.mount(false)) {
         fail();
@@ -736,10 +582,9 @@ public class TestDevice extends JajukTestCase {
       Log.error(e);
       fail();
     }
-
     // set the synchro-device
-    Device sync = DeviceManager.getInstance().registerDevice("name2", 0,
-        System.getProperty("java.io.tmpdir") + "/jajuk_tests/device_2");
+    Device sync = DeviceManager.getInstance().registerDevice("name2", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/device2");
     try {
       new java.io.File(sync.getUrl()).mkdirs();
       new java.io.File(sync.getUrl() + "/audio1.mp3").createNewFile();
@@ -752,10 +597,8 @@ public class TestDevice extends JajukTestCase {
     }
     device.setProperty(Const.XML_DEVICE_SYNCHRO_SOURCE, sync.getID());
     device.setProperty(Const.XML_DEVICE_SYNCHRO_MODE, Const.DEVICE_SYNCHRO_MODE_BI);
-
     sync.setProperty(Const.XML_DEVICE_SYNCHRO_SOURCE, device.getID());
     sync.setProperty(Const.XML_DEVICE_SYNCHRO_MODE, Const.DEVICE_SYNCHRO_MODE_BI);
-
     device.synchronizeCommand();
     new java.io.File(sync.getUrl()).delete();
   }
@@ -764,14 +607,17 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#test()}.
    */
   public void testTest() {
-    Device device = JUnitHelpers.getDevice("notexist", Device.TYPE_DIRECTORY, "notexisting");
+    Device device = DeviceManager.getInstance().registerDevice("name", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/device");
     assertFalse(device.test());
   }
 
+  /**
+   * Test test mounted.
+   * 
+   */
   public void testTestMounted() {
-    Device device = JUnitHelpers.getDevice();
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-
+    Device device = TestHelpers.getDevice();
     assertTrue(device.test());
   }
 
@@ -779,29 +625,25 @@ public class TestDevice extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Device#toString()}.
    */
   public void testToString() {
-    Device device = JUnitHelpers.getDevice();
-    JUnitHelpers.ToStringTest(device);
-
-    device = JUnitHelpers.getDevice();
-    JUnitHelpers.ToStringTest(device);
-
+    Device device = TestHelpers.getDevice();
+    TestHelpers.ToStringTest(device);
+    device = TestHelpers.getDevice();
+    TestHelpers.ToStringTest(device);
     device = new Device(null, null);
-    JUnitHelpers.ToStringTest(device);
+    TestHelpers.ToStringTest(device);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Device#unmount()}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testUnmount() throws Exception {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertFalse(device.isMounted());
     device.unmount();
-
     device.mount(true);
     assertTrue(device.isMounted());
-
     device.unmount();
     assertFalse(device.isMounted());
   }
@@ -809,53 +651,61 @@ public class TestDevice extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.Device#unmount(boolean, boolean)}.
    *
-   * @throws Exception
+   * @throws Exception the exception
    */
   public void testUnmountBooleanBoolean() throws Exception {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     assertFalse(device.isMounted());
     device.unmount(false, false);
-
     device.mount(true);
     assertTrue(device.isMounted());
-
     device.unmount(false, false);
     assertFalse(device.isMounted());
   }
 
+  /**
+   * Test unmount boolean boolean queue.
+   * 
+   *
+   * @throws Exception the exception
+   */
   public void testUnmountBooleanBooleanQueue() throws Exception {
-    Device device = JUnitHelpers.getDevice();
-
+    Device device = TestHelpers.getDevice();
     device.mount(true);
     assertTrue(device.isMounted());
-
-    Directory dir = JUnitHelpers.getDirectory();
+    Directory dir = TestHelpers.getDirectory();
     device.addDirectory(dir);
-
     File file = getFile(9, dir);
-
     QueueModel.insert(new StackItem(file), 0);
     QueueModel.goTo(0);
-
     device.unmount(false, false);
     assertTrue(device.isMounted()); // still mounted because there is a file
     // used on this device....
   }
 
+  /**
+   * .
+   */
   private class MockAttributes implements Attributes {
-
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getValue(java.lang.String, java.lang.String)
+     */
     @Override
     public String getValue(String uri, String localName) {
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getValue(java.lang.String)
+     */
     @Override
     public String getValue(String qName) {
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getValue(int)
+     */
     @Override
     public String getValue(int index) {
       switch (index) {
@@ -871,76 +721,90 @@ public class TestDevice extends JajukTestCase {
         fail("invalid index: " + index);
         break;
       }
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getURI(int)
+     */
     @Override
     public String getURI(int index) {
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getType(java.lang.String, java.lang.String)
+     */
     @Override
     public String getType(String uri, String localName) {
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getType(java.lang.String)
+     */
     @Override
     public String getType(String qName) {
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getType(int)
+     */
     @Override
     public String getType(int index) {
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getQName(int)
+     */
     @Override
     public String getQName(int index) {
       switch (index) {
       case 0:
         return "att1";
-
       case 1:
         return "att2";
-
       case 2:
         return "att3";
-
       case 3:
         return Const.XML_DEVICE_AUTO_REFRESH;
-
       default:
         fail("invalid index: " + index);
       }
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getLocalName(int)
+     */
     @Override
     public String getLocalName(int index) {
-
       return null;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getLength()
+     */
     @Override
     public int getLength() {
-
       return 4;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getIndex(java.lang.String, java.lang.String)
+     */
     @Override
     public int getIndex(String uri, String localName) {
-
       return 0;
     }
 
+    /* (non-Javadoc)
+     * @see org.xml.sax.Attributes#getIndex(java.lang.String)
+     */
     @Override
     public int getIndex(String qName) {
-
       return 0;
     }
   }
diff --git a/src/test/java/org/jajuk/base/TestDeviceManager.java b/src/test/java/org/jajuk/base/TestDeviceManager.java
index 4c4f67d..4c5bb6a 100644
--- a/src/test/java/org/jajuk/base/TestDeviceManager.java
+++ b/src/test/java/org/jajuk/base/TestDeviceManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,35 +16,32 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDeviceManager extends JajukTestCase {
-
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // avoid UI:
     Conf.setProperty(Const.CONF_CONFIRMATIONS_REMOVE_DEVICE, "false");
-    super.setUp();
   }
 
   /**
-   * Test method for {@link org.jajuk.base.DeviceManager#getLabel()}.
+   * Test method for {@link org.jajuk.base.DeviceManager#getXMLTag()}.
    */
   public final void testGetLabel() {
-    assertEquals(Const.XML_DEVICES, DeviceManager.getInstance().getLabel());
+    assertEquals(Const.XML_DEVICES, DeviceManager.getInstance().getXMLTag());
   }
 
   /**
@@ -54,7 +51,6 @@ public class TestDeviceManager extends JajukTestCase {
    */
   public final void testStartAutoRefreshThread() {
     DeviceManager.getInstance().startAutoRefreshThread();
-
     // what happens if done twice?
     DeviceManager.getInstance().startAutoRefreshThread();
   }
@@ -73,43 +69,27 @@ public class TestDeviceManager extends JajukTestCase {
    * .
    */
   public final void testRegisterDeviceStringLongString() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("device", 0,
-        System.getProperty("java.io.tmpdir")));
-
-    assertNotNull(DeviceManager.getInstance().getDeviceByName("device"));
+    assertNotNull(TestHelpers.getDevice());
+    assertNotNull(DeviceManager.getInstance().getDeviceByName("sample_device"));
   }
 
   /**
    * Test register device twice.
-   * DOCUMENT_ME
+   * 
    */
   public final void testRegisterDeviceTwice() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("device", 0,
-        System.getProperty("java.io.tmpdir")));
-    assertNotNull(DeviceManager.getInstance().registerDevice("device", 0,
-        System.getProperty("java.io.tmpdir")));
-
+    assertNotNull(DeviceManager.getInstance().registerDevice("device", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev"));
+    assertNotNull(DeviceManager.getInstance().registerDevice("device", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev"));
     assertNotNull(DeviceManager.getInstance().getDeviceByName("device"));
   }
 
   /**
-   * Test method for.
-   *
-   * {@link org.jajuk.base.DeviceManager#registerDevice(java.lang.String, java.lang.String, long, java.lang.String)}
-   * .
-   */
-  public final void testRegisterDeviceStringStringLongString() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("2", "device2", 0,
-        System.getProperty("java.io.tmpdir")));
-
-    assertNotNull(DeviceManager.getInstance().getDeviceByName("device2"));
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.base.DeviceManager#createID(java.lang.String)}.
-   */
+  * Test method for.
+  *
+  * {@link org.jajuk.base.DeviceManager#createID(java.lang.String)}.
+  */
   public final void testCreateID() {
     assertNotNull(ItemManager.createID("device123"));
   }
@@ -121,100 +101,83 @@ public class TestDeviceManager extends JajukTestCase {
    * .
    */
   public final void testCheckDeviceAvailablityCD() {
-    assertEquals(0, DeviceManager.getInstance().checkDeviceAvailablity("device3", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"), true));
-
+    assertEquals(
+        0,
+        DeviceManager.getInstance().checkDeviceAvailablity("device3", Device.Type.FILES_CD,
+            ConstTest.DEVICES_BASE_PATH + "/dev", true));
   }
 
   /**
    * Test check device availablity existing name.
-   * DOCUMENT_ME
+   * 
    */
   public final void testCheckDeviceAvailablityExistingName() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("device4", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir")));
-
+    assertNotNull(DeviceManager.getInstance().registerDevice("device4", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev"));
     // error, name already exists
-    assertEquals(19, DeviceManager.getInstance().checkDeviceAvailablity("device4",
-        Device.TYPE_DIRECTORY, System.getProperty("java.io.tmpdir"), true));
+    assertEquals(
+        19,
+        DeviceManager.getInstance().checkDeviceAvailablity("device4", Device.Type.DIRECTORY,
+            ConstTest.DEVICES_BASE_PATH + "/dev", true));
   }
 
   /**
-   * Test check device availablity existing name not new.
-   * DOCUMENT_ME
-   */
+   * Test check device availability existing name not new.
+   **/
   public final void testCheckDeviceAvailablityExistingNameNotNew() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("device4", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir")));
-
+    assertNotNull(TestHelpers.getDevice("device4", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev"));
     // error, name already exists
-    assertEquals(0, DeviceManager.getInstance().checkDeviceAvailablity("device4",
-        Device.TYPE_DIRECTORY, System.getProperty("java.io.tmpdir"), false));
+    assertEquals(
+        0,
+        DeviceManager.getInstance().checkDeviceAvailablity("device4", Device.Type.DIRECTORY,
+            ConstTest.DEVICES_BASE_PATH + "/dev", false));
   }
 
   /**
-   * Test check device availablity parent or descendant.
-   * DOCUMENT_ME
+   * Test check device availability parent or descendant.
+   * 
    */
   public final void testCheckDeviceAvailablityParentOrDescendant() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("device5", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir")));
-
+    assertNotNull(TestHelpers.getDevice("device5", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev"));
     // error, same url
-    assertEquals(29, DeviceManager.getInstance().checkDeviceAvailablity("device3", 0,
-        System.getProperty("java.io.tmpdir"), true));
+    assertEquals(
+        29,
+        DeviceManager.getInstance().checkDeviceAvailablity("device3", Device.Type.DIRECTORY,
+            ConstTest.DEVICES_BASE_PATH + "/dev", true));
     // error, descendant url
-    assertEquals(29, DeviceManager.getInstance().checkDeviceAvailablity("device3", 0,
-        System.getProperty("java.io.tmpdir") + java.io.File.separator + "test", true));
+    assertEquals(
+        29,
+        DeviceManager.getInstance().checkDeviceAvailablity("device3", Device.Type.DIRECTORY,
+            ConstTest.DEVICES_BASE_PATH + "/dev/subdir", true));
     // error, parent url
-    assertEquals(29, DeviceManager.getInstance().checkDeviceAvailablity("device3", 0,
-        new java.io.File(System.getProperty("java.io.tmpdir")).getParent(), true));
-
+    assertEquals(
+        29,
+        DeviceManager.getInstance().checkDeviceAvailablity("device3", Device.Type.DIRECTORY,
+            ConstTest.DEVICES_BASE_PATH, true));
   }
 
   /**
-   * Test check device availablity not exists.
-   * DOCUMENT_ME
+   * Test check device availability not exists.
+   * 
    */
   public final void testCheckDeviceAvailablityNotExists() {
-    assertEquals(143, DeviceManager.getInstance().checkDeviceAvailablity("device3", 0,
-        "notexistingpath", true));
-
+    assertEquals(
+        143,
+        DeviceManager.getInstance().checkDeviceAvailablity("device3", Device.Type.DIRECTORY,
+            "notexistingpath", true));
   }
 
   /**
-   * Test check device availablity exists.
-   * DOCUMENT_ME
+   * Test check device availability exists.
+   * 
    */
   public final void testCheckDeviceAvailablityExists() {
-    assertEquals(0, DeviceManager.getInstance().checkDeviceAvailablity("device3", 0,
-        System.getProperty("java.io.tmpdir"), true));
-
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.base.DeviceManager#registerDeviceType(java.lang.String)}.
-   */
-  public final void testRegisterDeviceType() {
-    DeviceManager.getInstance().registerDeviceType("testtype");
-  }
-
-  /**
-   * Test method for {@link org.jajuk.base.DeviceManager#getDeviceTypesNumber()}
-   * .
-   */
-  public final void testGetDeviceTypesNumber() {
-    int n = DeviceManager.getInstance().getDeviceTypesNumber();
-    DeviceManager.getInstance().registerDeviceType("testtype2");
-    assertEquals(n + 1, DeviceManager.getInstance().getDeviceTypesNumber());
-
-    // the first can be any of them
-    assertNotNull(DeviceManager.getInstance().getDeviceTypes().next());
-
-    // the last one should be the new one from us
-    assertEquals("testtype2", DeviceManager.getInstance().getDeviceType(n));
+    assertEquals(
+        0,
+        DeviceManager.getInstance().checkDeviceAvailablity("device3", Device.Type.DIRECTORY,
+            ConstTest.TEMP_PATH, true));
   }
 
   /**
@@ -237,32 +200,25 @@ public class TestDeviceManager extends JajukTestCase {
    * {@link org.jajuk.base.DeviceManager#removeDevice(org.jajuk.base.Device)}.
    */
   public final void testRemoveDevice() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("5", "device5", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir")));
-
+    assertNotNull(DeviceManager.getInstance().registerDevice("5", "device5", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev"));
     assertNotNull(DeviceManager.getInstance().getDeviceByID("5"));
-
     DeviceManager.getInstance().removeDevice(DeviceManager.getInstance().getDeviceByID("5"));
-
     assertNull(DeviceManager.getInstance().getDeviceByID("5"));
   }
 
   /**
    * Test remove device mounted.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testRemoveDeviceMounted() throws Exception {
-    Device device = DeviceManager.getInstance().registerDevice("14", "device14",
-        Device.TYPE_DIRECTORY, System.getProperty("java.io.tmpdir"));
-    device.mount(true);
-
-    assertNotNull(DeviceManager.getInstance().getDeviceByID("14"));
-
-    DeviceManager.getInstance().removeDevice(DeviceManager.getInstance().getDeviceByID("14"));
-
-    assertNull(DeviceManager.getInstance().getDeviceByID("14"));
+    TestHelpers.getDevice();
+    String id = DeviceManager.createID("sample_device");
+    assertNotNull(DeviceManager.getInstance().getDeviceByID(id));
+    DeviceManager.getInstance().removeDevice(DeviceManager.getInstance().getDeviceByID(id));
+    assertNull(DeviceManager.getInstance().getDeviceByID(id));
   }
 
   /**
@@ -271,11 +227,10 @@ public class TestDeviceManager extends JajukTestCase {
    * {@link org.jajuk.base.DeviceManager#isAnyDeviceRefreshing()}.
    */
   public final void testIsAnyDeviceRefreshing() {
-    assertNotNull(DeviceManager.getInstance().registerDevice("device8", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir")));
-    assertNotNull(DeviceManager.getInstance().registerDevice("device9", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir")));
-
+    assertNotNull(DeviceManager.getInstance().registerDevice("device8", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev8"));
+    assertNotNull(DeviceManager.getInstance().registerDevice("device9", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/dev9"));
     assertFalse(DeviceManager.getInstance().isAnyDeviceRefreshing());
   }
 
@@ -283,12 +238,11 @@ public class TestDeviceManager extends JajukTestCase {
    * Test method for {@link org.jajuk.base.DeviceManager#cleanAllDevices()}.
    */
   public final void testCleanAllDevices() {
-    DeviceManager.getInstance().registerDevice("device6", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir"));
-    DeviceManager.getInstance().registerDevice("device7", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
-
-    DeviceManager.getInstance().cleanAllDevices();
+    DeviceManager.getInstance().registerDevice("device6", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev6");
+    DeviceManager.getInstance().registerDevice("device7", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/dev7");
+    TestHelpers.cleanAllDevices();
   }
 
   /**
@@ -298,18 +252,14 @@ public class TestDeviceManager extends JajukTestCase {
    */
   public final void testGetDateLastGlobalRefresh() {
     StartupCollectionService.registerItemManagers();
-
-    DeviceManager.getInstance().registerDevice("device6", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir"));
-    DeviceManager.getInstance().registerDevice("device7", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
-
+    DeviceManager.getInstance().registerDevice("device6", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev6");
+    DeviceManager.getInstance().registerDevice("device7", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/dev7");
     // first do a refresh
     DeviceManager.getInstance().refreshAllDevices();
-
     // then the timestamp should be non-zero
     assertTrue(0 != DeviceManager.getInstance().getDateLastGlobalRefresh());
-
   }
 
   /**
@@ -317,12 +267,10 @@ public class TestDeviceManager extends JajukTestCase {
    */
   public final void testRefreshAllDevices() {
     StartupCollectionService.registerItemManagers();
-
-    DeviceManager.getInstance().registerDevice("device6", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir"));
-    DeviceManager.getInstance().registerDevice("device7", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
-
+    DeviceManager.getInstance().registerDevice("device6", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev6");
+    DeviceManager.getInstance().registerDevice("device7", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/dev7");
     DeviceManager.getInstance().refreshAllDevices();
   }
 
@@ -341,11 +289,10 @@ public class TestDeviceManager extends JajukTestCase {
    * {@link org.jajuk.base.DeviceManager#getDeviceByName(java.lang.String)}.
    */
   public final void testGetDeviceByName() {
-    DeviceManager.getInstance().registerDevice("device10", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir"));
-    DeviceManager.getInstance().registerDevice("device11", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
-
+    DeviceManager.getInstance().registerDevice("device10", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev10");
+    DeviceManager.getInstance().registerDevice("device11", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/dev11");
     assertNotNull(DeviceManager.getInstance().getDeviceByName("device10"));
     assertNull(DeviceManager.getInstance().getDeviceByName("notexistingdevice"));
   }
@@ -355,10 +302,10 @@ public class TestDeviceManager extends JajukTestCase {
    */
   public final void testGetDevices() {
     assertEquals(0, DeviceManager.getInstance().getDevices().size());
-    DeviceManager.getInstance().registerDevice("device12", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir"));
-    DeviceManager.getInstance().registerDevice("device13", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
+    DeviceManager.getInstance().registerDevice("device12", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev12");
+    DeviceManager.getInstance().registerDevice("device13", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/dev13");
     assertEquals(2, DeviceManager.getInstance().getDevices().size());
   }
 
@@ -367,11 +314,10 @@ public class TestDeviceManager extends JajukTestCase {
    */
   public final void testGetDevicesIterator() {
     assertFalse(DeviceManager.getInstance().getDevicesIterator().hasNext());
-    DeviceManager.getInstance().registerDevice("device12", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir"));
-    DeviceManager.getInstance().registerDevice("device13", Device.TYPE_CD,
-        System.getProperty("java.io.tmpdir"));
+    DeviceManager.getInstance().registerDevice("device12", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/dev12");
+    DeviceManager.getInstance().registerDevice("device13", Device.Type.FILES_CD,
+        ConstTest.DEVICES_BASE_PATH + "/dev13");
     assertTrue(DeviceManager.getInstance().getDevicesIterator().hasNext());
   }
-
 }
diff --git a/src/test/java/org/jajuk/base/TestDirectory.java b/src/test/java/org/jajuk/base/TestDirectory.java
index d7b8c3f..b792b01 100644
--- a/src/test/java/org/jajuk/base/TestDirectory.java
+++ b/src/test/java/org/jajuk/base/TestDirectory.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -25,9 +25,10 @@ import java.util.Set;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
-import org.jajuk.JUnitHelpers.MockPlayer;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.MockPlayer;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.players.IPlayerImpl;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Conf;
@@ -37,77 +38,36 @@ import org.jajuk.util.Const;
  * TODO: some more coverage is possible by enhancing the tests accordingly.
  */
 public class TestDirectory extends JajukTestCase {
-
-  /** Sample device named "device1" and located at /tmp/device1 *. */
-  Device device1;
-  
-  /** Sample top dir named "topdir1" and located at /tmp/device1/topdir1 *. */
-  Directory topdir1;
-  
-  /** Sample dir named "dir1" and located at /tmp/device1/topdir1/dir1 *. */
-  Directory dir1;
-  
-  /** Sample dir named "dir2" and located at /tmp/device1/topdir1/dir2 *. */
-  Directory dir2;
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // reset some conf-options
     Conf.setProperty(Const.CONF_OPTIONS_HIDE_UNMOUNTED, "false");
-
-    super.setUp();
-
-    // Create generic items
-    String pathDevice1 = System.getProperty("java.io.tmpdir") + "/device1";
-    // Cleanup any existing directory and create again the directory
-    new java.io.File(pathDevice1).delete();
-    new java.io.File(pathDevice1).mkdirs();
-    // create 2 directories to avoid getting a wanring dialog that device is void
-    new java.io.File(pathDevice1 + "/dir1").mkdirs();
-    new java.io.File(pathDevice1 + "/dir2").mkdirs();
-
-    device1 = DeviceManager.getInstance().registerDevice("device1", Device.TYPE_DIRECTORY,
-        pathDevice1);
-    topdir1 = DirectoryManager.getInstance().registerDirectory(device1);
-    dir1 = DirectoryManager.getInstance().registerDirectory("dir1", topdir1, device1);
-    dir2 = DirectoryManager.getInstance().registerDirectory("dir2", topdir1, device1);
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Directory#getDesc()}.
+   * Test method for {@link org.jajuk.base.Directory#getTitle()}.
    */
-
   public void testGetDesc() {
-    Directory dir = dir1;
-    assertTrue(dir.toString(), StringUtils.isNotBlank(dir.getDesc()));
+    Directory dir = TestHelpers.getDirectory("dir1");
+    assertTrue(dir.toString(), StringUtils.isNotBlank(dir.getTitle()));
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Directory#getLabel()}.
+   * Test method for {@link org.jajuk.base.Directory#getXMLTag()}.
    */
-
   public void testGetLabel() {
-    Directory dir = dir1;
-    assertEquals(dir.toString(), Const.XML_DIRECTORY, dir.getLabel());
+    Directory dir = TestHelpers.getDirectory("dir1");
+    assertEquals(dir.toString(), Const.XML_DIRECTORY, dir.getXMLTag());
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getHumanValue(java.lang.String)}.
    */
-
   public void testGetHumanValue() {
-    Device dev = device1;
-    assertNotNull(dev);
-
-    Directory dir = dir1;
-    assertEquals(dir.toString(), dir.getParentDirectory().getFio(), new java.io.File(dir
-        .getHumanValue(Const.XML_DIRECTORY_PARENT)));
-    assertEquals(dir.toString(), "device1", dir.getHumanValue(Const.XML_DEVICE));
+    Directory dir = TestHelpers.getDirectory("dir1");
+    assertEquals(dir.toString(), dir.getParentDirectory().getFio(),
+        new java.io.File(dir.getHumanValue(Const.XML_DIRECTORY_PARENT)));
+    assertEquals(dir.toString(), "sample_device", dir.getHumanValue(Const.XML_DEVICE));
     assertTrue(dir.toString(), StringUtils.isNotBlank(dir.getHumanValue(Const.XML_NAME)));
     assertEquals(dir.toString(), "", dir.getHumanValue("notexisting"));
   }
@@ -115,83 +75,72 @@ public class TestDirectory extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.Directory#getIconRepresentation()}.
    */
-
   public void testGetIconRepresentation() {
     StartupCollectionService.registerItemManagers();
-
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     assertNotNull(dir.getIconRepresentation());
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#Directory(java.lang.String, java.lang.String, org.jajuk.base.Directory, org.jajuk.base.Device)}.
    */
-
   public void testDirectory() {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     assertNotNull(dir);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#toString()}.
    */
-
   public void testToString() {
-    Directory dir = dir1;
-    JUnitHelpers.ToStringTest(dir);
+    Directory dir = TestHelpers.getDirectory("dir1");
+    TestHelpers.ToStringTest(dir);
   }
 
   /**
    * Test to string parent.
-   * DOCUMENT_ME
+   * 
    */
   public void testToStringParent() {
-    Directory dir = dir1;
-    JUnitHelpers.ToStringTest(dir);
+    Directory dir = TestHelpers.getDirectory("dir1");
+    TestHelpers.ToStringTest(dir);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getAbsolutePath()}.
    */
-
   public void testGetAbsolutePath() {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     assertTrue(dir.toString(), StringUtils.isNotBlank(dir.getAbsolutePath()));
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getDevice()}.
    */
-
   public void testGetDevice() {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     assertNotNull(dir.getDevice());
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getParentDirectory()}.
    */
-
   public void testGetParentDirectory() {
-    Directory dir = topdir1;
+    Directory dir = TestHelpers.getDevice().getRootDirectory();
     assertNull(dir.getParentDirectory());
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getDirectories()}.
    */
-
   public void testGetDirectories() {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     Set<Directory> dirs = dir.getDirectories();
-
     // no dirs without registered directories
     assertEquals(0, dirs.size());
-
     DirectoryManager.getInstance().registerDirectory("sub1", dir, dir.getDevice());
     DirectoryManager.getInstance().registerDirectory("sub2", dir, dir.getDevice());
     DirectoryManager.getInstance().registerDirectory("sub3", dir, dir.getDevice());
-
     dirs = dir.getDirectories();
     assertEquals(3, dirs.size());
   }
@@ -201,18 +150,13 @@ public class TestDirectory extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGetFiles() throws Exception {
-    Directory dir = dir1;
-
+    Directory dir = TestHelpers.getDirectory("dir1");
     Set<File> files = dir.getFiles();
-
     // no files are available currently
     assertEquals(0, files.size());
-
     getFileInDir(3, dir);
     getFileInDir(4, dir);
-
     files = dir.getFiles();
     assertEquals(2, dir.getFiles().size());
   }
@@ -220,91 +164,76 @@ public class TestDirectory extends JajukTestCase {
   /**
    * Gets the file in dir.
    *
-   * @param i DOCUMENT_ME
-   * @param dir DOCUMENT_ME
+   * @param i 
+   * @param dir 
    * @return the file in dir
    * @throws Exception the exception
    */
   @SuppressWarnings("unchecked")
   public static org.jajuk.base.File getFileInDir(int i, Directory dir) throws Exception {
-    Genre genre = JUnitHelpers.getGenre("name");
-    Album album = JUnitHelpers.getAlbum("myalbum", 0);
+    Genre genre = TestHelpers.getGenre("name");
+    Album album = TestHelpers.getAlbum("myalbum", 0);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
+    Artist artist = TestHelpers.getArtist("name");
     Year year = new Year(Integer.valueOf(i).toString(), "2000");
-
     IPlayerImpl imp = new MockPlayer();
     Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
-
     Type type = new Type(Integer.valueOf(i).toString(), "name", "mp3", cl, null);
     Track track = new Track(Integer.valueOf(i).toString(), "name", album, genre, artist, 120, year,
         1, type, 1);
-
     return FileManager.getInstance().registerFile("test_" + i + ".tst", dir, track, 120, 70);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getPlaylistFiles()}.
    */
-
   public void testGetPlaylistFiles() {
-    Directory dir = dir1;
-
+    Directory dir = TestHelpers.getDirectory("dir1");
     Set<Playlist> files = dir.getPlaylistFiles();
-
     // no files are available currently
     assertEquals(0, files.size());
-
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile1"), dir);
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile1"),
+        dir);
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile2"), dir);
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile2"),
+        dir);
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile3"), dir);
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile3"),
+        dir);
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile4"), dir);
-
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile4"),
+        dir);
     files = dir.getPlaylistFiles();
     assertEquals(4, files.size());
   }
 
   /**
    * Test get playlist recursively.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetPlaylistRecursively() {
     PlaylistManager.getInstance().clear();
-
-    Directory dir = dir1;
-
+    Directory dir = TestHelpers.getDirectory();
     List<Playlist> files = dir.getPlaylistsRecursively();
-
     // no files are available currently
     assertEquals(0, files.size());
-
     Directory dir1 = DirectoryManager.getInstance().registerDirectory("sub1", dir, dir.getDevice());
     Directory dir2 = DirectoryManager.getInstance().registerDirectory("sub2", dir, dir.getDevice());
     Directory dir3 = DirectoryManager.getInstance().registerDirectory("sub3", dir, dir.getDevice());
-
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile1"), dir1);
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile1"),
+        dir1);
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile2"), dir2);
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile2"),
+        dir2);
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile3"), dir2);
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile3"),
+        dir2);
     PlaylistManager.getInstance().registerPlaylistFile(
-        new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-            + "testfile4"), dir3);
-
+        new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testfile4"),
+        dir3);
     files = dir.getPlaylistsRecursively();
   }
 
@@ -313,16 +242,13 @@ public class TestDirectory extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGetFilesFromFile() throws Exception {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     assertNull(dir.getFilesFromFile(null));
-
     getFileInDir(3, dir);
     getFileInDir(4, dir);
     File file = getFileInDir(5, dir);
     getFileInDir(6, dir);
-
     List<File> list = dir.getFilesFromFile(file);
     assertTrue("Size: " + list.size(), list.size() > 0);
   }
@@ -332,25 +258,19 @@ public class TestDirectory extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGetFilesRecursively() throws Exception {
     FileManager.getInstance().clear();
-
-    Directory dir = JUnitHelpers.getDirectory();
+    Directory dir = TestHelpers.getDirectory();
     List<File> files = dir.getFilesRecursively();
-
     // no files are available currently
     assertEquals(0, files.size());
-
     Directory dir1 = DirectoryManager.getInstance().registerDirectory("sub1", dir, dir.getDevice());
     Directory dir2 = DirectoryManager.getInstance().registerDirectory("sub2", dir, dir.getDevice());
     Directory dir3 = DirectoryManager.getInstance().registerDirectory("sub3", dir, dir.getDevice());
-
     getFileInDir(3, dir1);
     getFileInDir(4, dir2);
     getFileInDir(5, dir2);
     getFileInDir(6, dir3);
-
     files = dir.getFilesRecursively();
     assertEquals(4, files.size());
   }
@@ -361,6 +281,9 @@ public class TestDirectory extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testHasAncestor() throws Exception {
+    Directory dir1 = TestHelpers.getDirectory("dir1");
+    Directory dir2 = TestHelpers.getDirectory("dir2");
+    Directory topdir1 = TestHelpers.getDevice().getRootDirectory();
     assertTrue(dir1.hasAncestor(topdir1));
     assertFalse(dir1.hasAncestor(dir2));
     assertFalse(dir1.hasAncestor(dir1));
@@ -372,6 +295,9 @@ public class TestDirectory extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testGetDirectoriesRecursively() throws Exception {
+    Directory topdir1 = TestHelpers.getDevice().getRootDirectory();
+    Directory dir1 = TestHelpers.getDirectory("dir1");
+    Directory dir2 = TestHelpers.getDirectory("dir2");
     List<Directory> dirs = topdir1.getDirectoriesRecursively();
     assertTrue(dirs.size() == 2);
     assertFalse(dirs.contains(topdir1));
@@ -382,60 +308,49 @@ public class TestDirectory extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.Directory#scan(boolean, org.jajuk.ui.helpers.RefreshReporter)}.
    */
-
   public void testScan() {
-    Directory dir = dir1;
-
+    Directory dir = TestHelpers.getDirectory("dir1");
     // this scan will not do much because there are no files in this dir
     dir.scan(true, null);
   }
 
   /**
    * Test scan actual.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testScanActual() throws Exception {
     StartupCollectionService.registerItemManagers();
     StartupCollectionService.registerTypes();
-
     // create temp file
-    Device dev = DeviceManager.getInstance().registerDevice("test1", Device.TYPE_DIRECTORY,
-        System.getProperty("java.io.tmpdir"));
-    Directory dir = dir1;
-
-    new java.io.File(dev.getUrl()).mkdirs();
-    FileUtils.writeStringToFile(new java.io.File(dev.getUrl() + java.io.File.separator + "testScan"
-        + java.io.File.separator + "test1.mp3"), "teststring");
-
+    Directory dir = TestHelpers.getDirectory("dir1");
+    File file = TestHelpers.getFile("test1.mp3", true);
+    FileUtils.writeStringToFile(file.getFIO(), "teststring");
     dir.scan(true, null);
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#reset()}.
    */
-
   public void testReset() {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     dir.reset();
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getRelativePath()}.
    */
-
   public void testGetRelativePath() {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     assertNotNull(dir.getRelativePath());
   }
 
   /**
    * Test method for {@link org.jajuk.base.Directory#getFio()}.
    */
-
   public void testGetFio() {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     assertNotNull(dir.getFio());
   }
 
@@ -443,16 +358,19 @@ public class TestDirectory extends JajukTestCase {
    * Test method for {@link org.jajuk.base.Directory#compareTo(org.jajuk.base.Directory)}.
    */
   public void testCompareTo() {
-    Directory dir1 = new Directory("1", "", null, new Device("2", "test"));
-    dir1.getDevice().setUrl(System.getProperty("java.io.tmpdir"));
-    Directory dir2 = new Directory("1", "", null, new Device("2", "test"));
-    dir2.getDevice().setUrl(System.getProperty("java.io.tmpdir"));
-    Directory dir3a = new Directory("3", "", null, new Device("2", "test3"));
-    dir3a.getDevice().setUrl(System.getProperty("java.io.tmpdir"));
-    Directory dir3b = new Directory("2", "", null, new Device("2", "test"));
-    dir3b.getDevice().setUrl(System.getProperty("java.io.tmpdir") + java.io.File.separator + "1");
-    JUnitHelpers.CompareToTest(dir1, dir2, dir3a);
-    JUnitHelpers.CompareToTest(dir1, dir2, dir3b);
+    Device device1 = TestHelpers.getDevice("1", Device.Type.DIRECTORY, ConstTest.DEVICES_BASE_PATH
+        + "/1");
+    Device device2 = TestHelpers.getDevice("2", Device.Type.DIRECTORY, ConstTest.DEVICES_BASE_PATH
+        + "/2");
+    Directory dir11 = DirectoryManager.getInstance().registerDirectory("dir11",
+        device1.getRootDirectory(), device1);
+    Directory dir12 = DirectoryManager.getInstance().registerDirectory("dir12",
+        device1.getRootDirectory(), device1);
+    Directory dir2 = DirectoryManager.getInstance().registerDirectory("dir2",
+        device1.getRootDirectory(), device2);
+    assertTrue(dir11.compareTo(dir12) < 0);
+    assertTrue(dir2.compareTo(dir11) > 0);
+    assertTrue(dir2.compareTo(dir12) > 0);
   }
 
   /**
@@ -460,54 +378,28 @@ public class TestDirectory extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testShouldBeHidden() throws Exception {
-    Directory dir = dir1;
+    Directory dir = TestHelpers.getDirectory("dir1");
     // not mounted by default
     assertFalse(dir.getDevice().isMounted());
-
     // false because option is not set
     assertFalse(dir.shouldBeHidden());
-
     Conf.setProperty(Const.CONF_OPTIONS_HIDE_UNMOUNTED, "true");
-
     // now true because option to hide unmounted is set
     assertTrue(dir.shouldBeHidden());
-
-    dir.getDevice().setUrl(System.getProperty("java.io.tmpdir"));
+    dir.getDevice().setUrl(ConstTest.DEVICES_BASE_PATH);
     dir.getDevice().mount(true);
-
     // now false because device is mounted now
     assertFalse(dir.shouldBeHidden());
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Directory#setName(java.lang.String)}.
-   */
-
-  public void testSetName() {
-    Directory dir = dir1;
-    assertEquals("dir1", dir.getName());
-    dir.setName("newname");
-    assertEquals("newname", dir.getName());
-  }
-
-  /**
-   * Test method for {@link org.jajuk.base.Directory#cleanRemovedFiles()}.
-   */
-
-  public void testCleanRemovedFiles() {
-    Directory dir = dir1;
-    dir.cleanRemovedFiles();
-  }
-
-  /**
    * Test method for {@link org.jajuk.base.Directory#isChildOf(org.jajuk.base.Directory)}.
    */
-
   public void testIsChildOf() {
+    Directory topdir1 = TestHelpers.getDevice().getRootDirectory();
+    Directory dir2 = TestHelpers.getDirectory("dir2");
     assertFalse(topdir1.isChildOf(dir2));
     assertTrue(dir2.isChildOf(topdir1));
   }
-
 }
diff --git a/src/test/java/org/jajuk/base/TestFileManager.java b/src/test/java/org/jajuk/base/TestFileManager.java
index 5abdbae..93abdea 100644
--- a/src/test/java/org/jajuk/base/TestFileManager.java
+++ b/src/test/java/org/jajuk/base/TestFileManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,77 +16,123 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision: 3132 $
+ *  
  */
 package org.jajuk.base;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.services.bookmark.History;
+import org.jajuk.util.Const;
 import org.jajuk.util.error.JajukException;
 import org.junit.Test;
 
-/**
- * 
- */
 public class TestFileManager extends JajukTestCase {
-
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-  }
-  
-   /**
+  /**
    * Test method for {@link org.jajuk.base.FileManager#removeFile(File)}.
    * @throws IOException 
+   *
    */
   @Test
-  public void testRemoveFile() {
-     // Set-up...
-    File file = JUnitHelpers.getFile();
-    
+  public void testRemoveFile() throws IOException {
+    // Set-up...
+    File file = TestHelpers.getFile();
     // Remove the reference
     FileManager.getInstance().removeFile(file);
-    
     // 1- Check that the collection no more contains the file
     assertTrue(FileManager.getInstance().getFileByID(file.getID()) == null);
-    
     // 2- check that associated track no more contains this file
     assertFalse(file.getTrack().getFiles().contains(file));
-    
-    
   }
 
   /**
    * Test method for {@link org.jajuk.base.FileManager#changeFileDirectory(org.jajuk.base.File, org.jajuk.base.Directory)}.
-   * @throws IOException 
+   *
+   * @throws IOException Signals that an I/O exception has occurred.
+   * @throws JajukException the jajuk exception
    */
   @Test
   public void testChangeFileDirectory() throws IOException, JajukException {
     // Set-up...
-    File oldFile = JUnitHelpers.getFile();
+    File oldFile = TestHelpers.getFile();
     oldFile.getDirectory().getFio().mkdirs();
     oldFile.getFIO().createNewFile();
     String newDirName = "top2";
     // Create a top2 directory just bellow device root
-    Directory newDir = JUnitHelpers.getDirectory(newDirName,
-        oldFile.getDevice().getRootDirectory(), oldFile.getDevice());
+    Directory newDir = TestHelpers.getDirectory(newDirName, oldFile.getDevice().getRootDirectory(),
+        oldFile.getDevice());
     // Create the physical directory if required
     newDir.getFio().mkdirs();
     // Perform the move
     File newFile = FileManager.getInstance().changeFileDirectory(oldFile, newDir);
     // Now test ...
-
     //1- Does the new file exist ?
     assertTrue(new java.io.File(newDir.getAbsolutePath() + '/' + oldFile.getName()).exists());
-
     //2- Does the old file is removed ?
     assertFalse(oldFile.getFIO().exists());
-    
     //3- Does the associated track contains the right file (and only it)
     List<File> files = newFile.getTrack().getFiles();
     assertTrue(files.size() == 1 && files.get(0).equals(newFile));
   }
+
+  @Test
+  public void testGetFileByPath() {
+    // test with default file 
+    testWithFile(TestHelpers.getFile());
+    // test with different files
+    testWithFile(TestHelpers.getFile("ABC.tst", true));
+    testWithFile(TestHelpers.getFile("ABC.tst", true));
+    testWithFile(TestHelpers.getFile("0123234327\"§$%!§\"()432ABC-.,_:;#+*'*~\\}][{.tst", true));
+  }
+
+  private void testWithFile(File file) {
+    assertNotNull("file " + file.getFIO() + " is not found if we look for the actual file name",
+        FileManager.getInstance().getFileByPath(file.getFIO().getAbsolutePath()));
+    assertNotNull("file " + file.getFIO() + " is not found if we look for the lowercase file name",
+        FileManager.getInstance().getFileByPath(file.getFIO().getAbsolutePath().toLowerCase()));
+    assertNotNull("file " + file.getFIO() + " is not found if we look for the uppercase file name",
+        FileManager.getInstance().getFileByPath(file.getFIO().getAbsolutePath().toUpperCase()));
+  }
+
+  public void testFilterRecentlyPlayedTracksEnoughTracks() {
+    int totalTracksNb = 500; // the 150 first tracks are recent and should be dropped
+    List<File> files = populateHistory(totalTracksNb);
+    FileManager.getInstance().filterRecentlyPlayedTracks(files);
+    assertEquals(350, files.size());
+  }
+
+  public void testFilterRecentlyPlayedTracksLessThanActionNumber() {
+    int totalTracksNb = 100; // all the 100 are recent but will not be dropped because 
+    // we are under the lower of tracks
+    List<File> files = populateHistory(totalTracksNb);
+    FileManager.getInstance().filterRecentlyPlayedTracks(files);
+    assertEquals(100, files.size());
+  }
+
+  public void testFilterRecentlyPlayedTracksABitMoreThanActionNumber() {
+    int totalTracksNb = 250; // the first 150 are recent but not all of them will be
+    // dropped to deal with the lower limit
+    List<File> files = populateHistory(totalTracksNb);
+    FileManager.getInstance().filterRecentlyPlayedTracks(files);
+    assertEquals(Const.NB_TRACKS_ON_ACTION, files.size());
+  }
+
+  private List<File> populateHistory(int totalTracksNb) {
+    long now = new Date().getTime();
+    // create 500 items in collection and add them into history, 
+    // we simulate a file per day in history.
+    // file0 is now, file499 is 500 days away
+    List<File> files = new ArrayList<File>(totalTracksNb);
+    for (long i = totalTracksNb - 1; i >= 0; i--) { // i must be a long to avoid out of bounds
+      File file = TestHelpers.getFile("file" + i, true);
+      files.add(file);
+      History.getInstance().addItem(file.getID(), now - i * 1000 * 3600 * 24);
+    }
+    return files;
+  }
 }
diff --git a/src/test/java/org/jajuk/base/TestFileManagerTest.java b/src/test/java/org/jajuk/base/TestFileManagerTest.java
new file mode 100644
index 0000000..d34cfed
--- /dev/null
+++ b/src/test/java/org/jajuk/base/TestFileManagerTest.java
@@ -0,0 +1,4 @@
+package org.jajuk.base;
+
+public class TestFileManagerTest {
+}
diff --git a/src/test/java/org/jajuk/base/TestItemManager.java b/src/test/java/org/jajuk/base/TestItemManager.java
index 4894ddf..9239e81 100644
--- a/src/test/java/org/jajuk/base/TestItemManager.java
+++ b/src/test/java/org/jajuk/base/TestItemManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
@@ -24,11 +24,9 @@ import ext.services.xml.XMLUtils;
 
 import java.util.Date;
 import java.util.Iterator;
-import java.util.List;
 
 import javax.swing.ImageIcon;
 
-import org.apache.commons.collections.Predicate;
 import org.apache.commons.lang.StringUtils;
 import org.jajuk.JajukTestCase;
 import org.jajuk.services.startup.StartupCollectionService;
@@ -36,14 +34,12 @@ import org.jajuk.util.Const;
 import org.jajuk.util.Messages;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestItemManager extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.base.ItemManager#ItemManager()}.
    */
-
   public final void testItemManager() {
     new LocalIM();
   }
@@ -53,13 +49,10 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#switchAllManagersToOrderState()}.
    */
-
   public final void testSwitchAllManagersToOrderState() {
     // without Managers this will do nothing
     ItemManager.switchAllManagersToOrderState();
-
     StartupCollectionService.registerItemManagers();
-
     // now it should do more
     ItemManager.switchAllManagersToOrderState();
   }
@@ -67,7 +60,6 @@ public class TestItemManager extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.ItemManager#switchToOrderState()}.
    */
-
   public final void testSwitchToOrderState() {
     ItemManager man = new LocalIM();
     man.switchToOrderState();
@@ -79,21 +71,17 @@ public class TestItemManager extends JajukTestCase {
    * {@link org.jajuk.base.ItemManager#registerItemManager(java.lang.Class, org.jajuk.base.ItemManager)}
    * .
    */
-
   public final void testRegisterItemManager() {
     ItemManager man = new LocalIM();
-
     ItemManager.registerItemManager(String.class, man);
   }
 
   /**
-   * Test method for {@link org.jajuk.base.ItemManager#getLabel()}.
+   * Test method for {@link org.jajuk.base.ItemManager#getXMLTag()}.
    */
-
   public final void testGetLabel() {
     ItemManager man = new LocalIM();
-
-    assertEquals("TestLabel", man.getLabel());
+    assertEquals("TestLabel", man.getXMLTag());
   }
 
   /**
@@ -101,10 +89,8 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#getMetaInformation(java.lang.String)}.
    */
-
   public final void testGetMetaInformation() {
     ItemManager man = new LocalIM();
-
     assertNotNull(man.getMetaInformation(Const.XML_ID));
     assertNull(man.getMetaInformation("unknown_property"));
   }
@@ -114,11 +100,10 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#getHumanType(java.lang.String)}.
    */
-
   public final void testGetHumanType() {
     assertEquals("anykey", Messages.getHumanPropertyName("anykey"));
-    assertFalse(Messages.getHumanPropertyName("disc_number"), "disc_number".equals(Messages
-        .getHumanPropertyName("disc_number")));
+    assertFalse(Messages.getHumanPropertyName("disc_number"),
+        "disc_number".equals(Messages.getHumanPropertyName("disc_number")));
   }
 
   /**
@@ -126,13 +111,10 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#removeProperty(java.lang.String)}.
    */
-
   public final void testRemoveProperty() {
     ItemManager man = new LocalIM();
-
     // one not existing
     man.removeProperty("notexisting");
-
     // another one existing
     man.removeProperty(Const.XML_ID);
   }
@@ -143,17 +125,12 @@ public class TestItemManager extends JajukTestCase {
    * {@link org.jajuk.base.ItemManager#applyRemoveProperty(org.jajuk.base.PropertyMetaInformation)}
    * .
    */
-
   public final void testApplyRemoveProperty() {
     ItemManager man = new LocalIM();
-
     PropertyMetaInformation meta = man.getMetaInformation(Const.XML_ID);
-
     // register some item before
     man.registerItem(new TestItem("3", "name"));
-
     man.applyRemoveProperty(meta);
-
     man.applyNewProperty(meta);
   }
 
@@ -163,7 +140,6 @@ public class TestItemManager extends JajukTestCase {
    * {@link org.jajuk.base.ItemManager#applyNewProperty(org.jajuk.base.PropertyMetaInformation)}
    * .
    */
-
   public final void testApplyNewProperty() {
     // tested above
   }
@@ -171,17 +147,14 @@ public class TestItemManager extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.ItemManager#toXML()}.
    */
-
   public final void testToXML() {
     ItemManager man = new LocalIM();
     String xml = man.toXML();
     assertTrue(StringUtils.isNotBlank(xml));
-
     StringBuilder sb = new StringBuilder(xml);
     sb.append("</");
-    sb.append(man.getLabel());
+    sb.append(man.getXMLTag());
     sb.append('>');
-
     // valid xml?
     assertNotNull(sb.toString(), XMLUtils.getDocument(sb.toString()));
   }
@@ -189,7 +162,6 @@ public class TestItemManager extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.ItemManager#getProperties()}.
    */
-
   public final void testGetProperties() {
     ItemManager man = new LocalIM();
     assertNotNull(man.getProperties());
@@ -199,17 +171,13 @@ public class TestItemManager extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.ItemManager#getCustomProperties()}.
    */
-
   public final void testGetCustomProperties() {
     ItemManager man = new LocalIM();
-
     assertNotNull(man.getCustomProperties());
     assertEquals(0, man.getCustomProperties().size());
-
     // add a custom property.
     man.registerProperty(new PropertyMetaInformation("testprop", true, true, false, false, false,
         String.class, null));
-
     assertNotNull(man.getCustomProperties());
     assertEquals(1, man.getCustomProperties().size()); // now one property is
     // registered
@@ -218,17 +186,13 @@ public class TestItemManager extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.ItemManager#getVisibleProperties()}.
    */
-
   public final void testGetVisibleProperties() {
     ItemManager man = new LocalIM();
-
     assertNotNull(man.getVisibleProperties());
     assertEquals(0, man.getVisibleProperties().size());
-
     // add a custom property.
     man.registerProperty(new PropertyMetaInformation("testprop", true, true, true, false, false,
         String.class, null));
-
     assertNotNull(man.getVisibleProperties());
     assertEquals(1, man.getVisibleProperties().size()); // now one visible
     // property is
@@ -240,7 +204,6 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#getItemManager(java.lang.String)}.
    */
-
   public final void testGetItemManagerString() {
     assertNotNull(ItemManager.getItemManager(Const.XML_DEVICE));
     assertNotNull(ItemManager.getItemManager(Const.XML_TRACK));
@@ -259,35 +222,21 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#getItemManager(java.lang.Class)}.
    */
-
   public final void testGetItemManagerClassOfQ() {
     StartupCollectionService.registerItemManagers();
-
     assertNotNull(ItemManager.getItemManager(org.jajuk.base.Album.class));
     assertNotNull(ItemManager.getItemManager(org.jajuk.base.Artist.class));
     assertNotNull(ItemManager.getItemManager(org.jajuk.base.File.class));
-
     // take care, String.class is used for LocalIM which might be registered...
     assertNull(ItemManager.getItemManager(Date.class));
   }
 
   /**
-   * Test method for {@link org.jajuk.base.ItemManager#getItemManagers()}.
-   */
-
-  public final void testGetItemManagers() {
-    // cannot check the count as there can be some from previous tests
-    assertNotNull(ItemManager.getItemManagers());
-  }
-
-  /**
-   * Test method for {@link org.jajuk.base.ItemManager#cleanup()}.
-   */
-
+  * Test method for {@link org.jajuk.base.ItemManager#cleanup()}.
+  */
   public final void testCleanup() {
     ItemManager man = new LocalIM();
     man.cleanup();
-
     // TODO: add more sophisticated testing here
   }
 
@@ -296,11 +245,9 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#cleanOrphanTracks(org.jajuk.base.Item)}.
    */
-
   public final void testCleanOrphanTracks() {
     ItemManager man = new LocalIM();
     man.cleanOrphanTracks(null);
-
     // TODO: add more sophisticated testing here
   }
 
@@ -309,19 +256,13 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#removeItem(org.jajuk.base.Item)}.
    */
-
   public final void testRemoveItem() {
     ItemManager man = new LocalIM();
     man.removeItem(null);
-
     Item item = new TestItem("4", "name4");
-
     man.registerItem(item);
-
     assertEquals(1, man.getItems().size());
-
     man.removeItem(item);
-
     assertEquals(0, man.getItems().size());
   }
 
@@ -330,7 +271,6 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#registerItem(org.jajuk.base.Item)}.
    */
-
   public final void testRegisterItem() {
     // tested in previous test
   }
@@ -341,7 +281,6 @@ public class TestItemManager extends JajukTestCase {
    * {@link org.jajuk.base.ItemManager#registerProperty(org.jajuk.base.PropertyMetaInformation)}
    * .
    */
-
   public final void testRegisterProperty() {
     // tested in testGetCustomProperties()
   }
@@ -353,30 +292,22 @@ public class TestItemManager extends JajukTestCase {
    * {@link org.jajuk.base.ItemManager#changeItem(org.jajuk.base.Item, java.lang.String, java.lang.Object, java.util.Set)}
    * .
    */
-
   public final void testChangeItem() throws Exception {
     ItemManager man = new LocalIM();
-
     Item item = new TestItem("5", "name5");
     man.registerItem(item);
-
     ItemManager.changeItem(item, Const.XML_ID, "6", null);
-
     // TODO: add more sophisticated testing here
   }
 
   /**
    * Test method for {@link org.jajuk.base.ItemManager#getElementCount()}.
    */
-
   public final void testGetElementCount() {
     ItemManager man = new LocalIM();
-
     assertEquals(0, man.getElementCount());
-
     Item item = new TestItem("5", "name5");
     man.registerItem(item);
-
     assertEquals(1, man.getElementCount());
   }
 
@@ -385,81 +316,35 @@ public class TestItemManager extends JajukTestCase {
    *
    * {@link org.jajuk.base.ItemManager#getItemByID(java.lang.String)}.
    */
-
   public final void testGetItemByID() {
     ItemManager man = new LocalIM();
-
     Item item = new TestItem("5", "name5");
     man.registerItem(item);
-
     assertNotNull(man.getItemByID("5"));
-
     assertNull(man.getItemByID("6"));
   }
 
   /**
    * Test method for {@link org.jajuk.base.ItemManager#getItems()}.
    */
-
   public final void testGetItems() {
     ItemManager man = new LocalIM();
-
     Item item = new TestItem("7", "name7");
     man.registerItem(item);
     item = new TestItem("8", "name8");
     man.registerItem(item);
-
     assertEquals(man.getItems().toString(), 2, man.getItems().size());
   }
 
   /**
-   * Test method for.
-   *
-   * {@link org.jajuk.base.ItemManager#getFilteredItems(org.apache.commons.collections.Predicate)}
-   * .
-   */
-
-  public final void testGetFilteredItems() {
-    ItemManager man = new LocalIM();
-
-    Item item = new TestItem("7", "name7");
-    man.registerItem(item);
-    item = new TestItem("8", "name8");
-    man.registerItem(item);
-
-    // first find all
-    List<? extends Item> list = man.getFilteredItems(new Predicate() {
-      @Override
-      public boolean evaluate(Object obj) {
-        return true;
-      }
-    });
-
-    assertEquals(list.toString(), 2, list.size());
-
-    // then none
-    list = man.getFilteredItems(new Predicate() {
-      @Override
-      public boolean evaluate(Object obj) {
-        return false;
-      }
-    });
-
-    assertEquals(list.toString(), 0, list.size());
-  }
-
-  /**
    * Test method for {@link org.jajuk.base.ItemManager#getItemsIterator()}.
    */
-
   public final void testGetItemsIterator() {
     ItemManager man = new LocalIM();
-
     Item item = new TestItem("9", "name9");
     man.registerItem(item);
     item = new TestItem("10", "name10");
     man.registerItem(item);
-
     Iterator<? extends Item> items = man.getItemsIterator();
     assertNotNull(items);
     assertTrue(items.hasNext());
@@ -468,45 +353,34 @@ public class TestItemManager extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.ItemManager#clear()}.
    */
-
   public final void testClear() {
     ItemManager man = new LocalIM();
-
     Item item = new TestItem("9", "name9");
     man.registerItem(item);
     item = new TestItem("10", "name10");
     man.registerItem(item);
-
     assertEquals(2, man.getElementCount());
-
     man.clear();
-
     assertEquals(0, man.getElementCount());
   }
 
   /**
    * Test method for {@link org.jajuk.base.ItemManager#forceSorting()}.
    */
-
   public final void testForceSorting() {
     ItemManager man = new LocalIM();
-
     Item item = new TestItem("9", "name9");
     man.registerItem(item);
     item = new TestItem("10", "name10");
     man.registerItem(item);
-
     // now the order is in there, first 9, then 10
     Iterator<? extends Item> it = man.getItemsIterator();
     assertEquals("9", it.next().getID());
     assertEquals("10", it.next().getID());
-
     assertEquals(2, man.getElementCount());
     man.forceSorting();
-
     // still the same size
     assertEquals(2, man.getElementCount());
-
     // the iterator should still return 9 before 10
     it = man.getItemsIterator();
     assertEquals("9", it.next().getID());
@@ -515,13 +389,12 @@ public class TestItemManager extends JajukTestCase {
 
   /**
    * Test sorting.
-   * DOCUMENT_ME
+   * 
    */
   public final void testSorting() {
     // first run without "ordered state"
     ItemManager man = new LocalIM();
     runSortingTest(man, true);
-
     // now use one with ordered state
     man = new LocalIM();
     man.switchToOrderState();
@@ -530,10 +403,10 @@ public class TestItemManager extends JajukTestCase {
 
   /**
    * Run sorting test.
-   * DOCUMENT_ME
+   * 
    *
-   * @param man DOCUMENT_ME
-   * @param notYetOrderedState DOCUMENT_ME
+   * @param man 
+   * @param notYetOrderedState 
    */
   private void runSortingTest(ItemManager man, boolean notYetOrderedState) {
     Item item = new TestItem("9", "name9");
@@ -551,7 +424,6 @@ public class TestItemManager extends JajukTestCase {
     man.registerItem(item);
     item = new TestItem("12", "name12");
     man.registerItem(item);
-
     // only ordered as long as we have not switched to ordered state
     if (notYetOrderedState) {
       // now the order is in there, first 9, then 10
@@ -564,7 +436,6 @@ public class TestItemManager extends JajukTestCase {
       assertEquals("7", it.next().getID());
       assertEquals("12", it.next().getID());
     }
-
     // in ordered state we do not add items multiple times
     if (notYetOrderedState) {
       assertEquals(7, man.getElementCount());
@@ -572,7 +443,6 @@ public class TestItemManager extends JajukTestCase {
       assertEquals(6, man.getElementCount());
     }
     man.forceSorting();
-
     // still the same size
     // in ordered state we do not add items multiple times
     if (notYetOrderedState) {
@@ -580,7 +450,6 @@ public class TestItemManager extends JajukTestCase {
     } else {
       assertEquals(6, man.getElementCount());
     }
-
     if (notYetOrderedState) {
       // the iterator should still return 9 before 10
       Iterator<? extends Item> it = man.getItemsIterator();
@@ -595,15 +464,14 @@ public class TestItemManager extends JajukTestCase {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private static class LocalIM extends ItemManager {
-    
     /* (non-Javadoc)
      * @see org.jajuk.base.ItemManager#getLabel()
      */
     @Override
-    public String getLabel() {
+    public String getXMLTag() {
       return "TestLabel";
     }
 
@@ -612,18 +480,15 @@ public class TestItemManager extends JajukTestCase {
      */
     public LocalIM() {
       super();
-
       registerProperty(new PropertyMetaInformation(Const.XML_ID, false, true, false, false, false,
           String.class, null));
-
     }
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private static class TestItem extends Item implements Comparable<Item> {
-    
     /* (non-Javadoc)
      * @see java.lang.Comparable#compareTo(java.lang.Object)
      */
@@ -635,8 +500,8 @@ public class TestItemManager extends JajukTestCase {
     /**
      * Instantiates a new test item.
      *
-     * @param id DOCUMENT_ME
-     * @param name DOCUMENT_ME
+     * @param id 
+     * @param name 
      */
     public TestItem(String id, String name) {
       super(id, name);
@@ -646,7 +511,7 @@ public class TestItemManager extends JajukTestCase {
      * @see org.jajuk.base.Item#getDesc()
      */
     @Override
-    public String getDesc() {
+    public String getTitle() {
       return "desc";
     }
 
@@ -664,9 +529,8 @@ public class TestItemManager extends JajukTestCase {
      * @return the label
      */
     @Override
-    String getLabel() {
+    public String getXMLTag() {
       return "Test";
     }
-
   }
 }
diff --git a/src/test/java/org/jajuk/base/TestPlaylist.java b/src/test/java/org/jajuk/base/TestPlaylist.java
index d6f9d55..7398915 100644
--- a/src/test/java/org/jajuk/base/TestPlaylist.java
+++ b/src/test/java/org/jajuk/base/TestPlaylist.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,19 +16,24 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
+import com.google.common.io.Files;
+
 import java.awt.HeadlessException;
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
 import org.jajuk.ConstTest;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.MockPlayer;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.bookmark.Bookmarks;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
@@ -39,27 +44,24 @@ import org.jajuk.util.error.JajukException;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestPlaylist extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.base.Playlist#hashCode()}.
    */
   public final void testHashCode() {
     Playlist play = new Playlist("1", "name", null);
     Playlist equ = new Playlist("1", "name", null);
-
-    JUnitHelpers.HashCodeTest(play, equ);
+    TestHelpers.HashCodeTest(play, equ);
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Playlist#getDesc()}.
+   * Test method for {@link org.jajuk.base.Playlist#getTitle()}.
    */
   public final void testGetDesc() {
     Playlist play = new Playlist("1", "name", null);
-    assertFalse(StringUtils.isBlank(play.getDesc()));
-
+    assertFalse(StringUtils.isBlank(play.getTitle()));
   }
 
   /**
@@ -68,23 +70,21 @@ public class TestPlaylist extends JajukTestCase {
   public final void testEqualsObject() {
     Playlist play = new Playlist(Playlist.Type.NORMAL, "1", "name", null);
     Playlist equ = new Playlist(Playlist.Type.NORMAL, "1", "name", null);
-
     // equals looks at id and type
     Playlist nonequ1 = new Playlist(Playlist.Type.NORMAL, "2", "name", null);
     Playlist nonequ2 = new Playlist(Playlist.Type.NORMAL, "2", "name2", null);
-    Playlist nonequ3 = new Playlist(Playlist.Type.NORMAL, "2", "name3", JUnitHelpers.getDirectory());
-
-    JUnitHelpers.EqualsTest(play, equ, nonequ1);
-    JUnitHelpers.EqualsTest(play, equ, nonequ2);
-    JUnitHelpers.EqualsTest(play, equ, nonequ3);
+    Playlist nonequ3 = new Playlist(Playlist.Type.NORMAL, "2", "name3", TestHelpers.getDirectory());
+    TestHelpers.EqualsTest(play, equ, nonequ1);
+    TestHelpers.EqualsTest(play, equ, nonequ2);
+    TestHelpers.EqualsTest(play, equ, nonequ3);
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Playlist#getLabel()}.
+   * Test method for {@link org.jajuk.base.Playlist#getXMLTag()}.
    */
   public final void testGetLabel() {
     Playlist play = new Playlist("1", "name", null);
-    assertTrue(StringUtils.isNotBlank(play.getLabel()));
+    assertTrue(StringUtils.isNotBlank(play.getXMLTag()));
   }
 
   /**
@@ -94,73 +94,20 @@ public class TestPlaylist extends JajukTestCase {
    * {@link org.jajuk.base.Playlist#getHumanValue(java.lang.String)}.
    */
   public final void testGetHumanValue() throws Exception {
-    Playlist play = createPlaylist();
-
-    DirectoryManager.getInstance().registerDirectory(play.getDirectory().getDevice());
-
-    // this is what we read here...
-    play.setProperty(Const.XML_DIRECTORY, play.getDirectory().getDevice().getID());
-
-    String str1 = ConstTest.PATH_DEVICE;
-    String str2 = play.getHumanValue(Const.XML_DIRECTORY);
-    str1 = StringUtils.stripEnd(str1, java.io.File.separator);
-    str2 = StringUtils.stripEnd(str2, java.io.File.separator);
-    assertEquals(str1, str2);
-
+    Playlist play = TestHelpers.getPlaylist();
     assertEquals("", play.getHumanValue("notexist"));
-
     // define property
     StartupCollectionService.registerItemManagers();
     ItemManager.getItemManager(Playlist.class).registerProperty(
         new PropertyMetaInformation("testkey", true, true, true, true, true, String.class,
             "defaultval"));
-
     play.setProperty("testkey", "testval");
-
     assertEquals("testval", play.getHumanValue("testkey"));
-
     play.removeProperty("testkey");
-
     assertEquals("defaultval", play.getHumanValue("testkey"));
   }
 
   /**
-   * Creates the playlist.
-   * DOCUMENT_ME
-   *
-   * @return the playlist
-   * @throws Exception the exception
-   */
-  private Playlist createPlaylist() throws Exception {
-    Device device = JUnitHelpers.getDevice();
-    Directory topdir = JUnitHelpers.getDirectory();
-    try {
-      topdir.getDevice().mount(true);
-    } catch (Exception e) {
-      Log.error(e);
-    }
-    Directory dir = JUnitHelpers.getDirectory("testdir", topdir, device);
-    // cleanup
-    dir.getFio().delete();
-    dir.getFio().mkdirs();
-
-    java.io.File fioPlaylist = new java.io.File(dir.getAbsolutePath() + "/playlist.m3u");
-    Playlist play = PlaylistManager.getInstance().registerPlaylistFile(fioPlaylist, dir);
-
-    List<org.jajuk.base.File> list = new ArrayList<org.jajuk.base.File>();
-    list.add(JUnitHelpers.getFile("file1", false));
-    list.add(JUnitHelpers.getFile("file1", false));
-
-    play.setFiles(list);
-    try {
-      play.commit();
-    } catch (JajukException e) {
-      Log.error(e);
-    }
-    return play;
-  }
-
-  /**
    * Test method for {@link org.jajuk.base.Playlist#getIconRepresentation()}.
    */
   public final void testGetIconRepresentation() {
@@ -174,41 +121,34 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetRate() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
     assertEquals(0, play.getRate());
-
-    File file = JUnitHelpers.getFile("file1", false);
+    File file = TestHelpers.getFile("file1", false);
     file.getTrack().setRate(2);
     play.addFile(file);
-
     // we use 2 above
     assertEquals(2, play.getRate());
-
     // multiple files round the rate
-    file = JUnitHelpers.getFile("file2", false);
+    file = TestHelpers.getFile("file2", false);
     file.getTrack().setRate(4);
     play.addFile(file);
     assertEquals(3, play.getRate());
-
-    play.addFile(JUnitHelpers.getFile("file3", false));
+    play.addFile(TestHelpers.getFile("file3", false));
     play.getFiles().get(2).getTrack().setRate(3);
-
     assertEquals(3, play.getRate());
   }
 
   /**
    * Test get rate null.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetRateNull() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.setFiles(null);
-
     assertEquals(0, play.getRate());
   }
 
@@ -239,53 +179,52 @@ public class TestPlaylist extends JajukTestCase {
    * {@link org.jajuk.base.Playlist#addFile(org.jajuk.base.File)}.
    */
   public final void testAddFileFile() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
-    play.addFile(JUnitHelpers.getFile("file1", false));
+    play.addFile(TestHelpers.getFile("file1", false));
     assertEquals(1, play.getFiles().size());
   }
 
   /**
    * Test add file queue.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testAddFileQueue() throws Exception {
-    Playlist play = getPlaylistQueue();
-
-    File file = JUnitHelpers.getFile("file1", false);
-    file.getDirectory().getDevice().mount(true);
+    Playlist play = getVoidPlaylistQueue();
+    File file = TestHelpers.getFile("file1", false);
+    System.out.println("QueueBefore: " + QueueModel.getQueue());
+    assertEquals(0, QueueModel.getQueueSize());
+    System.out.println("PlannedBefore: " + QueueModel.getPlanned());
+    assertEquals(0, QueueModel.getPlanned().size());
     play.addFile(file);
-
     // wait a bit to let the "push" be done in a separate thread
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
     assertEquals(1, QueueModel.getQueueSize());
-
-    file = JUnitHelpers.getFile("file1", false);
+    assertNotNull(QueueModel.getQueue().get(0));
+    assertNotNull(QueueModel.getQueue().get(0).getFile());
+    /*assertNotNull(QueueModel.getQueue().get(0).getFile().getType());
+    assertEquals(MockPlayer.class, QueueModel.getQueue().get(0).getFile().getType().getClass());*/
+    file = TestHelpers.getFile("file1", false);
     play.addFile(1, file);
-
     // wait a bit to let the "push" be done in a separate thread
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
     assertEquals(2, QueueModel.getQueueSize());
     assertEquals(2, play.getFiles().size());
-
     // test with repeat as well to see if we get repeat set for the new track as
     // well
     QueueModel.getItem(0).setRepeat(true);
-
-    file = JUnitHelpers.getFile("file1", false);
+    file = TestHelpers.getFile("file1", false);
     play.addFile(1, file);
-
     // wait a bit to let the "push" be done in a separate thread
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals(3, play.getFiles().size());
+    Log.info("Tearing down testcase");
+    TestHelpers.waitForThreadToFinish("MPlayer reader thread");
+    TestHelpers.waitForThreadToFinish("MPlayer writer thread");
   }
 
   /**
@@ -303,25 +242,20 @@ public class TestPlaylist extends JajukTestCase {
    * {@link org.jajuk.base.Playlist#addFile(int, org.jajuk.base.File)}.
    */
   public final void testAddFileIntFile() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
-    play.addFile(JUnitHelpers.getFile("test.tst", false));
+    play.addFile(TestHelpers.getFile("test.tst", false));
     assertEquals(1, play.getFiles().size());
-
-    File file = JUnitHelpers.getFile("othername", false);
+    File file = TestHelpers.getFile("othername", false);
     file.setName("othername");
     play.addFile(1, file);
-
     // this should now be at pos 1
     assertEquals("test.tst", play.getFiles().get(0).getName());
     assertEquals("othername", play.getFiles().get(1).getName());
-
-    file = JUnitHelpers.getFile("file3", false);
+    file = TestHelpers.getFile("file3", false);
     file.setName("yetanother");
     play.addFile(1, file);
-
     assertEquals("test.tst", play.getFiles().get(0).getName());
     assertEquals("yetanother", play.getFiles().get(1).getName());
     assertEquals("othername", play.getFiles().get(2).getName());
@@ -333,23 +267,18 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testAddFiles() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
     List<File> files = new ArrayList<File>();
-
     // empty add does not do anything
     play.addFiles(files, 0);
-
     assertEquals(0, play.getFiles().size());
-
     // add some files
-    files.add(JUnitHelpers.getFile("file1", false));
-    files.add(JUnitHelpers.getFile("file1", false));
-    files.add(JUnitHelpers.getFile("file1", false));
-    files.add(JUnitHelpers.getFile("file1", false));
-
+    files.add(TestHelpers.getFile("file1", false));
+    files.add(TestHelpers.getFile("file1", false));
+    files.add(TestHelpers.getFile("file1", false));
+    files.add(TestHelpers.getFile("file1", false));
     assertEquals(0, play.getFiles().size());
     play.addFiles(files, 0);
     assertEquals(4, play.getFiles().size());
@@ -361,17 +290,14 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testClear() throws Exception {
-    Playlist play = createPlaylist();
-
+    Playlist play = TestHelpers.getPlaylist();
     // nothing happens without content
     play.clear();
-
-    play.addFile(JUnitHelpers.getFile("file1", false));
-    play.addFile(JUnitHelpers.getFile("file1", false));
-    play.addFile(JUnitHelpers.getFile("file1", false));
-    play.addFile(JUnitHelpers.getFile("file1", false));
+    play.addFile(TestHelpers.getFile("file1", false));
+    play.addFile(TestHelpers.getFile("file1", false));
+    play.addFile(TestHelpers.getFile("file1", false));
+    play.addFile(TestHelpers.getFile("file1", false));
     assertEquals(4, play.getFiles().size());
-
     // now clear clears out the class
     play.clear();
     assertEquals(0, play.getFiles().size());
@@ -379,21 +305,21 @@ public class TestPlaylist extends JajukTestCase {
 
   /**
    * Test clear empty list.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testClearEmptyList() throws Exception {
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     device.mount(true);
-    Playlist play = new Playlist(Playlist.Type.NORMAL, "1", "playlist.m3u", JUnitHelpers
-        .getDirectory());
+    Playlist play = new Playlist(Playlist.Type.NORMAL, "1", "playlist.m3u",
+        TestHelpers.getDirectory());
     play.clear();
   }
 
   /**
    * Test clear queue.
-   * DOCUMENT_ME
+   * 
    */
   public final void testClearQueue() {
     Playlist play = getPlaylistQueue();
@@ -402,7 +328,7 @@ public class TestPlaylist extends JajukTestCase {
 
   /**
    * Test clear bookmark.
-   * DOCUMENT_ME
+   * 
    */
   public final void testClearBookmark() {
     Playlist play = getPlaylistBookmark();
@@ -415,7 +341,7 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testCommit() throws Exception {
-    Playlist playlist = createPlaylist();
+    Playlist playlist = TestHelpers.getPlaylist();
     playlist.commit();
   }
 
@@ -426,23 +352,19 @@ public class TestPlaylist extends JajukTestCase {
    */
   public final void testCompareTo() {
     Playlist play = new Playlist("1", "name", null);
-
     Playlist equ = new Playlist("1", "name", null);
     Playlist equ2 = new Playlist("4", "name", null); // different id still
     // compares as we just look
     // at name and directory...
-
     Playlist nonequ1 = new Playlist("2", "name3", null);
     Playlist nonequ2 = new Playlist("5", "name2", null);
-    Playlist nonequ3 = new Playlist("2", "name", JUnitHelpers.getDirectory());
-
-    JUnitHelpers.CompareToTest(play, equ, nonequ1);
-    JUnitHelpers.CompareToTest(play, equ, nonequ2);
-    JUnitHelpers.CompareToTest(play, equ, nonequ3);
-
-    JUnitHelpers.CompareToTest(play, equ2, nonequ1);
-    JUnitHelpers.CompareToTest(play, equ2, nonequ2);
-    JUnitHelpers.CompareToTest(play, equ2, nonequ3);
+    Playlist nonequ3 = new Playlist("2", "name", TestHelpers.getDirectory());
+    TestHelpers.CompareToTest(play, equ, nonequ1);
+    TestHelpers.CompareToTest(play, equ, nonequ2);
+    TestHelpers.CompareToTest(play, equ, nonequ3);
+    TestHelpers.CompareToTest(play, equ2, nonequ1);
+    TestHelpers.CompareToTest(play, equ2, nonequ2);
+    TestHelpers.CompareToTest(play, equ2, nonequ3);
   }
 
   /**
@@ -450,10 +372,8 @@ public class TestPlaylist extends JajukTestCase {
    */
   public final void testContainsExtFiles() {
     Playlist play = new Playlist("1", "name", null);
-
     // false usually
     assertFalse(play.containsExtFiles());
-
     // TODO: add test that loads a playlist with unavailable files so that this
     // is set to true...
   }
@@ -464,46 +384,37 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testDown() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
-    File file = JUnitHelpers.getFile("file1", false);
+    File file = TestHelpers.getFile("file1", false);
     file.setName("name1");
     play.addFile(file);
-
-    file = JUnitHelpers.getFile("file2", false);
+    file = TestHelpers.getFile("file2", false);
     file.setName("name2");
     play.addFile(file);
-
-    file = JUnitHelpers.getFile("file3", false);
+    file = TestHelpers.getFile("file3", false);
     file.setName("name3");
     play.addFile(file);
-
-    file = JUnitHelpers.getFile("file4", false);
+    file = TestHelpers.getFile("file4", false);
     file.setName("name4");
     play.addFile(file);
-
     assertEquals(4, play.getFiles().size());
-
     play.down(0);
     assertEquals("name2", play.getFiles().get(0).getName());
     assertEquals("name1", play.getFiles().get(1).getName());
     assertEquals("name3", play.getFiles().get(2).getName());
     assertEquals("name4", play.getFiles().get(3).getName());
-
     play.down(2);
     assertEquals("name2", play.getFiles().get(0).getName());
     assertEquals("name1", play.getFiles().get(1).getName());
     assertEquals("name4", play.getFiles().get(2).getName());
     assertEquals("name3", play.getFiles().get(3).getName());
-
     play.up(1);
     assertEquals("name1", play.getFiles().get(0).getName());
     assertEquals("name2", play.getFiles().get(1).getName());
     assertEquals("name4", play.getFiles().get(2).getName());
     assertEquals("name3", play.getFiles().get(3).getName());
-
     play.up(3);
     assertEquals("name1", play.getFiles().get(0).getName());
     assertEquals("name2", play.getFiles().get(1).getName());
@@ -512,8 +423,15 @@ public class TestPlaylist extends JajukTestCase {
   }
 
   /**
+   * Test method for {@link org.jajuk.base.Playlist#up(int)}.
+   */
+  public final void testUp() {
+    // tested as part of testDown()
+  }
+
+  /**
    * Test down bookmark.
-   * DOCUMENT_ME
+   * 
    */
   public final void testDownBookmark() {
     Playlist play = getPlaylistBookmark();
@@ -532,12 +450,23 @@ public class TestPlaylist extends JajukTestCase {
 
   /**
    * Test down queue.
-   * DOCUMENT_ME
+   * @throws JajukException 
+   * 
    */
-  public final void testDownQueue() {
+  public final void testDownQueue() throws JajukException {
+    // 1 track
     Playlist play = getPlaylistQueue();
-    play.down(-1);
-    play.up(0);
+    // We add a second track
+    TestHelpers.push(new StackItem(TestHelpers.getFile("2.mp3", false)), true, false);
+    StackItem st1 = QueueModel.getItem(0);
+    StackItem st2 = QueueModel.getItem(1);
+    assertEquals(st2.getFile().getName(), "2.mp3");
+    play.down(0);
+    assertEquals(st1, QueueModel.getItem(1));
+    assertEquals(st2, QueueModel.getItem(0));
+    play.up(1);
+    assertEquals(st1, QueueModel.getItem(0));
+    assertEquals(st2, QueueModel.getItem(1));
   }
 
   /**
@@ -546,9 +475,20 @@ public class TestPlaylist extends JajukTestCase {
    * @return the playlist queue
    */
   private Playlist getPlaylistQueue() {
-    // make sure the Queue is empty before creating a playlist on it
-    QueueModel.clear();
+    try {
+      TestHelpers.push(new StackItem(TestHelpers.getFile()), true, false);
+    } catch (JajukException e) {
+      Log.error(e);
+    }
+    return new Playlist(Playlist.Type.QUEUE, "1", "name", null);
+  }
 
+  /**
+   * Gets a void playlist queue.
+   *
+   * @return a void playlist queue
+   */
+  private Playlist getVoidPlaylistQueue() {
     return new Playlist(Playlist.Type.QUEUE, "1", "name", null);
   }
 
@@ -559,8 +499,8 @@ public class TestPlaylist extends JajukTestCase {
    */
   public final void testForceRefresh() throws Exception {
     // make sure we have a playlist stored before
-    Playlist play = createPlaylist();
-    play.forceRefresh();
+    Playlist play = TestHelpers.getPlaylist();
+    play.load();
   }
 
   /**
@@ -569,24 +509,23 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetAbsolutePath() throws Exception {
-    Playlist play = createPlaylist();
-    assertEquals(ConstTest.PATH_DEVICE + java.io.File.separator + "dir" + java.io.File.separator
-        + "testdir" + java.io.File.separator + "playlist.m3u", play.getAbsolutePath());
-
+    Playlist play = TestHelpers.getPlaylist();
+    assertEquals(ConstTest.DEVICES_BASE_PATH + "/sample_device/dir/sample_playlist.m3u",
+        play.getAbsolutePath());
     // call it a second time to use the cached version
-    assertEquals(ConstTest.PATH_DEVICE + java.io.File.separator + "dir" + java.io.File.separator
-        + "testdir" + java.io.File.separator + "playlist.m3u", play.getAbsolutePath());
+    assertEquals(ConstTest.DEVICES_BASE_PATH + "/sample_device/dir/sample_playlist.m3u",
+        play.getAbsolutePath());
   }
 
   /**
    * Test get absolute path not normal.
-   * DOCUMENT_ME
+   * 
+   * @throws IOException 
    */
-  public final void testGetAbsolutePathNotNormal() {
+  public final void testGetAbsolutePathNotNormal() throws IOException {
     Playlist play = new Playlist(Playlist.Type.BESTOF, "1", "name", null);
     assertTrue(StringUtils.isBlank(play.getAbsolutePath()));
-
-    play.setFIO(new java.io.File("testfile"));
+    play.setFIO(TestHelpers.getFile().getFIO());
     assertTrue(StringUtils.isNotBlank(play.getAbsolutePath()));
   }
 
@@ -596,8 +535,7 @@ public class TestPlaylist extends JajukTestCase {
   public final void testGetDirectory() {
     Playlist play = new Playlist("1", "name", null);
     assertNull(play.getDirectory());
-
-    play = new Playlist(Playlist.Type.NORMAL, "1", "playlist.m3u", JUnitHelpers.getDirectory());
+    play = new Playlist(Playlist.Type.NORMAL, "1", "playlist.m3u", TestHelpers.getDirectory());
     assertNotNull(play.getDirectory());
   }
 
@@ -607,67 +545,61 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetFiles() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
     assertEquals(0, play.getFiles().size());
-
-    play.addFile(JUnitHelpers.getFile("file1", false));
+    play.addFile(TestHelpers.getFile("file1", false));
     assertEquals(1, play.getFiles().size());
   }
 
   /**
    * Test get files null.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetFilesNull() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.setFiles(null); // null as list!
     assertEquals(2, play.getFiles().size());
   }
 
   /**
    * Test get files novelities.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetFilesNovelities() throws Exception {
-    Device device = JUnitHelpers.getDevice();
-    Directory dir = JUnitHelpers.getDirectory();
+    Device device = TestHelpers.getDevice();
+    Directory dir = TestHelpers.getDirectory();
     device.mount(true);
-
     Playlist play = new SmartPlaylist(Playlist.Type.NOVELTIES, "1", "playlist.m3u", dir);
-
     assertNotNull(play.getFiles());
   }
 
   /**
    * Test get files best of.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetFilesBestOf() throws Exception {
-    Playlist play = new SmartPlaylist(Playlist.Type.BESTOF, "1", "playlist.m3u", JUnitHelpers
-        .getDirectory());
-
+    Playlist play = new SmartPlaylist(Playlist.Type.BESTOF, "1", "playlist.m3u",
+        TestHelpers.getDirectory());
     assertNotNull(play.getFiles());
   }
 
   /**
    * Test get files new.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetFilesNew() throws Exception {
-    Playlist play = new SmartPlaylist(Playlist.Type.NEW, "1", "playlist.m3u", JUnitHelpers
-        .getDirectory());
-
+    Playlist play = new SmartPlaylist(Playlist.Type.NEW, "1", "playlist.m3u",
+        TestHelpers.getDirectory());
     assertNotNull(play.getFiles());
     assertEquals(0, play.getFiles().size());
   }
@@ -678,12 +610,9 @@ public class TestPlaylist extends JajukTestCase {
   public final void testGetAndSetFIO() {
     Playlist play = new SmartPlaylist(Playlist.Type.BESTOF, "1", "name", null);
     assertNotNull(play.getFIO());
-
     play.setFIO(null);
     assertNotNull(play.getFIO()); // recreated...
-
-    play.setFIO(new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
-        + "testfio"));
+    play.setFIO(new java.io.File(ConstTest.TEMP_PATH + java.io.File.separator + "testfio"));
     assertNotNull(play.getFIO());
   }
 
@@ -693,13 +622,10 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testIsReady() throws Exception {
-    Playlist play = createPlaylist();
-
+    Playlist play = TestHelpers.getPlaylist();
     // mounted initially
     assertTrue(play.isReady());
-
     play.getDirectory().getDevice().unmount();
-
     assertFalse(play.isReady());
   }
 
@@ -711,25 +637,20 @@ public class TestPlaylist extends JajukTestCase {
   public final void testLoad() throws Exception {
     // first commit a playlist
     {
-      Playlist play = createPlaylist();
-
-      play.addFile(JUnitHelpers.getFile("file1", false));
-      new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator + "testdir")
-          .mkdir();
-
-      play.setFIO(new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
+      Playlist play = TestHelpers.getPlaylist();
+      play.addFile(TestHelpers.getFile("file1", false));
+      new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator + "testdir")
+          .mkdirs();
+      play.setFIO(new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator
           + "testdir" + java.io.File.separator + "playlist.m3u"));
-
       play.commit();
     }
-
-    Playlist play = createPlaylist();
-    List<File> list = play.load();
+    Playlist play = TestHelpers.getPlaylist();
+    play.load();
+    List<File> list = play.getFiles();
     assertNotNull(list);
-
-    assertEquals(2, list.size());
-
-    assertEquals("file1", list.get(0).getName());
+    assertEquals(3, list.size());
+    assertEquals("1", list.get(0).getName());
   }
 
   /**
@@ -738,26 +659,22 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testPlay() throws Exception {
-    Playlist play = createPlaylist();
-
+    Playlist play = TestHelpers.getPlaylist();
     // some error without files
     play.play();
-
-    play.addFile(JUnitHelpers.getFile("file1", false));
-
+    play.addFile(TestHelpers.getFile("file1", false));
     // try again with files
     play.play();
   }
 
   /**
    * Test play null.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testPlayNull() throws Exception {
-    Playlist play = createPlaylist();
-
+    Playlist play = TestHelpers.getPlaylist();
     // some error without files
     play.setFiles(null);
     try {
@@ -779,29 +696,29 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testRemove() throws Exception {
-    Playlist play = createPlaylist();
-    play.addFile(JUnitHelpers.getFile("file1", false));
+    Playlist play = TestHelpers.getPlaylist();
+    play.addFile(TestHelpers.getFile("file1", false));
     play.remove(0);
   }
 
   /**
    * Test remove bookmark.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testRemoveBookmark() throws Exception {
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", false));
-
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", false));
     Playlist play = getPlaylistBookmark();
     play.remove(0);
   }
 
   /**
    * Test remove queue.
-   * DOCUMENT_ME
+   * 
+   * @throws JajukException 
    */
-  public final void testRemoveQueue() {
+  public final void testRemoveQueue() throws JajukException {
     Playlist play = getPlaylistQueue();
     play.remove(0);
   }
@@ -814,67 +731,60 @@ public class TestPlaylist extends JajukTestCase {
    * .
    */
   public final void testReplaceFile() throws Exception {
-    Playlist play = createPlaylist();
-
-    play.addFile(JUnitHelpers.getFile("file1", false));
-
-    File file = JUnitHelpers.getFile("file1", false);
-
-    play.setFIO(new java.io.File(System.getProperty("java.io.tmpdir") + java.io.File.separator
+    Playlist play = TestHelpers.getPlaylist();
+    play.addFile(TestHelpers.getFile("file1", false));
+    File file = TestHelpers.getFile("file1", false);
+    play.setFIO(new java.io.File(TestHelpers.getDevice().getUrl() + java.io.File.separator
         + "testdir" + java.io.File.separator + "playlist.m3u"));
-
     play.replaceFile(play.getFiles().get(0), file);
   }
 
   /**
    * Test replace file bookmark.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testReplaceFileBookmark() throws Exception {
     Playlist play = getPlaylistBookmark();
-
-    play.addFile(JUnitHelpers.getFile("file1", false));
-
+    play.addFile(TestHelpers.getFile("file1", false));
     // wait for the thread to finish before doing this
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
-    play.replaceFile(play.getFiles().get(0), JUnitHelpers.getFile("file1", false));
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
+    play.replaceFile(play.getFiles().get(0), TestHelpers.getFile("file1", false));
   }
 
   /**
    * Test replace file queue.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testReplaceFileQueue() throws Exception {
     // make sure Queue is empty
     QueueModel.clear();
-
-    Playlist play = getPlaylistQueue();
-
+    Playlist play = getVoidPlaylistQueue();
     // for type Queue, we need to push to the Queue
-    File file = JUnitHelpers.getFile("file1", false);
-    file.getDirectory().getDevice().mount(true);
+    File file = TestHelpers.getFile("file1", false);
     QueueModel.insert(new StackItem(file), 0);
-
     assertEquals(1, play.getFiles().size());
     assertNotNull(play.getFiles().get(0));
-
-    play.replaceFile(play.getFiles().get(0), JUnitHelpers.getFile("file1", false));
+    play.replaceFile(play.getFiles().get(0), TestHelpers.getFile("file1", false));
   }
 
   /**
    * Test method for {@link org.jajuk.base.Playlist#reset()}.
+   *
+   * @throws SecurityException the security exception
+   * @throws IllegalArgumentException the illegal argument exception
+   * @throws NoSuchFieldException the no such field exception
+   * @throws IllegalAccessException the illegal access exception
    */
-  public final void testReset() {
+  public final void testReset() throws SecurityException, IllegalArgumentException,
+      NoSuchFieldException, IllegalAccessException {
     Playlist play = new Playlist("1", "name", null);
-
-    Directory dir = JUnitHelpers.getDirectory();
-    play.setParentDirectory(dir);
-
+    Directory dir = TestHelpers.getDirectory();
+    TestHelpers.setAttribute(play, "dParentDirectory", dir);
+    dir.setProperty(Const.XML_DIRECTORY, dir == null ? "-1" : dir.getID());
     play.setFIO(new java.io.File("testfile"));
     play.reset();
     assertNotNull(play.getFIO()); // recreated again...
@@ -886,8 +796,7 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testSaveAs() throws Exception {
-    Playlist play = createPlaylist();
-
+    Playlist play = TestHelpers.getPlaylist();
     try {
       play.saveAs();
     } catch (InvocationTargetException e) {
@@ -899,21 +808,17 @@ public class TestPlaylist extends JajukTestCase {
 
   /**
    * Test save as best of.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testSaveAsBestOf() throws Exception {
-    Directory dir = JUnitHelpers.getDirectory();
-
+    Directory dir = TestHelpers.getDirectory();
     Playlist play = new Playlist(Playlist.Type.BESTOF, "1", "playlist.m3u", dir);
-
     List<File> list = new ArrayList<File>();
-    list.add(JUnitHelpers.getFile("file1", false));
-    list.add(JUnitHelpers.getFile("file1", false));
-
+    list.add(TestHelpers.getFile("file1", false));
+    list.add(TestHelpers.getFile("file1", false));
     play.setFiles(list);
-
     try {
       play.saveAs();
     } catch (InvocationTargetException e) {
@@ -925,13 +830,12 @@ public class TestPlaylist extends JajukTestCase {
 
   /**
    * Test save as bookmark.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testSaveAsBookmark() throws Exception {
     Playlist play = getPlaylistBookmark();
-
     try {
       play.saveAs();
     } catch (InvocationTargetException e) {
@@ -943,21 +847,17 @@ public class TestPlaylist extends JajukTestCase {
 
   /**
    * Test save as novelities.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testSaveAsNovelities() throws Exception {
-    Directory dir = JUnitHelpers.getDirectory();
-
+    Directory dir = TestHelpers.getDirectory();
     Playlist play = new Playlist(Playlist.Type.NOVELTIES, "1", "playlist.m3u", dir);
-
     List<File> list = new ArrayList<File>();
-    list.add(JUnitHelpers.getFile("file1", false));
-    list.add(JUnitHelpers.getFile("file1", false));
-
+    list.add(TestHelpers.getFile("file1", false));
+    list.add(TestHelpers.getFile("file1", false));
     play.setFiles(list);
-
     try {
       play.saveAs();
     } catch (InvocationTargetException e) {
@@ -969,13 +869,12 @@ public class TestPlaylist extends JajukTestCase {
 
   /**
    * Test save as queue.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testSaveAsQueue() throws Exception {
     Playlist play = getPlaylistQueue();
-
     try {
       play.saveAs();
     } catch (InvocationTargetException e) {
@@ -991,13 +890,10 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testSetFiles() throws Exception {
-    Playlist play = createPlaylist();
-
+    Playlist play = TestHelpers.getPlaylist();
     List<File> list = new ArrayList<File>();
-    list.add(JUnitHelpers.getFile("file1", false));
-
+    list.add(TestHelpers.getFile("file1", false));
     play.setFiles(list);
-
     assertEquals(1, play.getFiles().size());
   }
 
@@ -1009,52 +905,23 @@ public class TestPlaylist extends JajukTestCase {
   }
 
   /**
-   * Test method for.
-   *
-   * {@link org.jajuk.base.Playlist#setParentDirectory(org.jajuk.base.Directory)}
-   * .
-   */
-  public final void testSetParentDirectory() {
-    Playlist play = new Playlist("1", "name", null);
-    assertNull(play.getDirectory());
-
-    Directory dir = JUnitHelpers.getDirectory();
-
-    play.setParentDirectory(dir);
-
-    assertNotNull(play.getDirectory());
-
-    // also try setting it to null
-    play.setParentDirectory(null);
-    assertNull(play.getDirectory());
-  }
-
-  /**
    * Test method for {@link org.jajuk.base.Playlist#shouldBeHidden()}.
    *
    * @throws Exception the exception
    */
   public final void testShouldBeHidden() throws Exception {
-
-    Directory dir = JUnitHelpers.getDirectory();
-
+    Directory dir = TestHelpers.getDirectory();
     Playlist play = new Playlist("1", "name", dir);
-
     // related configuration
     Conf.setProperty(Const.CONF_OPTIONS_HIDE_UNMOUNTED, "false");
-
     // always false as long as conf is set to "false"
     assertFalse(play.shouldBeHidden());
-
     // related configuration
     Conf.setProperty(Const.CONF_OPTIONS_HIDE_UNMOUNTED, "true");
-
     // now "true" because device is not mounted
     assertTrue(play.shouldBeHidden());
-
     // now mount the device
     dir.getDevice().mount(true);
-
     // now "false" again, as we have the device mounted
     assertFalse(play.shouldBeHidden());
   }
@@ -1064,22 +931,12 @@ public class TestPlaylist extends JajukTestCase {
    */
   public final void testToString() {
     Playlist play = new Playlist("1", "name", null);
-
     // first test without directory
-    JUnitHelpers.ToStringTest(play);
-
-    Directory dir = JUnitHelpers.getDirectory();
-
+    TestHelpers.ToStringTest(play);
+    Directory dir = TestHelpers.getDirectory();
     // then with a directory
     play = new Playlist("1", "name", dir);
-    JUnitHelpers.ToStringTest(play);
-  }
-
-  /**
-   * Test method for {@link org.jajuk.base.Playlist#up(int)}.
-   */
-  public final void testUp() {
-    // tested as part of testDown()
+    TestHelpers.ToStringTest(play);
   }
 
   /**
@@ -1089,45 +946,36 @@ public class TestPlaylist extends JajukTestCase {
    */
   public final void testGetHits() throws Exception {
     FileManager.getInstance().clear();
-
-    Playlist play = createPlaylist();
-
+    Playlist play = TestHelpers.getPlaylist();
     // first without files
     assertEquals(0, play.getHits());
-
     // then with some files
-    play.addFile(JUnitHelpers.getFile("file11", false));
-
+    play.addFile(TestHelpers.getFile("file11", false));
     // still zero as file has no hits set
     assertEquals(0, play.getHits());
-
     // now add a file with hit-count set
-    File file = JUnitHelpers.getFile("file12", false);
+    File file = TestHelpers.getFile("file12", false);
     file.getTrack().setHits(3);
     play.addFile(file);
-
     // now hits are set
     assertEquals(3, play.getHits());
-
     // add another file with different hit-count
-    file = JUnitHelpers.getFile("file14", false);
+    file = TestHelpers.getFile("file14", false);
     file.getTrack().setHits(11);
     play.addFile(file);
-
     // now hits accumulate
     assertEquals(14, play.getHits());
   }
 
   /**
    * Test get hits null.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetHitsNull() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.setFiles(null);
-
     // first without files
     assertEquals(0, play.getHits());
   }
@@ -1138,36 +986,30 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetDuration() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
     // at first no duration at all
     assertEquals(0, play.getDuration());
-
     // when we add tracks, duration accumulates
-    play.addFile(JUnitHelpers.getFile("file1", false));
-
+    play.addFile(TestHelpers.getFile("file1", false));
     // we use 120 seconds as length in "JUnitHelpers.getFile("file1", false)"
     assertEquals(120, play.getDuration());
-
     // another file
-    play.addFile(JUnitHelpers.getFile("file1", false));
-
+    play.addFile(TestHelpers.getFile("file1", false));
     // sums up two times 120
     assertEquals(240, play.getDuration());
   }
 
   /**
    * Test get duration null.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetDurationNull() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.setFiles(null);
-
     // at first no duration at all
     assertEquals(0, play.getDuration());
   }
@@ -1178,31 +1020,52 @@ public class TestPlaylist extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetNbOfTracks() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.remove(0);
     play.remove(0);
-
     assertEquals(0, play.getNbOfTracks());
-
-    play.addFile(JUnitHelpers.getFile("file1", false));
+    play.addFile(TestHelpers.getFile("file1", false));
     assertEquals(1, play.getNbOfTracks());
-
     // another file
-    play.addFile(JUnitHelpers.getFile("file1", false));
-
+    play.addFile(TestHelpers.getFile("file1", false));
     assertEquals(2, play.getNbOfTracks());
   }
 
   /**
    * Test get nb of tracks null.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testGetNbOfTracksNull() throws Exception {
-    Playlist play = createPlaylist();
+    Playlist play = TestHelpers.getPlaylist();
     play.setFiles(null);
-
     assertEquals(0, play.getNbOfTracks());
   }
+
+  /**
+  * Test relative path files
+  *
+  * @throws Exception the exception
+  */
+  public final void testRelativePath() throws Exception {
+    Playlist play = TestHelpers.getVoidPlaylist();
+    Directory dirPlaylist = play.getDirectory();
+    Directory subDir = TestHelpers.getDirectory("dir1", play.getDirectory(), play.getDirectory()
+        .getDevice());
+    Directory upDir = dirPlaylist.getParentDirectory();
+    //create a two files in the same directory than the playlist
+    TestHelpers.getFile("file1", dirPlaylist, true, MockPlayer.class);
+    TestHelpers.getFile("file11", dirPlaylist, true, MockPlayer.class);
+    // then another in the sub directory
+    TestHelpers.getFile("file2", subDir, true, MockPlayer.class);
+    // and a third in the playlist parent directory
+    TestHelpers.getFile("file3", upDir, true, MockPlayer.class);
+    // Now, don't add the files using setFiles but create the playlist content instead 
+    // and  load it. This way, we can write relative paths like ../dir
+    String content = "file1\n" + "./file11\n" + "dir1/file2\n" + "../file3";
+    Files.write(content, play.getFIO(), Charset.defaultCharset());
+    play.load();
+    assertEquals(4, play.getNbOfTracks());
+  }
 }
diff --git a/src/test/java/org/jajuk/base/TestSearchResult.java b/src/test/java/org/jajuk/base/TestSearchResult.java
index 8503a04..770173a 100644
--- a/src/test/java/org/jajuk/base/TestSearchResult.java
+++ b/src/test/java/org/jajuk/base/TestSearchResult.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,21 +16,18 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
-import junit.framework.TestCase;
-
-import org.jajuk.JUnitHelpers;
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.SearchResult.SearchResultType;
-import org.jajuk.services.webradio.WebRadio;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestSearchResult extends TestCase {
-
+public class TestSearchResult extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.base.SearchResult#hashCode()}.
    *
@@ -38,15 +35,11 @@ public class TestSearchResult extends TestCase {
    */
   public void testHashCode() throws Exception {
     // TODO: this fails currently because there is no equals in SearchResult, should we add one? For now we just cover hashCode()
-
     // hashcode only looks at "sResu" parameter
-    SearchResult res = new SearchResult(JUnitHelpers.getFile("file2", true));
-    SearchResult equ = new SearchResult(JUnitHelpers.getFile("file2", true));
-
+    SearchResult res = new SearchResult(TestHelpers.getFile("file2", true), "");
+    SearchResult equ = new SearchResult(TestHelpers.getFile("file2", true), "");
     assertEquals(res.hashCode(), equ.hashCode());
-
     //JUnitHelpers.HashCodeTest(res, equ);
-
     //    res = new SearchResult(new WebRadio("web", "url"), "webradio");
     //    equ = new SearchResult(new WebRadio("web", "url"), "webradio");
     //    JUnitHelpers.HashCodeTest(res, equ);
@@ -58,7 +51,7 @@ public class TestSearchResult extends TestCase {
    * @throws Exception the exception
    */
   public void testSearchResultFile() throws Exception {
-    SearchResult res = new SearchResult(JUnitHelpers.getFile("file2", true));
+    SearchResult res = new SearchResult(TestHelpers.getFile("file2", true), "");
     assertNotNull(res);
   }
 
@@ -68,16 +61,15 @@ public class TestSearchResult extends TestCase {
    * @throws Exception the exception
    */
   public void testSearchResultFileString() throws Exception {
-    SearchResult res = new SearchResult(JUnitHelpers.getFile("file2", true), "testresult");
+    SearchResult res = new SearchResult(TestHelpers.getFile("file2", true), "testresult");
     assertNotNull(res);
-
   }
 
   /**
    * Test method for {@link org.jajuk.base.SearchResult#SearchResult(org.jajuk.services.webradio.WebRadio, java.lang.String)}.
    */
   public void testSearchResultWebRadioString() {
-    SearchResult res = new SearchResult(new WebRadio("web", "testurl"), "testresult");
+    SearchResult res = new SearchResult(TestHelpers.getWebRadio(), "testresult");
     assertNotNull(res);
   }
 
@@ -88,10 +80,10 @@ public class TestSearchResult extends TestCase {
    */
   public void testCompareTo() throws Exception {
     // compareTo only looks at sResu-parameter
-    SearchResult res = new SearchResult(JUnitHelpers.getFile("file2", true), "testresu");
-    SearchResult equ = new SearchResult(JUnitHelpers.getFile("file2", true), "testresu");
-    SearchResult notequ = new SearchResult(JUnitHelpers.getFile("file2", true), "testresu1");
-    JUnitHelpers.CompareToTest(res, equ, notequ);
+    SearchResult res = new SearchResult(TestHelpers.getFile("file2", true), "testresu");
+    SearchResult equ = new SearchResult(TestHelpers.getFile("file2", true), "testresu");
+    SearchResult notequ = new SearchResult(TestHelpers.getFile("file2", true), "testresu1");
+    TestHelpers.CompareToTest(res, equ, notequ);
   }
 
   /**
@@ -100,7 +92,7 @@ public class TestSearchResult extends TestCase {
    * @throws Exception the exception
    */
   public void testGetFile() throws Exception {
-    SearchResult res = new SearchResult(JUnitHelpers.getFile("file2", true), "testresu");
+    SearchResult res = new SearchResult(TestHelpers.getFile("file2", true), "testresu");
     assertEquals("file2", res.getFile().getName());
   }
 
@@ -110,27 +102,9 @@ public class TestSearchResult extends TestCase {
    * @throws Exception the exception
    */
   public void testGetType() throws Exception {
-    SearchResult res = new SearchResult(JUnitHelpers.getFile("file2", true), "testresu");
+    SearchResult res = new SearchResult(TestHelpers.getFile("file2", true), "testresu");
     assertEquals(SearchResultType.FILE, res.getType());
-
-    res = new SearchResult(new WebRadio("web", "testurl"), "testresu");
+    res = new SearchResult(TestHelpers.getWebRadio(), TestHelpers.getWebRadio().getName());
     assertEquals(SearchResultType.WEBRADIO, res.getType());
   }
-
-  /**
-   * Test method for {@link org.jajuk.base.SearchResult#getWebradio()}.
-   */
-  public void testGetWebradio() {
-    SearchResult res = new SearchResult(new WebRadio("web1", "testurl"), "testresu");
-    assertEquals(SearchResultType.WEBRADIO, res.getType());
-    assertEquals("web1", res.getWebradio().getName());
-  }
-
-  /**
-   * Test method for {@link org.jajuk.base.SearchResult#getResu()}.
-   */
-  public void testGetResu() {
-    SearchResult res = new SearchResult(new WebRadio("web", "testurl"), "testresu1");
-    assertEquals("testresu1", res.getResu());
-  }
 }
diff --git a/src/test/java/org/jajuk/base/TestTrack.java b/src/test/java/org/jajuk/base/TestTrack.java
index d47c9f3..8f2b18d 100644
--- a/src/test/java/org/jajuk/base/TestTrack.java
+++ b/src/test/java/org/jajuk/base/TestTrack.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,26 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision: 3132 $
+ *  
  */
 package org.jajuk.base;
 
-import org.jajuk.JUnitHelpers;
+import java.io.IOException;
+
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.junit.Test;
 
-/**
- * 
- */
 public class TestTrack extends JajukTestCase {
-
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-  }
-
   /**
-   * Test method for {@link org.jajuk.base.Track#getDesc()}.
+   * Test method for {@link org.jajuk.base.Track#getTitle()}.
    */
   @Test
   public void testGetDesc() {
@@ -51,7 +44,7 @@ public class TestTrack extends JajukTestCase {
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Track#getLabel()}.
+   * Test method for {@link org.jajuk.base.Track#getXMLTag()}.
    */
   @Test
   public void testGetLabel() {
@@ -124,16 +117,15 @@ public class TestTrack extends JajukTestCase {
 
   /**
    * Test method for {@link org.jajuk.base.Track#removeFile(org.jajuk.base.File)}.
+   * @throws IOException 
    */
   @Test
-  public void testRemoveFile() {
+  public void testRemoveFile() throws IOException {
     // Set-up...
-    File file = JUnitHelpers.getFile();
+    File file = TestHelpers.getFile();
     Track track = file.getTrack();
-
     // Remove the reference
     track.removeFile(file);
-
     // Check that associated track no more contains this file
     assertFalse(file.getTrack().getFiles().contains(file));
   }
@@ -361,5 +353,4 @@ public class TestTrack extends JajukTestCase {
   public void testGetFilesString() {
     //TODO To be implemented
   }
-
 }
diff --git a/src/test/java/org/jajuk/base/TestTrackManager.java b/src/test/java/org/jajuk/base/TestTrackManager.java
index 340c14f..e292bda 100644
--- a/src/test/java/org/jajuk/base/TestTrackManager.java
+++ b/src/test/java/org/jajuk/base/TestTrackManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,26 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision: 3132 $
+ *  
  */
 package org.jajuk.base;
 
-import org.jajuk.JUnitHelpers;
+import java.io.IOException;
+
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.junit.Test;
 
-/**
- * 
- */
 public class TestTrackManager extends JajukTestCase {
-
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-  }
-
   /**
-   * Test method for {@link org.jajuk.base.TrackManager#getLabel()}.
+   * Test method for {@link org.jajuk.base.TrackManager#getXMLTag()}.
    */
   @Test
   public void testGetLabel() {
@@ -172,18 +165,16 @@ public class TestTrackManager extends JajukTestCase {
 
   /**
    * Test method for {@link org.jajuk.base.TrackManager#removeFile(org.jajuk.base.Track, org.jajuk.base.File)}.
+   * @throws IOException 
    */
   @Test
-  public void testRemoveFile() {
+  public void testRemoveFile() throws IOException {
     // Set-up...
-    File file = JUnitHelpers.getFile();
-
+    File file = TestHelpers.getFile();
     // Remove the reference
     TrackManager.getInstance().removeFile(file);
-
     // Check if the collection no more contains the track (as it mapped a single file now removed)
     assertTrue(TrackManager.getInstance().getTrackByID(file.getTrack().getID()) == null);
-
     // Check if the associated track no more contains this file
     assertFalse(file.getTrack().getFiles().contains(file));
   }
@@ -259,5 +250,4 @@ public class TestTrackManager extends JajukTestCase {
   public void testSetAutocommit() {
     //TODO To be implemented
   }
-
 }
diff --git a/src/test/java/org/jajuk/base/TestTypeManager.java b/src/test/java/org/jajuk/base/TestTypeManager.java
index 28adc8c..28a7e7e 100644
--- a/src/test/java/org/jajuk/base/TestTypeManager.java
+++ b/src/test/java/org/jajuk/base/TestTypeManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,38 +16,29 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
-import junit.framework.TestCase;
-
+import org.jajuk.JajukTestCase;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestTypeManager extends TestCase {
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
+public class TestTypeManager extends JajukTestCase {
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // clear to make sure previous tests did not add anything
     TypeManager.getInstance().clear();
-
-    super.setUp();
   }
 
   /**
-   * Test method for {@link org.jajuk.base.TypeManager#getLabel()}.
+   * Test method for {@link org.jajuk.base.TypeManager#getXMLTag()}.
    */
   public void testGetLabel() {
-    assertEquals(Const.XML_TYPES, TypeManager.getInstance().getLabel());
+    assertEquals(Const.XML_TYPES, TypeManager.getInstance().getXMLTag());
   }
 
   /**
@@ -66,11 +57,9 @@ public class TestTypeManager extends TestCase {
   public void testRegisterType() {
     Type type = TypeManager.getInstance().registerType("testtype", "tst", null, null);
     assertNotNull(type);
-
     // try to register the same thing, we get back the same type
     Type type2 = TypeManager.getInstance().registerType("testtype", "tst", null, null);
     assertTrue(type == type2); // instance compare on purpose!
-
     // register the same type
   }
 
@@ -82,10 +71,8 @@ public class TestTypeManager extends TestCase {
   public void testIsExtensionSupported() {
     // not supported initially
     assertFalse(TypeManager.getInstance().isExtensionSupported("tst"));
-
     // register a type for it
     assertNotNull(TypeManager.getInstance().registerType("testtype", "tst", null, null));
-
     // supported now
     assertTrue(TypeManager.getInstance().isExtensionSupported("tst"));
   }
@@ -98,10 +85,8 @@ public class TestTypeManager extends TestCase {
   public void testGetTypeByExtension() {
     // not supported initially
     assertNull(TypeManager.getInstance().getTypeByExtension("tst"));
-
     // register a type for it
     assertNotNull(TypeManager.getInstance().registerType("testtype", "tst", null, null));
-
     // supported now
     assertNotNull(TypeManager.getInstance().getTypeByExtension("tst"));
   }
@@ -114,26 +99,19 @@ public class TestTypeManager extends TestCase {
   public void testGetAllMusicTypes() throws Exception {
     // we need the ItemManagers when using properties
     StartupCollectionService.registerItemManagers();
-
     // no type initially
     assertEquals(0, TypeManager.getInstance().getAllMusicTypes().size());
-
     // register a type
     assertNotNull(TypeManager.getInstance().registerType("testtype", "tst", null, null));
-
     // still no type now as it does not have "music" property set
     assertEquals(0, TypeManager.getInstance().getAllMusicTypes().size());
-
     // add another type with "true" for "music"
     Type type = TypeManager.getInstance().registerType("testtype2", "tst2", null, null);
     type.setProperty(Const.XML_TYPE_IS_MUSIC, true);
-
     // now we have one music-type
     assertEquals(1, TypeManager.getInstance().getAllMusicTypes().size());
-
     // add default types
     TypeManager.registerTypesNoMplayer();
-
     // many types now
     assertTrue(TypeManager.getInstance().getAllMusicTypes().size() > 1);
   }
@@ -146,16 +124,12 @@ public class TestTypeManager extends TestCase {
   public void testGetTypeListString() throws Exception {
     // no type initially
     assertEquals("", TypeManager.getInstance().getTypeListString());
-
     // register a type
     assertNotNull(TypeManager.getInstance().registerType("testtype", "tst", null, null));
-
     // one type now
     assertEquals("tst", TypeManager.getInstance().getTypeListString());
-
     // add default types
     TypeManager.registerTypesNoMplayer();
-
     // many types now
     assertTrue(TypeManager.getInstance().getTypeListString().length() > 4);
   }
@@ -168,13 +142,10 @@ public class TestTypeManager extends TestCase {
   public void testGetTypeByID() {
     // not available initially
     assertNull(TypeManager.getInstance().getTypeByID("tst"));
-
     // add one type
     assertNotNull(TypeManager.getInstance().registerType("testtype", "tst", null, null));
-
     // available now
     assertNotNull(TypeManager.getInstance().getTypeByID("tst"));
-
     // others still not available
     assertNull(TypeManager.getInstance().getTypeByID("notexist"));
   }
@@ -187,16 +158,12 @@ public class TestTypeManager extends TestCase {
   public void testGetTypes() throws Exception {
     // no type initially
     assertEquals(0, TypeManager.getInstance().getTypes().size());
-
     // register a type
     assertNotNull(TypeManager.getInstance().registerType("testtype", "tst", null, null));
-
     // one type now
     assertEquals(1, TypeManager.getInstance().getTypes().size());
-
     // add default types
     TypeManager.registerTypesNoMplayer();
-
     // many types now
     assertTrue(TypeManager.getInstance().getTypes().size() > 1);
   }
@@ -209,16 +176,12 @@ public class TestTypeManager extends TestCase {
   public void testGetTypesIterator() throws Exception {
     // no type initially
     assertFalse(TypeManager.getInstance().getTypesIterator().hasNext());
-
     // register a type
     assertNotNull(TypeManager.getInstance().registerType("testtype", "tst", null, null));
-
     // one type now
     assertTrue(TypeManager.getInstance().getTypesIterator().hasNext());
-
     // add default types
     TypeManager.registerTypesNoMplayer();
-
     // many types now
     assertTrue(TypeManager.getInstance().getTypesIterator().hasNext());
   }
@@ -231,7 +194,6 @@ public class TestTypeManager extends TestCase {
    */
   public void testRegisterTypesNoMplayer() throws Exception {
     TypeManager.registerTypesNoMplayer();
-
     assertTrue(TypeManager.getInstance().getTypes().size() > 1);
   }
 
@@ -243,8 +205,6 @@ public class TestTypeManager extends TestCase {
    */
   public void testRegisterTypesMplayerAvailable() throws Exception {
     TypeManager.registerTypesMplayerAvailable();
-
     assertTrue(TypeManager.getInstance().getTypes().size() > 1);
   }
-
 }
diff --git a/src/test/java/org/jajuk/base/TestYear.java b/src/test/java/org/jajuk/base/TestYear.java
index f96c26d..a35b209 100644
--- a/src/test/java/org/jajuk/base/TestYear.java
+++ b/src/test/java/org/jajuk/base/TestYear.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,35 +16,33 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.base;
 
-import junit.framework.TestCase;
-
-import org.jajuk.JUnitHelpers;
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestYear extends TestCase {
-
+public class TestYear extends JajukTestCase {
   /**
-   * Test method for {@link org.jajuk.base.Year#getDesc()}.
+   * Test method for {@link org.jajuk.base.Year#getTitle()}.
    */
   public void testGetDesc() {
     Year year = new Year("1", "1998");
-    assertNotNull(year.getDesc());
-    assertTrue(year.getDesc().contains("1998"));
+    assertNotNull(year.getTitle());
+    assertTrue(year.getTitle().contains("1998"));
   }
 
   /**
-   * Test method for {@link org.jajuk.base.Year#getLabel()}.
+   * Test method for {@link org.jajuk.base.Year#getXMLTag()}.
    */
   public void testGetLabel() {
     Year year = new Year("1", "1998");
-    assertEquals(Const.XML_YEAR, year.getLabel());
+    assertEquals(Const.XML_YEAR, year.getXMLTag());
   }
 
   /**
@@ -69,10 +67,10 @@ public class TestYear extends TestCase {
    * Test method for {@link org.jajuk.base.Year#toString()}.
    */
   public void testToString() {
-    JUnitHelpers.ToStringTest(new Year("1", "1998"));
-    JUnitHelpers.ToStringTest(new Year("1", null));
-    JUnitHelpers.ToStringTest(new Year(null, "1998"));
-    JUnitHelpers.ToStringTest(new Year(null, null));
+    TestHelpers.ToStringTest(new Year("1", "1998"));
+    TestHelpers.ToStringTest(new Year("1", null));
+    TestHelpers.ToStringTest(new Year(null, "1998"));
+    TestHelpers.ToStringTest(new Year(null, null));
   }
 
   /**
@@ -90,7 +88,7 @@ public class TestYear extends TestCase {
     Year year = new Year("1", "1998");
     Year yeareq = new Year("2", "1998");
     Year yearne = new Year("3", "1997");
-    JUnitHelpers.CompareToTest(year, yeareq, yearne);
+    TestHelpers.CompareToTest(year, yeareq, yearne);
   }
 
   /**
@@ -99,7 +97,6 @@ public class TestYear extends TestCase {
   public void testGetName2() {
     Year year = new Year("1", "1998");
     assertNotNull(year.getName2());
-
     // test with zero-year
     year = new Year("1", "0");
     assertNotNull(year.getName2());
@@ -113,10 +110,8 @@ public class TestYear extends TestCase {
     assertTrue(new Year("1", "1998").looksValid());
     assertTrue(new Year("1", "1001").looksValid());
     assertTrue(new Year("1", "2999").looksValid());
-
     assertFalse(new Year("1", "1000").looksValid());
     assertFalse(new Year("1", "-340").looksValid());
     assertFalse(new Year("1", "10000").looksValid());
   }
-
 }
diff --git a/src/test/java/org/jajuk/events/TestJajukEvent.java b/src/test/java/org/jajuk/events/TestJajukEvent.java
index 940892a..31131e3 100644
--- a/src/test/java/org/jajuk/events/TestJajukEvent.java
+++ b/src/test/java/org/jajuk/events/TestJajukEvent.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,42 +16,40 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.events;
 
 import java.util.Properties;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestJajukEvent extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.events.JajukEvent#hashCode()}.
    */
   public void testHashCode() {
     JajukEvent event1 = new JajukEvent(JajukEvents.VOLUME_CHANGED);
     JajukEvent event2 = new JajukEvent(JajukEvents.VOLUME_CHANGED);
-    JUnitHelpers.HashCodeTest(event1, event2);
+    TestHelpers.HashCodeTest(event1, event2);
   }
 
   /**
    * Test hash code2.
-   * DOCUMENT_ME
+   * 
    */
   public void testHashCode2() {
     Properties prop1 = new Properties();
     prop1.setProperty("test", "value");
     Properties prop2 = new Properties();
     prop2.setProperty("test", "value");
-
     JajukEvent event1 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop1);
     JajukEvent event2 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop2);
-    JUnitHelpers.HashCodeTest(event1, event2);
+    TestHelpers.HashCodeTest(event1, event2);
   }
 
   /**
@@ -63,7 +61,6 @@ public class TestJajukEvent extends JajukTestCase {
   public void testJajukEventJajukEventsProperties() {
     Properties prop1 = new Properties();
     prop1.setProperty("test", "value");
-
     new JajukEvent(JajukEvents.VOLUME_CHANGED, prop1);
   }
 
@@ -83,12 +80,10 @@ public class TestJajukEvent extends JajukTestCase {
   public void testGetDetails() {
     Properties prop1 = new Properties();
     prop1.setProperty("test", "value");
-
     JajukEvent event1 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop1);
     assertNotNull(event1.getDetails());
     assertNotNull(event1.getDetails().get("test"));
     assertNull(event1.getDetails().get("notexist"));
-
     JajukEvent event2 = new JajukEvent(JajukEvents.VOLUME_CHANGED);
     assertNull(event2.getDetails());
   }
@@ -99,7 +94,6 @@ public class TestJajukEvent extends JajukTestCase {
   public void testGetSubject() {
     Properties prop1 = new Properties();
     prop1.setProperty("test", "value");
-
     JajukEvent event1 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop1);
     assertEquals(JajukEvents.VOLUME_CHANGED, event1.getSubject());
   }
@@ -110,12 +104,10 @@ public class TestJajukEvent extends JajukTestCase {
   public void testToString() {
     Properties prop1 = new Properties();
     prop1.setProperty("test", "value");
-
     JajukEvent event1 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop1);
     JajukEvent event2 = new JajukEvent(JajukEvents.VOLUME_CHANGED);
-
-    JUnitHelpers.ToStringTest(event1);
-    JUnitHelpers.ToStringTest(event2);
+    TestHelpers.ToStringTest(event1);
+    TestHelpers.ToStringTest(event2);
   }
 
   /**
@@ -127,12 +119,12 @@ public class TestJajukEvent extends JajukTestCase {
     JajukEvent event1 = new JajukEvent(JajukEvents.VOLUME_CHANGED);
     JajukEvent event2 = new JajukEvent(JajukEvents.VOLUME_CHANGED);
     JajukEvent event3 = new JajukEvent(JajukEvents.FILE_FINISHED);
-    JUnitHelpers.EqualsTest(event1, event2, event3);
+    TestHelpers.EqualsTest(event1, event2, event3);
   }
 
   /**
    * Test equals object2.
-   * DOCUMENT_ME
+   * 
    */
   public void testEqualsObject2() {
     Properties prop1 = new Properties();
@@ -141,10 +133,9 @@ public class TestJajukEvent extends JajukTestCase {
     prop2.setProperty("test", "value");
     Properties prop3 = new Properties();
     prop3.setProperty("test", "diffvalue");
-
     JajukEvent event1 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop1);
     JajukEvent event2 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop2);
     JajukEvent event3 = new JajukEvent(JajukEvents.VOLUME_CHANGED, prop3);
-    JUnitHelpers.EqualsTest(event1, event2, event3);
+    TestHelpers.EqualsTest(event1, event2, event3);
   }
 }
diff --git a/src/test/java/org/jajuk/events/TestObservationManager.java b/src/test/java/org/jajuk/events/TestObservationManager.java
index 75144e4..67f64dc 100644
--- a/src/test/java/org/jajuk/events/TestObservationManager.java
+++ b/src/test/java/org/jajuk/events/TestObservationManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.events;
 
@@ -24,15 +24,13 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestObservationManager extends JajukTestCase {
-  
-  /** DOCUMENT_ME. */
   AtomicInteger called = new AtomicInteger(0);
 
   /*
@@ -67,11 +65,10 @@ public class TestObservationManager extends JajukTestCase {
 
   /**
    * Test unregister null.
-   * DOCUMENT_ME
+   * 
    */
   public void testUnregisterNull() {
     ObservationManager.unregister(new Observer() {
-
       @Override
       public void update(JajukEvent event) {
         // nothing to do
@@ -140,8 +137,8 @@ public class TestObservationManager extends JajukTestCase {
     Properties prop = new Properties();
     prop.setProperty("test", "value");
     ObservationManager.notifySync(new JajukEvent(JajukEvents.VOLUME_CHANGED, prop));
-    assertEquals("value", ObservationManager.getDetailLastOccurence(JajukEvents.VOLUME_CHANGED,
-        "test"));
+    assertEquals("value",
+        ObservationManager.getDetailLastOccurence(JajukEvents.VOLUME_CHANGED, "test"));
   }
 
   /**
@@ -153,20 +150,19 @@ public class TestObservationManager extends JajukTestCase {
   public void testGetDetail() {
     Properties prop = new Properties();
     prop.setProperty("test", "value");
-    assertEquals("value", ObservationManager.getDetail(new JajukEvent(JajukEvents.VOLUME_CHANGED,
-        prop), "test"));
+    assertEquals("value",
+        ObservationManager.getDetail(new JajukEvent(JajukEvents.VOLUME_CHANGED, prop), "test"));
   }
 
   /**
    * Test get detail null.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetDetailNull() {
     Properties prop = new Properties();
     prop.setProperty("test", "value");
     assertNull(ObservationManager.getDetail(new JajukEvent(JajukEvents.VOLUME_CHANGED, prop),
         "notexisting"));
-
     assertNull(ObservationManager.getDetail(new JajukEvent(JajukEvents.VOLUME_CHANGED),
         "notexisting"));
   }
@@ -190,18 +186,18 @@ public class TestObservationManager extends JajukTestCase {
   // helper method to emma-coverage of the unused constructor
   /**
    * Test private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPrivateConstructor() throws Exception {
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(ObservationManager.class);
+    TestHelpers.executePrivateConstructor(ObservationManager.class);
   }
 
   /**
    * Test exception.
-   * DOCUMENT_ME
+   * 
    */
   public void testException() {
     Observer observer = new TestObserverRegistry.LocalObserver(true, called);
diff --git a/src/test/java/org/jajuk/events/TestObserverRegistry.java b/src/test/java/org/jajuk/events/TestObserverRegistry.java
index e4a01b5..e7dfe5e 100644
--- a/src/test/java/org/jajuk/events/TestObserverRegistry.java
+++ b/src/test/java/org/jajuk/events/TestObserverRegistry.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.events;
 
@@ -28,17 +28,14 @@ import org.jajuk.JajukTestCase;
 import org.jajuk.ThreadTestHelper;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestObserverRegistry extends JajukTestCase {
-
-  /** The Constant NUMBER_OF_THREADS.  DOCUMENT_ME */
+  /** The Constant NUMBER_OF_THREADS.   */
   private static final int NUMBER_OF_THREADS = 15; // 15 is the limit on
   // concurrent events
-  /** The Constant NUMBER_OF_TESTS.  DOCUMENT_ME */
+  /** The Constant NUMBER_OF_TESTS.   */
   private static final int NUMBER_OF_TESTS = 1000;
-
-  /** DOCUMENT_ME. */
   private AtomicInteger called = new AtomicInteger(0);
 
   /**
@@ -76,66 +73,52 @@ public class TestObserverRegistry extends JajukTestCase {
 
   /**
    * Test below zero.
-   * DOCUMENT_ME
+   * 
    */
   public void testBelowZero() {
     ObserverRegistry registry = new ObserverRegistry();
     Observer observer = new LocalObserver(called);
-
     // first register
     registry.register(JajukEvents.FILE_FINISHED, observer);
-
     assertEquals(0, called.get());
-
     // then notifySync
     registry.notifySync(new JajukEvent(JajukEvents.FILE_FINISHED));
-
     assertEquals(1, called.get());
-
     // then unregister again
     registry.unregister(JajukEvents.FILE_FINISHED, observer);
   }
 
   /**
    * Test exception.
-   * DOCUMENT_ME
+   * 
    */
   public void testException() {
     ObserverRegistry registry = new ObserverRegistry();
     Observer observer = new LocalObserver(true, called);
-
     // first register
     registry.register(JajukEvents.FILE_FINISHED, observer);
-
     assertEquals(0, called.get());
-
     // then notifySync, this will not return an error even if an exception
     // occurred
     registry.notifySync(new JajukEvent(JajukEvents.FILE_FINISHED));
-
     assertEquals(1, called.get());
-
     // then unregister again
     registry.unregister(JajukEvents.FILE_FINISHED, observer);
   }
 
   /**
    * Test multiple threads.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testMultipleThreads() throws Exception {
     final ObserverRegistry registry = new ObserverRegistry();
     Observer observer = new LocalObserver(called);
-
     // first register
     registry.register(JajukEvents.FILE_FINISHED, observer);
-
     assertEquals(0, called.get());
-
     ThreadTestHelper helper = new ThreadTestHelper(NUMBER_OF_THREADS, NUMBER_OF_TESTS);
-
     helper.executeTest(new ThreadTestHelper.TestRunnable() {
       @Override
       public void doEnd(int threadnum) throws Exception {
@@ -148,34 +131,27 @@ public class TestObserverRegistry extends JajukTestCase {
         registry.notifySync(new JajukEvent(JajukEvents.FILE_FINISHED));
       }
     });
-
     assertEquals(NUMBER_OF_THREADS * NUMBER_OF_TESTS, called.get());
-
     // then unregister again
     registry.unregister(JajukEvents.FILE_FINISHED, observer);
   }
 
   /**
    * Test multiple threads wait.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testMultipleThreadsWait() throws Exception {
     final ObserverRegistry registry = new ObserverRegistry();
-
     // set 100ms wait time to reach event queue size on normal speed machines
     Observer observer = new LocalObserver(100, called);
-
     // first register
     registry.register(JajukEvents.FILE_FINISHED, observer);
-
     assertEquals(0, called.get());
-
     // more threads so that we reach the limit of 15 concurrent events
     // a bit fewer tests as they will need some time
     ThreadTestHelper helper = new ThreadTestHelper(NUMBER_OF_THREADS * 2, NUMBER_OF_TESTS / 20);
-
     helper.executeTest(new ThreadTestHelper.TestRunnable() {
       @Override
       public void doEnd(int threadnum) throws Exception {
@@ -188,17 +164,15 @@ public class TestObserverRegistry extends JajukTestCase {
         registry.notifySync(new JajukEvent(JajukEvents.FILE_FINISHED));
       }
     });
-
     // can not test this as we have overflows here!
     // assertEquals(NUMBER_OF_THREADS * NUMBER_OF_TESTS, called.get());
-
     // then unregister again
     registry.unregister(JajukEvents.FILE_FINISHED, observer);
   }
 
   /**
    * Test multiple threads multiple observers.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -206,15 +180,11 @@ public class TestObserverRegistry extends JajukTestCase {
     final ObserverRegistry registry = new ObserverRegistry();
     Observer observer1 = new LocalObserver(called);
     Observer observer2 = new LocalObserver(called);
-
     // first register
     registry.register(JajukEvents.FILE_FINISHED, observer1);
     registry.register(JajukEvents.FILE_FINISHED, observer2);
-
     assertEquals(0, called.get());
-
     ThreadTestHelper helper = new ThreadTestHelper(NUMBER_OF_THREADS, NUMBER_OF_TESTS);
-
     helper.executeTest(new ThreadTestHelper.TestRunnable() {
       @Override
       public void doEnd(int threadnum) throws Exception {
@@ -227,10 +197,8 @@ public class TestObserverRegistry extends JajukTestCase {
         registry.notifySync(new JajukEvent(JajukEvents.FILE_FINISHED));
       }
     });
-
     // now we were called twice as many times because of two observers...
     assertEquals(2 * NUMBER_OF_THREADS * NUMBER_OF_TESTS, called.get());
-
     // then unregister again
     registry.unregister(JajukEvents.FILE_FINISHED, observer2);
     registry.unregister(JajukEvents.FILE_FINISHED, observer1);
@@ -238,7 +206,7 @@ public class TestObserverRegistry extends JajukTestCase {
 
   /**
    * Test high priority observer.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -246,15 +214,11 @@ public class TestObserverRegistry extends JajukTestCase {
     final ObserverRegistry registry = new ObserverRegistry();
     LocalObserver observer1 = new LocalObserver(called);
     Observer observer2 = new LocalHighPriorityObserver(observer1, called);
-
     // first register
     registry.register(JajukEvents.FILE_FINISHED, observer1);
     registry.register(JajukEvents.FILE_FINISHED, observer2);
-
     assertEquals(0, called.get());
-
     ThreadTestHelper helper = new ThreadTestHelper(NUMBER_OF_THREADS, NUMBER_OF_TESTS);
-
     helper.executeTest(new ThreadTestHelper.TestRunnable() {
       @Override
       public void doEnd(int threadnum) throws Exception {
@@ -267,36 +231,26 @@ public class TestObserverRegistry extends JajukTestCase {
         registry.notifySync(new JajukEvent(JajukEvents.FILE_FINISHED));
       }
     });
-
     // now we were called twice as many times because of two observers...
     assertEquals(2 * NUMBER_OF_THREADS * NUMBER_OF_TESTS, called.get());
-
     // then unregister again
     registry.unregister(JajukEvents.FILE_FINISHED, observer2);
     registry.unregister(JajukEvents.FILE_FINISHED, observer1);
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   static class LocalObserver implements Observer {
-    
-    /** DOCUMENT_ME. */
     boolean invoked = false;
-    
-    /** DOCUMENT_ME. */
     int wait = 0;
-    
-    /** DOCUMENT_ME. */
     boolean exception = false;
-    
-    /** DOCUMENT_ME. */
     AtomicInteger called;
 
     /**
      * Instantiates a new local observer.
      *
-     * @param called DOCUMENT_ME
+     * @param called 
      */
     public LocalObserver(AtomicInteger called) {
       super();
@@ -306,8 +260,8 @@ public class TestObserverRegistry extends JajukTestCase {
     /**
      * Instantiates a new local observer.
      *
-     * @param wait DOCUMENT_ME
-     * @param called DOCUMENT_ME
+     * @param wait 
+     * @param called 
      */
     public LocalObserver(int wait, AtomicInteger called) {
       super();
@@ -318,8 +272,8 @@ public class TestObserverRegistry extends JajukTestCase {
     /**
      * Instantiates a new local observer.
      *
-     * @param exception DOCUMENT_ME
-     * @param called DOCUMENT_ME
+     * @param exception 
+     * @param called 
      */
     public LocalObserver(boolean exception, AtomicInteger called) {
       super();
@@ -349,11 +303,9 @@ public class TestObserverRegistry extends JajukTestCase {
     @Override
     public void update(JajukEvent event) {
       called.incrementAndGet();
-
       if (exception) {
         throw new RuntimeException("Exception requested in update...");
       }
-
       if (wait > 0) {
         try {
           Thread.sleep(wait);
@@ -365,18 +317,16 @@ public class TestObserverRegistry extends JajukTestCase {
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private class LocalHighPriorityObserver extends LocalObserver implements HighPriorityObserver {
-    
-    /** DOCUMENT_ME. */
     LocalObserver lowprioobserver; // to check if other was not yet called
 
     /**
      * Instantiates a new local high priority observer.
      *
-     * @param lowprioobserver DOCUMENT_ME
-     * @param called DOCUMENT_ME
+     * @param lowprioobserver 
+     * @param called 
      */
     public LocalHighPriorityObserver(LocalObserver lowprioobserver, AtomicInteger called) {
       super(called);
@@ -397,6 +347,5 @@ public class TestObserverRegistry extends JajukTestCase {
       }
       super.update(event);
     }
-
   }
 }
diff --git a/src/test/java/org/jajuk/services/alarm/TestAlarm.java b/src/test/java/org/jajuk/services/alarm/TestAlarm.java
index 2d55b45..4676611 100644
--- a/src/test/java/org/jajuk/services/alarm/TestAlarm.java
+++ b/src/test/java/org/jajuk/services/alarm/TestAlarm.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.alarm;
 
@@ -30,17 +30,15 @@ import org.jajuk.base.File;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAlarm extends JajukTestCase {
-
   /**
    * Test method for.
    *
    * {@link org.jajuk.services.alarm.Alarm#Alarm(java.util.Date, java.util.List, java.lang.String)}
    * .
    */
-
   public void testAlarm() {
     new Alarm(new Date(), new ArrayList<File>(), "mode");
   }
@@ -48,11 +46,9 @@ public class TestAlarm extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.alarm.Alarm#wakeUpSleeper()}.
    */
-
   public void testWakeUpSleeper() {
     Alarm alarm = new Alarm(new Date(), new ArrayList<File>(), "mode");
     alarm.wakeUpSleeper();
-
     List<File> list = new ArrayList<File>();
     alarm = new Alarm(new Date(), list, Const.ALARM_START_ACTION);
     alarm.wakeUpSleeper();
@@ -61,7 +57,6 @@ public class TestAlarm extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.alarm.Alarm#getAlarmTime()}.
    */
-
   public void testGetAlarmTime() {
     Date date = new Date();
     Alarm alarm = new Alarm(date, new ArrayList<File>(), "mode");
@@ -71,13 +66,11 @@ public class TestAlarm extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.alarm.Alarm#nextDay()}.
    */
-
   public void testNextDay() {
     Date date = new Date();
     Alarm alarm = new Alarm(date, new ArrayList<File>(), "mode");
     assertEquals(date, alarm.getAlarmTime());
     alarm.nextDay();
-
     Date datenew = alarm.getAlarmTime();
     assertEquals(DateUtils.addDays(date, 1), datenew);
   }
diff --git a/src/test/java/org/jajuk/services/alarm/TestAlarmManager.java b/src/test/java/org/jajuk/services/alarm/TestAlarmManager.java
index eefbac3..f20e8fb 100644
--- a/src/test/java/org/jajuk/services/alarm/TestAlarmManager.java
+++ b/src/test/java/org/jajuk/services/alarm/TestAlarmManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,14 +16,13 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.alarm;
 
 import java.util.Calendar;
 import java.util.Set;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
 import org.jajuk.base.FileManager;
 import org.jajuk.events.JajukEvent;
@@ -32,25 +31,16 @@ import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAlarmManager extends JajukTestCase {
-
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
-    JUnitHelpers.createSessionDirectory();
-
+  protected void specificSetUp() throws Exception {
     // make sure the FileManager is registered correctly for each invocation
     // this is done during the first access to the singleton
     FileManager.getInstance();
-
     // clear File Manager to avoid files being left in there and causing trouble
     FileManager.getInstance().clear();
-
-    super.setUp();
   }
 
   /**
@@ -61,9 +51,7 @@ public class TestAlarmManager extends JajukTestCase {
    */
   public void testGetInstance() throws Exception {
     Conf.setProperty(Const.CONF_ALARM_ENABLED, "true");
-
     assertNotNull(AlarmManager.getInstance());
-
     // sleep a bit to let internal thread do some work
     Thread.sleep(1100);
   }
@@ -80,44 +68,40 @@ public class TestAlarmManager extends JajukTestCase {
 
   /**
    * Test update2.
-   * DOCUMENT_ME
+   * 
    */
   public void testUpdate2() {
     Conf.setProperty(Const.CONF_ALARM_ENABLED, "true");
-
     AlarmManager.getInstance().update(new JajukEvent(JajukEvents.ALARMS_CHANGE));
   }
 
   /**
    * Test update3.
-   * DOCUMENT_ME
+   * 
    */
   public void testUpdate3() {
     Conf.setProperty(Const.CONF_ALARM_ENABLED, "true");
     Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_ITEM);
-
     AlarmManager.getInstance().update(new JajukEvent(JajukEvents.ALARMS_CHANGE));
   }
 
   /**
    * Test update4.
-   * DOCUMENT_ME
+   * 
    */
   public void testUpdate4() {
     Conf.setProperty(Const.CONF_ALARM_ENABLED, "true");
     Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_BESTOF);
-
     AlarmManager.getInstance().update(new JajukEvent(JajukEvents.ALARMS_CHANGE));
   }
 
   /**
    * Test update5.
-   * DOCUMENT_ME
+   * 
    */
   public void testUpdate5() {
     Conf.setProperty(Const.CONF_ALARM_ENABLED, "true");
     Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_NOVELTIES);
-
     AlarmManager.getInstance().update(new JajukEvent(JajukEvents.ALARMS_CHANGE));
   }
 
@@ -133,7 +117,7 @@ public class TestAlarmManager extends JajukTestCase {
 
   /**
    * Test trigger alarm.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -141,15 +125,12 @@ public class TestAlarmManager extends JajukTestCase {
     Calendar cal = Calendar.getInstance();
     // add one second to let it be triggered immedately
     cal.add(Calendar.SECOND, 1);
-
     Conf.setProperty(Const.CONF_ALARM_ENABLED, "true");
     Conf.setProperty(Const.CONF_ALARM_MODE, Const.STARTUP_MODE_ITEM);
     Conf.setProperty(Const.CONF_ALARM_TIME_HOUR, Integer.toString(cal.get(Calendar.HOUR_OF_DAY)));
     Conf.setProperty(Const.CONF_ALARM_TIME_MINUTES, Integer.toString(cal.get(Calendar.MINUTE)));
     Conf.setProperty(Const.CONF_ALARM_TIME_SECONDS, Integer.toString(cal.get(Calendar.SECOND)));
-
     AlarmManager.getInstance().update(new JajukEvent(JajukEvents.ALARMS_CHANGE));
-
     // sleep a bit to let internal thread do some work
     Thread.sleep(2000);
   }
diff --git a/src/test/java/org/jajuk/services/bookmark/TestBookmarks.java b/src/test/java/org/jajuk/services/bookmark/TestBookmarks.java
index 97ff26c..c695122 100644
--- a/src/test/java/org/jajuk/services/bookmark/TestBookmarks.java
+++ b/src/test/java/org/jajuk/services/bookmark/TestBookmarks.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,34 +16,26 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.bookmark;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.File;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestBookmarks extends JajukTestCase {
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     Bookmarks.getInstance().clear();
-
-    super.setUp();
   }
 
   /**
@@ -62,12 +54,10 @@ public class TestBookmarks extends JajukTestCase {
   public void testToString() throws Exception {
     // TODO: this fails currently because it returns an empty string:
     // JUnitHelpers.ToStringTest(Bookmarks.getInstance());
-
     assertNotNull(Bookmarks.getInstance().toString());
-
     // test with some files
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
-    JUnitHelpers.ToStringTest(Bookmarks.getInstance());
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
+    TestHelpers.ToStringTest(Bookmarks.getInstance());
   }
 
   /**
@@ -77,11 +67,10 @@ public class TestBookmarks extends JajukTestCase {
    */
   public void testGetFiles() throws Exception {
     assertEquals(0, Bookmarks.getInstance().getFiles().size());
-
     // test with some files
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
     assertEquals(1, Bookmarks.getInstance().getFiles().size());
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
     assertEquals(2, Bookmarks.getInstance().getFiles().size());
   }
 
@@ -91,9 +80,8 @@ public class TestBookmarks extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testClear() throws Exception {
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
     assertEquals(1, Bookmarks.getInstance().getFiles().size());
-
     Bookmarks.getInstance().clear();
     assertEquals(0, Bookmarks.getInstance().getFiles().size());
   }
@@ -107,35 +95,29 @@ public class TestBookmarks extends JajukTestCase {
     // nothing happens without files
     Bookmarks.getInstance().down(0);
     Bookmarks.getInstance().up(0);
-
     // add some files
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file2", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file3", true));
-
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file2", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file3", true));
     // check the order
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(1).getName());
     assertEquals("file3", Bookmarks.getInstance().getFiles().get(2).getName());
-
     // down some
     Bookmarks.getInstance().down(1);
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file3", Bookmarks.getInstance().getFiles().get(1).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(2).getName());
-
     // up again
     Bookmarks.getInstance().up(1);
     assertEquals("file3", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(1).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(2).getName());
-
     // outside
     Bookmarks.getInstance().down(2);
     assertEquals("file3", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(1).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(2).getName());
-
     // outside
     Bookmarks.getInstance().up(0);
     assertEquals("file3", Bookmarks.getInstance().getFiles().get(0).getName());
@@ -150,10 +132,9 @@ public class TestBookmarks extends JajukTestCase {
    */
   public void testRemove() throws Exception {
     // add some files
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file2", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file3", true));
-
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file2", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file3", true));
     Bookmarks.getInstance().remove(0);
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file3", Bookmarks.getInstance().getFiles().get(1).getName());
@@ -168,16 +149,14 @@ public class TestBookmarks extends JajukTestCase {
    */
   public void testAddFileIntFile() throws Exception {
     // add some files
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file2", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file3", true));
-
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file2", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file3", true));
     // check the order
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(1).getName());
     assertEquals("file3", Bookmarks.getInstance().getFiles().get(2).getName());
-
-    Bookmarks.getInstance().addFile(1, JUnitHelpers.getFile("file4", true));
+    Bookmarks.getInstance().addFile(1, TestHelpers.getFile("file4", true));
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file4", Bookmarks.getInstance().getFiles().get(1).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(2).getName());
@@ -192,10 +171,9 @@ public class TestBookmarks extends JajukTestCase {
    */
   public void testAddFileFile() throws Exception {
     // add some files
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file2", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file3", true));
-
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file2", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file3", true));
     // check the order
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(1).getName());
@@ -210,14 +188,11 @@ public class TestBookmarks extends JajukTestCase {
    */
   public void testAddFiles() throws Exception {
     List<File> list = new ArrayList<File>();
-
     // add some files
-    list.add(JUnitHelpers.getFile("file1", true));
-    list.add(JUnitHelpers.getFile("file2", true));
-    list.add(JUnitHelpers.getFile("file3", true));
-
+    list.add(TestHelpers.getFile("file1", true));
+    list.add(TestHelpers.getFile("file2", true));
+    list.add(TestHelpers.getFile("file3", true));
     Bookmarks.getInstance().addFiles(list);
-
     // check the order
     assertEquals("file1", Bookmarks.getInstance().getFiles().get(0).getName());
     assertEquals("file2", Bookmarks.getInstance().getFiles().get(1).getName());
@@ -227,36 +202,33 @@ public class TestBookmarks extends JajukTestCase {
   // helper method to emma-coverage of the unused constructor
   /**
    * Test private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPrivateConstructor() throws Exception {
     // test with some files
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
-    Bookmarks.getInstance().addFile(JUnitHelpers.getFile("file1", true));
-
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
+    Bookmarks.getInstance().addFile(TestHelpers.getFile("file1", true));
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(Bookmarks.class);
+    TestHelpers.executePrivateConstructor(Bookmarks.class);
   }
 
   /**
    * Test coverage.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testCoverage() throws Exception {
     Conf.setProperty(Const.CONF_BOOKMARKS, "");
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(Bookmarks.class);
-
+    TestHelpers.executePrivateConstructor(Bookmarks.class);
     Conf.removeProperty(Const.CONF_BOOKMARKS);
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(Bookmarks.class);
-
+    TestHelpers.executePrivateConstructor(Bookmarks.class);
     Conf.setProperty(Const.CONF_BOOKMARKS, "1,2,3,4");
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(Bookmarks.class);
+    TestHelpers.executePrivateConstructor(Bookmarks.class);
   }
 }
diff --git a/src/test/java/org/jajuk/services/bookmark/TestHistory.java b/src/test/java/org/jajuk/services/bookmark/TestHistory.java
index d6ff142..988f685 100644
--- a/src/test/java/org/jajuk/services/bookmark/TestHistory.java
+++ b/src/test/java/org/jajuk/services/bookmark/TestHistory.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,15 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.bookmark;
 
 import java.util.Properties;
 
 import org.apache.commons.io.FileUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.File;
 import org.jajuk.base.FileManager;
 import org.jajuk.events.JajukEvent;
@@ -37,33 +37,9 @@ import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestHistory extends JajukTestCase {
-
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-  }
-
-  /**
-   * Test method for {@link org.jajuk.services.bookmark.History#startDocument()}
-   * .
-   */
-  public final void testStartDocument() {
-    History.getInstance().startDocument();
-  }
-
-  /**
-   * Test method for {@link org.jajuk.services.bookmark.History#endDocument()}.
-   */
-  public final void testEndDocument() {
-    History.getInstance().endDocument();
-  }
-
   /**
    * Test method for {@link org.jajuk.services.bookmark.History#getInstance()}.
    */
@@ -78,56 +54,48 @@ public class TestHistory extends JajukTestCase {
    */
   public final void testGetRegistrationKeys() {
     assertNotNull(History.getInstance().getRegistrationKeys());
-
     assertTrue(History.getInstance().getRegistrationKeys().contains(JajukEvents.CLEAR_HISTORY));
   }
 
   /**
-   * Test method for {@link org.jajuk.services.bookmark.History#getHistory()}.
+   * Test method for {@link org.jajuk.services.bookmark.History#getItems()}.
    *
    * @throws Exception the exception
    */
   public final void testGetHistory() throws Exception {
-    assertNotNull(History.getInstance().getHistory());
-
+    assertNotNull(History.getInstance().getItems());
     // has size 0 at the beginning
-    assertEquals(0, History.getInstance().getHistory().size());
-
+    assertEquals(0, History.getInstance().getItems().size());
     // try with history disabled, should return without adding
     Conf.setProperty(Const.CONF_HISTORY, "0");
     History.getInstance().addItem("1", 123);
-    assertEquals(0, History.getInstance().getHistory().size());
-
+    assertEquals(0, History.getInstance().getItems().size());
     // enable history, should still not be added unless we have the file in the
     // FileManager
     Conf.setProperty(Const.CONF_HISTORY, "1");
     History.getInstance().addItem("1", 123);
-    assertEquals(0, History.getInstance().getHistory().size());
-
+    assertEquals(0, History.getInstance().getItems().size());
     // register a new file with the file manager, but still no go as we have a
     // different id!
-    File file2 = JUnitHelpers.getFile("file2", false);
+    File file2 = TestHelpers.getFile("file2", false);
     History.getInstance().addItem("1", 123);
-    assertEquals(0, History.getInstance().getHistory().size());
-
+    assertEquals(0, History.getInstance().getItems().size());
     // finally look for the correct file with id "2"
     History.getInstance().addItem(file2.getID(), 123);
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // now try to update the history with more files
-    File file3 = JUnitHelpers.getFile("file3", false);
-    File file4 = JUnitHelpers.getFile("file4", false);
-    File file5 = JUnitHelpers.getFile("file5", false);
+    File file3 = TestHelpers.getFile("file3", false);
+    File file4 = TestHelpers.getFile("file4", false);
+    File file5 = TestHelpers.getFile("file5", false);
     History.getInstance().addItem(file3.getID(), 123);
     History.getInstance().addItem(file4.getID(), 123);
     History.getInstance().addItem(file5.getID(), 123);
-    assertEquals(4, History.getInstance().getHistory().size());
-
+    assertEquals(4, History.getInstance().getItems().size());
     // now try to add the same file as the last one, the new one should be
     // added, but not twice
     History.getInstance().addItem(file5.getID(), 124);
     // size the same, not one higher
-    assertEquals(4, History.getInstance().getHistory().size());
+    assertEquals(4, History.getInstance().getItems().size());
     // new item should be found in history now
     assertEquals("Item: " + History.getInstance().getHistoryItem(0).getDate(), 124, History
         .getInstance().getHistoryItem(0).getDate());
@@ -135,7 +103,7 @@ public class TestHistory extends JajukTestCase {
 
   /**
    * Test get history max size.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -143,50 +111,40 @@ public class TestHistory extends JajukTestCase {
     // enable history, should still not be added unless we have the file in the
     // FileManager
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     // register enough files (one more than the max size)
     File[] files = new File[Const.MAX_HISTORY_SIZE];
     for (int i = 0; i < Const.MAX_HISTORY_SIZE; i++) {
-      files[i] = JUnitHelpers.getFile("file" + i, false);
+      files[i] = TestHelpers.getFile("file" + i, false);
     }
-
     // add up to max items
     for (int i = 0; i < Const.MAX_HISTORY_SIZE; i++) {
       History.getInstance().addItem(files[i].getID(), 123);
-      assertEquals(i + 1, History.getInstance().getHistory().size());
+      assertEquals(i + 1, History.getInstance().getItems().size());
     }
-
     // size should at the max now
-    assertEquals(Const.MAX_HISTORY_SIZE, History.getInstance().getHistory().size());
-
+    assertEquals(Const.MAX_HISTORY_SIZE, History.getInstance().getItems().size());
     // register one more file
-    File max = JUnitHelpers.getFile("file" + Const.MAX_HISTORY_SIZE, false);
-
+    File max = TestHelpers.getFile("file" + Const.MAX_HISTORY_SIZE, false);
     // now when we add one item, we should loose the oldest one (i.e. ID "1")
     History.getInstance().addItem(max.getID(), 123);
-
     // size should be equal as the oldest item was purged
-    assertEquals(Const.MAX_HISTORY_SIZE, History.getInstance().getHistory().size());
-
+    assertEquals(Const.MAX_HISTORY_SIZE, History.getInstance().getItems().size());
     // new element should be in the History at position 0 now
-    assertEquals(History.getInstance().getHistory().toString(), max.getID(), History.getInstance()
+    assertEquals(History.getInstance().getItems().toString(), max.getID(), History.getInstance()
         .getHistoryItem(0).getFileId());
-
     // check that the existing items were moved by one (items are always added at the front, so 
     // we have to check in reverse order, i.e. the one before the last added one is at pos 1
     for (int i = 1; i < Const.MAX_HISTORY_SIZE; i++) {
-      assertEquals(History.getInstance().getHistory().toString(), files[Const.MAX_HISTORY_SIZE - i]
-          .getID(), History.getInstance().getHistoryItem(i).getFileId());
+      assertEquals(History.getInstance().getItems().toString(),
+          files[Const.MAX_HISTORY_SIZE - i].getID(), History.getInstance().getHistoryItem(i)
+              .getFileId());
     }
-
     // also check clear
     History.getInstance().clear();
-
     // we have to wait for it as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // size should be zero again now
-    assertEquals(0, History.getInstance().getHistory().size());
+    assertEquals(0, History.getInstance().getItems().size());
   }
 
   /**
@@ -214,44 +172,34 @@ public class TestHistory extends JajukTestCase {
   public final void testCleanup() throws Exception {
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     // register the file
-    File file2 = JUnitHelpers.getFile("file2", false);
-
+    File file2 = TestHelpers.getFile("file2", false);
     // add the file
     History.getInstance().addItem(file2.getID(), 123);
-
     // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // cleanup should keep this file as it is registered correctly
     History.getInstance().cleanup();
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(1, History.getInstance().getItems().size());
     // add another file and unregister it from the FileManager
-    File file3 = JUnitHelpers.getFile("file3", false);
+    File file3 = TestHelpers.getFile("file3", false);
     History.getInstance().addItem(file3.getID(), 123);
-    assertEquals(2, History.getInstance().getHistory().size());
+    assertEquals(2, History.getInstance().getItems().size());
     FileManager.getInstance().removeFile(file3);
-    assertEquals(2, History.getInstance().getHistory().size());
-
+    assertEquals(2, History.getInstance().getItems().size());
     // cleanup should now remove one file!
     History.getInstance().cleanup();
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(1, History.getInstance().getItems().size());
     // if we clean out FileManager, cleanup should remove this file as well
     FileManager.getInstance().clear();
     History.getInstance().cleanup();
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(0, History.getInstance().getHistory().size());
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(0, History.getInstance().getItems().size());
   }
 
   /**
@@ -264,22 +212,17 @@ public class TestHistory extends JajukTestCase {
   public final void testChangeID() throws Exception {
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     // register the file
-    File file2 = JUnitHelpers.getFile("file2", false);
-
+    File file2 = TestHelpers.getFile("file2", false);
     // add the file
     History.getInstance().addItem(file2.getID(), 123);
-
     // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // change from id 2 to 3
     History.getInstance().changeID(file2.getID(), "3");
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(1, History.getInstance().getHistory().size());
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(1, History.getInstance().getItems().size());
     assertEquals("3", History.getInstance().getHistoryItem(0).getFileId());
     // it is not automatically changed in FileManager itself!
     assertNull(FileManager.getInstance().getFileByID("3"));
@@ -293,70 +236,58 @@ public class TestHistory extends JajukTestCase {
   public final void testClearInt() throws Exception {
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     // register the file
-    File file2 = JUnitHelpers.getFile("file2", false);
-
+    File file2 = TestHelpers.getFile("file2", false);
     // add the file
     History.getInstance().addItem(file2.getID(), 123);
-
     // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // minus 1 means endlessly
     History.getInstance().clear(-1);
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(1, History.getInstance().getItems().size());
     // stating a day will clean the file
     History.getInstance().clear(2);
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(0, History.getInstance().getHistory().size());
+    TestHelpers.clearSwingUtilitiesQueue();
+    // history size = 1 because we keep at least last track
+    assertEquals(0, History.getInstance().getItems().size());
   }
 
   /**
    * Test clear int keep.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testClearIntKeep() throws Exception {
     addHistoryItem(2, System.currentTimeMillis());
-
     // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // stating a day bigger than one will keep the file
     History.getInstance().clear(2);
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(1, History.getInstance().getHistory().size());
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(1, History.getInstance().getItems().size());
   }
 
   /**
    * Test clear int removed.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testClearIntRemoved() throws Exception {
     addHistoryItem(2, System.currentTimeMillis());
-
     // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // cleaning the FileManager will also remove the history for the files
     FileManager.getInstance().clear();
     History.getInstance().clear(2);
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(0, History.getInstance().getHistory().size());
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(0, History.getInstance().getItems().size());
   }
 
   /**
@@ -367,38 +298,29 @@ public class TestHistory extends JajukTestCase {
   public final void testCommit() throws Exception {
     long date = System.currentTimeMillis();
     addHistoryItem(2, date);
-
     // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
-    JUnitHelpers.createSessionDirectory();
-
+    assertEquals(1, History.getInstance().getItems().size());
     // write the list to disc
     History.commit();
-
     // item still there
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // clear the history, now the item is gone
     History.getInstance().clear();
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
-    assertEquals(0, History.getInstance().getHistory().size());
-
+    TestHelpers.clearSwingUtilitiesQueue();
+    assertEquals(0, History.getInstance().getItems().size());
     // now load the data again
     History.load();
-
     // the item is there again now
-    assertEquals(1, History.getInstance().getHistory().size());
+    assertEquals(1, History.getInstance().getItems().size());
     assertEquals(date, History.getInstance().getHistoryItem(0).getDate());
   }
 
   /**
    * Adds the history item.
-   * DOCUMENT_ME
+   * 
    *
-   * @param nID DOCUMENT_ME
+   * @param nID 
    * @param timestamp The timestamp to use for the HistoryItem
    * @throws NumberFormatException the number format exception
    * @throws Exception the exception
@@ -406,10 +328,8 @@ public class TestHistory extends JajukTestCase {
   private void addHistoryItem(int nID, long timestamp) throws NumberFormatException, Exception {
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     // register the file
-    File file = JUnitHelpers.getFile("file_" + nID, false);
-
+    File file = TestHelpers.getFile("file_" + nID, false);
     // add the file with current date
     History.getInstance().addItem(file.getID(), timestamp);
   }
@@ -423,56 +343,22 @@ public class TestHistory extends JajukTestCase {
 
   /**
    * Test load corrupt file.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testLoadCorruptFile() throws Exception {
-    JUnitHelpers.createSessionDirectory();
-
     // first try when no file is available
     java.io.File frt = SessionService.getConfFileByPath(Const.FILE_HISTORY);
     frt.delete();
     assertFalse(frt.exists());
-
     // it will catch an exception internally and handle it...
     History.load();
-
     // then try with a corrupted file
     FileUtils.writeStringToFile(frt, "<this is an invalid xML>");
   }
 
   /**
-   * Test method for {@link org.jajuk.services.bookmark.History#getLastFile()}.
-   *
-   * @throws NumberFormatException the number format exception
-   * @throws Exception the exception
-   */
-  public final void testGetLastFile() throws NumberFormatException, Exception {
-    // null without history
-    assertNull(History.getInstance().getLastFile());
-
-    addHistoryItem(2, 123);
-
-    // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
-    // now returns the correct item
-    File file2 = JUnitHelpers.getFile("file_2", false);
-    assertEquals(file2.getID(), History.getInstance().getLastFile());
-
-    addHistoryItem(3, 123);
-    File file3 = JUnitHelpers.getFile("file_3", false);
-    assertEquals(file3.getID(), History.getInstance().getLastFile());
-
-    // now it is there
-    assertEquals(2, History.getInstance().getHistory().size());
-
-    addHistoryItem(2, 123);
-    assertEquals(file2.getID(), History.getInstance().getLastFile());
-  }
-
-  /**
    * Test method for.
    *
    * @throws NumberFormatException the number format exception
@@ -482,23 +368,18 @@ public class TestHistory extends JajukTestCase {
   public final void testGetHistoryItem() throws NumberFormatException, Exception {
     // null without any history
     assertNull(History.getInstance().getHistoryItem(0));
-
     addHistoryItem(2, 123);
-
     // now it is there
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // found now
-    File file2 = JUnitHelpers.getFile("file_2", false);
+    File file2 = TestHelpers.getFile("file_2", false);
     assertEquals(file2.getID(), History.getInstance().getHistoryItem(0).getFileId());
-
     // null with index out of bound
     assertNull(History.getInstance().getHistoryItem(1));
     assertNull(History.getInstance().getHistoryItem(-1));
-
     // try with more than one item, the new one is added as first item!
     addHistoryItem(4, 123);
-    File file4 = JUnitHelpers.getFile("file_4", false);
+    File file4 = TestHelpers.getFile("file_4", false);
     assertEquals(file4.getID(), History.getInstance().getHistoryItem(0).getFileId());
     assertEquals(file2.getID(), History.getInstance().getHistoryItem(1).getFileId());
   }
@@ -578,75 +459,63 @@ public class TestHistory extends JajukTestCase {
   public final void testUpdateFileLaunched() throws Exception {
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     addHistoryItem(2, 12345);
-    assertEquals(1, History.getInstance().getHistory().size());
-
-    File file3 = JUnitHelpers.getFile("file_3", false);
-
+    assertEquals(1, History.getInstance().getItems().size());
+    File file3 = TestHelpers.getFile("file_3", false);
     Properties detail = new Properties();
     detail.put(Const.DETAIL_CURRENT_FILE_ID, file3.getID());
     detail.put(Const.DETAIL_CURRENT_DATE, new Long(12345));
-
     History.getInstance().update(new JajukEvent(JajukEvents.FILE_LAUNCHED, detail));
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // now the file should be added
-    assertEquals(2, History.getInstance().getHistory().size());
+    assertEquals(2, History.getInstance().getItems().size());
     assertEquals(file3.getID(), History.getInstance().getHistoryItem(0).getFileId());
   }
 
   /**
    * Test update device refresh.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testUpdateDeviceRefresh() throws Exception {
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     addHistoryItem(2, 12345);
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // remove the file from the FileManager
     FileManager.getInstance().clear();
-
     // trigger the refresh-event
     History.getInstance().update(new JajukEvent(JajukEvents.DEVICE_REFRESH, null));
     // we have to sleep a bit as it is executed in the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
+    TestHelpers.clearSwingUtilitiesQueue();
     // we need to wait a second time because we have an invokeLater() inside
     // another invokeLater() here...
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // now the item is removed because it is not available any more in the
     // FileManager
-    assertEquals(0, History.getInstance().getHistory().size());
+    assertEquals(0, History.getInstance().getItems().size());
   }
 
   /**
    * Test update clear history.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testUpdateClearHistory() throws Exception {
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     addHistoryItem(14, 12345);
-    assertEquals(1, History.getInstance().getHistory().size());
-
+    assertEquals(1, History.getInstance().getItems().size());
     // trigger the clear-event
     History.getInstance().update(new JajukEvent(JajukEvents.CLEAR_HISTORY, null));
     // here we actually have to sleep a few times as there are two thread-calls
     // done, once inside update() and then
     // another one in clear() itself, one "sleep()" only gives up thread-control
     // once and then gains control again later
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // now the item is cleared
     // TODO: this test fails in Hudson for some reason, I could not find out
     // why, it works
@@ -658,7 +527,7 @@ public class TestHistory extends JajukTestCase {
 
   /**
    * Test update language changed.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateLanguageChanged() {
     History.getInstance().update(new JajukEvent(JajukEvents.LANGUAGE_CHANGED, null));
@@ -666,7 +535,7 @@ public class TestHistory extends JajukTestCase {
 
   /**
    * Test update file name changed.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -675,29 +544,23 @@ public class TestHistory extends JajukTestCase {
     // some updates,
     // therefore sleep some more up-front to let that clear out before we start
     // the test here
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
     // register the file
-    File file11 = JUnitHelpers.getFile("file_11", false);
-    File file3 = JUnitHelpers.getFile("file_3", false);
-
+    File file11 = TestHelpers.getFile("file_11", false);
+    File file3 = TestHelpers.getFile("file_3", false);
     // add the file
     History.getInstance().addItem(file11.getID(), 123);
-
     // now it is there
-    assertEquals(History.getInstance().getHistory().toString(), 1, History.getInstance()
-        .getHistory().size());
-
+    assertEquals(History.getInstance().getItems().toString(), 1, History.getInstance().getItems()
+        .size());
     // change from id 11 to 3
     Properties detail = new Properties();
     File file = FileManager.getInstance().getFileByID(file11.getID());
     // there needs to be such a file because we added it above...
     assertNotNull(file);
     detail.put(Const.DETAIL_OLD, file);
-
     // read the file "3" and then remove it from the filemanager to be clean
     // there as well
     file = FileManager.getInstance().getFileByID(file3.getID());
@@ -705,20 +568,17 @@ public class TestHistory extends JajukTestCase {
     assertNotNull(file);
     detail.put(Const.DETAIL_NEW, file);
     FileManager.getInstance().removeFile(file);
-
     // now trigger the update
     History.getInstance().update(new JajukEvent(JajukEvents.FILE_NAME_CHANGED, detail));
-
     // we have to wait for the SwingUtilities here as the update is executed in
     // the background
-    JUnitHelpers.clearSwingUtilitiesQueue();
+    TestHelpers.clearSwingUtilitiesQueue();
     // we actually execute an invokeLater() in another invokeLater() which means
     // we need to
     // wait twice here until all work is guaranteed to be done
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // now we only should have the item "3"
-    assertEquals(1, History.getInstance().getHistory().size());
+    assertEquals(1, History.getInstance().getItems().size());
     // TODO: this test fails in Hudson for some reason, I could not find out
     // why, it works
     // in Eclipse as well as in a local Hudson instance that I did set up, so I
@@ -729,7 +589,7 @@ public class TestHistory extends JajukTestCase {
 
   /**
    * Test update unhandled event.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateUnhandledEvent() {
     History.getInstance().update(new JajukEvent(JajukEvents.BANNED, null));
@@ -746,7 +606,7 @@ public class TestHistory extends JajukTestCase {
 
   /**
    * Test constructor already launched.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -755,40 +615,30 @@ public class TestHistory extends JajukTestCase {
     // updates,
     // therefore sleep some more up-front to let that clear out before we start
     // the test here
-    JUnitHelpers.clearSwingUtilitiesQueue();
+    TestHelpers.clearSwingUtilitiesQueue();
     Thread.sleep(100);
-
     // enable history
     Conf.setProperty(Const.CONF_HISTORY, "1");
-
-    File file3 = JUnitHelpers.getFile("file_3", false);
-
+    File file3 = TestHelpers.getFile("file_3", false);
     Properties detail = new Properties();
     detail.put(Const.DETAIL_CURRENT_FILE_ID, file3.getID());
     detail.put(Const.DETAIL_CURRENT_DATE, new Long(12345));
-
     // set the necessary things in the ObservationManager
     ObservationManager.notifySync(new JajukEvent(JajukEvents.FILE_LAUNCHED, detail));
-
     // make sure we have the correct last-file now
     assertEquals(file3.getID(), ObservationManager.getDetailLastOccurence(
         JajukEvents.FILE_LAUNCHED, Const.DETAIL_CURRENT_FILE_ID));
-
     // call the constructor via reflection
-    History hist = JUnitHelpers.executePrivateConstructor(History.class);
-
+    History hist = TestHelpers.executePrivateConstructor(History.class);
     // we have to wait for the queue to be empty
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // it seems there is sometimes still work done by other tests, we saw
     // failures here,
     // I added this check here again to see if that actually happens...
     assertEquals(file3.getID(), ObservationManager.getDetailLastOccurence(
         JajukEvents.FILE_LAUNCHED, Const.DETAIL_CURRENT_FILE_ID));
-
     // now the file should be in the history already
-    assertEquals(hist.getHistory().toString(), 1, hist.getHistory().size());
+    assertEquals(hist.getItems().toString(), 1, hist.getItems().size());
     assertEquals(file3.getID(), hist.getHistoryItem(0).getFileId());
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/bookmark/TestHistoryItem.java b/src/test/java/org/jajuk/services/bookmark/TestHistoryItem.java
index 8669259..2223f45 100644
--- a/src/test/java/org/jajuk/services/bookmark/TestHistoryItem.java
+++ b/src/test/java/org/jajuk/services/bookmark/TestHistoryItem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,12 +16,13 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.bookmark;
 
-import org.jajuk.JUnitHelpers;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -37,9 +38,12 @@ import org.jajuk.base.Year;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestHistoryItem extends JajukTestCase {
+  @Override
+  protected void specificSetUp() throws Exception {
+  }
 
   /**
    * Test method for.
@@ -47,7 +51,6 @@ public class TestHistoryItem extends JajukTestCase {
    * {@link org.jajuk.services.bookmark.HistoryItem#HistoryItem(java.lang.String, long)}
    * .
    */
-
   public final void testHistoryItem() {
     new HistoryItem("1", 123);
   }
@@ -55,13 +58,10 @@ public class TestHistoryItem extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.bookmark.HistoryItem#getDate()}.
    */
-
   public final void testGetAndSetDate() {
     long date = System.currentTimeMillis();
     HistoryItem item = new HistoryItem("1", date);
-
     assertEquals(date, item.getDate());
-
     item.setDate(123);
     assertEquals(123, item.getDate());
   }
@@ -70,61 +70,46 @@ public class TestHistoryItem extends JajukTestCase {
    * Test method for {@link org.jajuk.services.bookmark.HistoryItem#getFileId()}
    * .
    */
-
   public final void testGetAndSetFileId() {
     long date = System.currentTimeMillis();
     HistoryItem item = new HistoryItem("1", date);
-
     assertEquals("1", item.getFileId());
-
     item.setFileId("2");
     assertEquals("2", item.getFileId());
-
   }
 
   /**
    * Test method for {@link org.jajuk.services.bookmark.HistoryItem#toString()}.
    */
-
   public final void testToStringNull() {
     long date = System.currentTimeMillis();
     HistoryItem item = new HistoryItem("1", date);
-
-    JUnitHelpers.ToStringTest(item);
+    TestHelpers.ToStringTest(item);
   }
 
   /**
    * Test to string file.
-   * DOCUMENT_ME
+   * 
    */
   public final void testToStringFile() {
     File file;
-    {
-      Genre genre = JUnitHelpers.getGenre("genrename");
-      Album album = JUnitHelpers.getAlbum("myalbum", 0);
-      album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
-      // this test
-
-      Artist artist = JUnitHelpers.getArtist("artistname");
-      Year year = JUnitHelpers.getYear(2000);
-
-      Type type = JUnitHelpers.getType();
-      Track track = TrackManager.getInstance().registerTrack("trackname", album, genre, artist,
-          120, year, 1, type, 1);
-
-      Device device = JUnitHelpers.getDevice("devicename", Device.TYPE_DIRECTORY, System
-          .getProperty("java.io.tmpdir"));
-
-      Directory dir = DirectoryManager.getInstance().registerDirectory(device);
-      file = FileManager.getInstance().registerFile("test.tst", dir, track, 120, 70);
-    }
-
+    Genre genre = TestHelpers.getGenre("genrename");
+    Album album = TestHelpers.getAlbum("myalbum", 0);
+    album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
+    // this test
+    Artist artist = TestHelpers.getArtist("artistname");
+    Year year = TestHelpers.getYear(2000);
+    Type type = TestHelpers.getType();
+    Track track = TrackManager.getInstance().registerTrack("trackname", album, genre, artist, 120,
+        year, 1, type, 1);
+    Device device = TestHelpers.getDevice("devicename", Device.Type.DIRECTORY,
+        ConstTest.DEVICES_BASE_PATH + "/device1");
+    Directory dir = DirectoryManager.getInstance().registerDirectory(device);
+    file = FileManager.getInstance().registerFile("test.tst", dir, track, 120, 70);
     long date = System.currentTimeMillis();
     HistoryItem item = new HistoryItem(file.getID(), date);
-
     // verify toString in general
-    JUnitHelpers.ToStringTest(item);
-
+    TestHelpers.ToStringTest(item);
     // verify that the necessary information is contained
     assertTrue(item.toString(), item.toString().contains("trackname"));
     assertTrue(item.toString(), item.toString().contains("artistname"));
diff --git a/src/test/java/org/jajuk/services/cddb/TestCDDBTrack.java b/src/test/java/org/jajuk/services/cddb/TestCDDBTrack.java
index 4a14640..5a75dee 100644
--- a/src/test/java/org/jajuk/services/cddb/TestCDDBTrack.java
+++ b/src/test/java/org/jajuk/services/cddb/TestCDDBTrack.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,12 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.cddb;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Genre;
@@ -33,10 +33,9 @@ import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestCDDBTrack extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -67,7 +66,6 @@ public class TestCDDBTrack extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.cddb.CDDBTrack#getTrack()}.
    */
-
   public final void testGetTrack() {
     CDDBTrack track = new CDDBTrack(getTrack(1));
     assertNotNull(track.getTrack());
@@ -76,32 +74,27 @@ public class TestCDDBTrack extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.cddb.CDDBTrack#toString()}.
    */
-
   public final void testToString() {
     StartupCollectionService.registerItemManagers();
-
     CDDBTrack track = new CDDBTrack(getTrack(1));
-    JUnitHelpers.ToStringTest(track);
+    TestHelpers.ToStringTest(track);
   }
 
   /**
    * Gets the track.
    *
-   * @param i DOCUMENT_ME
+   * @param i 
    * @return the track
    */
   private Track getTrack(int i) {
-    Genre genre = JUnitHelpers.getGenre();
-    Album album = JUnitHelpers.getAlbum("myalbum", 0);
+    Genre genre = TestHelpers.getGenre();
+    Album album = TestHelpers.getAlbum("myalbum", 0);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-
-    Type type = JUnitHelpers.getType();
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
+    Type type = TestHelpers.getType();
     return TrackManager.getInstance().registerTrack("name" + i, album, genre, artist, 120, year, 1,
         type, 1);
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/core/TestExitService.java b/src/test/java/org/jajuk/services/core/TestExitService.java
index 19b5070..6b9341a 100644
--- a/src/test/java/org/jajuk/services/core/TestExitService.java
+++ b/src/test/java/org/jajuk/services/core/TestExitService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,37 +16,26 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.core;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
 import org.jajuk.services.startup.StartupCollectionService;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestExitService extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.services.core.ExitService#run()}.
    *
    * @throws Exception the exception
    */
   public void testRun() throws Exception {
-    JUnitHelpers.createSessionDirectory();
-
     StartupCollectionService.registerItemManagers();
-
     ExitService service = new ExitService();
     service.run();
-
-    // once again with sessionidfile
-    SessionService.getSessionIdFile().getParentFile().mkdirs();
-    SessionService.getSessionIdFile().createNewFile();
-    service.run();
-
   }
 
   /**
@@ -62,7 +51,6 @@ public class TestExitService extends JajukTestCase {
   public void testExit() {
     ExitService service = new ExitService();
     assertNotNull(service);
-
     // don't run this as it stops the JVM! service.exit(1);
   }
 
@@ -72,5 +60,4 @@ public class TestExitService extends JajukTestCase {
   public void testIsExiting() {
     assertFalse(ExitService.isExiting());
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/core/TestRatingManager.java b/src/test/java/org/jajuk/services/core/TestRatingManager.java
index 6076c75..8267f91 100644
--- a/src/test/java/org/jajuk/services/core/TestRatingManager.java
+++ b/src/test/java/org/jajuk/services/core/TestRatingManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,14 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.core;
 
 import java.util.Set;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.MockPlayer;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -32,7 +33,6 @@ import org.jajuk.base.DirectoryManager;
 import org.jajuk.base.File;
 import org.jajuk.base.FileManager;
 import org.jajuk.base.Genre;
-import org.jajuk.base.TestAlbumManager.MockPlayer;
 import org.jajuk.base.TestAlbumManager.MyTagImpl;
 import org.jajuk.base.Track;
 import org.jajuk.base.TrackManager;
@@ -46,13 +46,9 @@ import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.services.tags.ITagImpl;
 import org.jajuk.util.Const;
 
-/**
- * DOCUMENT_ME.
- */
 public class TestRatingManager extends JajukTestCase {
-
   /**
-   * Test method for {@link org.jajuk.services.core.RatingManager#run()}.
+   * Test method for {@link org.jajuk.services.core.RatingService#run()}.
    */
   public void testRun() {
     // cannot be tested, is an endless loop:
@@ -60,33 +56,32 @@ public class TestRatingManager extends JajukTestCase {
   }
 
   /**
-   * Test method for {@link org.jajuk.services.core.RatingManager#getInstance()}
+   * Test method for {@link org.jajuk.services.core.RatingService#getInstance()}
    * .
    */
   public void testGetInstance() {
-    assertNotNull(RatingManager.getInstance());
+    assertNotNull(RatingService.getInstance());
   }
 
   /**
    * Test method for.
    *
-   * {@link org.jajuk.services.core.RatingManager#getMaxPlaycount()}.
+   * {@link org.jajuk.services.core.RatingService#getMaxPlaycount()}.
    */
   public void testGetAndSetMaxPlaycount() {
     // Reset the rating manager
-    RatingManager.getInstance().update(new JajukEvent(JajukEvents.RATE_RESET, null));
-    assertEquals(0, RatingManager.getMaxPlaycount());
-    RatingManager.setMaxPlaycount(10);
-    assertEquals(10, RatingManager.getMaxPlaycount());
-
+    RatingService.getInstance().update(new JajukEvent(JajukEvents.RATE_RESET, null));
+    assertEquals(0, RatingService.getMaxPlaycount());
+    RatingService.setMaxPlaycount(10);
+    assertEquals(10, RatingService.getMaxPlaycount());
     // set back to 0 as there is special handling
-    RatingManager.setMaxPlaycount(0);
+    RatingService.setMaxPlaycount(0);
   }
 
   /**
    * Test method for.
    *
-   * {@link org.jajuk.services.core.RatingManager#setMaxPlaycount(long)}.
+   * {@link org.jajuk.services.core.RatingService#setMaxPlaycount(long)}.
    */
   public void testSetMaxPlaycount() {
     // tested above
@@ -95,37 +90,10 @@ public class TestRatingManager extends JajukTestCase {
   /**
    * Test method for.
    *
-   * {@link org.jajuk.services.core.RatingManager#hasRateChanged()}.
-   */
-  public void testHasAndSetRateChanged() {
-    assertTrue(RatingManager.hasRateChanged());
-
-    RatingManager.setRateHasChanged(false);
-
-    assertFalse(RatingManager.hasRateChanged());
-
-    RatingManager.setRateHasChanged(true);
-
-    assertTrue(RatingManager.hasRateChanged());
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.RatingManager#setRateHasChanged(boolean)}.
-   */
-  public void testSetRateHasChanged() {
-    // tested above
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.RatingManager#getRegistrationKeys()}.
+   * {@link org.jajuk.services.core.RatingService#getRegistrationKeys()}.
    */
   public void testGetRegistrationKeys() {
-    Set<JajukEvents> set = RatingManager.getInstance().getRegistrationKeys();
-
+    Set<JajukEvents> set = RatingService.getInstance().getRegistrationKeys();
     assertTrue(set.toString(), set.contains(JajukEvents.RATE_RESET));
   }
 
@@ -133,47 +101,42 @@ public class TestRatingManager extends JajukTestCase {
    * Test method for.
    *
    * @throws Exception the exception
-   * {@link org.jajuk.services.core.RatingManager#update(org.jajuk.events.JajukEvent)}
+   * {@link org.jajuk.services.core.RatingService#update(org.jajuk.events.JajukEvent)}
    * .
    */
   public void testUpdate() throws Exception {
     StartupCollectionService.registerItemManagers();
-
     // update uses some Tracks
     getTrack(1);
     getTrack(2);
-
-    RatingManager.getInstance().update(new JajukEvent(JajukEvents.RATE_RESET, null));
-    RatingManager.getInstance().update(new JajukEvent(JajukEvents.PREFERENCES_RESET, null));
+    RatingService.getInstance().update(new JajukEvent(JajukEvents.RATE_RESET, null));
+    RatingService.getInstance().update(new JajukEvent(JajukEvents.PREFERENCES_RESET, null));
   }
 
   /**
    * Gets the track.
    *
-   * @param i DOCUMENT_ME
+   * @param i 
    * @return the track
    * @throws Exception the exception
    */
   @SuppressWarnings("unchecked")
   private Track getTrack(int i) throws Exception {
-    Genre genre = JUnitHelpers.getGenre();
-    Album album = JUnitHelpers.getAlbum("name", 23);
+    Genre genre = TestHelpers.getGenre();
+    Album album = TestHelpers.getAlbum("name", 23);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
     IPlayerImpl imp = new MockPlayer();
     Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
     ITagImpl tagimp = new MyTagImpl();
     Class<ITagImpl> tl = (Class<ITagImpl>) tagimp.getClass();
-
-    Type type = JUnitHelpers.getType();
+    Type type = TestHelpers.getType();
     Track track = TrackManager.getInstance().registerTrack(Integer.valueOf(i).toString(), "name",
         album, genre, artist, 120, year, 1, type, 1);
     album.getTracksCache().add(track);
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
     File file = FileManager.getInstance().registerFile("test.tst", dir, track, 120, 70);
     track.addFile(file);
@@ -181,4 +144,13 @@ public class TestRatingManager extends JajukTestCase {
     return track;
   }
 
+  public void testGetRateForPreference() {
+    assertEquals(RatingService.getRateForPreference(-3l), 0);
+    assertEquals(RatingService.getRateForPreference(-2l), 17);
+    assertEquals(RatingService.getRateForPreference(-1l), 33);
+    assertEquals(RatingService.getRateForPreference(0l), 50);
+    assertEquals(RatingService.getRateForPreference(1l), 67);
+    assertEquals(RatingService.getRateForPreference(2l), 83);
+    assertEquals(RatingService.getRateForPreference(3l), 100);
+  }
 }
diff --git a/src/test/java/org/jajuk/services/core/TestSessionService.java b/src/test/java/org/jajuk/services/core/TestSessionService.java
deleted file mode 100644
index d3981aa..0000000
--- a/src/test/java/org/jajuk/services/core/TestSessionService.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
- *  http://jajuk.info
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU General Public License
- *  as published by the Free Software Foundation; either version 2
- *  of the License, or any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
- */
-package org.jajuk.services.core;
-
-import java.io.File;
-import java.net.URL;
-
-import org.apache.commons.io.FileUtils;
-import org.jajuk.JUnitHelpers;
-import org.jajuk.JajukTestCase;
-import org.jajuk.util.Const;
-import org.jajuk.util.UtilSystem;
-import org.jajuk.util.error.JajukRuntimeException;
-
-/**
- * DOCUMENT_ME.
- */
-public class TestSessionService extends JajukTestCase {
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
-  @Override
-  protected void setUp() throws Exception {
-    // reset some of the values...
-    JUnitHelpers.createSessionDirectory();
-
-    super.setUp();
-  }
-
-  /**
-   * Test method for.
-   *
-   * @throws Exception the exception
-   * {@link org.jajuk.services.core.SessionService#checkOtherSession()}.
-   */
-  public void testCheckOtherSession() throws Exception {
-    SessionService.checkOtherSession();
-  }
-
-  /**
-   * Test method for {@link org.jajuk.services.core.SessionService#isIdeMode()}.
-   */
-  public void testIsIdeMode() {
-    // depends on startup
-    SessionService.isIdeMode();
-  }
-
-  /**
-   * Test method for {@link org.jajuk.services.core.SessionService#isTestMode()}
-   * .
-   */
-  public void testIsTestMode() {
-    // depends on startup
-    SessionService.isTestMode();
-  }
-
-  /**
-   * Test method for.
-   *
-   * @throws Exception the exception
-   * {@link org.jajuk.services.core.SessionService#getWorkspace()}.
-   */
-  public void testGetWorkspace() throws Exception {
-    assertNotNull(SessionService.getWorkspace());
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#setTestMode(boolean)}.
-   */
-  public void testSetTestMode() {
-    SessionService.setTestMode(true);
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#setWorkspace(java.lang.String)}
-   * .
-   */
-  public void testSetWorkspace() {
-    SessionService.setWorkspace("testworkspace");
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#getSessionIdFile()}.
-   */
-  public void testGetSessionIdFile() {
-    assertNotNull(SessionService.getSessionIdFile());
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#handleCommandline(java.lang.String[])}
-   * .
-   */
-  public void testHandleCommandline() {
-    SessionService.handleCommandline(new String[] {});
-    SessionService.handleCommandline(new String[] { "-test", "-ide", "-something" });
-    assertFalse(parseWorkspaceLocation(""));
-    assertFalse(parseWorkspaceLocation("/foo"));
-    String tmpDir = System.getProperty("java.io.tmpdir");
-    String rightWorkspaceLocation = tmpDir;
-    assertTrue(parseWorkspaceLocation(rightWorkspaceLocation));
-    SessionService.handleCommandline(new String[] { "-test", "-ide", "-workspace=" + tmpDir,
-        "-something" });
-  }
-
-  /**
-   * Return true if the workspace location is valid.
-   *
-   * @param workspaceLocation DOCUMENT_ME
-   * @return true if the workspace location is valid
-   */
-  private boolean parseWorkspaceLocation(String workspaceLocation) {
-    try {
-      // next line should throw a runtime exception
-      SessionService.handleCommandline(new String[] { "-test", "-ide", "-something",
-          "-workspace=" + workspaceLocation });
-      return true;
-    } catch (JajukRuntimeException e) {
-      return false;
-    }
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#handleSystemProperties()}.
-   */
-  public void testHandleSystemProperties() {
-    SessionService.handleSystemProperties();
-
-    System.setProperty("ide", "true");
-    System.setProperty("test", "true");
-    SessionService.handleSystemProperties();
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#createSessionFile()}.
-   */
-  public void testCreateSessionFile() {
-    SessionService.createSessionFile();
-
-    SessionService.setWorkspace("/invalidpath");
-    SessionService.createSessionFile();
-  }
-
-  /**
-   * Test method for.
-   *
-   * @throws Exception the exception
-   * {@link org.jajuk.services.core.SessionService#discoverWorkspace()}.
-   * @TODO : perform more tests
-   */
-  public void testDiscoverWorkspace() throws Exception {
-    { // ensure that the base jajuk-directory exists, otherwise the
-      // "first time wizard" is run, which blocks the test
-      File bootstrap = new File(SessionService.getBootstrapPath());
-
-      // try to create it if it is missing
-      if (!bootstrap.exists()) {
-        String content = "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n"+
-                          "<properties><entry key='final'>"+UtilSystem.getUserHome()+"</entry>\n"+
-                          "<entry key='test'>"+UtilSystem.getUserHome()+"</entry>\n</properties>";
-        FileUtils.writeStringToFile(bootstrap, content);
-      }
-
-      // needs to be a directory, needs to be readable, ...
-      assertTrue(bootstrap.isFile());
-      assertTrue(bootstrap.canRead());
-    }
-
-    // Reset CLI parameters
-    SessionService.handleCommandline(new String[] { "-test", "-ide", "-something" });
-    SessionService.discoverWorkspace();
-
-    // without test mode...
-    SessionService.setTestMode(false);
-    SessionService.discoverWorkspace();
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#notifyFirstTimeWizardClosed()}
-   * .
-   */
-  public void testNotifyFirstTimeWizardClosed() {
-    SessionService.notifyFirstTimeWizardClosed();
-  }
-
-  /**
-   * Test method for.
-   *
-   * @throws Exception the exception
-   * {@link org.jajuk.services.core.SessionService#getCachePath(java.net.URL)}.
-   */
-  public void testGetCachePath() throws Exception {
-    assertNotNull(SessionService.getCachePath(new URL("ftp://example.com/")));
-    assertNotNull(SessionService.getCachePath(new URL("http://ww.example.com/")));
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#getConfFileByPath(java.lang.String)}
-   * .
-   */
-  public void testGetConfFileByPath() {
-    SessionService.getConfFileByPath("/tmp");
-
-    SessionService.setTestMode(false);
-    SessionService.getConfFileByPath("/tmp");
-    SessionService.setTestMode(true);
-    SessionService.getConfFileByPath("/tmp");
-
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.services.core.SessionService#getDefaultCollectionPath()}.
-   */
-  public void testGetDefaultWorkspace() {
-    SessionService.getDefaultCollectionPath();
-  }
-
-  /**
-   * Test method for {@link org.jajuk.services.core.SessionService#clearCache()}
-   * .
-   *
-   * @throws Exception the exception
-   */
-  public void testClearCache() throws Exception {
-    SessionService.clearCache();
-
-    // create some dummy file
-    File file = SessionService.getConfFileByPath(Const.FILE_CACHE);
-    assertNotNull(file);
-    File.createTempFile("cache", ".tst", file);
-    SessionService.clearCache();
-  }
-
-  // helper method to emma-coverage of the unused constructor
-  // For EMMA code-coverage tests
-  /**
-   * Test private constructor.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testPrivateConstructor() throws Exception {
-    JUnitHelpers.executePrivateConstructor(SessionService.class);
-  }
-
-}
diff --git a/src/test/java/org/jajuk/services/covers/TestCover.java b/src/test/java/org/jajuk/services/covers/TestCover.java
index c9747f8..0a8d0e4 100644
--- a/src/test/java/org/jajuk/services/covers/TestCover.java
+++ b/src/test/java/org/jajuk/services/covers/TestCover.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.covers;
 
@@ -26,17 +26,17 @@ import java.net.URL;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.covers.Cover.CoverType;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestCover extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.services.covers.Cover#hashCode()}.
    *
@@ -45,14 +45,11 @@ public class TestCover extends JajukTestCase {
   public final void testHashCode() throws Exception {
     Cover cover = new Cover(new URL("http://www.example.com/"), CoverType.STANDARD_COVER);
     Cover equal = new Cover(new URL("http://www.example.com/"), CoverType.STANDARD_COVER);
-    JUnitHelpers.HashCodeTest(cover, equal);
+    TestHelpers.HashCodeTest(cover, equal);
   }
 
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // Make sure to reset default conf for this option :
     Conf.restoreValue(Const.FILE_DEFAULT_COVER);
   }
@@ -92,10 +89,9 @@ public class TestCover extends JajukTestCase {
     Cover notequal = new Cover(new URL("http://www.example.com/"), CoverType.LOCAL_COVER);
     Cover notequal2 = new Cover(Const.IMAGES_SPLASHSCREEN, CoverType.NO_COVER);
     Cover notequal3 = new Cover(new URL("http://www.example.com/"), CoverType.REMOTE_COVER);
-
-    JUnitHelpers.CompareToTest(cover, equal, notequal);
-    JUnitHelpers.CompareToTest(cover, equal, notequal2);
-    JUnitHelpers.CompareToTest(cover, equal, notequal3);
+    TestHelpers.CompareToTest(cover, equal, notequal);
+    TestHelpers.CompareToTest(cover, equal, notequal2);
+    TestHelpers.CompareToTest(cover, equal, notequal3);
   }
 
   /**
@@ -146,12 +142,10 @@ public class TestCover extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetSize() throws Exception {
-    File file = File.createTempFile("test", ".txt");
-
+    File file = File.createTempFile("test", ".txt", new java.io.File(ConstTest.TECH_TESTS_PATH));
     // remove it and re-create it with some content
     assertTrue(file.delete());
     FileUtils.writeStringToFile(file, StringUtils.repeat(".", 2000));
-
     Cover cover = new Cover(file, CoverType.STANDARD_COVER);
     assertEquals("2", cover.getSize());
   }
@@ -162,20 +156,17 @@ public class TestCover extends JajukTestCase {
    * @throws Exception the exception
    */
   public final void testGetImage() throws Exception {
-    File file = File.createTempFile("test", ".txt");
+    File file = File.createTempFile("test", ".txt", new java.io.File(ConstTest.DEVICES_BASE_PATH));
     Cover cover = new Cover(file, CoverType.NO_COVER);
-
     // for no-cover, we get back a default image
     assertNotNull(cover.getImage());
-
-    cover = new Cover(new URL("http://jajuk.info/skins/jajuk2010/jajuk_logotype.png"),
+    cover = new Cover(new URL("http://jajuk.info/images/jajuk_logotype.png"),
         CoverType.REMOTE_COVER);
     try {
       assertNotNull(cover.getImage());
     } catch (HeadlessException e) {
       // ignore here...
     }
-
     cover = new Cover(new File("notexists"), CoverType.STANDARD_COVER);
     try {
       cover.getImage();
@@ -183,7 +174,6 @@ public class TestCover extends JajukTestCase {
     } catch (IllegalArgumentException e) {
       // ok here
     }
-
     // TODO: more testing is necessary here...
   }
 
@@ -195,11 +185,10 @@ public class TestCover extends JajukTestCase {
   public final void testToString() throws Exception {
     // standard toString
     Cover cover = new Cover(new URL("http://www.example.com/"), CoverType.STANDARD_COVER);
-    JUnitHelpers.ToStringTest(cover);
-
+    TestHelpers.ToStringTest(cover);
     // should also cope with items being null
     cover = new Cover(new URL("http://www.example.com/"), null);
-    JUnitHelpers.ToStringTest(cover);
+    TestHelpers.ToStringTest(cover);
   }
 
   /**
@@ -214,10 +203,9 @@ public class TestCover extends JajukTestCase {
     // Cover notequal = new Cover(new URL("http://www.example.com/"), CoverType.LOCAL_COVER);
     // Cover notequal2 = new Cover(new URL("http://www.example.com/"), CoverType.NO_COVER);
     Cover notequal3 = new Cover(new URL("http://www.test.com/"), CoverType.STANDARD_COVER);
-
     // JUnitHelpers.EqualsTest(cover, equal, notequal);
     // JUnitHelpers.EqualsTest(cover, equal, notequal2);
-    JUnitHelpers.EqualsTest(cover, equal, notequal3);
+    TestHelpers.EqualsTest(cover, equal, notequal3);
   }
 
   /**
@@ -227,8 +215,7 @@ public class TestCover extends JajukTestCase {
    */
   public final void testGetFile() throws Exception {
     Cover cover = new Cover(new URL("http://www.example.com/"), CoverType.REMOTE_COVER);
-    Cover cover2 = new Cover(new File("testfile"), CoverType.STANDARD_COVER);
-
+    Cover cover2 = new Cover(TestHelpers.getFile().getFIO(), CoverType.STANDARD_COVER);
     assertNotNull(cover.getFile());
     assertNotNull(cover2.getFile());
   }
diff --git a/src/test/java/org/jajuk/services/dbus/TestDBusManager.java b/src/test/java/org/jajuk/services/dbus/TestDBusManager.java
index 6a7e941..def9001 100644
--- a/src/test/java/org/jajuk/services/dbus/TestDBusManager.java
+++ b/src/test/java/org/jajuk/services/dbus/TestDBusManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,24 +16,22 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dbus;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDBusManager extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.services.dbus.DBusManager#connect()}.
    */
   public final void testGetInstance() {
     // DBus requires the environment variable DBUS_SESSION_BUS_ADDRESS
     // but this is typically only set on machines that support D-Bus
-
     // cannot check this for null as it won't work in some installations
     try {
       DBusManager.connect();
@@ -48,16 +46,13 @@ public class TestDBusManager extends JajukTestCase {
   public final void testDisconnect() {
     // first run it without connecting in getInstance()
     DBusManager.disconnect();
-
     // then run getInstance() which tries to connect
     try {
       DBusManager.connect();
     } catch (Exception e) {
       e.printStackTrace();
     }
-
     // now again, although getInstance() might not have worked...
     DBusManager.disconnect();
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/dbus/TestDBusSignalImpl.java b/src/test/java/org/jajuk/services/dbus/TestDBusSignalImpl.java
index ec3d25e..fe55eeb 100644
--- a/src/test/java/org/jajuk/services/dbus/TestDBusSignalImpl.java
+++ b/src/test/java/org/jajuk/services/dbus/TestDBusSignalImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,16 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dbus;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDBusSignalImpl extends JajukTestCase {
+  @Override
+  protected void specificSetUp() throws Exception {
+  }
 
   /**
    * Test method for {@link org.jajuk.services.dbus.DBusSignalImpl#isRemote()}.
@@ -37,14 +40,13 @@ public class TestDBusSignalImpl extends JajukTestCase {
 
   /**
    * Test file changed signal.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testFileChangedSignal() throws Exception {
     DBusSignalImpl.FileChangedSignal signal = new DBusSignalImpl.FileChangedSignal("testfile",
         "/path/test");
-
     assertEquals("testfile", signal.getFilename());
   }
 }
diff --git a/src/test/java/org/jajuk/services/dbus/TestDBusSupportImpl.java b/src/test/java/org/jajuk/services/dbus/TestDBusSupportImpl.java
index fda4610..b93b355 100644
--- a/src/test/java/org/jajuk/services/dbus/TestDBusSupportImpl.java
+++ b/src/test/java/org/jajuk/services/dbus/TestDBusSupportImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,10 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dbus;
 
+import cx.ath.matthew.unix.UnixSocket;
+
 import java.util.Properties;
 import java.util.Set;
 
@@ -28,30 +30,34 @@ import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.util.Const;
+import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDBusSupportImpl extends JajukTestCase {
-
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // make sure this is initialized with Actions
     ActionManager.getInstance();
-
-    super.setUp();
   }
 
   /**
    * Test method for {@link org.jajuk.services.dbus.DBusSupportImpl#connect()}.
    */
-
   public final void testConnect() {
     DBusSupportImpl impl = new DBusSupportImpl();
-
+    // ensure that we do find the JNI-Library
+    try {
+      new UnixSocket();
+    } catch (UnsatisfiedLinkError e) {
+      Log.fatal("Could not load class UnixSocket, maybe the java.library.path is not set correctly: \n"
+          + "java.home: "
+          + System.getProperty("java.home")
+          + "\n"
+          + "java.library.path: "
+          + System.getProperty("java.library.path") + ": " + e.getMessage());
+    }
     // will fail where dbus is not available and report an error to the log...
     impl.connect();
   }
@@ -61,13 +67,10 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * {@link org.jajuk.services.dbus.DBusSupportImpl#disconnect()}.
    */
-
   public final void testDisconnect() {
     DBusSupportImpl impl = new DBusSupportImpl();
-
     // should not fail when not connected
     impl.disconnect();
-
     // try to connect first
     impl.connect();
     // then disconnect
@@ -79,7 +82,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testForward() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.forward();
@@ -90,7 +92,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testNext() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.next();
@@ -102,7 +103,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testPlayPause() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.playPause();
@@ -113,7 +113,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testPrevious() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.previous();
@@ -124,7 +123,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testRewind() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.rewind();
@@ -135,7 +133,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testStop() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.stop();
@@ -147,7 +144,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.dbus.DBusSupportImpl#decreaseVolume()}.
    */
-
   public final void testDecreaseVolume() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.decreaseVolume();
@@ -156,7 +152,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.dbus.DBusSupportImpl#exit()}.
    */
-
   public final void testExit() {
     // cannot test this as it stops the process:
     // DBusSupportImpl impl = new DBusSupportImpl();
@@ -169,7 +164,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.dbus.DBusSupportImpl#increaseVolume()}.
    */
-
   public final void testIncreaseVolume() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.increaseVolume();
@@ -181,7 +175,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testNextAlbum() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.nextAlbum();
@@ -193,7 +186,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.dbus.DBusSupportImpl#previousAlbum()}.
    */
-
   public final void testPreviousAlbum() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.previousAlbum();
@@ -205,7 +197,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.dbus.DBusSupportImpl#shuffleGlobal()}.
    */
-
   public final void testShuffleGlobal() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.shuffleGlobal();
@@ -216,7 +207,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testMute() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.mute();
@@ -228,7 +218,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.dbus.DBusSupportImpl#currentHTML()}.
    */
-
   public final void testCurrentHTML() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     assertNotNull(impl.currentHTML());
@@ -239,7 +228,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public final void testCurrent() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     assertNotNull(impl.current());
@@ -251,7 +239,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.dbus.DBusSupportImpl#banCurrent()}.
    */
-
   public final void testBanCurrent() throws Exception {
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.banCurrent();
@@ -260,7 +247,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.dbus.DBusSupportImpl#isRemote()}.
    */
-
   public final void testIsRemote() {
     DBusSupportImpl impl = new DBusSupportImpl();
     assertFalse(impl.isRemote());
@@ -271,7 +257,6 @@ public class TestDBusSupportImpl extends JajukTestCase {
    *
    * {@link org.jajuk.services.dbus.DBusSupportImpl#getRegistrationKeys()}.
    */
-
   public final void testGetRegistrationKeys() {
     DBusSupportImpl impl = new DBusSupportImpl();
     Set<JajukEvents> events = impl.getRegistrationKeys();
@@ -284,34 +269,29 @@ public class TestDBusSupportImpl extends JajukTestCase {
    * {@link org.jajuk.services.dbus.DBusSupportImpl#update(org.jajuk.events.JajukEvent)}
    * .
    */
-
   public final void testUpdate() {
     Properties prop = new Properties();
     prop.setProperty(Const.DETAIL_CURRENT_FILE_ID, "testfile");
-
     DBusSupportImpl impl = new DBusSupportImpl();
     impl.update(new JajukEvent(JajukEvents.FILE_LAUNCHED, null));
   }
 
   /**
    * Test update connect.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateConnect() {
     Properties prop = new Properties();
     prop.setProperty(Const.DETAIL_CURRENT_FILE_ID, "testfile");
-
     DBusSupportImpl impl = new DBusSupportImpl();
-
     // will fail where dbus is not available and report an error to the log...
     impl.connect();
-
     impl.update(new JajukEvent(JajukEvents.FILE_LAUNCHED, null));
   }
 
   /**
    * Test show currently playing.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -322,7 +302,7 @@ public class TestDBusSupportImpl extends JajukTestCase {
 
   /**
    * Test bookmark currently playing.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
diff --git a/src/test/java/org/jajuk/services/dj/TestAmbience.java b/src/test/java/org/jajuk/services/dj/TestAmbience.java
index 62d8db6..84f4e2a 100644
--- a/src/test/java/org/jajuk/services/dj/TestAmbience.java
+++ b/src/test/java/org/jajuk/services/dj/TestAmbience.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dj;
 
@@ -24,24 +24,22 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Genre;
 import org.jajuk.base.GenreManager;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAmbience extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.services.dj.Ambience#hashCode()}.
    */
   public final void testHashCode() {
     Ambience amb = new Ambience("1", "name");
     Ambience equal = new Ambience("1", "name");
-
-    JUnitHelpers.HashCodeTest(amb, equal);
+    TestHelpers.HashCodeTest(amb, equal);
   }
 
   /**
@@ -52,7 +50,7 @@ public class TestAmbience extends JajukTestCase {
    */
   public final void testAmbienceStringStringSetOfGenre() {
     Set<Genre> genres = new HashSet<Genre>();
-    genres.add(JUnitHelpers.getGenre("mygenre"));
+    genres.add(TestHelpers.getGenre("mygenre"));
     new Ambience("1", "name", genres);
   }
 
@@ -65,7 +63,6 @@ public class TestAmbience extends JajukTestCase {
   public final void testAmbienceStringStringStringArray() {
     GenreManager.getInstance().registerGenre("anothergenre");
     GenreManager.getInstance().registerGenre("yetanothergenre");
-
     // try with one unknown genre here...
     new Ambience("1", "name", new String[] { "anothergenre", "yetanothergenre", "unknowngenre" });
   }
@@ -94,8 +91,7 @@ public class TestAmbience extends JajukTestCase {
    */
   public final void testAddGenre() {
     Ambience amb = new Ambience("1", "name");
-
-    amb.addGenre(JUnitHelpers.getGenre("anothergenre"));
+    amb.addGenre(TestHelpers.getGenre("anothergenre"));
   }
 
   /**
@@ -105,22 +101,14 @@ public class TestAmbience extends JajukTestCase {
    */
   public final void testRemoveGenre() {
     Ambience amb = new Ambience("1", "name");
-
-    Genre genre = JUnitHelpers.getGenre("anothergenre");
-
+    Genre genre = TestHelpers.getGenre("anothergenre");
     assertEquals(0, amb.getGenres().size());
-
     amb.addGenre(genre);
-
     assertEquals(1, amb.getGenres().size());
-
     amb.removeGenre(genre);
-
     assertEquals(0, amb.getGenres().size());
-
     // try it again
     amb.removeGenre(genre);
-
     assertEquals(0, amb.getGenres().size());
   }
 
@@ -130,7 +118,6 @@ public class TestAmbience extends JajukTestCase {
   public final void testGetName() {
     Ambience amb = new Ambience("7", "name123");
     assertEquals("name123", amb.getName());
-
     amb.setName("123n");
     assertEquals("123n", amb.getName());
   }
@@ -166,16 +153,12 @@ public class TestAmbience extends JajukTestCase {
    */
   public final void testSetGenres() {
     Ambience amb = new Ambience("1", "name");
-
     assertEquals(0, amb.getGenres().size());
-
     Set<Genre> genres = new HashSet<Genre>();
-    genres.add(JUnitHelpers.getGenre("mygenre"));
-    genres.add(JUnitHelpers.getGenre("mygenre2"));
-    genres.add(JUnitHelpers.getGenre("mygenre3"));
-
+    genres.add(TestHelpers.getGenre("mygenre"));
+    genres.add(TestHelpers.getGenre("mygenre2"));
+    genres.add(TestHelpers.getGenre("mygenre3"));
     amb.setGenres(genres);
-
     assertEquals(3, amb.getGenres().size());
   }
 
@@ -184,15 +167,12 @@ public class TestAmbience extends JajukTestCase {
    */
   public final void testGetGenresDesc() {
     Ambience amb = new Ambience("1", "name");
-
     // first an empty string results without any genre set
     assertEquals("", amb.getGenresDesc());
-
     // then add some genres
-    amb.addGenre(JUnitHelpers.getGenre("mygenre"));
-    amb.addGenre(JUnitHelpers.getGenre("mygenre2"));
-    amb.addGenre(JUnitHelpers.getGenre("mygenre3"));
-
+    amb.addGenre(TestHelpers.getGenre("mygenre"));
+    amb.addGenre(TestHelpers.getGenre("mygenre2"));
+    amb.addGenre(TestHelpers.getGenre("mygenre3"));
     assertTrue(StringUtils.isNotBlank(amb.getGenresDesc()));
   }
 
@@ -201,21 +181,19 @@ public class TestAmbience extends JajukTestCase {
    */
   public final void testToString() {
     Ambience amb = new Ambience("1", "name");
-    JUnitHelpers.ToStringTest(amb);
-
+    TestHelpers.ToStringTest(amb);
     // also when some items are null
     amb = new Ambience(null, "name");
-    JUnitHelpers.ToStringTest(amb);
+    TestHelpers.ToStringTest(amb);
     amb = new Ambience("1", null);
-    JUnitHelpers.ToStringTest(amb);
+    TestHelpers.ToStringTest(amb);
     amb = new Ambience(null, null);
-    JUnitHelpers.ToStringTest(amb);
-
+    TestHelpers.ToStringTest(amb);
     // also with genres
     amb = new Ambience("9", "name0987");
-    amb.addGenre(JUnitHelpers.getGenre("mygenre"));
-    amb.addGenre(JUnitHelpers.getGenre("mygenre2"));
-    JUnitHelpers.ToStringTest(amb);
+    amb.addGenre(TestHelpers.getGenre("mygenre"));
+    amb.addGenre(TestHelpers.getGenre("mygenre2"));
+    TestHelpers.ToStringTest(amb);
   }
 
   /**
@@ -226,37 +204,31 @@ public class TestAmbience extends JajukTestCase {
   public final void testEqualsObject() {
     Ambience amb = new Ambience("1", "name");
     Ambience equal = new Ambience("1", "name");
-
     // equals compares on name
     Ambience notequal1 = new Ambience("1", "name1");
-
     // and also compares on genres
     Ambience notequal2 = new Ambience("1", "name");
-    notequal2.addGenre(JUnitHelpers.getGenre("mygenre2"));
-
-    JUnitHelpers.EqualsTest(amb, equal, notequal1);
-    JUnitHelpers.EqualsTest(amb, equal, notequal2);
+    notequal2.addGenre(TestHelpers.getGenre("mygenre2"));
+    TestHelpers.EqualsTest(amb, equal, notequal1);
+    TestHelpers.EqualsTest(amb, equal, notequal2);
   }
 
   /**
    * Test equals object2.
-   * DOCUMENT_ME
+   * 
    */
   public final void testEqualsObject2() {
     Ambience amb = new Ambience("1", "name");
-    amb.addGenre(JUnitHelpers.getGenre("mygenre4"));
+    amb.addGenre(TestHelpers.getGenre("mygenre4"));
     Ambience equal = new Ambience("1", "name");
-    equal.addGenre(JUnitHelpers.getGenre("mygenre4"));
-
+    equal.addGenre(TestHelpers.getGenre("mygenre4"));
     // equals compares on name
     Ambience notequal1 = new Ambience("1", "name1");
-
     // and also compares on genres
     Ambience notequal2 = new Ambience("1", "name");
-    notequal2.addGenre(JUnitHelpers.getGenre("mygenre2"));
-
-    JUnitHelpers.EqualsTest(amb, equal, notequal1);
-    JUnitHelpers.EqualsTest(amb, equal, notequal2);
+    notequal2.addGenre(TestHelpers.getGenre("mygenre2"));
+    TestHelpers.EqualsTest(amb, equal, notequal1);
+    TestHelpers.EqualsTest(amb, equal, notequal2);
   }
 
   /**
@@ -269,9 +241,8 @@ public class TestAmbience extends JajukTestCase {
     Ambience amb = new Ambience("1", "name");
     Ambience equal = new Ambience("1", "name");
     Ambience notequal = new Ambience("1", "name1");
-
     // only compares on name
-    JUnitHelpers.CompareToTest(amb, equal, notequal);
+    TestHelpers.CompareToTest(amb, equal, notequal);
   }
 
   /**
@@ -279,18 +250,14 @@ public class TestAmbience extends JajukTestCase {
    */
   public final void testToXML() {
     Ambience amb = new Ambience("1", "name");
-
     // just returns a comma-separated list, not a full XML here...
-
     // try without any genres, returns an empty string
     assertEquals("", amb.toXML());
-
     // then add some
-    amb.addGenre(JUnitHelpers.getGenre("mygenre4123"));
+    amb.addGenre(TestHelpers.getGenre("mygenre4123"));
     assertTrue(StringUtils.isNotBlank(amb.toXML()));
-
     // and then some more
-    amb.addGenre(JUnitHelpers.getGenre("mygenre4234"));
-    amb.addGenre(JUnitHelpers.getGenre("mygenre834874"));
+    amb.addGenre(TestHelpers.getGenre("mygenre4234"));
+    amb.addGenre(TestHelpers.getGenre("mygenre834874"));
   }
 }
diff --git a/src/test/java/org/jajuk/services/dj/TestAmbienceDigitalDJ.java b/src/test/java/org/jajuk/services/dj/TestAmbienceDigitalDJ.java
index 7708de4..d7a7ab6 100644
--- a/src/test/java/org/jajuk/services/dj/TestAmbienceDigitalDJ.java
+++ b/src/test/java/org/jajuk/services/dj/TestAmbienceDigitalDJ.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,15 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dj;
 
 import ext.services.xml.XMLUtils;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -42,24 +42,20 @@ import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAmbienceDigitalDJ extends JajukTestCase {
-
   /**
-   * Test method for {@link org.jajuk.services.dj.AmbienceDigitalDJ#toXML()}.
-   */
+  * Test method for {@link org.jajuk.services.dj.AmbienceDigitalDJ#toXML()}.
+  */
   public final void testToXML() {
     AmbienceDigitalDJ dj = new AmbienceDigitalDJ("3");
     assertTrue(StringUtils.isNotBlank(dj.toXML()));
-
     // try to parse the resulting XML
     XMLUtils.getDocument(dj.toXML());
-
     // set an Ambience
     GenreManager.getInstance().registerGenre("mystyle");
     dj.setAmbience(new Ambience("5", "ambience", new String[] { "mystyle" }));
-
     // try to parse the resulting XML
     XMLUtils.getDocument(dj.toXML());
   }
@@ -72,61 +68,49 @@ public class TestAmbienceDigitalDJ extends JajukTestCase {
    */
   public final void testGeneratePlaylist() throws Exception {
     StartupCollectionService.registerItemManagers();
-
     AmbienceDigitalDJ dj = new AmbienceDigitalDJ("4");
-
     // empty without Ambience set
     assertEquals(0, dj.generatePlaylist().size());
-
     // set an Ambience
     Genre genre = GenreManager.getInstance().registerGenre("mystyle");
     dj.setAmbience(new Ambience("5", "ambience", new String[] { "mystyle" }));
-
     getFile(6, genre);
-
     // assert a few conditions to find out why this test fails sometimes when
     // run in combination with others
     assertFalse(dj.isTrackUnicity());
     assertTrue(FileManager.getInstance().getGlobalShufflePlaylist().size() > 0);
-    assertTrue(dj.getAmbience().getGenres().contains(
-        FileManager.getInstance().getGlobalShufflePlaylist().get(0).getTrack().getGenre()));
-
+    assertTrue(dj
+        .getAmbience()
+        .getGenres()
+        .contains(FileManager.getInstance().getGlobalShufflePlaylist().get(0).getTrack().getGenre()));
     assertEquals(Const.MIN_TRACKS_NUMBER_WITHOUT_UNICITY, dj.generatePlaylist().size());
-
     // once again with "unicity"
     dj.setTrackUnicity(true);
     assertEquals(1, dj.generatePlaylist().size());
-
   }
 
   /**
    * Gets the file.
    *
-   * @param i DOCUMENT_ME
-   * @param genre DOCUMENT_ME
+   * @param i 
+   * @param genre 
    * @return the file
    * @throws Exception the exception
    */
   private File getFile(int i, Genre genre) throws Exception {
-    Album album = JUnitHelpers.getAlbum("myalbum", 0);
+    Album album = TestHelpers.getAlbum("myalbum", 0);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
     // IPlayerImpl imp = new MockPlayer();
     // Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
-
-    Type type = JUnitHelpers.getType();
+    Type type = TestHelpers.getType();
     Track track = TrackManager.getInstance().registerTrack("name", album, genre, artist, 120, year,
         1, type, 1);
-
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     device.mount(true);
-
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
-
     return FileManager.getInstance().registerFile(Integer.valueOf(i).toString(), "test.tst", dir,
         track, 120, 70);
   }
@@ -148,14 +132,11 @@ public class TestAmbienceDigitalDJ extends JajukTestCase {
    */
   public final void testGetAndSetAmbience() {
     AmbienceDigitalDJ dj = new AmbienceDigitalDJ("4");
-
     // empty without Ambience set
     assertNull(dj.getAmbience());
-
     // set an Ambience
     GenreManager.getInstance().registerGenre("mystyle");
     dj.setAmbience(new Ambience("5", "ambience", new String[] { "mystyle" }));
-
     assertNotNull(dj.getAmbience());
   }
 
@@ -168,5 +149,4 @@ public class TestAmbienceDigitalDJ extends JajukTestCase {
   public final void testSetAmbience() {
     // tested above
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/dj/TestAmbienceManager.java b/src/test/java/org/jajuk/services/dj/TestAmbienceManager.java
index 8136b4c..dd2dbcb 100644
--- a/src/test/java/org/jajuk/services/dj/TestAmbienceManager.java
+++ b/src/test/java/org/jajuk/services/dj/TestAmbienceManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dj;
 
@@ -35,21 +35,15 @@ import org.jajuk.util.Messages;
 import org.jajuk.util.UpgradeManager;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAmbienceManager extends JajukTestCase {
-
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // clean out all leftover ambiences from other testing
     for (Ambience amb : AmbienceManager.getInstance().getAmbiences()) {
       AmbienceManager.getInstance().removeAmbience(amb.getID());
     }
-
-    super.setUp();
   }
 
   /**
@@ -79,25 +73,21 @@ public class TestAmbienceManager extends JajukTestCase {
     // make sure "UpgradeManager.bFirstSession" is not set
     {
       Class<?> c = UpgradeManager.class;
-      Field f = c.getDeclaredField("bFirstSession");
+      Field f = c.getDeclaredField("firstSession");
       f.setAccessible(true);
       f.setBoolean(null, Boolean.FALSE);
     }
     assertFalse(UpgradeManager.isFirstSession());
-
     assertEquals(0, AmbienceManager.getInstance().getAmbiences().size());
-
     // first without any key
     AmbienceManager.getInstance().load();
     // creates the 14 default ambiences
     assertEquals(14, AmbienceManager.getInstance().getAmbiences().size());
-
     // clean out all leftover ambiences from other testing
     for (Ambience amb : AmbienceManager.getInstance().getAmbiences()) {
       AmbienceManager.getInstance().removeAmbience(amb.getID());
     }
     assertEquals(0, AmbienceManager.getInstance().getAmbiences().size());
-
     { // remove all leftover properties
       Properties properties = Conf.getProperties();
       Enumeration<Object> e = properties.keys();
@@ -108,14 +98,11 @@ public class TestAmbienceManager extends JajukTestCase {
         }
       }
     }
-
     // then add set some Ambience-items
     Genre genre1 = GenreManager.getInstance().registerGenre("genre1");
     Genre genre2 = GenreManager.getInstance().registerGenre("genre2");
-    Conf
-        .setProperty(Const.AMBIENCE_PREFIX + "12/myambience", genre1.getID() + "," + genre2.getID());
+    Conf.setProperty(Const.AMBIENCE_PREFIX + "12/myambience", genre1.getID() + "," + genre2.getID());
     assertEquals(0, AmbienceManager.getInstance().getAmbiences().size());
-
     { // check all the conditions to find out why it fails in Hudson
       assertFalse(UpgradeManager.isFirstSession());
       Properties properties = Conf.getProperties();
@@ -127,7 +114,6 @@ public class TestAmbienceManager extends JajukTestCase {
           if (sKey.substring(Const.AMBIENCE_PREFIX.length()).indexOf('/') == -1) {
             continue;
           }
-
           nMatch++;
         }
       }
@@ -136,7 +122,6 @@ public class TestAmbienceManager extends JajukTestCase {
     AmbienceManager.getInstance().load();
     assertEquals(1, AmbienceManager.getInstance().getAmbiences().size());
     assertNotNull(AmbienceManager.getInstance().getAmbience("12"));
-
     // now test with an ambience with invalid format, i.e. only "12", not
     // "12/name"
     for (Ambience amb : AmbienceManager.getInstance().getAmbiences()) {
@@ -149,7 +134,6 @@ public class TestAmbienceManager extends JajukTestCase {
     // now 14 as this could not be loaded and thus the default ones were
     // loaded...
     assertEquals(14, AmbienceManager.getInstance().getAmbiences().size());
-
     UpgradeManager.setFirstSession();
     AmbienceManager.getInstance().load();
   }
@@ -172,7 +156,6 @@ public class TestAmbienceManager extends JajukTestCase {
   public final void testGetAmbience() {
     // this creates the 14 default ambiences
     AmbienceManager.getInstance().createDefaultAmbiences();
-
     assertNotNull(AmbienceManager.getInstance().getAmbience("0"));
   }
 
@@ -185,18 +168,16 @@ public class TestAmbienceManager extends JajukTestCase {
   public final void testGetAmbienceByName() {
     // this creates the 14 default ambiences
     AmbienceManager.getInstance().createDefaultAmbiences();
-
     assertNotNull(AmbienceManager.getInstance().getAmbienceByName(Messages.getString("Ambience.9")));
   }
 
   /**
    * Test get ambience by name invalid.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGetAmbienceByNameInvalid() {
     // this creates the 14 default ambiences
     AmbienceManager.getInstance().createDefaultAmbiences();
-
     assertNull(AmbienceManager.getInstance().getAmbienceByName("notexistingone"));
   }
 
@@ -220,12 +201,9 @@ public class TestAmbienceManager extends JajukTestCase {
   public final void testGetSelectedAmbience() {
     // first with no ambience and no default set
     assertNull(AmbienceManager.getInstance().getSelectedAmbience());
-
     // this creates the 14 default ambiences
     AmbienceManager.getInstance().createDefaultAmbiences();
-
     Conf.setProperty(Const.CONF_DEFAULT_AMBIENCE, "2"); // by ID
-
     // now we should find one
     assertNotNull(AmbienceManager.getInstance().getSelectedAmbience());
   }
@@ -238,19 +216,13 @@ public class TestAmbienceManager extends JajukTestCase {
    */
   public final void testUpdate() {
     Properties prop = new Properties();
-
     Genre genre1 = GenreManager.getInstance().registerGenre("genre1");
     Genre genre2 = GenreManager.getInstance().registerGenre("genre2");
-
     Ambience ambience = new Ambience("23", "testamb", new String[] { "genre1" });
-
     prop.put(Const.DETAIL_OLD, genre1);
     prop.put(Const.DETAIL_NEW, genre2);
-
     AmbienceManager.getInstance().registerAmbience(ambience);
-
     AmbienceManager.getInstance().update(new JajukEvent(JajukEvents.GENRE_NAME_CHANGED, prop));
-
     assertEquals(1, AmbienceManager.getInstance().getAmbiences().size());
     assertEquals(1, AmbienceManager.getInstance().getAmbiences().iterator().next().getGenres()
         .size());
@@ -264,10 +236,8 @@ public class TestAmbienceManager extends JajukTestCase {
   public final void testCommit() {
     // this creates the 14 default ambiences
     AmbienceManager.getInstance().createDefaultAmbiences();
-
     // set one ambience prefix to have it removed before
     Conf.setProperty(Const.AMBIENCE_PREFIX + "12/ambience", "testvalue");
-
     AmbienceManager.getInstance().commit();
   }
 
@@ -279,13 +249,10 @@ public class TestAmbienceManager extends JajukTestCase {
    */
   public final void testRemoveAmbience() {
     assertEquals(0, AmbienceManager.getInstance().getAmbiences().size());
-
     AmbienceManager.getInstance().registerAmbience(new Ambience("30", "nextone"));
     assertEquals(1, AmbienceManager.getInstance().getAmbiences().size());
-
     AmbienceManager.getInstance().removeAmbience("30");
     assertEquals(0, AmbienceManager.getInstance().getAmbiences().size());
-
   }
 
   /**
@@ -296,9 +263,7 @@ public class TestAmbienceManager extends JajukTestCase {
   public final void testCreateDefaultAmbiences() {
     assertEquals(0, AmbienceManager.getInstance().getAmbiences().size());
     AmbienceManager.getInstance().createDefaultAmbiences();
-
     // currently 14 ambiences are defined as default ones
     assertEquals(14, AmbienceManager.getInstance().getAmbiences().size());
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/dj/TestDigitalDJ.java b/src/test/java/org/jajuk/services/dj/TestDigitalDJ.java
index b321a97..29c7787 100644
--- a/src/test/java/org/jajuk/services/dj/TestDigitalDJ.java
+++ b/src/test/java/org/jajuk/services/dj/TestDigitalDJ.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.dj;
 
@@ -26,8 +26,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -44,9 +44,12 @@ import org.jajuk.util.Const;
 import org.w3c.dom.Document;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDigitalDJ extends JajukTestCase {
+  @Override
+  protected void specificSetUp() throws Exception {
+  }
 
   /**
    * Test method for {@link org.jajuk.services.dj.DigitalDJ#hashCode()}.
@@ -56,9 +59,7 @@ public class TestDigitalDJ extends JajukTestCase {
     dj.setName("ambience1");
     DigitalDJ equ = new AmbienceDigitalDJ("3");
     equ.setName("ambience1");
-
-    JUnitHelpers.HashCodeTest(dj, equ);
-
+    TestHelpers.HashCodeTest(dj, equ);
   }
 
   /**
@@ -77,14 +78,11 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testToString() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
-    JUnitHelpers.ToStringTest(dj);
-
+    TestHelpers.ToStringTest(dj);
     // also test null values
     dj = new AmbienceDigitalDJ(null);
     dj.setName(null);
-
-    JUnitHelpers.ToStringTest(dj);
+    TestHelpers.ToStringTest(dj);
   }
 
   /**
@@ -100,9 +98,8 @@ public class TestDigitalDJ extends JajukTestCase {
     equ.setName("ambience1");
     DigitalDJ notequ = new AmbienceDigitalDJ("3");
     notequ.setName("other");
-
     // only compares on name
-    JUnitHelpers.CompareToTest(dj, equ, notequ);
+    TestHelpers.CompareToTest(dj, equ, notequ);
   }
 
   /**
@@ -111,7 +108,6 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testToXML() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     // abstract in DigitalDJ anyway, so no need to test this in detail here...
     assertTrue(dj.toXML(), StringUtils.isNotBlank(dj.toXML()));
   }
@@ -124,9 +120,7 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testToXMLGeneralParameters() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     assertTrue(dj.toXMLGeneralParameters(), StringUtils.isNotBlank(dj.toXMLGeneralParameters()));
-
     // test xml-validity, need to add closing tag to build complete xml
     String xml = dj.toXMLGeneralParameters() + "</" + Const.XML_DJ_DJ + ">";
     Document document = XMLUtils.getDocument(xml);
@@ -142,24 +136,19 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testFilterFilesByRate() throws Exception {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     List<File> files = new ArrayList<File>();
     File file = getFile(1);
     file.getTrack().setProperty(Const.XML_TRACK_RATE, 1l);
     files.add(file);
-
     file = getFile(2);
     file.getTrack().setProperty(Const.XML_TRACK_RATE, 26l);
     files.add(file);
-
     file = getFile(3);
     file.getTrack().setProperty(Const.XML_TRACK_RATE, 51l);
     files.add(file);
-
     // without rating level set nothing happens to the list
     dj.filterFilesByRate(files);
     assertEquals(3, files.size());
-
     // set rating level and see if tracks are removed
     dj.setRatingLevel(2);
     dj.filterFilesByRate(files);
@@ -168,37 +157,31 @@ public class TestDigitalDJ extends JajukTestCase {
 
   /**
    * Test filter files by max track.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testFilterFilesByMaxTrack() throws Exception {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     List<File> files = new ArrayList<File>();
     File file = getFile(1);
     file.getTrack().setProperty(Const.XML_TRACK_RATE, 1l);
     files.add(file);
-
     file = getFile(2);
     file.getTrack().setProperty(Const.XML_TRACK_RATE, 26l);
     files.add(file);
-
     file = getFile(3);
     file.getTrack().setProperty(Const.XML_TRACK_RATE, 51l);
     files.add(file);
-
     // with max-tracks -1 nothing is cut off
     dj.setMaxTracks(-1);
     dj.filterFilesByMaxTrack(files);
     assertEquals(3, files.size());
-
     // nothing happens if max is higher
     dj.setMaxTracks(4);
     dj.filterFilesByMaxTrack(files);
     assertEquals(3, files.size());
-
     // set max level and see if tracks are removed
     dj.setMaxTracks(2);
     dj.filterFilesByMaxTrack(files);
@@ -208,31 +191,24 @@ public class TestDigitalDJ extends JajukTestCase {
   /**
    * Gets the file.
    *
-   * @param i DOCUMENT_ME
+   * @param i 
    * @return the file
    * @throws Exception the exception
    */
   private File getFile(int i) throws Exception {
-    Genre genre = JUnitHelpers.getGenre();
-    Album album = JUnitHelpers.getAlbum("name" + i, 0);
+    Genre genre = TestHelpers.getGenre();
+    Album album = TestHelpers.getAlbum("name" + i, 0);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-
-    // IPlayerImpl imp = new MockPlayer();
-    // Class<IPlayerImpl> cl = (Class<IPlayerImpl>) imp.getClass();
-
-    Type type = JUnitHelpers.getType();
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
+    Type type = TestHelpers.getType();
     Track track = TrackManager.getInstance().registerTrack("name", album, genre, artist, 120, year,
         1, type, 1);
-
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     if (!device.isMounted()) {
       device.mount(true);
     }
-
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
     return FileManager.getInstance().registerFile("test.tst", dir, track, 120, 70);
   }
@@ -259,9 +235,8 @@ public class TestDigitalDJ extends JajukTestCase {
     equ.setName("ambience1");
     DigitalDJ notequ = new AmbienceDigitalDJ("3");
     notequ.setName("other");
-
     // only compares on name
-    JUnitHelpers.EqualsTest(dj, equ, notequ);
+    TestHelpers.EqualsTest(dj, equ, notequ);
   }
 
   /**
@@ -280,7 +255,6 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testGetAndSetFadingDuration() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     assertEquals(0, dj.getFadingDuration());
     dj.setFadingDuration(3);
     assertEquals(3, dj.getFadingDuration());
@@ -301,7 +275,6 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testGetAndSetRatingLevel() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     assertEquals(0, dj.getRatingLevel());
     dj.setRatingLevel(3);
     assertEquals(3, dj.getRatingLevel());
@@ -321,7 +294,6 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testGeneratePlaylist() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     // abstract method, do not check result here
     dj.generatePlaylist();
   }
@@ -332,7 +304,6 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testGetID() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     assertEquals("3", dj.getID());
   }
 
@@ -342,7 +313,6 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testIsAndSetTrackUnicity() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     assertFalse(dj.isTrackUnicity());
     dj.setTrackUnicity(true);
     assertTrue(dj.isTrackUnicity());
@@ -363,7 +333,6 @@ public class TestDigitalDJ extends JajukTestCase {
   public final void testGetAndSetMaxTracks() {
     DigitalDJ dj = new AmbienceDigitalDJ("3");
     dj.setName("ambience1");
-
     assertEquals(-1, dj.getMaxTracks());
     dj.setMaxTracks(3);
     assertEquals(3, dj.getMaxTracks());
diff --git a/src/test/java/org/jajuk/services/lastfm/TestLastFmManager.java b/src/test/java/org/jajuk/services/lastfm/TestLastFmManager.java
index 52d7394..94aca57 100644
--- a/src/test/java/org/jajuk/services/lastfm/TestLastFmManager.java
+++ b/src/test/java/org/jajuk/services/lastfm/TestLastFmManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,24 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.lastfm;
 
 import java.util.Set;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestLastFmManager extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -65,10 +64,8 @@ public class TestLastFmManager extends JajukTestCase {
     {
       Conf.setProperty(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE, "false");
       LastFmManager.getInstance().update(new JajukEvent(JajukEvents.FILE_FINISHED, null));
-
       // wait for thread to finish
-      JUnitHelpers.waitForThreadToFinish("LastFM Update Thread");
+      TestHelpers.waitForThreadToFinish("LastFM Update Thread");
     }
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/lyrics/TestLyrics.java b/src/test/java/org/jajuk/services/lyrics/TestLyrics.java
index 892a1f0..0747943 100644
--- a/src/test/java/org/jajuk/services/lyrics/TestLyrics.java
+++ b/src/test/java/org/jajuk/services/lyrics/TestLyrics.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.lyrics;
 
@@ -27,11 +27,13 @@ import java.net.URL;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.services.lyrics.providers.AzLyricsWebLyricsProvider;
 import org.jajuk.services.lyrics.providers.GenericWebLyricsProvider;
 import org.jajuk.services.lyrics.providers.ILyricsProvider;
-import org.jajuk.services.lyrics.providers.LyricWikiWebLyricsProvider;
+import org.jajuk.services.lyrics.providers.LyricsManiaWebLyricsProvider;
+import org.jajuk.services.lyrics.providers.LyricsWikiaWebLyricsProvider;
 import org.jajuk.util.DownloadManager;
 import org.jajuk.util.log.Log;
 
@@ -39,51 +41,77 @@ import org.jajuk.util.log.Log;
  * Lyrics unit tests.
  */
 public class TestLyrics extends JajukTestCase {
-
-  /** DOCUMENT_ME. */
-  private final File tmp = new File("test.tmp");
-  
-  /** The Constant ARTIST.  DOCUMENT_ME */
+  /** The Constant ARTIST.   */
   private static final String ARTIST = "Massive Attack";
-  
-  /** The Constant TITLE.  DOCUMENT_ME */
-  private static final String TITLE = "Dissolved Girl";
-  
-  /** The Constant TESTED_WORD.  DOCUMENT_ME */
-  private static final String TESTED_WORD = "Day, yesterday";
-
   // LyricsFly put a delay of 1500 ms before we are allowed to query again, we
   // need to take that into account for some of the tests
-  /** The Constant FLY_DELAY.  DOCUMENT_ME */
+  /** The Constant FLY_DELAY.   */
   private static final long FLY_DELAY = 1500 + 200;
+  /** The Constant TESTED_WORD.   */
+  private static final String TESTED_WORD = "Day, yesterday";
+  /** The Constant TITLE.   */
+  private static final String TITLE = "Dissolved Girl";
+  private File tmp = null;
+
+  @Override
+  public void specificSetUp() throws Exception {
+    // to first cover this method while no providers are loaded yet
+    LyricsService.getProviders();
+    tmp = TestHelpers.getFile("test.tmp", true).getFIO();
+  }
 
-  // helper method to emma-coverage of the unused constructor
   /**
-   * Test private constructor.
-   * DOCUMENT_ME
+   * Test AZLyrics provider response to get lyrics.
+   */
+  public void testAZLyricsWebProvider() {
+    GenericWebLyricsProvider provider = new AzLyricsWebLyricsProvider();
+    testWebService(provider);
+  }
+
+  /**
+   * Test Lyricsmania provider response to get lyrics.
+   */
+  public void testLyricsManiaWeb() throws Exception {
+    GenericWebLyricsProvider provider = new LyricsManiaWebLyricsProvider();
+    testWeb(provider);
+  }
+
+  /**
+   * Test Lyricsmania provider response to get lyrics.
+   */
+  public void testLyricsManiaWebService() {
+    GenericWebLyricsProvider provider = new LyricsManiaWebLyricsProvider();
+    testWebService(provider);
+  }
+
+  /**
+   * Test LyricsWikia provider response to get lyrics.
+   */
+  public void testLyricsWikiaService() {
+    GenericWebLyricsProvider provider = new LyricsWikiaWebLyricsProvider();
+    testWebService(provider);
+  }
+
+  /**
+   * Test LyricWiki web url availability.
    *
    * @throws Exception the exception
    */
-  public void testPrivateConstructor() throws Exception {
-    // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(LyricsService.class);
+  public void testLyricsWikiaWeb() throws Exception {
+    GenericWebLyricsProvider provider = new LyricsWikiaWebLyricsProvider();
+    testWeb(provider);
   }
 
+  // helper method to emma-coverage of the unused constructor
   /**
-   * Test setup.
+   * Test private constructor.
+   * 
    *
-   * @throws IOException Signals that an I/O exception has occurred.
+   * @throws Exception the exception
    */
-  @Override
-  public void setUp() throws IOException {
-    if (tmp.exists()) {
-      tmp.delete();
-    }
-
-    JUnitHelpers.createSessionDirectory();
-
-    // to first cover this method while no providers are loaded yet
-    LyricsService.getProviders();
+  public void testPrivateConstructor() throws Exception {
+    // For EMMA code-coverage tests
+    TestHelpers.executePrivateConstructor(LyricsService.class);
   }
 
   /**
@@ -97,29 +125,9 @@ public class TestLyrics extends JajukTestCase {
   }
 
   /**
-   * Test provider response to get lyrics (shared code).
-   *
-   * @param provider DOCUMENT_ME
-   */
-  private void testWebService(GenericWebLyricsProvider provider) {
-    String lyrics = provider.getLyrics(ARTIST, TITLE);
-    Log.debug("Resulting Lyrics(" + provider.getProviderHostname() + "): " + lyrics);
-
-    if (provider.getProviderHostname().equals("api.lyricsfly.com") && lyrics == null) {
-      Log.fatal("In Sonar this can happen, seems we do not have internet access there...");
-      return;
-    }
-
-    assertTrue("Lyrics(" + provider.getProviderHostname() + "): " + lyrics,
-        StringUtils.isNotBlank(lyrics));
-    assertTrue("Lyrics(" + provider.getProviderHostname() + "): " + lyrics,
-        lyrics.indexOf(TESTED_WORD) != -1);
-  }
-
-  /**
    * Test provider web site url (shared code).
    *
-   * @param provider DOCUMENT_ME
+   * @param provider 
    * @throws IOException Signals that an I/O exception has occurred.
    */
   private void testWeb(GenericWebLyricsProvider provider) throws IOException {
@@ -131,28 +139,25 @@ public class TestLyrics extends JajukTestCase {
       Log.fatal("In Sonar this exception occurs, seems we do not have internet access there...");
       return;
     }
-
     assertTrue(tmp.exists());
     assertTrue(tmp.length() > 0);
   }
-  
-
-  /**
-   * Test LyricWiki provider response to get lyrics.
-   */
-  public void testLyricWikiService() {
-    GenericWebLyricsProvider provider = new LyricWikiWebLyricsProvider();
-    testWebService(provider);
-  }
 
   /**
-   * Test LyricWiki web url availability.
+   * Test provider response to get lyrics (shared code).
    *
-   * @throws Exception the exception
+   * @param provider 
    */
-  public void testLyricWikiWeb() throws Exception {
-    GenericWebLyricsProvider provider = new LyricWikiWebLyricsProvider();
-    testWeb(provider);
+  private void testWebService(GenericWebLyricsProvider provider) {
+    String lyrics = provider.getLyrics(ARTIST, TITLE);
+    Log.debug("Resulting Lyrics(" + provider.getProviderHostname() + "): " + lyrics);
+    if (provider.getProviderHostname().equals("api.lyricsfly.com") && lyrics == null) {
+      Log.fatal("In Sonar this can happen, seems we do not have internet access there...");
+      return;
+    }
+    assertTrue("Lyrics(" + provider.getProviderHostname() + "): " + lyrics,
+        StringUtils.isNotBlank(lyrics));
+    assertTrue("Lyrics(" + provider.getProviderHostname() + "): " + lyrics,
+        lyrics.indexOf(TESTED_WORD) != -1);
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/notification/TestJavaBalloonNotificator.java b/src/test/java/org/jajuk/services/notification/TestJavaBalloonNotificator.java
index eb5a6b8..404a81c 100644
--- a/src/test/java/org/jajuk/services/notification/TestJavaBalloonNotificator.java
+++ b/src/test/java/org/jajuk/services/notification/TestJavaBalloonNotificator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -30,10 +30,9 @@ import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.ui.windows.JajukSystray;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestJavaBalloonNotificator extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -45,7 +44,6 @@ public class TestJavaBalloonNotificator extends JajukTestCase {
     // "isAvailable"
     JavaBalloonNotificator notificator = JavaBalloonNotificator.getInstance();
     assertFalse(notificator.isAvailable());
-
     try {
       // should initialize correctly and return true for valid TrayIcon
       TrayIcon tray = JajukSystray.getInstance().getTrayIcon();
@@ -80,7 +78,7 @@ public class TestJavaBalloonNotificator extends JajukTestCase {
     try {
       JavaBalloonNotificator notificator = JavaBalloonNotificator.getInstance();
       if (notificator.isAvailable()) {
-        File file = TestHelpers.getMockFile();
+        File file = TestHelpers.getFile();
         notificator.notify(file);
       }
     } catch (NoClassDefFoundError e) {
@@ -100,7 +98,7 @@ public class TestJavaBalloonNotificator extends JajukTestCase {
     try {
       JavaBalloonNotificator notificator = JavaBalloonNotificator.getInstance();
       if (notificator.isAvailable()) {
-        WebRadio webradio = new WebRadio("a web radio", "http://www.test.org/webradio");
+        WebRadio webradio = TestHelpers.getWebRadio();
         notificator.notify(webradio);
       }
     } catch (NoClassDefFoundError e) {
diff --git a/src/test/java/org/jajuk/services/notification/TestNotificatorFactory.java b/src/test/java/org/jajuk/services/notification/TestNotificatorFactory.java
index b8b1c98..1783d19 100644
--- a/src/test/java/org/jajuk/services/notification/TestNotificatorFactory.java
+++ b/src/test/java/org/jajuk/services/notification/TestNotificatorFactory.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -25,10 +25,9 @@ import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestNotificatorFactory extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -38,7 +37,6 @@ public class TestNotificatorFactory extends JajukTestCase {
   public void testNoneNotificator() {
     // enable Tooltip/Notification
     Conf.setProperty(Const.CONF_UI_NOTIFICATOR_TYPE, NotificatorTypes.NONE.name());
-
     // now try to get a balloon notificator, but we cannot be sure if this works
     // on all
     // machines so we on't assume not null.
@@ -54,7 +52,6 @@ public class TestNotificatorFactory extends JajukTestCase {
   public void testBalloonNotificator() {
     // enable Tooltip/Notification
     Conf.setProperty(Const.CONF_UI_NOTIFICATOR_TYPE, NotificatorTypes.BALLOON.name());
-
     // now try to get a balloon notificator, but we cannot be sure if this works
     // on all
     // machines so we on't assume not null.
@@ -76,12 +73,11 @@ public class TestNotificatorFactory extends JajukTestCase {
 
   /**
    * Test get system notificator false.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetSystemNotificatorFalse() {
     // disable Tooltip/Notification
     Conf.setProperty(Const.CONF_UI_NOTIFICATOR_TYPE, NotificatorTypes.NONE.name());
-
     // here we need to get null back as it is disabled
     assertNull(NotificatorFactory.getNotificator());
   }
diff --git a/src/test/java/org/jajuk/services/notification/TestNotifySendBalloonNotificator.java b/src/test/java/org/jajuk/services/notification/TestNotifySendBalloonNotificator.java
index 230861d..2deda05 100644
--- a/src/test/java/org/jajuk/services/notification/TestNotifySendBalloonNotificator.java
+++ b/src/test/java/org/jajuk/services/notification/TestNotifySendBalloonNotificator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -26,10 +26,9 @@ import org.jajuk.base.File;
 import org.jajuk.services.webradio.WebRadio;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestNotifySendBalloonNotificator extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -42,10 +41,8 @@ public class TestNotifySendBalloonNotificator extends JajukTestCase {
     // on the "notify-send" to be available, which we cannot guarantee on all
     // machines running the tests
     NotifySendBalloonNotificator not = NotifySendBalloonNotificator.getInstance();
-
     // just call it to cover it, we cannot test if it is true or false
     not.isAvailable();
-
   }
 
   /**
@@ -60,10 +57,9 @@ public class TestNotifySendBalloonNotificator extends JajukTestCase {
     // on the "notify-send" to be available, which we cannot guarantee on all
     // machines running the tests
     NotifySendBalloonNotificator notificator = NotifySendBalloonNotificator.getInstance();
-
     // only test this if it is available
     if (notificator.isAvailable()) {
-      File file = TestHelpers.getMockFile();
+      File file = TestHelpers.getFile();
       notificator.notify(file);
     }
   }
@@ -80,12 +76,10 @@ public class TestNotifySendBalloonNotificator extends JajukTestCase {
     // on the "notify-send" to be available, which we cannot guarantee on all
     // machines running the tests
     NotifySendBalloonNotificator notificator = NotifySendBalloonNotificator.getInstance();
-
     // only test this if it is available
     if (notificator.isAvailable()) {
-      WebRadio webradio = new WebRadio("a web radio", "http://www.test.org/webradio");
+      WebRadio webradio = TestHelpers.getWebRadio();
       notificator.notify(webradio);
     }
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/notification/TestToastNotificator.java b/src/test/java/org/jajuk/services/notification/TestToastNotificator.java
index 01c54e7..1e5a684 100644
--- a/src/test/java/org/jajuk/services/notification/TestToastNotificator.java
+++ b/src/test/java/org/jajuk/services/notification/TestToastNotificator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.notification;
 
@@ -28,11 +28,7 @@ import org.jajuk.base.File;
 import org.jajuk.services.startup.StartupCollectionService;
 import org.jajuk.services.webradio.WebRadio;
 
-/**
- * DOCUMENT_ME.
- */
 public class TestToastNotificator extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -70,7 +66,7 @@ public class TestToastNotificator extends JajukTestCase {
     try {
       StartupCollectionService.registerItemManagers();
       ToastNotificator notificator = ToastNotificator.getInstance();
-      File file = TestHelpers.getMockFile();
+      File file = TestHelpers.getFile();
       notificator.notify(file);
     } catch (NoClassDefFoundError e) {
       // expected when run without UI support
@@ -88,7 +84,7 @@ public class TestToastNotificator extends JajukTestCase {
   public void testNotifyWebradio() {
     try {
       ToastNotificator notificator = ToastNotificator.getInstance();
-      WebRadio webradio = new WebRadio("a web radio", "http://www.test.org/webradio");
+      WebRadio webradio = TestHelpers.getWebRadio();
       notificator.notify(webradio);
     } catch (NoClassDefFoundError e) {
       // expected when run without UI support
diff --git a/src/test/java/org/jajuk/services/players/DummyMPlayerImpl.java b/src/test/java/org/jajuk/services/players/DummyMPlayerImpl.java
index c745766..871b8fc 100644
--- a/src/test/java/org/jajuk/services/players/DummyMPlayerImpl.java
+++ b/src/test/java/org/jajuk/services/players/DummyMPlayerImpl.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,19 +16,14 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
-/**
- * DOCUMENT_ME.
- */
 public class DummyMPlayerImpl {
-  
-  /** The Constant POSITION.  DOCUMENT_ME */
+  /** The Constant POSITION.   */
   public final static float POSITION = 17.7f;
-  
-  /** The Constant LENGTH.  DOCUMENT_ME */
+  /** The Constant LENGTH.   */
   public final static float LENGTH = 235.28f;
 
   /**
@@ -39,13 +34,10 @@ public class DummyMPlayerImpl {
    */
   public static void main(final String[] args) throws InterruptedException {
     System.out.println("TestMPlayerPlayerImpl was called!");
-
     // simulate normal reply by MPlayer to commands that are sent in
     System.out.println("ANS_LENGTH=" + new Float(LENGTH).toString());
     System.out.println("ANS_TIME_POSITION=" + new Float(POSITION).toString());
-
     Thread.sleep(5000);
-
     System.out.println("Exiting... (Quit)");
   }
 }
diff --git a/src/test/java/org/jajuk/services/players/TestQueueList.java b/src/test/java/org/jajuk/services/players/TestQueueList.java
index 83cf12d..a88d3ea 100644
--- a/src/test/java/org/jajuk/services/players/TestQueueList.java
+++ b/src/test/java/org/jajuk/services/players/TestQueueList.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
@@ -25,16 +25,15 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.File;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestQueueList extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.services.players.QueueList#add(org.jajuk.services.players.StackItem)}.
    *
@@ -42,7 +41,7 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testAddStackItem() throws Exception {
     QueueList impl = new QueueList();
-    impl.add(new StackItem(JUnitHelpers.getFile("file1", false)));
+    impl.add(new StackItem(TestHelpers.getFile("file1", false)));
     assertEquals(1, impl.size());
   }
 
@@ -53,14 +52,12 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testAddIntStackItem() throws Exception {
     QueueList impl = new QueueList();
-    File file1 = JUnitHelpers.getFile("file1", false);
-    File file2 = JUnitHelpers.getFile("file2", false);
-
+    File file1 = TestHelpers.getFile("file1", false);
+    File file2 = TestHelpers.getFile("file2", false);
     impl.add(new StackItem(file1));
     assertEquals(1, impl.size());
     impl.add(0, new StackItem(file2));
     assertEquals(2, impl.size());
-
     // "2" should be first!
     assertEquals(file2, impl.get(0).getFile());
   }
@@ -72,7 +69,6 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testAddAllCollectionOfQextendsStackItem() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
   }
@@ -84,19 +80,15 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testAddAllIntCollectionOfQextendsStackItem() throws Exception {
     QueueList impl = new QueueList();
-
-    impl.add(new StackItem(JUnitHelpers.getFile("file10", false)));
+    impl.add(new StackItem(TestHelpers.getFile("file10", false)));
     assertEquals(1, impl.size());
-
-    File file1 = JUnitHelpers.getFile("file1", false);
-    File file2 = JUnitHelpers.getFile("file2", false);
-    File file3 = JUnitHelpers.getFile("file3", false);
-
+    File file1 = TestHelpers.getFile("file1", false);
+    File file2 = TestHelpers.getFile("file2", false);
+    File file3 = TestHelpers.getFile("file3", false);
     List<StackItem> set = new ArrayList<StackItem>();
     set.add(new StackItem(file1));
     set.add(new StackItem(file2));
     set.add(new StackItem(file3));
-
     impl.addAll(0, set);
     assertEquals(4, impl.size());
     assertEquals(file1, impl.get(0).getFile());
@@ -109,10 +101,8 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testClear() throws Exception {
     QueueList impl = new QueueList();
-
-    impl.add(new StackItem(JUnitHelpers.getFile("file10", false)));
+    impl.add(new StackItem(TestHelpers.getFile("file10", false)));
     assertEquals(1, impl.size());
-
     impl.clear();
     assertEquals(0, impl.size());
   }
@@ -124,12 +114,10 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testContains() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
-    assertTrue(impl.contains(new StackItem(JUnitHelpers.getFile("file1", false))));
-    assertFalse(impl.contains(new StackItem(JUnitHelpers.getFile("file4", false))));
+    assertTrue(impl.contains(new StackItem(TestHelpers.getFile("file1", false))));
+    assertFalse(impl.contains(new StackItem(TestHelpers.getFile("file4", false))));
   }
 
   /**
@@ -139,14 +127,11 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testContainsAll() throws Exception {
     QueueList impl = new QueueList();
-
     List<StackItem> set = prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
     assertTrue(impl.containsAll(set));
-
     // add a file that is not in the queue
-    set.add(new StackItem(JUnitHelpers.getFile("file4", false)));
+    set.add(new StackItem(TestHelpers.getFile("file4", false)));
     assertFalse(impl.containsAll(set));
   }
 
@@ -166,12 +151,10 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testIndexOf() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
-    assertEquals(0, impl.indexOf(new StackItem(JUnitHelpers.getFile("file1", false))));
-    assertEquals(1, impl.indexOf(new StackItem(JUnitHelpers.getFile("file2", false))));
+    assertEquals(0, impl.indexOf(new StackItem(TestHelpers.getFile("file1", false))));
+    assertEquals(1, impl.indexOf(new StackItem(TestHelpers.getFile("file2", false))));
   }
 
   /**
@@ -181,11 +164,8 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testIsEmpty() throws Exception {
     QueueList impl = new QueueList();
-
     assertTrue(impl.isEmpty());
-
-    impl.add(new StackItem(JUnitHelpers.getFile("file1", false)));
-
+    impl.add(new StackItem(TestHelpers.getFile("file1", false)));
     assertFalse(impl.isEmpty());
   }
 
@@ -196,10 +176,8 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testIterator() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
     Iterator<StackItem> it = impl.iterator();
     assertTrue(it.hasNext());
     it.next();
@@ -217,11 +195,9 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testLastIndexOf() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
-    assertEquals(2, impl.lastIndexOf(new StackItem(JUnitHelpers.getFile("file3", false))));
+    assertEquals(2, impl.lastIndexOf(new StackItem(TestHelpers.getFile("file3", false))));
   }
 
   /**
@@ -231,10 +207,8 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testListIterator() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
     assertNotNull(impl.listIterator());
   }
 
@@ -245,10 +219,8 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testListIteratorInt() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
     assertNotNull(impl.listIterator(1));
   }
 
@@ -259,15 +231,12 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testRemoveObject() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
     assertEquals(3, impl.size());
-
     // first it works
-    assertTrue(impl.remove(new StackItem(JUnitHelpers.getFile("file2", false))));
-
+    assertTrue(impl.remove(new StackItem(TestHelpers.getFile("file2", false))));
     // then the element is not found any more
-    assertFalse(impl.remove(new StackItem(JUnitHelpers.getFile("file2", false))));
+    assertFalse(impl.remove(new StackItem(TestHelpers.getFile("file2", false))));
   }
 
   /**
@@ -277,12 +246,9 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testRemoveInt() throws Exception {
     QueueList impl = new QueueList();
-
     prepareQueueImpl(impl);
-
     // first it removes an item
     assertNotNull(impl.remove(2));
-
     // then there is no more item to remove
     try {
       assertNull(impl.remove(2));
@@ -299,12 +265,9 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testRemoveAll() throws Exception {
     QueueList impl = new QueueList();
-
     List<StackItem> set = prepareQueueImpl(impl);
-
     assertTrue(impl.removeAll(set));
     assertEquals(0, impl.size());
-
     // no more changes
     assertFalse(impl.removeAll(set));
   }
@@ -316,12 +279,9 @@ public class TestQueueList extends JajukTestCase {
    */
   public void testRetainAll() throws Exception {
     QueueList impl = new QueueList();
-
     List<StackItem> set = prepareQueueImpl(impl);
-
     impl.retainAll(set);
     assertEquals(3, impl.size());
-
     impl.retainAll(new HashSet<StackItem>());
     assertEquals(0, impl.size());
   }
@@ -334,9 +294,7 @@ public class TestQueueList extends JajukTestCase {
   public void testSet() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
-    impl.set(0, new StackItem(JUnitHelpers.getFile("file4", false)));
-
+    impl.set(0, new StackItem(TestHelpers.getFile("file4", false)));
     assertEquals("file4", impl.get(0).getFile().getName());
   }
 
@@ -357,7 +315,6 @@ public class TestQueueList extends JajukTestCase {
   public void testSubList() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     List<StackItem> items = impl.subList(1, 3);
     assertEquals(2, items.size());
   }
@@ -370,7 +327,6 @@ public class TestQueueList extends JajukTestCase {
   public void testToArray() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     Object[] arr = impl.toArray();
     assertEquals(3, arr.length);
   }
@@ -383,7 +339,6 @@ public class TestQueueList extends JajukTestCase {
   public void testToArrayTArray() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     StackItem[] arr = impl.toArray(new StackItem[] {});
     assertEquals(3, arr.length);
   }
@@ -396,7 +351,6 @@ public class TestQueueList extends JajukTestCase {
   public void testGetQueue() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     List<StackItem> queue = impl.getQueue();
     assertEquals(3, queue.size());
   }
@@ -409,10 +363,8 @@ public class TestQueueList extends JajukTestCase {
   public void testSizePlanned() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     assertEquals(0, impl.sizePlanned());
-    impl.addPlanned(new StackItem(JUnitHelpers.getFile("file2", false)));
-
+    impl.addPlanned(new StackItem(TestHelpers.getFile("file2", false)));
     assertEquals(1, impl.sizePlanned());
   }
 
@@ -433,9 +385,7 @@ public class TestQueueList extends JajukTestCase {
   public void testAddPlannedListOfStackItem() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     prepareQueueImplPlanned(impl);
-
     assertEquals(2, impl.sizePlanned());
   }
 
@@ -447,9 +397,7 @@ public class TestQueueList extends JajukTestCase {
   public void testGetPlannedInt() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     prepareQueueImplPlanned(impl);
-
     assertEquals("file9", impl.getPlanned(0).getFile().getName());
     assertEquals("file8", impl.getPlanned(1).getFile().getName());
   }
@@ -462,9 +410,7 @@ public class TestQueueList extends JajukTestCase {
   public void testGetPlanned() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     prepareQueueImplPlanned(impl);
-
     assertEquals(2, impl.getPlanned().size());
   }
 
@@ -476,27 +422,18 @@ public class TestQueueList extends JajukTestCase {
   public void testRemovePlannedFromList() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     prepareQueueImplPlanned(impl);
-
     List<File> items = new ArrayList<File>();
-
     impl.removePlannedFromList(items);
-
     assertEquals(0, items.size());
-
-    items.add(JUnitHelpers.getFile("file2", false));
-    items.add(JUnitHelpers.getFile("file8", false)); // this should be removed
-    items.add(JUnitHelpers.getFile("file11", false));
-
+    items.add(TestHelpers.getFile("file2", false));
+    items.add(TestHelpers.getFile("file8", false)); // this should be removed
+    items.add(TestHelpers.getFile("file11", false));
     assertEquals(3, items.size());
-
     impl.removePlannedFromList(items);
-
     assertEquals(2, items.size());
     assertEquals("file2", items.get(0).getName());
     assertEquals("file11", items.get(1).getName());
-
   }
 
   /**
@@ -507,11 +444,8 @@ public class TestQueueList extends JajukTestCase {
   public void testClearPlanned() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     prepareQueueImplPlanned(impl);
-
     impl.clearPlanned();
-
     assertEquals(3, impl.size());
     assertEquals(0, impl.sizePlanned());
   }
@@ -524,16 +458,11 @@ public class TestQueueList extends JajukTestCase {
   public void testContainsRepeat() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     // repeat is not automatically set
     assertFalse(impl.containsRepeat());
-
     impl.get(1).setRepeat(true);
-
     assertTrue(impl.containsRepeat());
-
     impl.get(1).setRepeat(false);
-
     assertFalse(impl.containsRepeat());
   }
 
@@ -545,9 +474,7 @@ public class TestQueueList extends JajukTestCase {
   public void testPopNextPlanned() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     prepareQueueImplPlanned(impl);
-
     assertNotNull(impl.popNextPlanned());
     assertNotNull(impl.popNextPlanned());
     assertNull(impl.popNextPlanned());
@@ -561,57 +488,48 @@ public class TestQueueList extends JajukTestCase {
   public void testContainsOnlyRepeat() throws Exception {
     QueueList impl = new QueueList();
     prepareQueueImpl(impl);
-
     // repeat is not automatically set
     assertFalse(impl.containsOnlyRepeat());
-
     impl.get(1).setRepeat(true);
-
     assertFalse(impl.containsOnlyRepeat());
-
     impl.get(0).setRepeat(true);
     impl.get(2).setRepeat(true);
-
     assertTrue(impl.containsOnlyRepeat());
-
     impl.get(1).setRepeat(false);
-
     assertFalse(impl.containsOnlyRepeat());
   }
 
   /**
    * Prepare queue impl.
-   * DOCUMENT_ME
+   * 
    *
-   * @param impl DOCUMENT_ME
+   * @param impl 
    * @return the list
    * @throws JajukException the jajuk exception
    * @throws Exception the exception
    */
   private List<StackItem> prepareQueueImpl(QueueList impl) throws JajukException, Exception {
     List<StackItem> set = new ArrayList<StackItem>();
-    set.add(new StackItem(JUnitHelpers.getFile("file1", false)));
-    set.add(new StackItem(JUnitHelpers.getFile("file2", false)));
-    set.add(new StackItem(JUnitHelpers.getFile("file3", false)));
-
+    set.add(new StackItem(TestHelpers.getFile("file1", false)));
+    set.add(new StackItem(TestHelpers.getFile("file2", false)));
+    set.add(new StackItem(TestHelpers.getFile("file3", false)));
     impl.addAll(set);
     return set;
   }
 
   /**
    * Prepare queue impl planned.
-   * DOCUMENT_ME
+   * 
    *
-   * @param impl DOCUMENT_ME
+   * @param impl 
    * @return the list
    * @throws JajukException the jajuk exception
    * @throws Exception the exception
    */
   private List<StackItem> prepareQueueImplPlanned(QueueList impl) throws JajukException, Exception {
     List<StackItem> set = new ArrayList<StackItem>();
-    set.add(new StackItem(JUnitHelpers.getFile("file9", false)));
-    set.add(new StackItem(JUnitHelpers.getFile("file8", false)));
-
+    set.add(new StackItem(TestHelpers.getFile("file9", false)));
+    set.add(new StackItem(TestHelpers.getFile("file8", false)));
     impl.addPlanned(set);
     return set;
   }
diff --git a/src/test/java/org/jajuk/services/players/TestQueueModel.java b/src/test/java/org/jajuk/services/players/TestQueueModel.java
index be140a6..732771d 100644
--- a/src/test/java/org/jajuk/services/players/TestQueueModel.java
+++ b/src/test/java/org/jajuk/services/players/TestQueueModel.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,16 +16,19 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.commons.io.FileUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.MockPlayer;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -40,53 +43,43 @@ import org.jajuk.base.Type;
 import org.jajuk.base.Year;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.services.startup.StartupCollectionService;
-import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
+import org.jajuk.util.UtilFeatures;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestQueueModel extends JajukTestCase {
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
+    UtilFeatures.storePersistedPlayingPosition(0);
     // reset before each test to have a clean start for each test as most
     // data is held statically for QueueModel
     QueueModel.reset();
     QueueModel.itemLast = null;
     QueueModel.stopRequest();
-
     // reset conf changes to default
     Conf.setProperty(Const.CONF_STATE_CONTINUE, "false");
-    Conf.setProperty(Const.CONF_DROP_PLAYED_TRACKS_FROM_QUEUE, "false");
     Conf.setProperty(Const.CONF_STATE_CONTINUE, "false");
     Conf.setProperty(Const.CONF_STATE_SHUFFLE, "false");
-
     // remove any registered files
     for (File file : FileManager.getInstance().getFiles()) {
       FileManager.getInstance().removeFile(file);
     }
-
-    super.setUp();
   }
 
   // helper method to emma-coverage of the unused constructor
   /**
    * Test private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPrivateConstructor() throws Exception {
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(QueueModel.class);
+    TestHelpers.executePrivateConstructor(QueueModel.class);
   }
 
   /*
@@ -96,9 +89,6 @@ public class TestQueueModel extends JajukTestCase {
    */
   @Override
   protected void tearDown() throws Exception {
-    // make sure that the SwingUtilities.invokeLater() are all done
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
     super.tearDown();
   }
 
@@ -107,12 +97,10 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testReset() throws Exception {
     // nothing to reset up-front
     QueueModel.reset();
     assertEquals(0, QueueModel.getQueueSize());
-
     // things are reset with queued items
     addItems(10);
     QueueModel.goTo(4);
@@ -126,7 +114,6 @@ public class TestQueueModel extends JajukTestCase {
    *
    * {@link org.jajuk.services.players.QueueModel#setRepeatModeToAll(boolean)}.
    */
-
   public void testSetRepeatModeToAll() {
     QueueModel.setRepeatModeToAll(false);
   }
@@ -138,34 +125,21 @@ public class TestQueueModel extends JajukTestCase {
    * {@link org.jajuk.services.players.QueueModel#push(java.util.List, boolean)}
    * .
    */
-
   public void testPushListOfStackItemBoolean() throws Exception {
-    List<StackItem> list = new ArrayList<StackItem>();
-    list.add(new StackItem(JUnitHelpers.getFile("file1", true)));
-
-    QueueModel.push(list, true);
-
-    // we try to wait for the thread started inside push() to finish
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
+    TestHelpers.push(item, true, false);
     assertEquals(1, QueueModel.getQueue().size());
   }
 
   /**
    * Test push list of stack item boolean no push.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPushListOfStackItemBooleanNoPush() throws Exception {
-    List<StackItem> list = new ArrayList<StackItem>();
-    list.add(new StackItem(JUnitHelpers.getFile("file1", true)));
-
-    QueueModel.push(list, false);
-
-    // we try to wait for the thread started inside push() to finish
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
+    TestHelpers.push(item, false, false);
     assertEquals(1, QueueModel.getQueue().size());
   }
 
@@ -178,30 +152,23 @@ public class TestQueueModel extends JajukTestCase {
   public void testPushListOfStackItemVoid() throws Exception {
     List<StackItem> list = new ArrayList<StackItem>();
     QueueModel.push(list, false);
-
     // there is a thread started, so delay a bit to let that happen...
     Thread.sleep(400);
-
     assertEquals(0, QueueModel.getQueue().size());
   }
 
   /**
    * Test push list of stack item boolean null items.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPushListOfStackItemBooleanNullItems() throws Exception {
     List<StackItem> list = new ArrayList<StackItem>();
-    list.add(new StackItem(JUnitHelpers.getFile("file1", true)));
+    list.add(new StackItem(TestHelpers.getFile("file1", true)));
     list.add(null);
-    list.add(new StackItem(JUnitHelpers.getFile("file3", true)));
-
-    QueueModel.push(list, true);
-
-    // we try to wait for the thread started inside push() to finish
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    list.add(new StackItem(TestHelpers.getFile("file3", true)));
+    TestHelpers.push(list, true, false);
     assertEquals(2, QueueModel.getQueue().size());
   }
 
@@ -212,34 +179,23 @@ public class TestQueueModel extends JajukTestCase {
    * {@link org.jajuk.services.players.QueueModel#push(java.util.List, boolean, boolean)}
    * .
    */
-
   public void testPushListOfStackItemBooleanBoolean() throws Exception {
-    List<StackItem> list = new ArrayList<StackItem>();
-    list.add(new StackItem(JUnitHelpers.getFile("file1", true)));
-
-    QueueModel.push(list, true, true);
-
-    // we try to wait for the thread started inside push() to finish
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
+    TestHelpers.push(item, true, true);
     assertEquals(1, QueueModel.getQueue().size());
   }
 
   /**
    * Test push list of stack item boolean boolean no push next.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPushListOfStackItemBooleanBooleanNoPushNext() throws Exception {
-    List<StackItem> list = new ArrayList<StackItem>();
-    list.add(new StackItem(JUnitHelpers.getFile("file1", true)));
-
-    QueueModel.push(list, false, false);
-
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
+    TestHelpers.push(item, false, false);
     // we try to wait for the thread started inside push() to finish
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
     assertEquals(1, QueueModel.getQueue().size());
   }
 
@@ -250,13 +206,10 @@ public class TestQueueModel extends JajukTestCase {
    * {@link org.jajuk.services.players.QueueModel#push(org.jajuk.services.players.StackItem, boolean)}
    * .
    */
-
   public void testPushStackItemBoolean() throws Exception {
-    QueueModel.push(new StackItem(JUnitHelpers.getFile("file1", true)), true);
-
+    QueueModel.push(new StackItem(TestHelpers.getFile("file1", true)), true);
     // we try to wait for the thread started inside push() to finish
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
     assertEquals(1, QueueModel.getQueue().size());
   }
 
@@ -267,29 +220,46 @@ public class TestQueueModel extends JajukTestCase {
    * {@link org.jajuk.services.players.QueueModel#push(org.jajuk.services.players.StackItem, boolean, boolean)}
    * .
    */
-
   public void testPushStackItemBooleanBoolean() throws Exception {
-    QueueModel.push(new StackItem(JUnitHelpers.getFile("file1", true)), true, true);
-
+    QueueModel.push(new StackItem(TestHelpers.getFile("file1", true)), true, true);
     // we try to wait for the thread started inside push() to finish
-    JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
     assertEquals(1, QueueModel.getQueue().size());
   }
 
   /**
    * Adds the items.
-   * DOCUMENT_ME
+   * 
    *
    * @param count number of items to create
+   * @param repeat repeat mode ?
+   * @param userLaunched : is it an excplicite user action ?
    * @throws Exception the exception
    */
-  private void addItems(int count) throws Exception {
+  private List<StackItem> addItems(int count, boolean repeat, boolean userLaunched)
+      throws Exception {
     List<StackItem> list = new ArrayList<StackItem>();
     for (int i = 0; i < count; i++) {
-      list.add(new StackItem(JUnitHelpers.getFile("file" + i, true)));
+      list.add(new StackItem(TestHelpers.getFile("file" + i, true), userLaunched, repeat));
     }
-    QueueModel.insert(list, 0);
+    QueueModel.insert(list, QueueModel.getQueueSize());
+    return list;
+  }
+
+  /**
+   * Adds the items.
+   * 
+   *
+   * @param count number of items to create
+   * @throws Exception the exception
+   */
+  private List<StackItem> addItems(int count) throws Exception {
+    List<StackItem> list = new ArrayList<StackItem>();
+    for (int i = 0; i < count; i++) {
+      list.add(new StackItem(TestHelpers.getFile("file" + i, true)));
+    }
+    QueueModel.insert(list, QueueModel.getQueueSize());
+    return list;
   }
 
   /**
@@ -298,9 +268,8 @@ public class TestQueueModel extends JajukTestCase {
    * {@link org.jajuk.services.players.QueueModel#launchRadio(org.jajuk.services.webradio.WebRadio)}
    * .
    */
-
   public void testLaunchRadio() {
-    QueueModel.launchRadio(new WebRadio("name", "invalidurl"));
+    QueueModel.launchRadio(TestHelpers.getWebRadio());
   }
 
   /**
@@ -309,15 +278,11 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#containsRepeat()}.
    */
-
   public void testContainsRepeat() throws Exception {
     addItems(2);
-
     assertFalse(QueueModel.containsRepeat());
-
     QueueModel.setRepeatModeToAll(true);
     assertTrue("Items: " + QueueModel.getQueue(), QueueModel.containsRepeat());
-
   }
 
   /**
@@ -325,17 +290,33 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testFinished() throws Exception {
     // without item it just returns
     QueueModel.finished();
+    // with items, it will go to the next ine
+    addItems(10);
+    QueueModel.goTo(0);
+    assertEquals(0, QueueModel.getIndex());
+    QueueModel.finished();
+    assertEquals(1, QueueModel.getIndex());
+  }
 
+  /**
+   * Test method for {@link org.jajuk.services.players.QueueModel#finished()}.
+   *
+   * @throws Exception the exception
+   */
+  public void testFinishedStoped() throws Exception {
+    // without item it just returns
+    QueueModel.finished();
     // with items, it will go to the next ine
     addItems(10);
     QueueModel.goTo(0);
     assertEquals(0, QueueModel.getIndex());
+    QueueModel.stopRequest();
     QueueModel.finished();
     assertEquals(1, QueueModel.getIndex());
+    assertTrue(QueueModel.isStopped());
   }
 
   /**
@@ -362,8 +343,8 @@ public class TestQueueModel extends JajukTestCase {
     assertTrue(QueueModel.getItem(0).equals(firstItem));
     QueueModel.finished();
     // Make sure that first item is no more the same
-    assertFalse("Item0: " + QueueModel.getItem(0) + "\nFirstItem: " + firstItem, !(QueueModel
-        .getItem(0).equals(firstItem)));
+    assertFalse("Item0: " + QueueModel.getItem(0) + "\nFirstItem: " + firstItem,
+        !(QueueModel.getItem(0).equals(firstItem)));
   }
 
   /**
@@ -375,105 +356,80 @@ public class TestQueueModel extends JajukTestCase {
   public void testFinishedBoolean() throws Exception {
     // without item it just returns
     QueueModel.finished(true);
-
     // with items, it will go to the next line
     addItems(10);
     QueueModel.goTo(0);
     assertEquals(0, QueueModel.getIndex());
     QueueModel.finished(true);
     assertEquals(1, QueueModel.getIndex());
-
     // still 10 as we do not remove items from queue in default setup
     assertEquals(10, QueueModel.getQueueSize());
   }
 
   /**
-   * Test finished boolean remove played.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testFinishedBooleanRemovePlayed() throws Exception {
-    // set config option that we want to test
-    Conf.setProperty(Const.CONF_DROP_PLAYED_TRACKS_FROM_QUEUE, "true");
-
-    // without item it just returns
-    QueueModel.finished(true);
-
-    // with items, it will go to the next line
-    addItems(10);
-    QueueModel.goTo(0);
-    assertEquals(0, QueueModel.getIndex());
-    QueueModel.finished(true);
-    assertEquals(0, QueueModel.getIndex());
-
-    // here we should have 9 now...
-    assertEquals(9, QueueModel.getQueueSize());
-  }
-
-  /**
    * Test finished end of queue no planned.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testFinishedEndOfQueueNoPlanned() throws Exception {
     // without item it just returns
     QueueModel.finished(true);
-
     // with items, it will go to the next line
     addItems(2);
     QueueModel.goTo(0);
     assertEquals(0, QueueModel.getIndex());
     QueueModel.finished(true);
     assertEquals(1, QueueModel.getIndex());
-
     // still 2 as we do not remove items from queue in default setup
     assertEquals(2, QueueModel.getQueueSize());
-
-    // next time it will reset the index as we do not "plan" new tracks automatically
-    QueueModel.finished(true);
-    assertEquals(-1, QueueModel.getIndex());
   }
 
   /**
    * Test finished end of queue with planned.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testFinishedEndOfQueueWithPlanned() throws Exception {
     Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    Conf.setProperty(Const.CONF_STATE_REPEAT, "false");
+    Conf.setProperty(Const.CONF_STATE_REPEAT_ALL, "false");
     // without item it just returns
     QueueModel.finished(true);
-
     // with items, it will go to the next line
     addItems(2);
     QueueModel.goTo(0);
     assertEquals(0, QueueModel.getIndex());
     QueueModel.finished(true);
     assertEquals(1, QueueModel.getIndex());
-
     // still 2 as we do not remove items from queue in default setup
     assertEquals(2, QueueModel.getQueueSize());
-
-    { // start a track
-      List<StackItem> list = new ArrayList<StackItem>();
-      list.add(new StackItem(JUnitHelpers.getFile("file" + 21, true)));
-
-      QueueModel.push(list, true);
-
-      // we try to wait for the thread started inside push() to finish
-      JUnitHelpers.waitForThreadToFinish("Queue Push Thread");
-
-      assertEquals(3, QueueModel.getQueue().size());
-    }
-
-    // one more to finish now
+    // start a track
+    StackItem item = new StackItem(TestHelpers.getFile("file" + 21, true));
+    TestHelpers.push(item, true, false);
+    // we try to wait for the thread started inside push() to finish
+    TestHelpers.waitForThreadToFinish("Queue Push Thread");
+    assertEquals(3, QueueModel.getQueue().size());
+    QueueModel.finished(true);
     QueueModel.finished(true);
+    assertEquals(4, QueueModel.getQueue().size()); // a  planned track has been selected, we have now 4 tracks in queue
+    assertEquals(3, QueueModel.getIndex());
+  }
 
-    // next time it will reset the index as we do not "plan" new tracks automatically
+  /**
+   * Test finished end of queue without continue mode.
+   * 
+   *
+   * @throws Exception the exception
+   */
+  public void testFinishedNoContinueMode() throws Exception {
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "false");
+    // without item it just returns
     QueueModel.finished(true);
+    // with items, it will go to the next line
+    addItems(1);
+    QueueModel.goTo(0);
     assertEquals(0, QueueModel.getIndex());
   }
 
@@ -487,11 +443,9 @@ public class TestQueueModel extends JajukTestCase {
     addItems(1);
     StackItem si = QueueModel.getItem(0);
     si.setRepeat(true);
-
     QueueModel.goTo(0);
     // Finish the track, should play again
     QueueModel.finished();
-
     StackItem newSi = QueueModel.getItem(0);
     assertEquals(0, QueueModel.getIndex());
     assertTrue(newSi.isRepeat());
@@ -513,13 +467,11 @@ public class TestQueueModel extends JajukTestCase {
     QueueModel.goTo(9);
     // Finish the track, should play again
     QueueModel.finished();
-
     // same track should be played again as it is in repeat mode and the first
     // one at index 0 is not
     StackItem newSi = QueueModel.getCurrentItem();
     assertEquals(newSi, si);
     assertTrue(newSi.isRepeat());
-
     // Now the same with first track in repeat mode
     QueueModel.getItem(0).setRepeat(true);
     QueueModel.finished();
@@ -531,7 +483,7 @@ public class TestQueueModel extends JajukTestCase {
 
   /**
    * Test finished repeat last item not last.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
@@ -544,13 +496,11 @@ public class TestQueueModel extends JajukTestCase {
     QueueModel.goTo(5);
     // Finish the track, should play again
     QueueModel.finished();
-
     // same track should be played again as it is in repeat mode and the first
     // one at index 0 is not
     StackItem newSi = QueueModel.getCurrentItem();
     assertEquals(newSi, si);
     assertTrue(newSi.isRepeat());
-
     // Now the same with first track in repeat mode
     QueueModel.getItem(6).setRepeat(true);
     QueueModel.finished();
@@ -575,13 +525,11 @@ public class TestQueueModel extends JajukTestCase {
     QueueModel.goTo(5);
     // Finish the track, should play again
     QueueModel.finished();
-
     // same track should be played again as it is in repeat mode and the first
     // one at index 0 is not
     StackItem newSi = QueueModel.getCurrentItem();
     assertEquals(newSi, si);
     assertTrue(newSi.isRepeat());
-
     // Now the same with first track in repeat mode
     QueueModel.getItem(6).setRepeat(true);
     QueueModel.finished();
@@ -597,7 +545,6 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testSetAndGetIndex() throws Exception {
     // with items, it will go to the next ine
     addItems(10);
@@ -613,44 +560,38 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#computesPlanned(boolean)}.
    */
-
   public void testComputesPlanned() throws Exception {
     // without tracks it will not do much
     QueueModel.computesPlanned(false);
-
     // with tracks, it will look at planned items
     addItems(10);
     QueueModel.computesPlanned(true);
-
   }
 
   /**
    * Test computes planned clear.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testComputesPlannedClear() throws Exception {
     Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
-
     // without tracks it will not do much, but it will hit the "clearPlanned"
     QueueModel.computesPlanned(true);
   }
 
   /**
    * Test computes planned shuffle.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testComputesPlannedShuffle() throws Exception {
     // set Property to hit the "Shuffle" branch
     Conf.setProperty(Const.CONF_STATE_SHUFFLE, "true");
-
     // with tracks, it will look at planned items
     addItems(10);
     QueueModel.computesPlanned(true);
-
   }
 
   /**
@@ -658,12 +599,10 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testClear() throws Exception {
     // nothing to reset up-front
     QueueModel.clear();
     assertEquals(0, QueueModel.getQueueSize());
-
     // things are reset with queued items
     addItems(10);
     QueueModel.goTo(4);
@@ -678,7 +617,6 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#containsOnlyRepeat()}.
    */
-
   public void testContainsOnlyRepeat() throws Exception {
     assertTrue(QueueModel.containsOnlyRepeat());
     addItems(10);
@@ -693,11 +631,9 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#playPrevious()}.
    */
-
   public void testPlayPrevious() throws Exception {
     // do nothing without items
     QueueModel.playPrevious();
-
     // with items:
     addItems(10);
     QueueModel.goTo(2);
@@ -707,14 +643,13 @@ public class TestQueueModel extends JajukTestCase {
 
   /**
    * Test play previous at zero.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPlayPreviousAtZero() throws Exception {
     // do nothing without items
     QueueModel.playPrevious();
-
     // with items:
     addItems(10);
     QueueModel.goTo(0);
@@ -724,14 +659,13 @@ public class TestQueueModel extends JajukTestCase {
 
   /**
    * Test play previous at zero with repeat.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPlayPreviousAtZeroWithRepeat() throws Exception {
     // do nothing without items
     QueueModel.playPrevious();
-
     // with items:
     addItems(10);
     QueueModel.goTo(0);
@@ -745,7 +679,6 @@ public class TestQueueModel extends JajukTestCase {
    *
    * {@link org.jajuk.services.players.QueueModel#playPreviousAlbum()}.
    */
-
   public void testPlayPreviousAlbum() {
     QueueModel.playPreviousAlbum();
   }
@@ -755,11 +688,9 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testPlayNext() throws Exception {
     // do nothing without items
     QueueModel.playNext();
-
     // with items:
     addItems(10);
     QueueModel.goTo(2);
@@ -768,11 +699,32 @@ public class TestQueueModel extends JajukTestCase {
   }
 
   /**
+   * Test method for {@link org.jajuk.services.players.QueueModel#playNext()}.
+   * We test case where we launch several tracks in simple repeat mode and we force a next.
+   *
+   * @throws Exception the exception
+   */
+  public void testPlayNextSetOfSimpleRepeat() throws Exception {
+    // with items:
+    addItems(10, true, true);
+    assertTrue(QueueModel.getItem(0).isRepeat());
+    assertTrue(QueueModel.getItem(9).isRepeat());
+    assertEquals(QueueModel.getQueueSize(), 10);
+    QueueModel.goTo(0);
+    Thread.sleep(100);
+    assertEquals(0, QueueModel.getIndex());
+    QueueModel.finished(true);
+    Thread.sleep(100);
+    assertTrue(QueueModel.getItem(0).isRepeat());
+    assertEquals(1, QueueModel.getIndex());
+    assertEquals(QueueModel.getQueueSize(), 10);
+  }
+
+  /**
    * Test method for.
    *
    * {@link org.jajuk.services.players.QueueModel#playNextAlbum()}.
    */
-
   public void testPlayNextAlbum() {
     QueueModel.playNextAlbum();
   }
@@ -783,12 +735,10 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#getPlayingFile()}.
    */
-
   public void testGetPlayingFile() throws Exception {
     assertNull(QueueModel.getPlayingFile());
-
     addItems(10);
-    // QueueModel.playNext();
+    // QueueModel.finished(true);
     QueueModel.goTo(0);
     assertFalse(QueueModel.isStopped());
     assertNotNull(QueueModel.getPlayingFile());
@@ -798,15 +748,14 @@ public class TestQueueModel extends JajukTestCase {
 
   /**
    * Test get playing file title.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testGetPlayingFileTitle() throws Exception {
     assertNull(QueueModel.getPlayingFileTitle());
-
     addItems(10);
-    // QueueModel.playNext();
+    // QueueModel.finished(true);
     QueueModel.goTo(0);
     assertFalse(QueueModel.isStopped());
     assertNotNull(QueueModel.getPlayingFileTitle());
@@ -820,7 +769,6 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#getCurrentItem()}.
    */
-
   public void testGetCurrentItem() throws Exception {
     // no item without items
     assertNull(QueueModel.getCurrentItem());
@@ -834,7 +782,6 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGetItem() throws Exception {
     addItems(10);
     assertEquals("file0", QueueModel.getItem(0).getFile().getName());
@@ -847,27 +794,21 @@ public class TestQueueModel extends JajukTestCase {
    * {@link org.jajuk.services.players.QueueModel#canUnmount(org.jajuk.base.Device)}
    * .
    */
-
   public void testCanUnmount() throws Exception {
-    Device device = JUnitHelpers.getDevice("anydevice", 0, "/foo");
+    Device device = TestHelpers.getDevice();
     assertTrue(QueueModel.canUnmount(device));
-
     addItems(10);
-
     // still true as we are not playing
     assertTrue(QueueModel.canUnmount(device));
-
     // try to start playing/planning
-    QueueModel.playNext();
+    QueueModel.goTo(0);
     assertFalse(QueueModel.canUnmount(QueueModel.getItem(1).getFile().getDevice()));
-    assertTrue(QueueModel.canUnmount(device));
   }
 
   /**
    * Test method for {@link org.jajuk.services.players.QueueModel#stopRequest()}
    * .
    */
-
   public void testStopRequest() {
     QueueModel.stopRequest();
   }
@@ -877,17 +818,12 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testIsStopped() throws Exception {
     assertTrue(QueueModel.isStopped());
-
     addItems(10);
-
     // try to start playing/planning
-    QueueModel.playNext();
-
+    QueueModel.goTo(0);
     assertFalse(QueueModel.isStopped());
-
     QueueModel.stopRequest();
     assertTrue(QueueModel.isStopped());
   }
@@ -897,12 +833,9 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGetQueue() throws Exception {
     assertEquals(0, QueueModel.getQueue().size());
-
     addItems(10);
-
     assertEquals(10, QueueModel.getQueue().size());
   }
 
@@ -912,78 +845,41 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#getQueueSize()}.
    */
-
   public void testGetQueueSize() throws Exception {
     assertEquals(0, QueueModel.getQueueSize());
-
     addItems(10);
-
     assertEquals(10, QueueModel.getQueueSize());
   }
 
   /**
-   * Test method for {@link org.jajuk.services.players.QueueModel#shuffle()}.
-   *
-   * @throws Exception the exception
-   */
-
-  public void testShuffle() throws Exception {
-    // shuffle should not fail if queue is empty
-    QueueModel.shuffle();
-
-    addItems(10);
-
-    // verify that we have them in order before
-    assertEquals("file0", QueueModel.getItem(0).getFile().getName());
-    assertEquals("file5", QueueModel.getItem(5).getFile().getName());
-    assertEquals("file9", QueueModel.getItem(9).getFile().getName());
-
-    QueueModel.shuffle();
-
-    assertFalse("Queue: " + QueueModel.getQueue(), QueueModel.getItem(0).getFile().getName()
-        .equals("file0")
-        && QueueModel.getItem(5).getFile().getName().equals("file5")
-        && QueueModel.getItem(9).getFile().getName().equals("file9"));
-  }
-
-  /**
    * Test method for.
    *
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#insert(org.jajuk.services.players.StackItem, int)}
    * .
    */
-
   public void testInsertStackItemInt() throws Exception {
     assertEquals(0, QueueModel.getQueueSize());
-    QueueModel.insert(new StackItem(JUnitHelpers.getFile("file0", true)), 0);
-
+    QueueModel.insert(new StackItem(TestHelpers.getFile("file0", true)), 0);
     assertEquals(1, QueueModel.getQueueSize());
-
     // when we insert the next one at 0, the previous one should be moved
-    QueueModel.insert(new StackItem(JUnitHelpers.getFile("file1", true)), 0);
-
+    QueueModel.insert(new StackItem(TestHelpers.getFile("file1", true)), 0);
     assertEquals(2, QueueModel.getQueueSize());
     assertEquals("file1", QueueModel.getItem(0).getFile().getName());
     assertEquals("file0", QueueModel.getItem(1).getFile().getName());
-
     // adding in between now, should again adjust the queue accordingly
-    QueueModel.insert(new StackItem(JUnitHelpers.getFile("file2", true)), 1);
-
+    QueueModel.insert(new StackItem(TestHelpers.getFile("file2", true)), 1);
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals("file1", QueueModel.getItem(0).getFile().getName());
     assertEquals("file2", QueueModel.getItem(1).getFile().getName());
     assertEquals("file0", QueueModel.getItem(2).getFile().getName());
-
     // and adding at the end should work as well
-    QueueModel.insert(new StackItem(JUnitHelpers.getFile("file3", true)), 3);
-
+    QueueModel.insert(new StackItem(TestHelpers.getFile("file3", true)), 3);
     assertEquals(4, QueueModel.getQueueSize());
     assertEquals("file1", QueueModel.getItem(0).getFile().getName());
     assertEquals("file2", QueueModel.getItem(1).getFile().getName());
     assertEquals("file0", QueueModel.getItem(2).getFile().getName());
     assertEquals("file3", QueueModel.getItem(3).getFile().getName());
-
   }
 
   /**
@@ -992,13 +888,10 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#insert(java.util.List, int)}.
    */
-
   public void testInsertListOfStackItemInt() throws Exception {
     assertEquals(0, QueueModel.getQueueSize());
-
     // tested with addItems
     addItems(256);
-
     assertEquals(256, QueueModel.getQueueSize());
   }
 
@@ -1007,31 +900,24 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testUp() throws Exception {
     // first one cannot be put up, returns immediately
     QueueModel.up(0);
-
     addItems(3);
-
     // check queue
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals("file0", QueueModel.getItem(0).getFile().getName());
     assertEquals("file1", QueueModel.getItem(1).getFile().getName());
     assertEquals("file2", QueueModel.getItem(2).getFile().getName());
-
     // now up one
     QueueModel.up(2);
-
     // check queue after move
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals("file0", QueueModel.getItem(0).getFile().getName());
     assertEquals("file2", QueueModel.getItem(1).getFile().getName());
     assertEquals("file1", QueueModel.getItem(2).getFile().getName());
-
     // up once more
     QueueModel.up(1);
-
     // check queue
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals("file2", QueueModel.getItem(0).getFile().getName());
@@ -1044,22 +930,17 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testDown() throws Exception {
     // first one cannot be put up, returns immediately
     QueueModel.down(0);
-
     addItems(3);
-
     // check queue
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals("file0", QueueModel.getItem(0).getFile().getName());
     assertEquals("file1", QueueModel.getItem(1).getFile().getName());
     assertEquals("file2", QueueModel.getItem(2).getFile().getName());
-
     // now up one
     QueueModel.down(0);
-
     // check queue after move
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals(QueueModel.getQueue().toString(), "file1", QueueModel.getItem(0).getFile()
@@ -1068,10 +949,8 @@ public class TestQueueModel extends JajukTestCase {
         .getName());
     assertEquals(QueueModel.getQueue().toString(), "file2", QueueModel.getItem(2).getFile()
         .getName());
-
     // up once more
     QueueModel.down(1);
-
     // check queue
     assertEquals(3, QueueModel.getQueueSize());
     assertEquals("file1", QueueModel.getItem(0).getFile().getName());
@@ -1084,63 +963,329 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGoTo() throws Exception {
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 0, QueueModel.getQueueSize());
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), -1, QueueModel.getIndex());
+    //System.out.println("Thread dump at failure");
+    //TestHelpers.dumpThreads();
     QueueModel.goTo(0);
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 0, QueueModel.getQueueSize());
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 0, QueueModel.getIndex());
     addItems(5);
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 5, QueueModel.getQueueSize());
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 5, QueueModel.getIndex());
     QueueModel.goTo(2);
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 5, QueueModel.getQueueSize());
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 2, QueueModel.getIndex());
     QueueModel.goTo(4);
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 5, QueueModel.getQueueSize());
     assertEquals("file4", QueueModel.getCurrentItem().getFile().getName());
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 4, QueueModel.getIndex());
   }
 
   /**
    * Test go to repeat.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testGoToRepeat() throws Exception {
     addItems(5);
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 5, QueueModel.getQueueSize());
     QueueModel.goTo(2);
-
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 5, QueueModel.getQueueSize());
+    assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+        + ", item: " + QueueModel.getCurrentItem(), 2, QueueModel.getIndex());
     { // first choose one that is not set to repeat
       // now set some repeat
       QueueModel.getItem(2).setRepeat(true);
-
+      assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), 5, QueueModel.getQueueSize());
+      assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), 2, QueueModel.getIndex());
       QueueModel.goTo(4);
-
-      assertEquals("file4", QueueModel.getCurrentItem().getFile().getName());
+      assertNotNull("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), QueueModel.getCurrentItem());
+      assertNotNull("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), QueueModel.getCurrentItem().getFile());
+      assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), "file4", QueueModel.getCurrentItem()
+          .getFile().getName());
+      // item 4 is now not repeated
+      assertFalse(QueueModel.getItem(4).isRepeat());
     }
-
     { // and then try to go to a repeated one
-
       // now set some repeat
       QueueModel.getItem(2).setRepeat(true);
-
       QueueModel.goTo(2);
-
-      assertEquals("file2", QueueModel.getCurrentItem().getFile().getName());
-
+      assertNotNull("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), QueueModel.getCurrentItem());
+      assertNotNull("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), QueueModel.getCurrentItem().getFile());
+      assertEquals("Index: " + QueueModel.getIndex() + ", size: " + QueueModel.getQueueSize()
+          + ", item: " + QueueModel.getCurrentItem(), "file2", QueueModel.getCurrentItem()
+          .getFile().getName());
       // item 2 is now still repeated
       assertTrue(QueueModel.getItem(2).isRepeat());
     }
   }
 
   /**
+   * Album1..2..1 , reset album 2 at index 1 -> album 1, 1
+   * @throws JajukException
+   */
+  public void testRemoveAround1() throws JajukException {
+    List<StackItem> list = new ArrayList<StackItem>();
+    Album album1 = TestHelpers.getAlbum("album1", 1);
+    Album album2 = TestHelpers.getAlbum("album2", 1);
+    Directory dir = TestHelpers.getDirectory();
+    StackItem si1 = new StackItem(TestHelpers.getFile("file1", dir, true, MockPlayer.class, album1));
+    StackItem si2 = new StackItem(TestHelpers.getFile("file2", dir, true, MockPlayer.class, album2));
+    StackItem si3 = new StackItem(TestHelpers.getFile("file3", dir, true, MockPlayer.class, album1));
+    list.add(si1);
+    list.add(si2);
+    list.add(si3);
+    QueueModel.insert(list, QueueModel.getQueueSize());
+    QueueModel.resetAround(1, album2);
+    assertEquals(2, QueueModel.getCountTracksLeft());
+    assertEquals(album1, QueueModel.getItem(0).getFile().getTrack().getAlbum());
+    assertEquals(album1, QueueModel.getItem(1).getFile().getTrack().getAlbum());
+  }
+
+  /**
+   * Album1..2..2 , reset album 2 at index 1 -> album 1
+   * @throws JajukException
+   */
+  public void testRemoveAround2() throws JajukException {
+    List<StackItem> list = new ArrayList<StackItem>();
+    Album album1 = TestHelpers.getAlbum("album1", 1);
+    Album album2 = TestHelpers.getAlbum("album2", 1);
+    Directory dir = TestHelpers.getDirectory();
+    StackItem si1 = new StackItem(TestHelpers.getFile("file1", dir, true, MockPlayer.class, album1));
+    StackItem si2 = new StackItem(TestHelpers.getFile("file2", dir, true, MockPlayer.class, album2));
+    StackItem si3 = new StackItem(TestHelpers.getFile("file3", dir, true, MockPlayer.class, album2));
+    list.add(si1);
+    list.add(si2);
+    list.add(si3);
+    QueueModel.insert(list, QueueModel.getQueueSize());
+    QueueModel.resetAround(1, album2);
+    assertEquals(1, QueueModel.getCountTracksLeft());
+    assertEquals(album1, QueueModel.getItem(0).getFile().getTrack().getAlbum());
+  }
+
+  /**
+   * Album2..2..2 , reset album 2 at index 1 -> <nothing>
+   * @throws JajukException
+   */
+  public void testRemoveAround3() throws JajukException {
+    List<StackItem> list = new ArrayList<StackItem>();
+    Album album2 = TestHelpers.getAlbum("album2", 1);
+    Directory dir = TestHelpers.getDirectory();
+    StackItem si1 = new StackItem(TestHelpers.getFile("file1", dir, true, MockPlayer.class, album2));
+    StackItem si2 = new StackItem(TestHelpers.getFile("file2", dir, true, MockPlayer.class, album2));
+    StackItem si3 = new StackItem(TestHelpers.getFile("file3", dir, true, MockPlayer.class, album2));
+    list.add(si1);
+    list.add(si2);
+    list.add(si3);
+    QueueModel.insert(list, QueueModel.getQueueSize());
+    QueueModel.resetAround(1, album2);
+    assertEquals(0, QueueModel.getCountTracksLeft());
+  }
+
+  /**
+   * Album1..1..1 , reset album 2 at index 1 -> album 1,1
+   * @throws JajukException
+   */
+  public void testRemoveAround4() throws JajukException {
+    List<StackItem> list = new ArrayList<StackItem>();
+    Album album1 = TestHelpers.getAlbum("album1", 1);
+    Album album2 = TestHelpers.getAlbum("album2", 1);
+    Directory dir = TestHelpers.getDirectory();
+    StackItem si1 = new StackItem(TestHelpers.getFile("file1", dir, true, MockPlayer.class, album1));
+    StackItem si2 = new StackItem(TestHelpers.getFile("file2", dir, true, MockPlayer.class, album1));
+    StackItem si3 = new StackItem(TestHelpers.getFile("file3", dir, true, MockPlayer.class, album1));
+    list.add(si1);
+    list.add(si2);
+    list.add(si3);
+    QueueModel.insert(list, QueueModel.getQueueSize());
+    QueueModel.resetAround(1, album2);
+    assertEquals(2, QueueModel.getCountTracksLeft());
+    assertEquals(album1, QueueModel.getItem(0).getFile().getTrack().getAlbum());
+  }
+
+  /**
    * Test method for.
    *
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#remove(int, int)}.
    */
+  public void testRemoveCountInterval() throws Exception {
+    addItems(10);
+    QueueModel.remove(fromArray(1, 2, 3));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(QueueModel.getQueue().toString(), 7, QueueModel.getQueueSize());
+  }
 
-  public void testRemove() throws Exception {
-    QueueModel.remove(0, 0);
+  private Set<Integer> fromArray(Integer... indexes) {
+    HashSet<Integer> out = new HashSet<Integer>();
+    for (Integer i : indexes) {
+      out.add(i);
+    }
+    return out;
+  }
 
-    addItems(10);
+  public void testRemoveUnplayedTracks() throws Exception {
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    List<StackItem> items = addItems(3);
+    QueueModel.goTo(0);
+    assertEquals(0, QueueModel.getIndex());
+    assertEquals(items.get(0), QueueModel.getCurrentItem());
+    QueueModel.remove(fromArray(1, 2));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(1, QueueModel.getQueueSize());
+    assertEquals(0, QueueModel.getIndex());
+    assertEquals(items.get(0), QueueModel.getCurrentItem());
+  }
 
-    QueueModel.remove(1, 3);
+  public void testRemoveTracksIncludingPlaying() throws Exception {
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    List<StackItem> items = addItems(4);
+    QueueModel.goTo(1);
+    assertEquals(1, QueueModel.getIndex());
+    assertEquals(items.get(1), QueueModel.getCurrentItem());
+    QueueModel.remove(fromArray(1, 2));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(2, QueueModel.getQueueSize());
+    assertEquals(1, QueueModel.getIndex());
+    assertEquals(items.get(3), QueueModel.getCurrentItem());
+  }
 
-    assertEquals(QueueModel.getQueue().toString(), 7, QueueModel.getQueueSize());
+  public void testRemoveTracksIncludingPlayingFirstPosition() throws Exception {
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    List<StackItem> items = addItems(4);
+    assertEquals(4, QueueModel.getQueueSize());
+    QueueModel.goTo(0);
+    assertEquals(items.get(0), QueueModel.getCurrentItem());
+    assertEquals(0, QueueModel.getIndex());
+    QueueModel.remove(fromArray(0, 1));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(2, QueueModel.getQueueSize());
+    assertEquals(0, QueueModel.getIndex());
+    assertEquals(items.get(2), QueueModel.getCurrentItem());
+  }
+
+  public void testRemoveTracksIncludingPlayingLastPosition() throws Exception {
+    /** First planned track should be played */
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    List<StackItem> items = addItems(4);
+    assertEquals(4, QueueModel.getQueueSize());
+    QueueModel.goTo(3);
+    List<StackItem> planned = QueueModel.getPlanned();
+    StackItem firstPlanned = planned.get(0);
+    assertEquals(items.get(3), QueueModel.getCurrentItem());
+    assertEquals(3, QueueModel.getIndex());
+    QueueModel.remove(fromArray(2, 3));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(3, QueueModel.getQueueSize());
+    assertEquals(2, QueueModel.getIndex());
+    assertEquals(firstPlanned, QueueModel.getCurrentItem());
+  }
+
+  public void testRemoveTrackNoContinue() throws Exception {
+    /** First planned track should be played */
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "false");
+    List<StackItem> items = addItems(1);
+    assertEquals(1, QueueModel.getQueueSize());
+    QueueModel.goTo(0);
+    assertEquals(items.get(0), QueueModel.getCurrentItem());
+    assertEquals(0, QueueModel.getIndex());
+    QueueModel.remove(fromArray(0));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(0, QueueModel.getQueueSize());
+    assertEquals(-1, QueueModel.getIndex());
+    assertFalse(QueueModel.isPlayingTrack());
+  }
+
+  public void testRemoveNoPlanningTrackPlaying() throws Exception {
+    /** Test a regression : when dropping playing last track in queue, next planned track is played */
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    List<StackItem> items = addItems(10);
+    assertEquals(10, QueueModel.getQueueSize());
+    // planned tracks are file0, file1...
+    QueueModel.goTo(9);
+    assertEquals(items.get(9), QueueModel.getCurrentItem());
+    assertEquals(9, QueueModel.getIndex());
+    QueueModel.remove(9);
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(10, QueueModel.getQueueSize()); // dropped track should be replaced by first planned one
+    assertEquals(9, QueueModel.getIndex());
+    assertEquals(items.get(0), QueueModel.getCurrentItem());
+    assertTrue(QueueModel.isPlayingTrack());
+    assertFalse(QueueModel.getCurrentItem().isPlanned());
+  }
+
+  public void testRemoveTrackIncludingPlayingLastPosition() throws Exception {
+    /** First planned track should be played */
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    List<StackItem> items = addItems(4);
+    assertEquals(4, QueueModel.getQueueSize());
+    QueueModel.goTo(3);
+    List<StackItem> planned = QueueModel.getPlanned();
+    StackItem firstPlanned = planned.get(0);
+    assertEquals(items.get(3), QueueModel.getCurrentItem());
+    assertEquals(3, QueueModel.getIndex());
+    QueueModel.remove(fromArray(3));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(4, QueueModel.getQueueSize());
+    assertEquals(3, QueueModel.getIndex());
+    assertEquals(firstPlanned, QueueModel.getCurrentItem());
+  }
+
+  public void testRemoveTracksIncludingRepeatedAndPlayingFirstPosition() throws Exception {
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    StackItem repeated = new StackItem(TestHelpers.getFile("repeated", true), true, true);
+    List<StackItem> items = addItems(3);
+    QueueModel.insert(repeated, 0);
+    assertEquals(repeated, QueueModel.getItem(0));
+    assertEquals(4, QueueModel.getQueueSize());
+    QueueModel.goTo(0);
+    assertEquals(repeated, QueueModel.getCurrentItem());
+    assertEquals(0, QueueModel.getIndex());
+    QueueModel.remove(fromArray(0, 1));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(2, QueueModel.getQueueSize());
+    assertEquals(0, QueueModel.getIndex());
+    assertEquals(items.get(1), QueueModel.getCurrentItem());
+  }
+
+  public void testRemoveTracksIncludingRepeatedAndPlayingMiddlePosition() throws Exception {
+    Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
+    addItems(2);
+    StackItem repeated = new StackItem(TestHelpers.getFile("repetead", true), true, true);
+    QueueModel.insert(repeated, 2);
+    List<StackItem> items2 = addItems(2);
+    assertEquals(5, QueueModel.getQueueSize());
+    QueueModel.goTo(2);
+    assertEquals(repeated, QueueModel.getCurrentItem());
+    assertEquals(2, QueueModel.getIndex());
+    assertEquals(repeated, QueueModel.getCurrentItem());
+    QueueModel.remove(fromArray(1, 2, 3));
+    Thread.sleep(100); // wait for the push thread to be done
+    assertEquals(2, QueueModel.getQueueSize());
+    assertEquals(1, QueueModel.getIndex());
+    assertEquals(items2.get(1), QueueModel.getCurrentItem());
   }
 
   /**
@@ -1148,12 +1293,9 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGetLast() throws Exception {
     assertNull(QueueModel.getLast());
-
     addItems(10);
-
     assertEquals("file9", QueueModel.getLast().getFile().getName());
   }
 
@@ -1163,14 +1305,10 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#getLastPlayed()}.
    */
-
   public void testGetLastPlayed() throws Exception {
     assertNull(QueueModel.getLastPlayed());
-
     addItems(10);
-
-    QueueModel.playNext();
-
+    QueueModel.goTo(0);
     // maybe we have one now
     assertNotNull(QueueModel.getLastPlayed());
   }
@@ -1178,7 +1316,6 @@ public class TestQueueModel extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.services.players.QueueModel#getIndex()}.
    */
-
   public void testGetIndex() {
     // tested by tests above
   }
@@ -1189,14 +1326,13 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#getCountTracksLeft()}.
    */
-
   public void testGetCountTracksLeft() throws Exception {
     assertEquals(0, QueueModel.getCountTracksLeft());
     addItems(10);
     assertEquals(10, QueueModel.getCountTracksLeft());
     QueueModel.goTo(0);
-    QueueModel.playNext();
-    QueueModel.playNext();
+    QueueModel.finished(true);
+    QueueModel.finished(true);
     assertEquals(8, QueueModel.getCountTracksLeft());
   }
 
@@ -1205,29 +1341,20 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testGetPlanned() throws Exception {
     StartupCollectionService.registerItemManagers();
-
     assertEquals(0, QueueModel.getPlanned().size());
-
     QueueModel.computesPlanned(false);
-
     // no tracks are planned when queue is empty
     assertEquals(0, QueueModel.getPlanned().size());
-
     // now add some items
     addItems(5);
-
     // still no items because default configration states to not continue play
     QueueModel.computesPlanned(false);
     assertEquals(0, QueueModel.getPlanned().size());
-
     // we also need to enable continuous play for tracks to be planned
     Conf.setProperty(Const.CONF_STATE_CONTINUE, "true");
-
     QueueModel.computesPlanned(false);
-
     assertTrue(QueueModel.getPlanned().size() > 0);
   }
 
@@ -1236,18 +1363,12 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testCommit() throws Exception {
-    JUnitHelpers.createSessionDirectory();
-
     final java.io.File fifo = SessionService.getConfFileByPath(Const.FILE_FIFO);
     fifo.delete();
     assertFalse(fifo.exists()); // we should not have the file now...
-
     addItems(10);
-
     QueueModel.commit();
-
     // now the file should exist and have some size
     assertTrue(fifo.exists());
     assertNotNull(FileUtils.readFileToString(fifo).length() > 0);
@@ -1258,7 +1379,6 @@ public class TestQueueModel extends JajukTestCase {
    *
    * {@link org.jajuk.services.players.QueueModel#isPlayingRadio()}.
    */
-
   public void testIsPlayingRadio() {
     assertFalse(QueueModel.isPlayingRadio());
   }
@@ -1268,13 +1388,11 @@ public class TestQueueModel extends JajukTestCase {
    *
    * {@link org.jajuk.services.players.QueueModel#getCurrentRadio()}.
    */
-
   public void testGetCurrentRadio() {
     // make sure we reset WebRadio
     QueueModel.launchRadio(null);
-
     assertNull(QueueModel.getCurrentRadio());
-    QueueModel.launchRadio(new WebRadio("name", "invalidurl"));
+    QueueModel.launchRadio(TestHelpers.getWebRadio());
     assertNotNull(QueueModel.getCurrentRadio());
   }
 
@@ -1284,15 +1402,11 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#isPlayingTrack()}.
    */
-
   public void testIsPlayingTrack() throws Exception {
     assertTrue(QueueModel.isStopped());
-
     assertFalse(QueueModel.isPlayingTrack());
-
     addItems(3);
-    QueueModel.playNext();
-
+    QueueModel.goTo(0);
     assertTrue(QueueModel.isPlayingTrack());
   }
 
@@ -1302,16 +1416,13 @@ public class TestQueueModel extends JajukTestCase {
    * @throws Exception the exception
    * {@link org.jajuk.services.players.QueueModel#getCurrentFileTitle()}.
    */
-
   public void testGetCurrentFileTitle() throws Exception {
     // always returns some string, without file "Read to play"
     // can be wrong with different settings assertEquals("Ready to play",
     // QueueModel.getCurrentFileTitle());
     assertNotNull(QueueModel.getCurrentFileTitle());
-
     addItems(3);
-    QueueModel.playNext();
-
+    QueueModel.goTo(0);
     assertNotNull(QueueModel.getCurrentFileTitle());
     // should not be the same as before
     assertFalse(QueueModel.getCurrentFileTitle().equals("Ready to play"));
@@ -1322,49 +1433,60 @@ public class TestQueueModel extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-
   public void testClean() throws Exception {
     // should work without any items
     QueueModel.clean();
-
     addItems(10);
     assertEquals(10, QueueModel.getQueueSize());
-
     // here clean will not remove things as they are correctly listed in the FileManager
     QueueModel.clean();
-
     assertEquals(10, QueueModel.getQueueSize());
-
     // we can add a dummy-file and check that it is removed
-    Genre genre = JUnitHelpers.getGenre();
-    Album album = JUnitHelpers.getAlbum("name", 23);
+    Genre genre = TestHelpers.getGenre();
+    Album album = TestHelpers.getAlbum("name", 23);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-
-    Type type = JUnitHelpers.getType();
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
+    Type type = TestHelpers.getType();
     Track track = TrackManager.getInstance().registerTrack("name", album, genre, artist, 120, year,
         1, type, 1);
-
-    Device device = JUnitHelpers.getDevice();
-
+    Device device = TestHelpers.getDevice();
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
-
     File file = FileManager.getInstance().registerFile("test.tst", dir, track, 120, 70);
-
     QueueModel.insert(new StackItem(file), 0);
-
     // now we have 11 elements
     assertEquals(11, QueueModel.getQueueSize());
-
     FileManager.getInstance().removeFile(file);
-
     // here clean will remove one item that is not listed in the FileManager
     QueueModel.clean();
-
     // should be 10 again now
     assertEquals(10, QueueModel.getQueueSize());
   }
+
+  /**
+   * Test method for.
+   *
+   * @throws Exception the exception
+   * {@link org.jajuk.services.players.QueueModel#setStopAfter()}.
+   */
+  public void testStopAfter() throws Exception {
+    assertTrue(QueueModel.isStopped());
+    assertFalse(QueueModel.isPlayingTrack());
+    addItems(3);
+    QueueModel.goTo(0);
+    assertTrue(QueueModel.isPlayingTrack());
+    // Test next track will be stopped 
+    QueueModel.setStopAfter(true);
+    // Simulate end of file 
+    QueueModel.finished();
+    assertTrue(QueueModel.isStopped());
+    QueueModel.goTo(0);
+    assertTrue(QueueModel.isPlayingTrack());
+    // Now test without the stop after option
+    QueueModel.setStopAfter(false);
+    // Simulate end of file 
+    QueueModel.finished();
+    assertTrue(QueueModel.isPlayingTrack());
+  }
 }
diff --git a/src/test/java/org/jajuk/services/players/TestStackItem.java b/src/test/java/org/jajuk/services/players/TestStackItem.java
index 648220f..67696cf 100644
--- a/src/test/java/org/jajuk/services/players/TestStackItem.java
+++ b/src/test/java/org/jajuk/services/players/TestStackItem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,31 +16,26 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.players;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.File;
 import org.jajuk.util.error.JajukException;
 
-/**
- * DOCUMENT_ME.
- */
 public class TestStackItem extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.services.players.StackItem#hashCode()}.
    *
    * @throws Exception the exception
    */
   public void testHashCode() throws Exception {
-    File file = JUnitHelpers.getFile("file1", true);
+    File file = TestHelpers.getFile("file1", true);
     StackItem item1 = new StackItem(file);
     StackItem item2 = new StackItem(file);
-
-    JUnitHelpers.HashCodeTest(item1, item2);
+    TestHelpers.HashCodeTest(item1, item2);
   }
 
   /**
@@ -51,8 +46,7 @@ public class TestStackItem extends JajukTestCase {
    * .
    */
   public void testStackItemFile() throws Exception {
-    new StackItem(JUnitHelpers.getFile("file1", true));
-
+    new StackItem(TestHelpers.getFile("file1", true));
     // test null input
     try {
       new StackItem(null);
@@ -70,8 +64,7 @@ public class TestStackItem extends JajukTestCase {
    * .
    */
   public void testStackItemFileBoolean() throws Exception {
-    new StackItem(JUnitHelpers.getFile("file2", true), true);
-
+    new StackItem(TestHelpers.getFile("file2", true), true);
     // test null input
     try {
       new StackItem(null, true);
@@ -89,8 +82,7 @@ public class TestStackItem extends JajukTestCase {
    * .
    */
   public void testStackItemFileBooleanBoolean() throws Exception {
-    new StackItem(JUnitHelpers.getFile("file2", true), true, true);
-
+    new StackItem(TestHelpers.getFile("file2", true), true, true);
     // test null input
     try {
       new StackItem(null, true, true);
@@ -106,7 +98,7 @@ public class TestStackItem extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testIsAndSetRepeat() throws Exception {
-    StackItem item = new StackItem(JUnitHelpers.getFile("file1", true));
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
     assertFalse(item.isRepeat());
     item.setRepeat(true);
     assertTrue(item.isRepeat());
@@ -118,7 +110,7 @@ public class TestStackItem extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testgetFile() throws Exception {
-    StackItem item = new StackItem(JUnitHelpers.getFile("file1", true));
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
     assertNotNull(item.getFile());
   }
 
@@ -129,7 +121,7 @@ public class TestStackItem extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testIsAndSetUserLaunch() throws Exception {
-    StackItem item = new StackItem(JUnitHelpers.getFile("file1", true));
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
     assertFalse(item.isUserLaunch());
     item.setUserLaunch(true);
     assertTrue(item.isUserLaunch());
@@ -141,7 +133,7 @@ public class TestStackItem extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testIsAndSetPlanned() throws Exception {
-    StackItem item = new StackItem(JUnitHelpers.getFile("file1", true));
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
     assertFalse(item.isPlanned());
     item.setPlanned(true);
     assertTrue(item.isPlanned());
@@ -153,8 +145,8 @@ public class TestStackItem extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testClone() throws Exception {
-    StackItem item = new StackItem(JUnitHelpers.getFile("file1", true));
-    JUnitHelpers.CloneTest(item);
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
+    TestHelpers.CloneTest(item);
   }
 
   /**
@@ -164,11 +156,11 @@ public class TestStackItem extends JajukTestCase {
    * {@link org.jajuk.services.players.StackItem#equals(java.lang.Object)}.
    */
   public void testEqualsObject() throws Exception {
-    File file = JUnitHelpers.getFile("file1", true);
+    File file = TestHelpers.getFile("file1", true);
     StackItem item1 = new StackItem(file);
     StackItem item2 = new StackItem(file);
-    StackItem item3 = new StackItem(JUnitHelpers.getFile("file2", true));
-    JUnitHelpers.EqualsTest(item1, item2, item3);
+    StackItem item3 = new StackItem(TestHelpers.getFile("file2", true));
+    TestHelpers.EqualsTest(item1, item2, item3);
   }
 
   /**
@@ -177,8 +169,7 @@ public class TestStackItem extends JajukTestCase {
    * @throws Exception the exception
    */
   public void testToString() throws Exception {
-    StackItem item = new StackItem(JUnitHelpers.getFile("file1", true));
-    JUnitHelpers.ToStringTest(item);
+    StackItem item = new StackItem(TestHelpers.getFile("file1", true));
+    TestHelpers.ToStringTest(item);
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/startup/TestStartupEngineService.java b/src/test/java/org/jajuk/services/startup/TestStartupEngineService.java
index f1164ff..c077170 100644
--- a/src/test/java/org/jajuk/services/startup/TestStartupEngineService.java
+++ b/src/test/java/org/jajuk/services/startup/TestStartupEngineService.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,71 +16,49 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.services.startup;
 
 import java.io.BufferedWriter;
 import java.io.FileWriter;
+import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.File;
 import org.jajuk.base.SearchResult.SearchResultType;
-import org.jajuk.services.bookmark.History;
 import org.jajuk.services.core.SessionService;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.webradio.WebRadio;
 import org.jajuk.services.webradio.WebRadioManager;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
+import org.jajuk.util.UtilFeatures;
 
 /**
  * Tests for org.jajuk.services.StartupEngineService
  */
 public class TestStartupEngineService extends JajukTestCase {
-
-  /** DOCUMENT_ME. */
   private File file1;
-  
-  /** DOCUMENT_ME. */
   private File file2;
-  
-  /** DOCUMENT_ME. */
   private File file3;
-  
-  /** DOCUMENT_ME. */
   private WebRadio radio1;
-
-  /** The Constant POSITION.  DOCUMENT_ME */
+  /** The Constant POSITION.   */
   private static final float POSITION = 0.5f;
 
-  /*
-  * (non-Javadoc)
-  * 
-  * @see junit.framework.TestCase#setUp()
-  */
   @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  protected void specificSetUp() throws Exception {
     // Populate collection with a few files and associated items 
-    // (automatically created with it)
-    file1 = JUnitHelpers.getFile("file1", true);
-    file2 = JUnitHelpers.getFile("file2", true);
-    file3 = JUnitHelpers.getFile("file3", true);
-
-    // Populate the history with these three files
-    History.getInstance().addItem(file1.getID(), System.currentTimeMillis() - 120000);
-    History.getInstance().addItem(file2.getID(), System.currentTimeMillis() - 110000);
-    History.getInstance().addItem(file3.getID(), System.currentTimeMillis() - 100000);
-
+    file1 = TestHelpers.getFile("file1", true);
+    file2 = TestHelpers.getFile("file2", true);
+    file3 = TestHelpers.getFile("file3", true);
     // Add last played radio
-    radio1 = new WebRadio("myRadio", "http://foo.bar");
-    WebRadioManager.getInstance().addWebRadio(radio1);
+    radio1 = WebRadioManager.getInstance().registerWebRadio("myRadio");
+    radio1.setProperty(Const.XML_URL, "http://di.fm/mp3/classictechno.pls");
     Conf.setProperty(Const.CONF_DEFAULT_WEB_RADIO, "myRadio");
-
     // Populate FIFO
     java.io.File fifo = SessionService.getConfFileByPath(Const.FILE_FIFO);
     fifo.delete();
@@ -89,209 +67,198 @@ public class TestStartupEngineService extends JajukTestCase {
     bw.write(file2.getID() + "\n");
     bw.write(file3.getID() + "\n");
     bw.close();
-
     // Set others properties
-    Conf.setProperty(Const.CONF_STARTUP_LAST_POSITION, POSITION + "");
+    UtilFeatures.storePersistedPlayingPosition(POSITION);
     Conf.setProperty(Const.CONF_STARTUP_STOPPED, "false");
     Conf.setProperty(Const.CONF_STARTUP_ITEM, file3.getID());
     Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, "false");
-
+    Conf.setProperty(Const.CONF_STARTUP_QUEUE_INDEX, "2");
     // Reset the queue
     QueueModel.reset();
-
     // Reset the Startup service
     Field alToPlay = StartupEngineService.class.getDeclaredField("alToPlay");
     alToPlay.setAccessible(true);
     alToPlay.set(null, new ArrayList<org.jajuk.base.File>());
-
     Field fileToPlay = StartupEngineService.class.getDeclaredField("fileToPlay");
     fileToPlay.setAccessible(true);
     fileToPlay.set(null, null);
-
     Field radio = StartupEngineService.class.getDeclaredField("radio");
     radio.setAccessible(true);
     radio.set(null, null);
-
     Field index = StartupEngineService.class.getDeclaredField("index");
     index.setAccessible(true);
     index.set(null, 0);
+  }
 
+  public final void testVoidFIFO() throws IOException, InterruptedException {
+    java.io.File fifo = SessionService.getConfFileByPath(Const.FILE_FIFO);
+    fifo.delete();
+    fifo.createNewFile();
+    StartupEngineService.launchInitialTrack();
+    // Wait for track to be actually launched
+    Thread.sleep(100);
+    assertEquals(QueueModel.getPlayingFile(), null);
+  }
+
+  public final void testNoFIFO() throws InterruptedException {
+    java.io.File fifo = SessionService.getConfFileByPath(Const.FILE_FIFO);
+    fifo.delete();
+    StartupEngineService.launchInitialTrack();
+    // Wait for track to be actually launched
+    Thread.sleep(100);
+    assertEquals(QueueModel.getPlayingFile(), null);
   }
 
   /**
    * Test nothing.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testNothing() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOTHING);
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), null);
-
     // Check that queue is filled up
     assertTrue(QueueModel.getQueue().size() == 3);
   }
 
   /**
    * Test last item.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testLastItem() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST);
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), file3);
   }
 
   /**
    * Test last item last pos.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testLastItemLastPos() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), file3);
     // Cannot test actual position, the mock player always return zero
     //assertTrue(Player.getCurrentPosition() >= POSITION);
-
   }
 
   /**
    * Test novelties.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testNovelties() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOVELTIES);
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertTrue(QueueModel.isPlayingTrack());
-
   }
 
   /**
    * Test bestof.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testBestof() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_BESTOF);
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertTrue(QueueModel.isPlayingTrack());
   }
 
   /**
    * Test first session.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testFirstSession() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
-    History.getInstance().clear();
-
+    Conf.removeProperty(Const.CONF_STARTUP_QUEUE_INDEX);
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), null);
   }
 
   /**
    * Test shuffle.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testShuffle() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_SHUFFLE);
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertTrue(QueueModel.isPlayingTrack());
   }
 
   /**
    * Test stopped file.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testStoppedFile() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
     Conf.setProperty(Const.CONF_STARTUP_STOPPED, "true");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertFalse(QueueModel.isPlayingRadio());
     assertFalse(QueueModel.isPlayingTrack());
-
     // Check that queue is filled up
     assertTrue(QueueModel.getQueue().size() == 3);
   }
 
   /**
    * Test stopped radio.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testStoppedRadio() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
     Conf.setProperty(Const.CONF_STARTUP_STOPPED, "true");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertFalse(QueueModel.isPlayingRadio());
     assertFalse(QueueModel.isPlayingTrack());
   }
 
   /**
    * Test start web radio.
-   * DOCUMENT_ME
+   * 
    *
    * @throws InterruptedException the interrupted exception
    */
   public final void testStartWebRadio() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
     Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, "true");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getCurrentRadio(), radio1);
   }
 
@@ -303,22 +270,17 @@ public class TestStartupEngineService extends JajukTestCase {
   public final void testStartGivenFile() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_ITEM);
     Conf.setProperty(Const.CONF_STARTUP_ITEM, SearchResultType.FILE.name() + "/" + file1.getID());
-
     // Radio was playing but we don't care, we should launch the file
     Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, "true");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), file1);
-
     // Same without playing radio
     Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, "false");
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), file1);
   }
 
@@ -329,25 +291,19 @@ public class TestStartupEngineService extends JajukTestCase {
    */
   public final void testStartGivenRadio() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_ITEM);
-    Conf.setProperty(Const.CONF_STARTUP_ITEM, SearchResultType.WEBRADIO.name() + "/"
-        + radio1.getName());
-
+    Conf.setProperty(Const.CONF_STARTUP_ITEM,
+        SearchResultType.WEBRADIO.name() + "/" + radio1.getName());
     // Radio was playing but we don't care, we should launch the file
     Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, "true");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getCurrentRadio(), radio1);
-
     // Same without playing radio
     Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, "false");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getCurrentRadio(), radio1);
   }
 
@@ -358,16 +314,13 @@ public class TestStartupEngineService extends JajukTestCase {
    */
   public final void testStartGivenRadioStopped() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_ITEM);
-    Conf.setProperty(Const.CONF_STARTUP_ITEM, SearchResultType.WEBRADIO.name() + "/"
-        + radio1.getName());
+    Conf.setProperty(Const.CONF_STARTUP_ITEM,
+        SearchResultType.WEBRADIO.name() + "/" + radio1.getName());
     Conf.setProperty(Const.CONF_STARTUP_STOPPED, "true");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getCurrentRadio(), null);
-
   }
 
   /**
@@ -380,11 +333,9 @@ public class TestStartupEngineService extends JajukTestCase {
   public final void test1() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
     Conf.setProperty(Const.CONF_WEBRADIO_WAS_PLAYING, "true");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), null);
   }
 
@@ -397,12 +348,9 @@ public class TestStartupEngineService extends JajukTestCase {
   public final void test2() throws InterruptedException {
     Conf.setProperty(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
     Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
-
     StartupEngineService.launchInitialTrack();
     // Wait for track to be actually launched
     Thread.sleep(100);
-
     assertEquals(QueueModel.getPlayingFile(), file3);
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/tags/TestTag.java b/src/test/java/org/jajuk/services/tags/TestTag.java
new file mode 100644
index 0000000..2ab85bf
--- /dev/null
+++ b/src/test/java/org/jajuk/services/tags/TestTag.java
@@ -0,0 +1,364 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.tags;
+
+import java.io.File;
+
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.base.TypeManager;
+import org.jajuk.util.error.JajukException;
+
+public class TestTag extends JajukTestCase {
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#Tag(java.io.File, boolean)}.
+   * @throws Exception 
+   */
+  public void testTag() throws Exception {
+    // can read tag-type
+    assertNotNull(TypeManager.getInstance().registerType("testtag", "tst", null,
+        NoTagsTagImpl.class));
+    Tag tag = new Tag(new File("somefile.tst"), false);
+    assertFalse(tag.isCorrupted());
+    tag = new Tag(new File("somefile.tst"), true);
+    assertFalse(tag.isCorrupted());
+    assertNotNull(TypeManager.getInstance().registerType("testtagnul", "nul", null, null));
+    // null, do not ignore errors
+    try {
+      new Tag(new File("somefile.nul"), false);
+      fail("Expect exception here");
+    } catch (JajukException e) {
+      // expected here
+    }
+    // null, do ignore errors
+    tag = new Tag(new File("somefile.nul"), true);
+    assertTrue(tag.isCorrupted());
+  }
+
+  public void testTagInvalidTypes() throws Exception {
+    // null, do not ignore errors
+    try {
+      new Tag(null, false);
+      fail("Expect exception here");
+    } catch (JajukException e) {
+      // expected here
+    }
+    // null, but ignore errors, but is set to "corrupted"
+    Tag tag = new Tag(null, true);
+    assertTrue(tag.isCorrupted());
+    // cannot read tag-type, do not ignore errors
+    try {
+      new Tag(new File("somefile"), false);
+      fail("Expect exception here");
+    } catch (JajukException e) {
+      // expected here
+    }
+    // cannot read tag-type, but ignore errors and set to corrupted
+    tag = new Tag(new File("somefile"), true);
+    assertTrue(tag.isCorrupted());
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#hashCode()}.
+   * @throws Exception 
+   */
+  public void testHashCode() throws Exception {
+    // can read tag-type
+    assertNotNull(TypeManager.getInstance().registerType("testtag", "tst", null,
+        NoTagsTagImpl.class));
+    Tag tag = new Tag(new File("somefile.tst"), false);
+    Tag equ = new Tag(new File("somefile.tst"), false);
+    TestHelpers.HashCodeTest(tag, equ);
+    tag = new Tag(null, true);
+    equ = new Tag(null, true);
+    TestHelpers.HashCodeTest(tag, equ);
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getTrackName()}.
+   * @throws Exception 
+   */
+  public void testGetTrackName() throws Exception {
+    assertNotNull(TypeManager.getInstance().registerType("testtag", "tst", null,
+        NoTagsTagImpl.class));
+    Tag tag = new Tag(new File("somefile.tst"), false);
+    assertEquals("somefile", tag.getTrackName());
+    assertNotNull(TypeManager.getInstance().registerType("testtagnul", "nul", null, null));
+    tag = new Tag(new File("somefile.nul"), true);
+    assertEquals("somefile", tag.getTrackName());
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getAlbumName()}.
+   */
+  public void testGetAlbumName() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getArtistName()}.
+   */
+  public void testGetArtistName() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getAlbumArtist()}.
+   */
+  public void testGetAlbumArtist() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getGenreName()}.
+   */
+  public void testGetGenreName() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getLength()}.
+   */
+  public void testGetLength() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getDiscNumber()}.
+   */
+  public void testGetDiscNumber() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getYear()}.
+   */
+  public void testGetYear() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getQuality()}.
+   */
+  public void testGetQuality() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getComment()}.
+   */
+  public void testGetComment() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getOrder()}.
+   */
+  public void testGetOrder() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getLyrics()}.
+   */
+  public void testGetLyrics() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getCovers()}.
+   */
+  public void testGetCovers() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setTrackName(java.lang.String)}.
+   */
+  public void testSetTrackName() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setAlbumName(java.lang.String)}.
+   */
+  public void testSetAlbumName() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setArtistName(java.lang.String)}.
+   */
+  public void testSetArtistName() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setAlbumArtist(java.lang.String)}.
+   */
+  public void testSetAlbumArtist() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setGenreName(java.lang.String)}.
+   */
+  public void testSetGenreName() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setOrder(long)}.
+   */
+  public void testSetOrder() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setYear(java.lang.String)}.
+   */
+  public void testSetYear() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setDiscNumber(long)}.
+   */
+  public void testSetDiscNumber() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setComment(java.lang.String)}.
+   */
+  public void testSetComment() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setLyrics(java.lang.String)}.
+   */
+  public void testSetLyrics() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#deleteLyrics()}.
+   */
+  public void testDeleteLyrics() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#commit()}.
+   */
+  public void testCommit() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#isCorrupted()}.
+   */
+  public void testIsCorrupted() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#setCorrupted(boolean)}.
+   */
+  public void testSetCorrupted() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getFio()}.
+   */
+  public void testGetFio() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#equals(java.lang.Object)}.
+   * @throws Exception 
+   */
+  public void testEqualsObject() throws Exception {
+    assertNotNull(TypeManager.getInstance().registerType("testtag", "tst", null,
+        NoTagsTagImpl.class));
+    Tag tag = new Tag(new File("somefile.tst"), false);
+    Tag equ = new Tag(new File("somefile.tst"), false);
+    Tag notequ = new Tag(new File("somefile1.tst"), false);
+    TestHelpers.EqualsTest(tag, equ, notequ);
+    notequ = new Tag(null, true);
+    TestHelpers.EqualsTest(tag, equ, notequ);
+    tag = new Tag(null, true);
+    equ = new Tag(null, true);
+    notequ = new Tag(new File("somefile.tst"), false);
+    TestHelpers.EqualsTest(tag, equ, notequ);
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#toString()}.
+   * @throws Exception 
+   */
+  public void testToString() throws Exception {
+    assertNotNull(TypeManager.getInstance().registerType("testtag", "tst", null,
+        NoTagsTagImpl.class));
+    Tag tag = new Tag(new File("somefile.tst"), false);
+    Tag tag2 = new Tag(null, true);
+    TestHelpers.ToStringTest(tag);
+    TestHelpers.ToStringTest(tag2);
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getTagForFio(java.io.File, boolean)}.
+   */
+  public void testGetTagForFio() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#clearCache()}.
+   */
+  public void testClearCache() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getTagField(java.lang.String)}.
+   */
+  public void testGetTagField() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getSupportedTagFields()}.
+   */
+  public void testGetSupportedTagFields() {
+    // TODO: implement test
+  }
+
+  /**
+   * Test method for {@link org.jajuk.services.tags.Tag#getActivatedExtraTags()}.
+   */
+  public void testGetActivatedExtraTags() {
+    // TODO: implement test
+  }
+}
diff --git a/src/test/java/org/jajuk/services/webradio/TestCustomPersistenceHelper.java b/src/test/java/org/jajuk/services/webradio/TestCustomPersistenceHelper.java
new file mode 100644
index 0000000..5117b13
--- /dev/null
+++ b/src/test/java/org/jajuk/services/webradio/TestCustomPersistenceHelper.java
@@ -0,0 +1,124 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.webradio;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.List;
+
+import org.jajuk.JajukTestCase;
+import org.jajuk.services.core.SessionService;
+import org.jajuk.util.Const;
+
+/**
+   * Custom radios parser
+   */
+public class TestCustomPersistenceHelper extends JajukTestCase {
+  private WebRadioManager man = WebRadioManager.getInstance();
+
+  @Override
+  public void specificSetUp() throws Exception {
+    man.cleanup();
+    writeSampleFile();
+  }
+
+  private void writeSampleFile() throws Exception {
+    // Write down the sample custom radios file
+    File fCustom = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_CUSTOM);
+    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fCustom));
+    bos.write(sampleFile.getBytes());
+    bos.flush();
+    bos.close();
+  }
+
+  /**
+   * Test the custom file load
+   * @throws IOException 
+   * @throws MalformedURLException 
+   */
+  public void testLoadRepository() throws Exception {
+    // Make sure the repository has been cleared during the setUp()
+    assertTrue(man.getElementCount() == 0);
+    // Load the presets
+    WebRadioHelper.loadCustomRadios();
+    //Check the repo is not void
+    assertTrue(man.getElementCount() > 0);
+    // Check item are sorted
+    String previous = null;
+    List<WebRadio> radios = man.getWebRadios();
+    for (WebRadio radio : radios) {
+      if (previous != null) {
+        // >0, not >= because dups are forbidden
+        assertTrue(radio.getName().compareTo(previous) > 0);
+        previous = radio.getName();
+      }
+    }
+    WebRadio radio = radioTest();
+    // Check origin
+    assertTrue(WebRadioOrigin.CUSTOM.equals(radio.getValue(Const.XML_ORIGIN)));
+  }
+
+  private WebRadio radioTest() throws Exception {
+    String name = "LuNe Radio";
+    WebRadio radio = man.getWebRadioByName(name);
+    assertTrue(radio.getUrl().equals("http://broadcaster.infomaniak.ch/lune-high.mp3.m3u"));
+    assertTrue(radio.getDescription().equals("Switzerland"));
+    assertTrue(radio.getLongValue(Const.XML_BITRATE) == 128);
+    assertTrue(radio.getLongValue(Const.XML_FREQUENCY) == 44100);
+    assertTrue("talk;good".equals(radio.getKeywords()));
+    assertTrue("Pop".equals(radio.getGenre()));
+    return radio;
+  }
+
+  public void testCustomRadiosCommit() throws Exception {
+    // Load the sample file (written in setUp())
+    WebRadioHelper.loadCustomRadios();
+    // Write it down 
+    CustomRadiosPersistenceHelper.commit();
+    // load it again
+    WebRadioHelper.loadCustomRadios();
+    // Check radios presence
+    assertTrue(man.getWebRadioByName("Bayern 1") != null);
+  }
+
+  public void testVoidCustomRadiosCommit() throws Exception {
+    // Write void collection 
+    CustomRadiosPersistenceHelper.commit();
+    // load it again
+    WebRadioHelper.loadCustomRadios();
+    // Check no radios presence
+    assertTrue(man.getWebRadios().size() == 0);
+  }
+
+  /** Sample file content */
+  private static final String sampleFile = "<?xml version='1.0' encoding='UTF-8'?>"
+      + "<streams jajuk_version='"
+      + Const.TEST_VERSION
+      + "'>"
+      + "<stream name='1449 AM URB' url='http://people.bath.ac.uk/su9urb/audio/urb-hi.m3u'/>"
+      + "<stream name='LuNe Radio' url='http://broadcaster.infomaniak.ch/lune-high.mp3.m3u' label='Switzerland' bitrate='128' frequency='44100' keywords='talk;good' style='Pop'/>"
+      + "<stream name='Bayern 1' url='http://streams.br-online.de/bayern1_1.asx'/>"
+      + "<stream name='Bayern Aktuell' url='http://streams.br-online.de/b5aktuell_1.asx'/>"
+      + "</streams>";
+}
diff --git a/src/test/java/org/jajuk/services/webradio/TestPresetPersistenceHelper.java b/src/test/java/org/jajuk/services/webradio/TestPresetPersistenceHelper.java
new file mode 100644
index 0000000..6921de8
--- /dev/null
+++ b/src/test/java/org/jajuk/services/webradio/TestPresetPersistenceHelper.java
@@ -0,0 +1,172 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.webradio;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.base.Item;
+import org.jajuk.services.core.SessionService;
+import org.jajuk.util.Const;
+import org.jajuk.util.DownloadManager;
+import org.jajuk.util.UtilFeatures;
+import org.xml.sax.SAXException;
+
+/**
+   * Preset radios parser
+   */
+public class TestPresetPersistenceHelper extends JajukTestCase {
+  private WebRadioManager man = WebRadioManager.getInstance();
+
+  @Override
+  public void specificSetUp() throws Exception {
+    man.cleanup();
+  }
+
+  /**
+   * Test the preset file download
+   * @throws IOException 
+   * @throws MalformedURLException 
+   * @throws ParserConfigurationException 
+   * @throws SAXException 
+   */
+  public void testDownloadPresets() throws MalformedURLException, IOException, SAXException,
+      ParserConfigurationException {
+    // Check for preset file, delete it if it exist
+    File fwebradios = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
+    if (fwebradios.exists()) {
+      fwebradios.delete();
+    }
+    downloadPresets();
+    File cachedPreset = DownloadManager.downloadToCache(new URL(Const.URL_WEBRADIO_PRESETS));
+    WebRadioHelper.loadPresetsRadios(cachedPreset);
+    //Check the repo is not void
+    WebRadioManager man = WebRadioManager.getInstance();
+    assertTrue(man.getElementCount() > 0);
+  }
+
+  /**
+   * Test the preset file load
+   * @throws IOException 
+   * @throws MalformedURLException 
+   * @throws ParserConfigurationException 
+   * @throws SAXException 
+   */
+  public void testLoadRepository() throws MalformedURLException, IOException, SAXException,
+      ParserConfigurationException {
+    // Make sure the repository has been cleared during the setUp()
+    assertTrue(man.getElementCount() == 0);
+    // Check for preset file, delete it if it exist
+    File cachedPreset = DownloadManager.downloadToCache(new URL(Const.URL_WEBRADIO_PRESETS));
+    if (cachedPreset.exists()) {
+      cachedPreset.delete();
+    }
+    downloadPresets();
+    // Load the presets
+    WebRadioHelper.loadPresetsRadios(cachedPreset);
+    //Check the repo is not void
+    assertTrue(man.getElementCount() > 0);
+    // Check item are sorted
+    String previous = null;
+    List<WebRadio> radios = man.getWebRadios();
+    for (WebRadio radio : radios) {
+      if (previous != null) {
+        // >=0, because name dups are allowed
+        assertTrue(radio.getName().compareTo(previous) >= 0);
+        previous = radio.getName();
+      }
+    }
+    /* Check a sample radio :  
+                <name>LuNe Radio</name>
+                <url>http://broadcaster.infomaniak.ch/lune-high.mp3.m3u</url>
+                <label>Switzerland</label>
+                <keywords>foo;bar</keywords>
+                <isRemoved>false</isRemoved>  //not used by Jajuk
+                <bitrate>128</bitrate>
+                <frequency>44100</frequency>
+    */
+    String name = "LuNe Radio";
+    WebRadio radio = man.getWebRadioByName(name);
+    assertTrue(radio.getUrl().equals("http://broadcaster.infomaniak.ch/lune-high.mp3.m3u"));
+    assertTrue(radio.getDescription().equals("Switzerland"));
+    assertTrue(radio.getLongValue(Const.XML_BITRATE) == 128);
+    assertTrue(radio.getLongValue(Const.XML_FREQUENCY) == 44100);
+    // Check origin
+    assertTrue(WebRadioOrigin.PRESET.equals(radio.getValue(Const.XML_ORIGIN)));
+  }
+
+  private File downloadPresets() throws MalformedURLException, IOException {
+    // Download and load it it
+    File cachedPreset = DownloadManager.downloadToCache(new URL(Const.URL_WEBRADIO_PRESETS));
+    return cachedPreset;
+  }
+
+  public void testPresetRadiosCommit() throws Exception {
+    // Add a few radios and commit the preset file
+    // Fill few radio
+    TestHelpers.getWebRadio("Preset1", "http://preset1", WebRadioOrigin.PRESET);
+    TestHelpers.getWebRadio("Preset2", "http://preset2", WebRadioOrigin.PRESET);
+    PresetRadiosPersistenceHelper.commit();
+    // Load the sample file
+    WebRadioHelper
+        .loadPresetsRadios(SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET));
+    //Make sure keywords will not be lost
+    WebRadio radio1 = WebRadioManager.getInstance().getWebRadioByName("Preset1");
+    radio1.setProperty(Const.XML_KEYWORDS, "foo;bar");
+    // Write it down 
+    PresetRadiosPersistenceHelper.commit();
+    // Cleanup radios
+    WebRadioManager.getInstance().cleanup();
+    assertNull(WebRadioManager.getInstance().getWebRadioByName("Preset1"));
+    // load it again
+    WebRadioHelper
+        .loadPresetsRadios(SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET));
+    // Check that the preset keywords are not lost
+    radio1 = WebRadioManager.getInstance().getWebRadioByName("Preset1");
+    assertEquals("foo;bar", radio1.getKeywords());
+  }
+
+  public void testCheckGenres() throws Exception {
+    // Check for preset file, delete it if it exist
+    File cachedPreset = DownloadManager.downloadToCache(new URL(Const.URL_WEBRADIO_PRESETS));
+    if (cachedPreset.exists()) {
+      cachedPreset.delete();
+    }
+    downloadPresets();
+    // Load the presets
+    WebRadioHelper.loadPresetsRadios(cachedPreset);
+    // Check all genres are in UtilFeatures list
+    List<String> knownGenres = Arrays.asList(UtilFeatures.GENRES);
+    for (Item radio : WebRadioManager.getInstance().getWebRadios()) {
+      if (!knownGenres.contains(radio.getStringValue(Const.XML_GENRE))) {
+        fail();
+      }
+    }
+  }
+}
diff --git a/src/test/java/org/jajuk/services/webradio/TestWebRadioManager.java b/src/test/java/org/jajuk/services/webradio/TestWebRadioManager.java
new file mode 100644
index 0000000..cb8b88d
--- /dev/null
+++ b/src/test/java/org/jajuk/services/webradio/TestWebRadioManager.java
@@ -0,0 +1,51 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  $Revision: 3132 $
+ */
+package org.jajuk.services.webradio;
+
+import java.util.List;
+
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+
+public class TestWebRadioManager extends JajukTestCase {
+  private WebRadioManager man = WebRadioManager.getInstance();
+  WebRadio radio1;
+  WebRadio radio2;
+  WebRadio radio3;
+  WebRadio radio4;
+
+  @Override
+  public void specificSetUp() throws Exception {
+    man.cleanup();
+    // Fill few radio
+    radio1 = TestHelpers.getWebRadio("Preset1", "http://preset1", WebRadioOrigin.PRESET);
+    radio2 = TestHelpers.getWebRadio("Preset2", "http://preset2", WebRadioOrigin.PRESET);
+    radio3 = TestHelpers.getWebRadio("Custom1", "http://custom1", WebRadioOrigin.CUSTOM);
+    radio4 = TestHelpers.getWebRadio("Custom2", "http://custom2", WebRadioOrigin.CUSTOM);
+  }
+
+  public void testGetWebRadiosByOrigin() throws Exception {
+    List<WebRadio> shouldBeCustom = man.getWebRadiosByOrigin(WebRadioOrigin.CUSTOM);
+    List<WebRadio> shouldBePreset = man.getWebRadiosByOrigin(WebRadioOrigin.PRESET);
+    assertTrue(shouldBeCustom.size() == 2 && shouldBeCustom.contains(radio3));
+    assertTrue(shouldBePreset.size() == 2 && shouldBePreset.contains(radio2));
+  }
+}
diff --git a/src/test/java/org/jajuk/ui/actions/TestDebugLogAction.java b/src/test/java/org/jajuk/ui/actions/TestDebugLogAction.java
index 57c2201..b97d9ac 100644
--- a/src/test/java/org/jajuk/ui/actions/TestDebugLogAction.java
+++ b/src/test/java/org/jajuk/ui/actions/TestDebugLogAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -26,10 +26,9 @@ import org.jajuk.JajukTestCase;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDebugLogAction extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -39,7 +38,6 @@ public class TestDebugLogAction extends JajukTestCase {
   public void testPerform() {
     // initialize Log
     Log.init();
-
     DebugLogAction action = new DebugLogAction();
     try {
       action.perform(null); // it doesn't look at the actionevent at all right
@@ -57,5 +55,4 @@ public class TestDebugLogAction extends JajukTestCase {
   public void testDebugLogAction() {
     new DebugLogAction();
   }
-
 }
diff --git a/src/test/java/org/jajuk/ui/actions/TestFindDuplicateTracksAction.java b/src/test/java/org/jajuk/ui/actions/TestFindDuplicateTracksAction.java
index 599b31a..01b2916 100644
--- a/src/test/java/org/jajuk/ui/actions/TestFindDuplicateTracksAction.java
+++ b/src/test/java/org/jajuk/ui/actions/TestFindDuplicateTracksAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,14 +16,14 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
 import java.util.List;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.AlbumArtist;
 import org.jajuk.base.AlbumArtistManager;
@@ -41,48 +41,27 @@ import org.jajuk.util.Const;
  * Test find dups action.
  */
 public class TestFindDuplicateTracksAction extends JajukTestCase {
-  
-  /** DOCUMENT_ME. */
   Type type;
-  
-  /** DOCUMENT_ME. */
   Artist artist;
-  
-  /** DOCUMENT_ME. */
   Album album;
-  
-  /** DOCUMENT_ME. */
   Genre genre;
-  
-  /** DOCUMENT_ME. */
   org.jajuk.base.Year year;
-  
-  /** DOCUMENT_ME. */
   FindDuplicateTracksAction action;
-  
-  /** DOCUMENT_ME. */
   Directory dir;
-  
-  /** DOCUMENT_ME. */
   AlbumArtist albumArtist;
 
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  public void setUp() throws Exception {
-    super.setUp();
+  public void specificSetUp() throws Exception {
     // Populate tracks and files
-    dir = JUnitHelpers.getDirectory();
+    dir = TestHelpers.getDirectory();
     dir.getDevice().mount(false);
-    type = JUnitHelpers.getType();
-    artist = JUnitHelpers.getArtist();
-    album = JUnitHelpers.getAlbum();
-    genre = JUnitHelpers.getGenre();
-    year = JUnitHelpers.getYear();
+    type = TestHelpers.getType();
+    artist = TestHelpers.getArtist();
+    album = TestHelpers.getAlbum();
+    genre = TestHelpers.getGenre();
+    year = TestHelpers.getYear();
     action = new FindDuplicateTracksAction();
     albumArtist = AlbumArtistManager.getInstance().registerAlbumArtist(Const.UNKNOWN_ARTIST);
-
   }
 
   /**
@@ -93,31 +72,25 @@ public class TestFindDuplicateTracksAction extends JajukTestCase {
    * Test 1 : none dups
    */
   public void testPopulateDups1() {
-
     Track track11 = TrackManager.getInstance().registerTrack("track11", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track11.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file11", dir, track11, 10, 128);
-
     Track track12 = TrackManager.getInstance().registerTrack("track12", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track12.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file12", dir, track12, 10, 128);
-
     Track track21 = TrackManager.getInstance().registerTrack("track21", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track21.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file21", dir, track21, 10, 218);
-
     Track track22 = TrackManager.getInstance().registerTrack("track22", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track22.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file22", dir, track22, 10, 128);
-
     action.populateDups();
     List<List<File>> dups = action.duplicateTracksList;
     assertTrue(dups.size() == 0);
-
   }
 
   /**
@@ -128,21 +101,16 @@ public class TestFindDuplicateTracksAction extends JajukTestCase {
    * Test 2 : multi-files track : filex1 and filex2 are in the same track
    */
   public void testPopulateDups2() {
-
     Track track11 = TrackManager.getInstance().registerTrack("track11", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track11.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file11", dir, track11, 10, 128);
-
     FileManager.getInstance().registerFile("file12", dir, track11, 10, 128);
-
     Track track21 = TrackManager.getInstance().registerTrack("track21", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track21.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file21", dir, track21, 10, 218);
-
     FileManager.getInstance().registerFile("file22", dir, track21, 10, 128);
-
     action.populateDups();
     List<List<File>> dups = action.duplicateTracksList;
     assertTrue(dups.size() == 2);
@@ -150,7 +118,6 @@ public class TestFindDuplicateTracksAction extends JajukTestCase {
     assertTrue(dup0.size() == 2);
     List<File> dup1 = dups.get(1);
     assertTrue(dup1.size() == 2);
-
   }
 
   /**
@@ -161,17 +128,14 @@ public class TestFindDuplicateTracksAction extends JajukTestCase {
    * Test 3 : single dup : track11 and track12 have fuzzy match
    */
   public void testPopulateDups3() {
-
     Track track11 = TrackManager.getInstance().registerTrack("track", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track11.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file11", dir, track11, 10, 128);
-
     Track track12 = TrackManager.getInstance().registerTrack("trAck", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track12.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file12", dir, track12, 10, 128);
-
     action.populateDups();
     List<List<File>> dups = action.duplicateTracksList;
     assertTrue(dups.size() == 1);
@@ -189,19 +153,16 @@ public class TestFindDuplicateTracksAction extends JajukTestCase {
    * track1 =~ track2
    */
   public void testPopulateDups4() {
-
     Track track1 = TrackManager.getInstance().registerTrack("track", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track1.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file11", dir, track1, 10, 128);
     FileManager.getInstance().registerFile("file12", dir, track1, 10, 128);
-
     Track track2 = TrackManager.getInstance().registerTrack("trAck", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track2.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file21", dir, track2, 10, 128);
     FileManager.getInstance().registerFile("file22", dir, track2, 10, 128);
-
     action.populateDups();
     List<List<File>> dups = action.duplicateTracksList;
     assertTrue(dups.size() == 1);
@@ -219,28 +180,23 @@ public class TestFindDuplicateTracksAction extends JajukTestCase {
    * track1 =~ track21 != track22
    */
   public void testPopulateDups5() {
-
     Track track1 = TrackManager.getInstance().registerTrack("track", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track1.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file11", dir, track1, 10, 128);
     FileManager.getInstance().registerFile("file12", dir, track1, 10, 128);
-
     Track track21 = TrackManager.getInstance().registerTrack("trAck", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track21.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file21", dir, track21, 10, 128);
-
     Track track22 = TrackManager.getInstance().registerTrack("trAck2", album, genre, artist, 10l,
         year, 1l, type, 1l);
     track22.setAlbumArtist(albumArtist);
     FileManager.getInstance().registerFile("file22", dir, track22, 10, 128);
-
     action.populateDups();
     List<List<File>> dups = action.duplicateTracksList;
     assertTrue(dups.size() == 1);
     List<File> dup0 = dups.get(0);
     assertTrue(dup0.size() == 3);
-
   }
 }
diff --git a/src/test/java/org/jajuk/ui/actions/TestPreparePartyAction.java b/src/test/java/org/jajuk/ui/actions/TestPreparePartyAction.java
index 7588b53..5bff186 100644
--- a/src/test/java/org/jajuk/ui/actions/TestPreparePartyAction.java
+++ b/src/test/java/org/jajuk/ui/actions/TestPreparePartyAction.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.actions;
 
@@ -28,8 +28,8 @@ import java.util.List;
 import javax.swing.JButton;
 
 import org.apache.commons.io.FileUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -48,10 +48,9 @@ import org.jajuk.util.Const;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestPreparePartyAction extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -70,14 +69,12 @@ public class TestPreparePartyAction extends JajukTestCase {
    */
   public void testPreparePartyAction() throws Exception {
     PreparePartyAction action = new PreparePartyAction();
-
     // once with empty properties, this is called from the menu
     try {
       action.perform(new ActionEvent(new JButton(), 1, null));
     } catch (HeadlessException e) {
       // happens when tests are run on servers without ui
     }
-
     // then with a single and with a list of playlists, this is called from the
     // PlaylistView
     JButton button = new JButton();
@@ -88,7 +85,6 @@ public class TestPreparePartyAction extends JajukTestCase {
     } catch (HeadlessException e) {
       // happens when tests are run on servers without ui
     }
-
     List<Playlist> list = new ArrayList<Playlist>();
     list.add(getPlaylist(11, false));
     button.putClientProperty(Const.DETAIL_SELECTION, list);
@@ -103,37 +99,31 @@ public class TestPreparePartyAction extends JajukTestCase {
   /**
    * Gets the playlist.
    *
-   * @param i DOCUMENT_ME
-   * @param register DOCUMENT_ME
+   * @param i 
+   * @param register 
    * @return the playlist
    * @throws Exception the exception
    */
   private static Playlist getPlaylist(int i, boolean register) throws Exception {
-    Genre genre = JUnitHelpers.getGenre();
-    Album album = JUnitHelpers.getAlbum("name", 23);
+    Genre genre = TestHelpers.getGenre();
+    Album album = TestHelpers.getAlbum("name", 23);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-
-    Type type = JUnitHelpers.getType();
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
+    Type type = TestHelpers.getType();
     Track track = TrackManager.getInstance().registerTrack("name", album, genre, artist, 120, year,
         1, type, 1);
-
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     if (!device.isMounted()) {
       device.mount(true);
     }
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
     Log.debug("Dir: " + dir.getFio());
     dir.getFio().mkdirs();
-
     java.io.File f = java.io.File.createTempFile("jajukFile", ".mp3", dir.getFio());
-
     File file = FileManager.getInstance().registerFile(Integer.valueOf(i).toString(), f.getName(),
         dir, track, 120, 70);
-
     final Playlist list;
     if (register) {
       list = PlaylistManager.getInstance().registerPlaylistFile(
@@ -142,16 +132,13 @@ public class TestPreparePartyAction extends JajukTestCase {
     } else {
       list = new Playlist(Integer.valueOf(i).toString(), "New list", dir);
     }
-
     // write the playlist so we can add files to it
     if (!list.getFIO().exists()) {
       // just create an empty file, # is a comment here
       FileUtils.writeStringToFile(list.getFIO(), "#");
     }
-
     // add a file to the playlist
     list.addFile(file);
-
     return list;
   }
 }
diff --git a/src/test/java/org/jajuk/ui/actions/TestRatingsImportExport.java b/src/test/java/org/jajuk/ui/actions/TestRatingsImportExport.java
new file mode 100644
index 0000000..92087f1
--- /dev/null
+++ b/src/test/java/org/jajuk/ui/actions/TestRatingsImportExport.java
@@ -0,0 +1,95 @@
+/*
+ *  Jajuk
+ *  Copyright (C) 2003-2012 The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+package org.jajuk.ui.actions;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.jajuk.ConstTest;
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.base.Collection;
+import org.jajuk.base.Track;
+import org.jajuk.base.TrackManager;
+import org.jajuk.services.startup.StartupCollectionService;
+import org.jajuk.util.Const;
+import org.jajuk.util.error.JajukException;
+import org.xml.sax.SAXException;
+
+public class TestRatingsImportExport extends JajukTestCase {
+  public void testExportImport() throws IOException, SAXException, JajukException,
+      ParserConfigurationException {
+    ExportRatingsAction exportRatings = new ExportRatingsAction();
+    ImportRatingsAction importRatings = new ImportRatingsAction();
+    StartupCollectionService.registerItemManagers();
+    Collection coll = Collection.getInstance();
+    assertNotNull(coll);
+    java.io.File file = java.io.File.createTempFile("testcoll", ".xml", new java.io.File(
+        ConstTest.TECH_TESTS_PATH));
+    // delete the file before writing the collection
+    assertTrue(file.delete());
+    // write ratings without any item
+    exportRatings.exportRatings(file);
+    // now it should exist and have some content
+    assertTrue(file.exists());
+    String str = FileUtils.readFileToString(file);
+    assertTrue(str, StringUtils.isNotBlank(str));
+    assertTrue(str, str.contains("<" + Const.XML_TRACKS));
+    assertFalse(str, str.contains(" " + Const.XML_TRACK_HITS));
+    // now with some content
+    String id = TestHelpers.getTrack(5).getID();
+    Track track = TrackManager.getInstance().getTrackByID(id);
+    track.setHits(29);
+    track.setProperty(Const.XML_TRACK_PREFERENCE, -2l);
+    track.setProperty(Const.XML_TRACK_BANNED, true);
+    // delete the file before writing the tracks
+    assertTrue(file.delete());
+    // commit without any item
+    exportRatings.exportRatings(file);
+    // now it should exist and have some content
+    assertTrue(file.exists());
+    str = FileUtils.readFileToString(file);
+    assertTrue(str, StringUtils.isNotBlank(str));
+    assertTrue(str, str.contains("<" + Const.XML_TRACKS));
+    // it should contain the track id and the rate that we set
+    assertFalse(str, str.contains("id=\"" + id + "\""));
+    assertFalse(str, str.contains(" " + Const.XML_TRACK_HITS + "=\"29\""));
+    // change the rate that we use internally and set it banned
+    assertEquals(29l, track.getHits());
+    assertEquals(true, track.getValue(Const.XML_TRACK_BANNED));
+    assertEquals(-2l, track.getLongValue(Const.XML_TRACK_PREFERENCE));
+    //Change values
+    track.setProperty(Const.XML_TRACK_PREFERENCE, -3l);
+    track.setHits(87);
+    track.setProperty(Const.XML_TRACK_BANNED, true);
+    assertEquals(87l, track.getHits());
+    assertEquals(true, track.getProperties().remove(Const.XML_TRACK_BANNED));
+    assertEquals(-3l, track.getProperties().remove(Const.XML_TRACK_PREFERENCE));
+    // import
+    importRatings.importRatings(file);
+    // now we need to have the restored settings again
+    assertEquals(29l, track.getHits());
+    assertEquals(true, track.getValue(Const.XML_TRACK_BANNED));
+    assertEquals(-2l, track.getLongValue(Const.XML_TRACK_PREFERENCE));
+  }
+}
diff --git a/src/test/java/org/jajuk/ui/helpers/TestDuration.java b/src/test/java/org/jajuk/ui/helpers/TestDuration.java
index c711275..3f848df 100644
--- a/src/test/java/org/jajuk/ui/helpers/TestDuration.java
+++ b/src/test/java/org/jajuk/ui/helpers/TestDuration.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,20 +16,15 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
-import static org.junit.Assert.assertEquals;
-
-import org.jajuk.JUnitHelpers;
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.junit.Test;
 
-/**
- * DOCUMENT_ME.
- */
-public class TestDuration {
-
+public class TestDuration extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.ui.helpers.Duration#hashCode()}.
    */
@@ -37,8 +32,7 @@ public class TestDuration {
   public void testHashCode() {
     Duration dur = new Duration(123);
     Duration equ = new Duration(123);
-
-    JUnitHelpers.HashCodeTest(dur, equ);
+    TestHelpers.HashCodeTest(dur, equ);
   }
 
   /**
@@ -54,7 +48,7 @@ public class TestDuration {
    */
   @Test
   public void testToString() {
-    JUnitHelpers.ToStringTest(new Duration(993));
+    TestHelpers.ToStringTest(new Duration(993));
   }
 
   /**
@@ -67,8 +61,7 @@ public class TestDuration {
     Duration dur = new Duration(234);
     Duration equal = new Duration(234);
     Duration notequal = new Duration(233);
-
-    JUnitHelpers.EqualsTest(dur, equal, notequal);
+    TestHelpers.EqualsTest(dur, equal, notequal);
   }
 
   /**
@@ -82,8 +75,7 @@ public class TestDuration {
     Duration dur = new Duration(234);
     Duration equal = new Duration(234);
     Duration notequal = new Duration(233);
-
-    JUnitHelpers.CompareToTest(dur, equal, notequal);
+    TestHelpers.CompareToTest(dur, equal, notequal);
   }
 
   /**
@@ -93,9 +85,7 @@ public class TestDuration {
   public void testGetDuration() {
     Duration dur = new Duration(234);
     Duration dur2 = new Duration(233);
-
     assertEquals(234, dur.getDuration());
     assertEquals(233, dur2.getDuration());
   }
-
 }
diff --git a/src/test/java/org/jajuk/ui/helpers/TestPlayerStateMediator.java b/src/test/java/org/jajuk/ui/helpers/TestPlayerStateMediator.java
index 75f4acc..bc7a7a3 100644
--- a/src/test/java/org/jajuk/ui/helpers/TestPlayerStateMediator.java
+++ b/src/test/java/org/jajuk/ui/helpers/TestPlayerStateMediator.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.helpers;
 
@@ -24,8 +24,8 @@ import java.util.List;
 import java.util.Properties;
 import java.util.Set;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -44,25 +44,19 @@ import org.jajuk.services.notification.NotificatorTypes;
 import org.jajuk.services.players.Player;
 import org.jajuk.services.players.QueueModel;
 import org.jajuk.services.players.StackItem;
-import org.jajuk.services.webradio.WebRadio;
+import org.jajuk.services.webradio.WebRadioOrigin;
 import org.jajuk.ui.actions.ActionManager;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestPlayerStateMediator extends JajukTestCase {
-
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // to install actions...
     ActionManager.getInstance();
-
-    super.setUp();
   }
 
   /**
@@ -73,7 +67,6 @@ public class TestPlayerStateMediator extends JajukTestCase {
   public final void testGetInstance() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
     assertNotNull(med);
-
     // once again to cover other if-branch
     med = PlayerStateMediator.getInstance();
     assertNotNull(med);
@@ -106,7 +99,7 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update stop.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateStop() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
@@ -115,26 +108,21 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update stop queue model.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testUpdateStopQueueModel() throws Exception {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
-
     // test with queue size > 0
-    Device device = JUnitHelpers.getDevice();
-
+    Device device = TestHelpers.getDevice();
     // no files without a directory
     List<File> files = device.getFilesRecursively();
     assertEquals(0, files.size()); // no file available
-
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
     File file = getFile(9, dir);
-
     QueueModel.insert(new StackItem(file), 0);
     assertTrue(QueueModel.getQueue().toString(), QueueModel.getQueue().size() > 0);
-
     // run the method
     med.update(new JajukEvent(JajukEvents.PLAYER_STOP, null));
   }
@@ -142,30 +130,27 @@ public class TestPlayerStateMediator extends JajukTestCase {
   /**
    * Gets the file.
    *
-   * @param i DOCUMENT_ME
-   * @param dir DOCUMENT_ME
+   * @param i 
+   * @param dir 
    * @return the file
    */
   private File getFile(int i, Directory dir) {
-    Genre genre = JUnitHelpers.getGenre();
-    Album album = JUnitHelpers.getAlbum("name", 0);
+    Genre genre = TestHelpers.getGenre();
+    Album album = TestHelpers.getAlbum("name", 0);
     album.setProperty(Const.XML_ALBUM_DISCOVERED_COVER, Const.COVER_NONE); // don't read covers for
     // this test
-
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-
-    Type type = JUnitHelpers.getType();
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
+    Type type = TestHelpers.getType();
     Track track = TrackManager.getInstance().registerTrack("name", album, genre, artist, 120, year,
         1, type, 1);
-
     return FileManager.getInstance().registerFile(Integer.valueOf(i).toString(), "test.tst", dir,
         track, 120, 70);
   }
 
   /**
    * Test update paused.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdatePaused() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
@@ -174,7 +159,7 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update resume.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateResume() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
@@ -183,7 +168,7 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update opening error.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateOpeningError() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
@@ -192,7 +177,7 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update zero.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateZero() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
@@ -201,7 +186,7 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update webradio.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateWebradio() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
@@ -210,61 +195,52 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update webradio notifcator.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateWebradioNotifcator() {
     // enable Tooltip/Notification
     Conf.setProperty(Const.CONF_UI_NOTIFICATOR_TYPE, NotificatorTypes.TOAST.name());
-
     Properties prop = new Properties();
-    prop.put(Const.DETAIL_CONTENT, new WebRadio("test", "testurl"));
-
+    prop.put(Const.DETAIL_CONTENT,
+        TestHelpers.getWebRadio("myradio", "http://foo", WebRadioOrigin.CUSTOM));
     PlayerStateMediator med = PlayerStateMediator.getInstance();
     med.update(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED, prop));
   }
 
   /**
    * Test update file launched.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testUpdateFileLaunched() throws Exception {
     // enable Tooltip/Notification
     Conf.setProperty(Const.CONF_UI_NOTIFICATOR_TYPE, NotificatorTypes.TOAST.name());
-
-    Device device = JUnitHelpers.getDevice();
-    device.setUrl(System.getProperty("java.io.tmpdir"));
-    Directory dir = DirectoryManager.getInstance().registerDirectory(device);
+    Directory dir = TestHelpers.getDirectory();
     File file = getFile(3, dir);
-
     Properties prop = new Properties();
     prop.put(Const.DETAIL_CURRENT_FILE_ID, file.getID());
-
     PlayerStateMediator med = PlayerStateMediator.getInstance();
     med.update(new JajukEvent(JajukEvents.FILE_LAUNCHED, prop));
-
-    JUnitHelpers.clearSwingUtilitiesQueue();
+    TestHelpers.clearSwingUtilitiesQueue();
   }
 
   /**
    * Test update file launched null.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateFileLaunchedNull() {
     // enable Tooltip/Notification
     Conf.setProperty(Const.CONF_UI_NOTIFICATOR_TYPE, NotificatorTypes.TOAST.name());
-
     // just provide empty properties
     Properties prop = new Properties();
-
     PlayerStateMediator med = PlayerStateMediator.getInstance();
     med.update(new JajukEvent(JajukEvents.FILE_LAUNCHED, prop));
   }
 
   /**
    * Test update volume.
-   * DOCUMENT_ME
+   * 
    */
   public final void testUpdateVolume() {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
@@ -273,23 +249,19 @@ public class TestPlayerStateMediator extends JajukTestCase {
 
   /**
    * Test update mute.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public final void testUpdateMute() throws Exception {
     PlayerStateMediator med = PlayerStateMediator.getInstance();
     med.update(new JajukEvent(JajukEvents.MUTE_STATE, null));
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // test with muted player
     Player.mute();
-
     med.update(new JajukEvent(JajukEvents.MUTE_STATE, null));
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     Player.mute(false);
-
     med.update(new JajukEvent(JajukEvents.MUTE_STATE, null));
   }
 }
diff --git a/src/test/java/org/jajuk/ui/helpers/TestWebRadioTableModel.java b/src/test/java/org/jajuk/ui/helpers/TestWebRadioTableModel.java
new file mode 100644
index 0000000..b5747aa
--- /dev/null
+++ b/src/test/java/org/jajuk/ui/helpers/TestWebRadioTableModel.java
@@ -0,0 +1,72 @@
+/*
+ *  Jajuk
+ *  Copyright (C) The Jajuk Team
+ *  http://jajuk.info
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *  
+ */
+package org.jajuk.ui.helpers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.services.webradio.WebRadioOrigin;
+import org.jajuk.util.Const;
+import org.junit.Test;
+
+/**
+ * Test methods for {@link org.jajuk.ui.helpers.WebRadioTableModel}.
+ */
+public class TestWebRadioTableModel extends JajukTestCase {
+  @Test
+  public void testModel() {
+    // Load radios
+    TestHelpers.getWebRadios();
+    //Create and populate the model
+    WebRadioTableModel model = new WebRadioTableModel();
+    model.populateModel(getColumnsConf(Const.XML_PLAY + ',' + Const.XML_NAME + ','
+        + Const.XML_KEYWORDS + Const.XML_GENRE + ',' + Const.XML_ORIGIN + ',' + Const.XML_BITRATE
+        + ',' + Const.XML_URL));
+    // Check the model (Note that we check that the rows are sorted at the same time)
+    assertEquals(model.getRowCount(), 4);
+    assertEquals(model.getColumnCount(), 9);
+    assertEquals(model.getValueAt(0, 1), "Custom 1");
+    assertEquals(model.getValueAt(0, 2), "a cool radio");
+    assertEquals(model.getValueAt(0, 3), "http://custom1");
+    assertEquals(model.getValueAt(0, 4), "foo,bar");
+    assertEquals(model.getValueAt(0, 5), "Pop");
+    assertEquals(model.getValueAt(0, 6), WebRadioOrigin.CUSTOM.name());
+    assertEquals(model.getValueAt(0, 7), new Long(127));
+    // Frequency is not shown
+    assertEquals(model.getValueAt(0, 8), new Long(45000));
+    assertEquals(model.getValueAt(3, 1), "Preset 2");
+    assertEquals(model.getValueAt(3, 3), "http://preset2");
+    assertEquals(model.getValueAt(3, 6), WebRadioOrigin.PRESET.name());
+    assertEquals(model.getValueAt(3, 8), 0l);
+  }
+
+  private List<String> getColumnsConf(String sConf) {
+    List<String> alOut = new ArrayList<String>(10);
+    StringTokenizer st = new StringTokenizer(sConf, ",");
+    while (st.hasMoreTokens()) {
+      alOut.add(st.nextToken());
+    }
+    return alOut;
+  }
+}
diff --git a/src/test/java/org/jajuk/ui/views/TestCoverView.java b/src/test/java/org/jajuk/ui/views/TestCoverView.java
index 4502493..5fb8310 100644
--- a/src/test/java/org/jajuk/ui/views/TestCoverView.java
+++ b/src/test/java/org/jajuk/ui/views/TestCoverView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.views;
 
@@ -26,8 +26,8 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ComponentEvent;
 import java.util.Set;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Device;
@@ -46,27 +46,22 @@ import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestCoverView extends JajukTestCase {
-  
   /**
    * Test method for.
    *
    * {@link org.jajuk.ui.views.CoverView#componentResized(java.awt.event.ComponentEvent)}
    * .
    */
-
   public final void testComponentResized() {
     CoverView view = new CoverView();
-
     // this expects the UI to be available
     view.initUI();
-
     view.componentResized(new ComponentEvent(new Component() {
       private static final long serialVersionUID = 1L;
     }, 9));
-
     // resize immediately again to cover the time delay mechanism
     view.componentResized(new ComponentEvent(new Component() {
       private static final long serialVersionUID = 1L;
@@ -76,7 +71,6 @@ public class TestCoverView extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.ui.views.CoverView#CoverView()}.
    */
-
   public final void testCoverView() {
     new CoverView();
   }
@@ -86,7 +80,6 @@ public class TestCoverView extends JajukTestCase {
    *
    * {@link org.jajuk.ui.views.CoverView#CoverView(org.jajuk.base.File)}.
    */
-
   public final void testCoverViewFile() {
     new CoverView(getFile());
   }
@@ -97,14 +90,14 @@ public class TestCoverView extends JajukTestCase {
    * @return the file
    */
   private File getFile() {
-    Genre genre = JUnitHelpers.getGenre();
-    Album album = JUnitHelpers.getAlbum("name", 0);
-    Artist artist = JUnitHelpers.getArtist("name");
-    Year year = JUnitHelpers.getYear(2000);
-    Type type = JUnitHelpers.getType();
+    Genre genre = TestHelpers.getGenre();
+    Album album = TestHelpers.getAlbum("name", 0);
+    Artist artist = TestHelpers.getArtist("name");
+    Year year = TestHelpers.getYear(2000);
+    Type type = TestHelpers.getType();
     Track track = TrackManager.getInstance().registerTrack("name", album, genre, artist, 120, year,
         1, type, 1);
-    Device device = JUnitHelpers.getDevice();
+    Device device = TestHelpers.getDevice();
     Directory dir = DirectoryManager.getInstance().registerDirectory(device);
     File file = FileManager.getInstance().registerFile("test.tst", dir, track, 120, 70);
     return file;
@@ -113,7 +106,6 @@ public class TestCoverView extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.ui.views.CoverView#initUI()}.
    */
-
   public final void testInitUI() {
     CoverView view = new CoverView();
     view.initUI();
@@ -122,13 +114,11 @@ public class TestCoverView extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.ui.views.CoverView#initUI(boolean)}.
    */
-
   public final void testInitUIBoolean() {
     {
       CoverView view = new CoverView();
       view.initUI(true);
     }
-
     {
       CoverView view = new CoverView();
       view.initUI(false);
@@ -141,34 +131,28 @@ public class TestCoverView extends JajukTestCase {
    * {@link org.jajuk.ui.views.CoverView#actionPerformed(java.awt.event.ActionEvent)}
    * .
    */
-
   public final void testActionPerformed() {
     CoverView view = new CoverView();
-
     view.initUI();
-
     // disable confirmations to not show UI during running tests
     Conf.setProperty(Const.CONF_CONFIRMATIONS_DELETE_COVER, "false");
-
     // different source, will not trigger anything
     view.actionPerformed(new ActionEvent("testsource", 1, "test"));
-
     // now try to trigger actions on each of the components in the view
     recursiveActionPerformed(view, view);
   }
 
   /**
    * Recursive action performed.
-   * DOCUMENT_ME
+   * 
    *
-   * @param cmp DOCUMENT_ME
-   * @param view DOCUMENT_ME
+   * @param cmp 
+   * @param view 
    */
   private void recursiveActionPerformed(Container cmp, CoverView view) {
     for (int i = 0; i < cmp.getComponentCount(); i++) {
       // first call actionPerfomed with this component
       view.actionPerformed(new ActionEvent(cmp.getComponent(i), 1, "test"));
-
       // then again with CTRL-Mask set to trigger all parts
       view.actionPerformed(new ActionEvent(cmp.getComponent(i), 1, "test", ActionEvent.CTRL_MASK)); // set
       // CTRL_MASK
@@ -176,7 +160,6 @@ public class TestCoverView extends JajukTestCase {
       // trigger
       // all
       // code
-
       // then recusively step into this components
       if (cmp.getComponent(i) instanceof Container) {
         recursiveActionPerformed((Container) cmp.getComponent(i), view);
@@ -189,7 +172,6 @@ public class TestCoverView extends JajukTestCase {
    *
    * {@link org.jajuk.ui.views.CoverView#createQuery(org.jajuk.base.File)}.
    */
-
   public final void testCreateQuery() {
     CoverView view = new CoverView();
     // NPE: view.createQuery(null);
@@ -199,10 +181,8 @@ public class TestCoverView extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.ui.views.CoverView#getDesc()}.
    */
-
   public final void testGetDesc() {
     CoverView view = new CoverView();
-
     assertNotNull(view.getDesc());
     assertFalse(view.getDesc().isEmpty());
   }
@@ -210,7 +190,6 @@ public class TestCoverView extends JajukTestCase {
   /**
    * Test method for {@link org.jajuk.ui.views.CoverView#getRegistrationKeys()}.
    */
-
   public final void testGetRegistrationKeys() {
     CoverView view = new CoverView();
     Set<JajukEvents> eventSubjectSet = view.getRegistrationKeys();
@@ -219,29 +198,14 @@ public class TestCoverView extends JajukTestCase {
   }
 
   /**
-   * Test method for {@link org.jajuk.ui.views.CoverView#searching(boolean)}.
-   */
-
-  public final void testSearching() {
-    CoverView view = new CoverView();
-    view.initUI();
-
-    view.searching(true);
-    view.searching(false);
-  }
-
-  /**
    * Test method for {@link org.jajuk.ui.views.CoverView#getCurrentImage()}.
    *
    * @throws Exception the exception
    */
-
   public final void testGetCurrentImage() throws Exception {
     CoverView view = new CoverView();
-
     // need to cover initialized
     view.initUI();
-
     // there is always a dummy image...
     assertNotNull(view.getCurrentImage());
   }
@@ -251,16 +215,12 @@ public class TestCoverView extends JajukTestCase {
    *
    * {@link org.jajuk.ui.views.CoverView#update(org.jajuk.events.JajukEvent)}.
    */
-
   public final void testUpdateJajukEvent() {
     CoverView view = new CoverView();
-
     // this expects the UI to be available
     view.initUI();
-
     // this is not catched currently, but should still not cause trouble
     view.update(new JajukEvent(JajukEvents.ALARMS_CHANGE));
-
     // these are catched and handled currently
     view.update(new JajukEvent(JajukEvents.FILE_LAUNCHED));
     view.update(new JajukEvent(JajukEvents.WEBRADIO_LAUNCHED));
diff --git a/src/test/java/org/jajuk/ui/views/TestParameterView.java b/src/test/java/org/jajuk/ui/views/TestParameterView.java
index 8512d9a..a059d5b 100644
--- a/src/test/java/org/jajuk/ui/views/TestParameterView.java
+++ b/src/test/java/org/jajuk/ui/views/TestParameterView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,31 +16,27 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.views;
 
-import java.awt.Component;
 import java.awt.ItemSelectable;
-import java.awt.event.ActionEvent;
-import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.util.Properties;
 import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.events.JajukEvent;
 import org.jajuk.events.JajukEvents;
 import org.jajuk.util.Const;
 import org.jajuk.util.log.Log;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestParameterView extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.ui.views.ParameterView#ParameterView()}.
    */
@@ -58,18 +54,9 @@ public class TestParameterView extends JajukTestCase {
   public void testActionPerformed() throws Exception {
     ParameterView view = new ParameterView();
     view.initUI();
-
-    JUnitHelpers.waitForAllWorkToFinishAndCleanup();
-
+    TestHelpers.cleanup();
     // make sure the logger is initialized
     Log.init();
-
-    // iterate over all components of the view
-    for (Component comp : view.getComponents()) {
-      System.out.println("Comp: " + comp.toString());
-      ActionEvent event = new ActionEvent(comp, 1, "test");
-      view.actionPerformed(event);
-    }
   }
 
   /**
@@ -108,25 +95,6 @@ public class TestParameterView extends JajukTestCase {
   public void testItemStateChanged() {
     ParameterView view = new ParameterView();
     view.initUI();
-
-    // iterate over all components of the view
-    for (Component comp : view.getComponents()) {
-      ItemEvent event = new ItemEvent(new MyItemSelectable(), 1, comp, 2);
-      view.itemStateChanged(event);
-    }
-
-  }
-
-  /**
-   * Test method for.
-   *
-   * {@link org.jajuk.ui.views.ParameterView#stateChanged(javax.swing.event.ChangeEvent)}
-   * .
-   */
-  public void testStateChanged() {
-    ParameterView view = new ParameterView();
-    view.initUI();
-    view.stateChanged(null);
   }
 
   /**
@@ -139,33 +107,27 @@ public class TestParameterView extends JajukTestCase {
   public void testUpdateJajukEvent() throws Exception {
     ParameterView view = new ParameterView();
     view.initUI();
-
     // once without details
     view.update(new JajukEvent(JajukEvents.PARAMETERS_CHANGE, null));
-
     // wait for invokeLater to finish();
-    JUnitHelpers.clearSwingUtilitiesQueue();
-
+    TestHelpers.clearSwingUtilitiesQueue();
     // then with details
     Properties prop = new Properties();
     prop.put(Const.DETAIL_ORIGIN, view);
     view.update(new JajukEvent(JajukEvents.PARAMETERS_CHANGE, prop));
-
     // wait for invokeLater to finish();
-    JUnitHelpers.clearSwingUtilitiesQueue();
+    TestHelpers.clearSwingUtilitiesQueue();
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private final class MyItemSelectable implements ItemSelectable {
-    
     /* (non-Javadoc)
      * @see java.awt.ItemSelectable#removeItemListener(java.awt.event.ItemListener)
      */
     @Override
     public void removeItemListener(ItemListener l) {
-
     }
 
     /* (non-Javadoc)
@@ -173,7 +135,6 @@ public class TestParameterView extends JajukTestCase {
      */
     @Override
     public Object[] getSelectedObjects() {
-
       return null;
     }
 
@@ -182,8 +143,6 @@ public class TestParameterView extends JajukTestCase {
      */
     @Override
     public void addItemListener(ItemListener l) {
-
     }
   }
-
 }
diff --git a/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java b/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java
index bc21236..27ea24d 100644
--- a/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java
+++ b/src/test/java/org/jajuk/ui/views/TestTracksTreeView.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.views;
 
@@ -33,8 +33,8 @@ import javax.swing.event.TreeExpansionEvent;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.tree.TreePath;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.Album;
 import org.jajuk.base.Artist;
 import org.jajuk.base.Genre;
@@ -47,24 +47,15 @@ import org.jajuk.ui.views.TracksTreeView.TracksMouseAdapter;
 import org.jajuk.util.Conf;
 import org.jajuk.util.Const;
 
-/**
- * DOCUMENT_ME.
- */
 public class TestTracksTreeView extends JajukTestCase {
-
-  /* (non-Javadoc)
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     try {
       // initialize the actions
       ActionManager.getInstance();
     } catch (HeadlessException e) {
       // this is thrown in automated tests on Hudson/Sonar
     }
-
-    super.setUp();
   }
 
   /**
@@ -72,15 +63,14 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testInitUI() {
     TracksTreeView view = new TracksTreeView();
-
     tryInitUI(view);
   }
 
   /**
    * Try init ui.
-   * DOCUMENT_ME
+   * 
    *
-   * @param view DOCUMENT_ME
+   * @param view 
    */
   private void tryInitUI(TracksTreeView view) {
     try {
@@ -100,15 +90,12 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTree() {
     TracksTreeView view = new TracksTreeView();
-
     tryInitUI(view);
-
     try {
       view.populateTree();
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     // try with different settings
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "0");
     try {
@@ -116,49 +103,42 @@ public class TestTracksTreeView extends JajukTestCase {
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "1");
     try {
       view.populateTree();
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "2");
     try {
       view.populateTree();
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "3");
     try {
       view.populateTree();
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "4");
     try {
       view.populateTree();
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "5");
     try {
       view.populateTree();
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "6");
     try {
       view.populateTree();
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "7");
     try {
       view.populateTree();
@@ -172,7 +152,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testExpand() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.expand();
     } catch (NullPointerException e) {
@@ -214,7 +193,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTreeByGenre() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.populateTreeByGenre();
     } catch (NullPointerException e) {
@@ -229,7 +207,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTreeByArtist() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.populateTreeByArtist();
     } catch (NullPointerException e) {
@@ -244,7 +221,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTreeByYear() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.populateTreeByYear();
     } catch (NullPointerException e) {
@@ -259,7 +235,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTreeByAlbum() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.populateTreeByAlbum();
     } catch (NullPointerException e) {
@@ -274,7 +249,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTreeByDiscovery() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.populateTreeByDiscovery();
     } catch (NullPointerException e) {
@@ -289,7 +263,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTreeByRate() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.populateTreeByRate();
     } catch (NullPointerException e) {
@@ -304,7 +277,6 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   public final void testPopulateTreeByHits() {
     TracksTreeView view = new TracksTreeView();
-
     try {
       view.populateTreeByHits();
     } catch (NullPointerException e) {
@@ -325,12 +297,11 @@ public class TestTracksTreeView extends JajukTestCase {
 
   /**
    * Test tracks tree selection listener.
-   * DOCUMENT_ME
+   * 
    */
   public final void testTracksTreeSelectionListener() {
     TracksTreeView view = new TracksTreeView();
     TracksTreeView.TracksTreeSelectionListener task = view.new TracksTreeSelectionListener();
-
     try {
       task.valueChanged(new TreeSelectionEvent(this, new TreePath("test"), false, null, null));
     } catch (NullPointerException e) {
@@ -340,31 +311,27 @@ public class TestTracksTreeView extends JajukTestCase {
 
   /**
    * Test tracks mouse adapter.
-   * DOCUMENT_ME
+   * 
    */
   public final void testTracksMouseAdapter() {
     TracksTreeView view = new TracksTreeView();
     TracksMouseAdapter ad = view.new TracksMouseAdapter(null);
     assertNotNull(ad);
-
     MouseEvent event = new MouseEvent(new Component() {
       private static final long serialVersionUID = 1L;
     }, 1, 2l, 3, 2, 2, 3, true);
     assertTrue(event.isPopupTrigger());
-
     try {
       ad.handlePopup(event);
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     // popup trigger
     try {
       ad.mousePressed(event);
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     // normal event with CTRL is handled here
     event = new MouseEvent(new Component() {
       private static final long serialVersionUID = 1L;
@@ -374,7 +341,6 @@ public class TestTracksTreeView extends JajukTestCase {
     } catch (NullPointerException e) {
       // reported on headless settings
     }
-
     event = new MouseEvent(new Component() {
       private static final long serialVersionUID = 1L;
     }, 1, 2l, 0, 2, 2, 3, true);
@@ -387,13 +353,12 @@ public class TestTracksTreeView extends JajukTestCase {
 
   /**
    * Test genre node.
-   * DOCUMENT_ME
+   * 
    */
   public final void testGenreNode() {
     GenreNode ad = new GenreNode(getGenre());
     assertNotNull(ad);
-
-    JUnitHelpers.ToStringTest(ad);
+    TestHelpers.ToStringTest(ad);
     assertNotNull(ad.getGenre());
     assertEquals("name", ad.getGenre().getName());
   }
@@ -404,18 +369,17 @@ public class TestTracksTreeView extends JajukTestCase {
    * @return the genre
    */
   private Genre getGenre() {
-    return JUnitHelpers.getGenre();
+    return TestHelpers.getGenre();
   }
 
   /**
    * Test artist node.
-   * DOCUMENT_ME
+   * 
    */
   public final void testArtistNode() {
     ArtistNode ad = new ArtistNode(getArtist());
     assertNotNull(ad);
-
-    JUnitHelpers.ToStringTest(ad);
+    TestHelpers.ToStringTest(ad);
     assertNotNull(ad.getArtist());
     assertEquals("name", ad.getArtist().getName());
   }
@@ -426,18 +390,17 @@ public class TestTracksTreeView extends JajukTestCase {
    * @return the artist
    */
   private Artist getArtist() {
-    return JUnitHelpers.getArtist("name");
+    return TestHelpers.getArtist("name");
   }
 
   /**
    * Test year node.
-   * DOCUMENT_ME
+   * 
    */
   public final void testYearNode() {
     YearNode ad = new YearNode(getYear());
     assertNotNull(ad);
-
-    JUnitHelpers.ToStringTest(ad);
+    TestHelpers.ToStringTest(ad);
     assertNotNull(ad.getYear());
     assertEquals("2000", ad.getYear().getName());
   }
@@ -448,18 +411,17 @@ public class TestTracksTreeView extends JajukTestCase {
    * @return the year
    */
   private Year getYear() {
-    return JUnitHelpers.getYear(2000);
+    return TestHelpers.getYear(2000);
   }
 
   /**
    * Test album node.
-   * DOCUMENT_ME
+   * 
    */
   public final void testAlbumNode() {
     AlbumNode ad = new AlbumNode(getAlbum());
     assertNotNull(ad);
-
-    JUnitHelpers.ToStringTest(ad);
+    TestHelpers.ToStringTest(ad);
     assertNotNull(ad.getAlbum());
     assertEquals("name", ad.getAlbum().getName());
   }
@@ -470,18 +432,17 @@ public class TestTracksTreeView extends JajukTestCase {
    * @return the album
    */
   private Album getAlbum() {
-    return JUnitHelpers.getAlbum("name", 234);
+    return TestHelpers.getAlbum("name", 234);
   }
 
   /**
    * Test track node.
-   * DOCUMENT_ME
+   * 
    */
   public final void testTrackNode() {
     TrackNode ad = new TrackNode(getTrack());
     assertNotNull(ad);
-
-    JUnitHelpers.ToStringTest(ad);
+    TestHelpers.ToStringTest(ad);
     assertNotNull(ad.getTrack());
     assertEquals("name", ad.getTrack().getName());
   }
@@ -493,12 +454,12 @@ public class TestTracksTreeView extends JajukTestCase {
    */
   private Track getTrack() {
     return TrackManager.getInstance().registerTrack("name", getAlbum(), getGenre(), getArtist(),
-        123, getYear(), 1, JUnitHelpers.getType(), 1);
+        123, getYear(), 1, TestHelpers.getType(), 1);
   }
 
   /**
    * Test discovery date node.
-   * DOCUMENT_ME
+   * 
    */
   public final void testDiscoveryDateNode() {
     DiscoveryDateNode ad = new DiscoveryDateNode(null);
@@ -507,12 +468,11 @@ public class TestTracksTreeView extends JajukTestCase {
 
   /**
    * Test tracks tree cell renderer.
-   * DOCUMENT_ME
+   * 
    */
   public final void testTracksTreeCellRenderer() {
     TracksTreeCellRenderer ad = new TracksTreeCellRenderer();
     assertNotNull(ad);
-
     Icon icon = ad.getIcon();
     // make sure we have a different icon after each call
     assertNotNull(ad.getTreeCellRendererComponent(new JTree(), new GenreNode(getGenre()), true,
@@ -547,12 +507,11 @@ public class TestTracksTreeView extends JajukTestCase {
 
   /**
    * Test tracks tree expansion listener.
-   * DOCUMENT_ME
+   * 
    */
   public final void testTracksTreeExpansionListener() {
     TracksTreeExpansionListener ad = new TracksTreeExpansionListener();
     assertNotNull(ad);
-
     {
       Genre genre = getGenre();
       assertNull(genre.getProperties().get(Const.XML_EXPANDED));
@@ -561,7 +520,6 @@ public class TestTracksTreeView extends JajukTestCase {
       ad.treeCollapsed(new TreeExpansionEvent("dummy", new TreePath(new GenreNode(genre))));
       assertNull(genre.getProperties().get(Const.XML_EXPANDED));
     }
-
     {
       Artist genre = getArtist();
       assertNull(genre.getProperties().get(Const.XML_EXPANDED));
@@ -570,7 +528,6 @@ public class TestTracksTreeView extends JajukTestCase {
       ad.treeCollapsed(new TreeExpansionEvent("dummy", new TreePath(new ArtistNode(genre))));
       assertNull(genre.getProperties().get(Const.XML_EXPANDED));
     }
-
     {
       Album genre = getAlbum();
       assertNull(genre.getProperties().get(Const.XML_EXPANDED));
@@ -579,7 +536,6 @@ public class TestTracksTreeView extends JajukTestCase {
       ad.treeCollapsed(new TreeExpansionEvent("dummy", new TreePath(new AlbumNode(genre))));
       assertNull(genre.getProperties().get(Const.XML_EXPANDED));
     }
-
     {
       Year genre = getYear();
       assertNull(genre.getProperties().get(Const.XML_EXPANDED));
diff --git a/src/test/java/org/jajuk/ui/wizard/TestDigitalDJWizard.java b/src/test/java/org/jajuk/ui/wizard/TestDigitalDJWizard.java
index 238d627..68f4757 100644
--- a/src/test/java/org/jajuk/ui/wizard/TestDigitalDJWizard.java
+++ b/src/test/java/org/jajuk/ui/wizard/TestDigitalDJWizard.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.ui.wizard;
 
@@ -27,33 +27,38 @@ import org.jajuk.services.dj.AmbienceManager;
 import org.jajuk.services.dj.DigitalDJ;
 import org.jajuk.services.dj.DigitalDJManager;
 import org.jajuk.services.dj.TransitionDigitalDJ;
+import org.jajuk.ui.wizard.digital_dj.ActionSelectionScreen;
+import org.jajuk.ui.wizard.digital_dj.AmbiencesScreen;
+import org.jajuk.ui.wizard.digital_dj.ChangeScreen;
+import org.jajuk.ui.wizard.digital_dj.DigitalDJWizard;
+import org.jajuk.ui.wizard.digital_dj.GeneralOptionsScreen;
+import org.jajuk.ui.wizard.digital_dj.ProportionsScreen;
+import org.jajuk.ui.wizard.digital_dj.RemoveScreen;
+import org.jajuk.ui.wizard.digital_dj.TransitionsScreen;
+import org.jajuk.ui.wizard.digital_dj.TypeSelectionScreen;
 import org.qdwizard.Screen;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDigitalDJWizard extends JajukTestCase {
-  
   /**
    * Test method for.
    *
    * @throws Exception the exception
-   * {@link org.jajuk.ui.wizard.DigitalDJWizard#getPreviousScreen(java.lang.Class)}
+   * {@link org.jajuk.ui.wizard.digital_dj.DigitalDJWizard#getPreviousScreen(java.lang.Class)}
    * .
    */
-
   public void testGetPreviousScreenClassOfQextendsScreen() throws Exception {
     try {
       DigitalDJWizard wizard = new DigitalDJWizard();
       assertNull(wizard.getPreviousScreen(null));
       assertNotNull(wizard.getNextScreen(null));
-
       // do some dummy things with this panel...
       Screen screen = wizard.getNextScreen(null).newInstance();
       screen.initUI();
       assertNotNull(screen.getDescription());
       assertNotNull(screen.getName());
-
       assertNull(wizard.getPreviousScreen(null)); // always null until
       // "actionPerformed"
     } catch (HeadlessException e) {
@@ -65,29 +70,25 @@ public class TestDigitalDJWizard extends JajukTestCase {
    * Test method for.
    *
    * @throws Exception the exception
-   * {@link org.jajuk.ui.wizard.DigitalDJWizard#getNextScreen(java.lang.Class)}.
+   * {@link org.jajuk.ui.wizard.digital_dj.DigitalDJWizard#getNextScreen(java.lang.Class)}.
    */
-
   public void testGetNextScreenClassOfQextendsScreen() throws Exception {
     try {
       DigitalDJWizard wizard = new DigitalDJWizard();
       assertNotNull(wizard.getNextScreen(null));
-
       // do some dummy things with this panel...
       Screen screen = wizard.getNextScreen(null).newInstance();
       screen.initUI();
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
-
   }
 
   /**
    * Test method for.
    *
-   * {@link org.jajuk.ui.wizard.DigitalDJWizard#DigitalDJWizard()}.
+   * {@link org.jajuk.ui.wizard.digital_dj.DigitalDJWizard#DigitalDJWizard()}.
    */
-
   public void testDigitalDJWizard() {
     try {
       new DigitalDJWizard();
@@ -98,7 +99,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Test panels action selection.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsActionSelection() {
     try {
@@ -106,8 +107,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
-      coverScreen(new DigitalDJWizard.ActionSelectionPanel());
+      coverScreen(new ActionSelectionScreen());
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
@@ -115,7 +115,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Test panels ambience.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsAmbience() {
     try {
@@ -123,11 +123,9 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
       // we need to load ambiences before this will work
       AmbienceManager.getInstance().load();
-
-      coverScreen(new DigitalDJWizard.AmbiencePanel());
+      coverScreen(new AmbiencesScreen());
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
@@ -135,7 +133,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Test panels change.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsChange() {
     try {
@@ -143,14 +141,11 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
-      coverScreen(new DigitalDJWizard.ChangePanel());
-
+      coverScreen(new ChangeScreen());
       // also cover the case when a digital dj is registered
       DigitalDJ dj = new TransitionDigitalDJ("1");
       DigitalDJManager.getInstance().register(dj);
-
-      coverScreen(new DigitalDJWizard.ChangePanel());
+      coverScreen(new ChangeScreen());
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
@@ -158,7 +153,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Test panels general option.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsGeneralOption() {
     try {
@@ -166,8 +161,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
-      coverScreen(new DigitalDJWizard.GeneralOptionsPanel());
+      coverScreen(new GeneralOptionsScreen());
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
@@ -175,7 +169,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Test panels proportions.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsProportions() {
     try {
@@ -183,8 +177,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
-      coverScreen(new DigitalDJWizard.ProportionsPanel());
+      coverScreen(new ProportionsScreen());
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
@@ -192,7 +185,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Test panels remove.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsRemove() {
     try {
@@ -200,11 +193,9 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
       DigitalDJ dj = new TransitionDigitalDJ("1");
       DigitalDJManager.getInstance().register(dj);
-
-      coverScreen(new DigitalDJWizard.RemovePanel());
+      coverScreen(new RemoveScreen());
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
@@ -212,7 +203,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Test panels transition.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsTransition() {
     try {
@@ -220,16 +211,15 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
-      coverScreen(new DigitalDJWizard.TransitionsPanel());
+      coverScreen(new TransitionsScreen());
     } catch (HeadlessException e) {
-      // on some servers we cannot initalize any ui and thus cannot test this
+      // on some servers we cannot initialize any ui and thus cannot test this
     }
   }
 
   /**
    * Test panels type selection.
-   * DOCUMENT_ME
+   * 
    */
   public void testPanelsTypeSelection() {
     try {
@@ -237,8 +227,7 @@ public class TestDigitalDJWizard extends JajukTestCase {
       // TODO: this looks a bit weird in the code of Wizard and Screen, why is
       // it needed?
       new DigitalDJWizard();
-
-      coverScreen(new DigitalDJWizard.TypeSelectionPanel());
+      coverScreen(new TypeSelectionScreen());
     } catch (HeadlessException e) {
       // on some servers we cannot initalize any ui and thus cannot test this
     }
@@ -246,9 +235,9 @@ public class TestDigitalDJWizard extends JajukTestCase {
 
   /**
    * Cover screen.
-   * DOCUMENT_ME
+   * 
    *
-   * @param screen DOCUMENT_ME
+   * @param screen 
    */
   private void coverScreen(Screen screen) {
     screen.initUI();
@@ -258,16 +247,14 @@ public class TestDigitalDJWizard extends JajukTestCase {
   }
 
   /**
-   * Test method for {@link org.jajuk.ui.wizard.DigitalDJWizard#finish()}.
+   * Test method for {@link org.jajuk.ui.wizard.digital_dj.DigitalDJWizard#finish()}.
    */
-
   public void testFinish() {
     // TODO: find out how to test this...
     /*
-     * coverScreen(new DigitalDJWizard.TypeSelectionPanel());
+     * coverScreen(new DJWizardTypeSelectionScreen());
      * 
      * DigitalDJWizard wizard = new DigitalDJWizard(); wizard.finish();
      */
   }
-
 }
diff --git a/src/test/java/org/jajuk/services/dbus/TestDBusSignalImpl.java b/src/test/java/org/jajuk/util/TestDownloadManager.java
similarity index 56%
copy from src/test/java/org/jajuk/services/dbus/TestDBusSignalImpl.java
copy to src/test/java/org/jajuk/util/TestDownloadManager.java
index ec3d25e..2971624 100644
--- a/src/test/java/org/jajuk/services/dbus/TestDBusSignalImpl.java
+++ b/src/test/java/org/jajuk/util/TestDownloadManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,35 +16,33 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
-package org.jajuk.services.dbus;
+package org.jajuk.util;
+
+import java.net.URL;
+import java.util.List;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
-public class TestDBusSignalImpl extends JajukTestCase {
+public class TestDownloadManager extends JajukTestCase {
+  /** The Constant ARTIST.   */
+  private static final String ARTIST = "Massive Attack";
+  /** The Constant ALBUM.   */
+  private static final String ALBUM = "Collected";
 
   /**
-   * Test method for {@link org.jajuk.services.dbus.DBusSignalImpl#isRemote()}.
-   */
-  public final void testIsRemote() {
-    // currently false
-    assertFalse(new DBusSignalImpl().isRemote());
-  }
-
-  /**
-   * Test file changed signal.
-   * DOCUMENT_ME
+   * Test method for {@link org.jajuk.util.DownloadManager#getRemoteCoversList()}.
    *
    * @throws Exception the exception
+   * {@link org.jajuk.util.DownloadManager#getRemoteCoversList(String)}.
    */
-  public final void testFileChangedSignal() throws Exception {
-    DBusSignalImpl.FileChangedSignal signal = new DBusSignalImpl.FileChangedSignal("testfile",
-        "/path/test");
-
-    assertEquals("testfile", signal.getFilename());
+  public void testGetRemoteCoversList() throws Exception {
+    List<URL> res = DownloadManager.getRemoteCoversList(ARTIST + " " + ALBUM);
+    assertEquals(true, res.size()>0);
   }
+
 }
diff --git a/src/test/java/org/jajuk/util/TestFilter.java b/src/test/java/org/jajuk/util/TestFilter.java
index b9be7ec..55eca0c 100644
--- a/src/test/java/org/jajuk/util/TestFilter.java
+++ b/src/test/java/org/jajuk/util/TestFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
@@ -27,10 +27,9 @@ import org.jajuk.JajukTestCase;
 import org.jajuk.base.Item;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestFilter extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -41,7 +40,6 @@ public class TestFilter extends JajukTestCase {
     Filter filter = new Filter("test", "test", true, false);
     assertTrue(filter.isHuman());
     assertFalse(filter.isExact());
-
     filter = new Filter("test", "test", false, true);
     assertFalse(filter.isHuman());
     assertTrue(filter.isExact());
@@ -71,26 +69,19 @@ public class TestFilter extends JajukTestCase {
    */
   public final void testFilterItems() {
     // works with empty filter
-    Filter.filterItems(null, null);
-
+    assertNull(Filter.filterItems(null, null, Item.class));
     // returns with empty expression
     Filter filter = new Filter("any", null, true, false);
-    Filter.filterItems(null, filter);
-
+    assertNull(Filter.filterItems(null, filter, Item.class));
     List<Item> list = new ArrayList<Item>();
-
     // try to trigger a regex error
     filter = new Filter("any", "asdfas(sasdfsa", true, false);
-    Filter.filterItems(list, filter);
-
+    list = Filter.filterItems(list, filter, Item.class);
     // works with useful filter
     filter = new Filter("any", "test", true, false);
-    Filter.filterItems(list, filter);
-
+    list = Filter.filterItems(list, filter, Item.class);
     filter = new Filter("something", "test", true, false);
-    Filter.filterItems(list, filter);
-
+    list = Filter.filterItems(list, filter, Item.class);
     // TODO: more sophisticated testing is missing here
   }
-
 }
diff --git a/src/test/java/org/jajuk/util/TestJajukFileFilter.java b/src/test/java/org/jajuk/util/TestJajukFileFilter.java
index 2d9be3f..c1b27f2 100644
--- a/src/test/java/org/jajuk/util/TestJajukFileFilter.java
+++ b/src/test/java/org/jajuk/util/TestJajukFileFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,24 +16,18 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 import java.io.File;
 
+import org.jajuk.ConstTest;
+import org.jajuk.JajukTestCase;
 import org.jajuk.util.filters.AnyFileFilter;
 import org.junit.Test;
 
-/**
- * DOCUMENT_ME.
- */
-public class TestJajukFileFilter {
-
+public class TestJajukFileFilter extends JajukTestCase {
   /**
    * Test method for.
    *
@@ -85,8 +79,8 @@ public class TestJajukFileFilter {
    */
   @Test
   public final void testAcceptFileFilter() {
-    JajukFileFilter filter = new JajukFileFilter(true, new JajukFileFilter[] { AnyFileFilter
-        .getInstance() });
+    JajukFileFilter filter = new JajukFileFilter(true,
+        new JajukFileFilter[] { AnyFileFilter.getInstance() });
     assertTrue(filter.accept(new File("test")));
   }
 
@@ -98,10 +92,8 @@ public class TestJajukFileFilter {
     JajukFileFilter filter = new JajukFileFilter(new String[] { "mp3", "ogg" });
     assertTrue(filter.getDescription(), filter.getDescription().contains("mp3"));
     assertTrue(filter.getDescription(), filter.getDescription().contains("ogg"));
-
-    JajukFileFilter filter2 = new JajukFileFilter(true, new JajukFileFilter[] { AnyFileFilter
-        .getInstance() });
-
+    JajukFileFilter filter2 = new JajukFileFilter(true,
+        new JajukFileFilter[] { AnyFileFilter.getInstance() });
     assertEquals("", filter2.getDescription());
   }
 
@@ -114,10 +106,8 @@ public class TestJajukFileFilter {
     assertEquals(2, filter.getExtensions().length);
     assertEquals("mp3", filter.getExtensions()[0]);
     assertEquals("ogg", filter.getExtensions()[1]);
-
-    JajukFileFilter filter2 = new JajukFileFilter(true, new JajukFileFilter[] { AnyFileFilter
-        .getInstance() });
-
+    JajukFileFilter filter2 = new JajukFileFilter(true,
+        new JajukFileFilter[] { AnyFileFilter.getInstance() });
     assertEquals(0, filter2.getExtensions().length);
   }
 
@@ -128,10 +118,8 @@ public class TestJajukFileFilter {
   public final void testGetFilters() {
     JajukFileFilter filter = new JajukFileFilter(new String[] { "mp3", "ogg" });
     assertEquals(0, filter.getFilters().length);
-
-    JajukFileFilter filter2 = new JajukFileFilter(true, new JajukFileFilter[] { AnyFileFilter
-        .getInstance() });
-
+    JajukFileFilter filter2 = new JajukFileFilter(true,
+        new JajukFileFilter[] { AnyFileFilter.getInstance() });
     assertEquals(1, filter2.getFilters().length);
   }
 
@@ -146,10 +134,8 @@ public class TestJajukFileFilter {
     assertTrue(filter.isKnownExtension(new File("test.mp3")));
     assertTrue(filter.isKnownExtension(new File("test.ogg")));
     assertFalse(filter.isKnownExtension(new File("test.mp2")));
-
-    JajukFileFilter filter2 = new JajukFileFilter(true, new JajukFileFilter[] { AnyFileFilter
-        .getInstance() });
-
+    JajukFileFilter filter2 = new JajukFileFilter(true,
+        new JajukFileFilter[] { AnyFileFilter.getInstance() });
     assertFalse(filter2.isKnownExtension(new File("test.mp3")));
     assertFalse(filter2.isKnownExtension(new File("test.ogg")));
     assertFalse(filter2.isKnownExtension(new File("test.mp2")));
@@ -164,20 +150,18 @@ public class TestJajukFileFilter {
   public final void testSetAcceptDirectories() {
     {
       JajukFileFilter filter = new JajukFileFilter(new String[] { "mp3", "ogg" });
-
       filter.setAcceptDirectories(true);
-      assertTrue(filter.accept(new File(System.getProperty("java.io.tmpdir"))));
+      assertTrue(filter.accept(new File(ConstTest.TEMP_PATH)));
       filter.setAcceptDirectories(false);
-      assertFalse(filter.accept(new File(System.getProperty("java.io.tmpdir"))));
+      assertFalse(filter.accept(new File(ConstTest.TEMP_PATH)));
     }
-
     { // ignored for Filter based matching
-      JajukFileFilter filter2 = new JajukFileFilter(true, new JajukFileFilter[] { AnyFileFilter
-          .getInstance() });
+      JajukFileFilter filter2 = new JajukFileFilter(true,
+          new JajukFileFilter[] { AnyFileFilter.getInstance() });
       filter2.setAcceptDirectories(true);
-      assertFalse(filter2.accept(new File(System.getProperty("java.io.tmpdir"))));
+      assertFalse(filter2.accept(new File(ConstTest.TEMP_PATH)));
       filter2.setAcceptDirectories(false);
-      assertFalse(filter2.accept(new File(System.getProperty("java.io.tmpdir"))));
+      assertFalse(filter2.accept(new File(ConstTest.TEMP_PATH)));
     }
   }
 
@@ -188,12 +172,10 @@ public class TestJajukFileFilter {
   public final void testShow() {
     {
       JajukFileFilter filter = new JajukFileFilter(new String[] { "mp3", "ogg" });
-
       filter.setAcceptDirectories(true);
-      assertTrue(filter.show(new File(System.getProperty("java.io.tmpdir"))));
+      assertTrue(filter.show(new File(ConstTest.TEMP_PATH)));
       filter.setAcceptDirectories(false);
-      assertFalse(filter.show(new File(System.getProperty("java.io.tmpdir"))));
-
+      assertFalse(filter.show(new File(ConstTest.TEMP_PATH)));
       assertTrue(filter.show(new File("test.mp3")));
       assertTrue(filter.show(new File("test.ogg")));
       assertFalse(filter.show(new File("test.mp2")));
diff --git a/src/test/java/org/jajuk/util/TestUpgradeManager.java b/src/test/java/org/jajuk/util/TestUpgradeManager.java
index 5433423..26074a5 100644
--- a/src/test/java/org/jajuk/util/TestUpgradeManager.java
+++ b/src/test/java/org/jajuk/util/TestUpgradeManager.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,47 +16,25 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestUpgradeManager extends JajukTestCase {
-
-  /** DOCUMENT_ME. */
   String v1 = "1.8.4";
-  
-  /** DOCUMENT_ME. */
   String v2 = "1.9.1";
-  
-  /** DOCUMENT_ME. */
   String v3 = "1.9.2RC3";
-  
-  /** DOCUMENT_ME. */
   String v4 = "1.8.5";
-  
-  /** DOCUMENT_ME. */
   String v5 = "1.8";
-  
-  /** DOCUMENT_ME. */
   String v6 = "1.9";
-  
-  /** DOCUMENT_ME. */
   String v7 = "1.9.2RC4";
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-  }
+  String v8 = "1.10.3";
+  String v9 = "1.10.4dev";
 
   /**
    * Test method for.
@@ -85,6 +63,7 @@ public class TestUpgradeManager extends JajukTestCase {
     assertEquals(false, UpgradeManager.isMajorMigration(v2, v3));
     assertEquals(true, UpgradeManager.isMajorMigration(v5, v6));
     assertEquals(false, UpgradeManager.isMajorMigration(v3, v7));
+    assertEquals(false, UpgradeManager.isMajorMigration(v8, v9));
   }
 
   /**
@@ -94,11 +73,12 @@ public class TestUpgradeManager extends JajukTestCase {
    * {@link org.jajuk.util.UpgradeManager#isNewer(String,String)}.
    */
   public void testIsNewer() throws Exception {
-    assertEquals(true, UpgradeManager.isNewer(v1, v2));
-    assertEquals(true, UpgradeManager.isNewer(v1, v4));
-    assertEquals(true, UpgradeManager.isNewer(v2, v3));
-    assertEquals(false, UpgradeManager.isNewer(v2, v1));
-    assertEquals(true, UpgradeManager.isNewer(v5, v6));
+    assertTrue(UpgradeManager.isNewer(v2, v1));
+    assertTrue(UpgradeManager.isNewer(v4, v1));
+    assertFalse(UpgradeManager.isNewer(v3, v3));
+    assertFalse(UpgradeManager.isNewer(v1, v2));
+    assertTrue(UpgradeManager.isNewer(v6, v5));
+    assertTrue(UpgradeManager.isNewer("1.10dev", "1.7"));
+    assertFalse(UpgradeManager.isNewer("1.7", "1.7"));
   }
-
 }
diff --git a/src/test/java/org/jajuk/util/TestUtilFeatures.java b/src/test/java/org/jajuk/util/TestUtilFeatures.java
index 5bd8415..366f416 100644
--- a/src/test/java/org/jajuk/util/TestUtilFeatures.java
+++ b/src/test/java/org/jajuk/util/TestUtilFeatures.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,32 +16,21 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.jajuk.JUnitHelpers;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.services.players.StackItem;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestUtilFeatures extends JajukTestCase {
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-  }
-
   /**
    * Test method for.
    *
@@ -49,8 +38,8 @@ public class TestUtilFeatures extends JajukTestCase {
    * {@link org.jajuk.util.UtilFeatures#forcedShuffle(List<StackItem>)}.
    */
   public void testCopyFileFile() throws Exception {
-    StackItem si1 = new StackItem(JUnitHelpers.getFile("1", true));
-    StackItem si2 = new StackItem(JUnitHelpers.getFile("2", true));
+    StackItem si1 = new StackItem(TestHelpers.getFile("1", true));
+    StackItem si2 = new StackItem(TestHelpers.getFile("2", true));
     List<StackItem> items = new ArrayList<StackItem>(2);
     items.add(si1);
     items.add(si2);
@@ -61,12 +50,12 @@ public class TestUtilFeatures extends JajukTestCase {
   // helper method to emma-coverage of the unused constructor
   /**
    * Test private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPrivateConstructor() throws Exception {
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(UtilFeatures.class);
+    TestHelpers.executePrivateConstructor(UtilFeatures.class);
   }
 }
diff --git a/src/test/java/org/jajuk/util/TestUtilString.java b/src/test/java/org/jajuk/util/TestUtilString.java
index 097494c..4895099 100644
--- a/src/test/java/org/jajuk/util/TestUtilString.java
+++ b/src/test/java/org/jajuk/util/TestUtilString.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,263 +16,407 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  $Revision: 3132 $
  */
 package org.jajuk.util;
 
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.Random;
+
 import org.jajuk.JajukTestCase;
-import org.junit.Test;
+import org.jajuk.TestHelpers;
+import org.jajuk.ThreadTestHelper;
+import org.jajuk.base.File;
+import org.jajuk.base.FileManager;
+import org.jajuk.base.PropertyMetaInformation;
+import org.jajuk.base.Track;
+import org.jajuk.base.TrackManager;
+import org.jajuk.util.error.JajukException;
 
-/**
- * DOCUMENT_ME.
- */
 public class TestUtilString extends JajukTestCase {
+  // settings for the micro-benchmarks done for some methods
+  private static final int MATCHES_PER_TEST = 300000;
+  private static final int NUMBER_OF_MATCH_TESTS = 5;
+  private static final int NUMBER_OF_THREADS = 10;
+  private static final int NUMBER_OF_TESTS = 1000;
+  private static final Random random = new Random();
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
-    super.setUp();
+  public void specificSetUp() throws Exception {
+    random.setSeed(System.currentTimeMillis());
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#applyPattern(org.jajuk.base.File, java.lang.String, boolean, boolean)}.
+   * @throws Exception
    */
-  @Test
-  public void testApplyPattern() {
-    //TODO to be implemented
+  public void testApplyPattern() throws Exception {
+    UtilString.applyPattern(TestHelpers.getFile(), "somepattern", false, false);
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#containsNonDigitOrLetters(java.lang.String)}.
    */
-  @Test
   public void testContainsNonDigitOrLetters() {
-    //TODO to be implemented
+    // TODO: implement test
+  }
+
+  public void testCustomTrackCustomPropertyPattern() throws JajukException {
+    try {
+      TrackManager.getInstance().registerProperty(
+          new PropertyMetaInformation("foo", true, false, false, false, false, String.class, ""));
+      File file = TestHelpers.getFile();
+      Track track = file.getTrack();
+      track.setProperty("foo", "bar");
+      assertEquals("foo : bar", UtilString.applyPattern(file, "foo : %foo", true, false));
+      track.setProperty("foo", "");
+      assertEquals("foo : ", UtilString.applyPattern(file, "foo : %foo", true, false));
+    } finally {
+      TrackManager.getInstance().removeProperty("foo");
+    }
+  }
+
+  public void testCustomFileCustomPropertyPattern() throws JajukException {
+    try {
+      FileManager.getInstance().registerProperty(
+          new PropertyMetaInformation("foo", true, false, false, false, false, String.class, ""));
+      File file = TestHelpers.getFile();
+      file.setProperty("foo", "bar");
+      assertEquals("foo : bar", UtilString.applyPattern(file, "foo : %foo", true, false));
+      file.setProperty("foo", "");
+      assertEquals("foo : ", UtilString.applyPattern(file, "foo : %foo", true, false));
+    } finally {
+      FileManager.getInstance().removeProperty("foo");
+    }
+  }
+
+  // Files and track have the same custom property
+  public void testCustomFileAndTrackCustomPropertyPattern() throws JajukException {
+    try {
+      FileManager.getInstance().registerProperty(
+          new PropertyMetaInformation("foo", true, false, false, false, false, String.class, ""));
+      TrackManager.getInstance().registerProperty(
+          new PropertyMetaInformation("foo", true, false, false, false, false, String.class, ""));
+      File file = TestHelpers.getFile();
+      file.setProperty("foo", "bar");
+      Track track = file.getTrack();
+      track.setProperty("foo", "baz");
+      assertEquals("foo : bar", UtilString.applyPattern(file, "foo : %foo", true, false));
+    } finally {
+      FileManager.getInstance().removeProperty("foo");
+      TrackManager.getInstance().removeProperty("foo");
+    }
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#encodeURL(java.lang.String)}.
    */
-  @Test
   public void testEncodeURL() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#escapeString(java.lang.String)}.
    */
-  @Test
   public void testEscapeString() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#format(java.lang.Object, org.jajuk.base.PropertyMetaInformation, boolean)}.
    */
-  @Test
   public void testFormat() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#getLocaleDateFormatter()}.
    */
-  @Test
   public void testGetLocaleDateFormatter() {
-    //TODO to be implemented
+    assertNotNull(UtilString.getLocaleDateFormatter());
+  }
+
+  public void testMultipleThreads() throws Exception {
+    ThreadTestHelper helper = new ThreadTestHelper(NUMBER_OF_THREADS, NUMBER_OF_TESTS);
+    helper.executeTest(new ThreadTestHelper.TestRunnable() {
+      @Override
+      public void doEnd(int threadnum) throws Exception {
+        // do stuff at the end ...
+      }
+
+      @Override
+      public void run(int threadnum, int iter) {
+        DateFormat format = UtilString.getLocaleDateFormatter();
+        assertNotNull(format.format(new Date()));
+      }
+    });
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#formatPropertyDesc(java.lang.String)}.
    */
-  @Test
   public void testFormatPropertyDesc() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#formatGenre(java.lang.String)}.
    */
-  @Test
   public void testFormatGenre() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#formatTag(java.lang.String)}.
    */
-  @Test
   public void testFormatTag() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#formatTimeBySec(long)}.
    */
-  @Test
   public void testFormatTimeBySec() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#formatXML(java.lang.String)}.
    */
-  @Test
   public void testFormatXML() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#getAdditionDateFormatter()}.
    */
-  @Test
   public void testGetAdditionDateFormatter() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#getAnonymizedJajukProperties()}.
    */
-  @Test
   public void testGetAnonymizedJajukProperties() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#getAnonymizedSystemProperties()}.
    */
-  @Test
   public void testGetAnonymizedSystemProperties() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#getLimitedString(java.lang.String, int)}.
    */
-  @Test
   public void testGetLimitedString() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#isChar(int)}.
    */
-  @Test
   public void testIsChar() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#isXMLValid(java.lang.String)}.
    */
-  @Test
   public void testIsXMLValid() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#padNumber(long, int)}.
    */
-  @Test
   public void testPadNumber() {
-    //TODO to be implemented
+    assertEquals("00099", UtilString.padNumber(99, 5));
+    assertEquals("00011", UtilString.padNumber(11, 5));
+    assertEquals("00000", UtilString.padNumber(0, 5));
+    assertEquals("99999", UtilString.padNumber(99999, 5));
+    assertEquals("100000", UtilString.padNumber(100000, 5));
+    assertEquals("000-9", UtilString.padNumber(-9, 5));
+    assertEquals("00-19", UtilString.padNumber(-19, 5));
+    assertEquals("1", UtilString.padNumber(1, 1));
+    assertEquals("11", UtilString.padNumber(11, 2));
+    assertEquals("113", UtilString.padNumber(113, 3));
+  }
+
+  public void testPadNumberBenchmark() {
+    testPadNumber();
+    long overall = 0;
+    for (int i = 0; i < NUMBER_OF_MATCH_TESTS; i++) {
+      long dur = runPadMicroBenchmark();
+      System.out.println("Test run took " + dur + "ms");
+      overall += dur;
+    }
+    System.out.println("Average test duration: " + (overall / NUMBER_OF_MATCH_TESTS));
+  }
+
+  /**
+   * @return
+   *
+   */
+  private long runPadMicroBenchmark() {
+    long start = System.currentTimeMillis();
+    for (int i = 0; i < MATCHES_PER_TEST * 10; i++) {
+      UtilString.padNumber(random.nextInt(10000), 5);
+      //StringUtils.leftPad(Long.toString(random.nextInt(10000)), 5, '0');
+    }
+    return System.currentTimeMillis() - start;
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#parse(java.lang.String, java.lang.Class)}.
    */
-  @Test
   public void testParse() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#fastLongParser(java.lang.String)}.
    */
-  @Test
   public void testFastLongParser() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#fastBooleanParser(java.lang.String)}.
    */
-  @Test
   public void testFastBooleanParser() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#rot13(java.lang.String)}.
    */
-  @Test
   public void testRot13() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#matchesIgnoreCaseAndOrder(java.lang.String, java.lang.String)}.
    */
-  @Test
   public void testMatchesIgnoreCaseAndOrder() {
-    //TODO to be implemented
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("", ""));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("", "123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("t", "test"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("t", "TesT"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("tes", "TesT"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("Tes", "test"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("te", "123te123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("te1", "123te123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3te", "123te123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3te 12", "123te123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3te 3te1", "123te123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3Te 12", "123te123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3Te 3tE1", "123te123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3te 12", "123TE123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3te 3te1", "123TE123"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3te 12", "1 2 3te 12 3"));
+    assertTrue(UtilString.matchesIgnoreCaseAndOrder("3te 3te1", "12 3te1 23"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("1", ""));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("t", ""));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("test", ""));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("test", "t"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("TesT", "t"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("TesT", "tes"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("test", "Tes"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("123te123", "te"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("123te123", "te1"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("123te123", "3te"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("TesT test", "tt"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("123te123", "1te"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("123te123", "te3"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3te 12", "123ate123"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3te 3te1", "123tae123"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3Te 12", "1323te1323"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3Te 3tE1", "123.te123"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3te 12", "123T_E123"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3te 3te1", "123TEa123"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3te 12", "1 2 3te 1 2 3"));
+    assertFalse(UtilString.matchesIgnoreCaseAndOrder("3te 3te1", "12 3toe1 23"));
+  }
+
+  public void testMatchesIgnoreCaseAndOrderBenchmark() {
+    long overall = 0;
+    for (int i = 0; i < NUMBER_OF_MATCH_TESTS; i++) {
+      long dur = runMicroBenchmark();
+      System.out.println("Test run took " + dur + "ms");
+      overall += dur;
+    }
+    System.out.println("Average test duration: " + (overall / NUMBER_OF_MATCH_TESTS));
+  }
+
+  /**
+   * @return
+   *
+   */
+  private long runMicroBenchmark() {
+    long start = System.currentTimeMillis();
+    RandomString str = new RandomString(30);
+    RandomString search = new RandomString(6);
+    for (int i = 0; i < MATCHES_PER_TEST; i++) {
+      UtilString.matchesIgnoreCaseAndOrder(str.nextString(), search.nextString());
+    }
+    return System.currentTimeMillis() - start;
+  }
+
+  public static class RandomString {
+    private static final char[] symbols = new char[63];
+    static {
+      for (int idx = 0; idx < 10; ++idx)
+        symbols[idx] = (char) ('0' + idx);
+      for (int idx = 10; idx < 36; ++idx)
+        symbols[idx] = (char) ('a' + idx - 10);
+      for (int idx = 36; idx < 62; ++idx)
+        symbols[idx] = (char) ('A' + idx - 36);
+      symbols[62] = ' ';
+    }
+    private final char[] buf;
+
+    public RandomString(int length) {
+      if (length < 1)
+        throw new IllegalArgumentException("length < 1: " + length);
+      buf = new char[length];
+    }
+
+    public String nextString() {
+      for (int idx = 0; idx < buf.length; ++idx)
+        buf[idx] = symbols[random.nextInt(symbols.length)];
+      return new String(buf);
+    }
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#encodeToUnicode(java.lang.String)}.
    */
-  @Test
   public void testEncodeToUnicode() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#byteToHex(byte)}.
    */
-  @Test
   public void testByteToHex() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#concat(java.lang.Object[])}.
    */
-  @Test
   public void testConcat() {
-    //TODO to be implemented
+    // TODO: implement test
   }
 
   /**
    * Test method for {@link org.jajuk.util.UtilString#getTextBetweenChars(java.lang.String, char, char)}.
    */
-  @Test
   public void testGetTextBetweenChars() {
-    //TODO to be implemented
-  }
-
-  /**
-   * Test method for {@link org.jajuk.util.UtilString#normalizeFilename(java.lang.String)}.
-   */
-  @Test
-  public void testNormalizeFilename() {
-    // Regular string check 
-    String fileName = "foo.txt";
-    String normFileName = UtilString.normalizeFilename(fileName);
-    assertTrue("foo.txt".equals(normFileName));
-
-    // Contains a Windows forbidden chars : ?
-    fileName = "?-e.txt";
-    normFileName = UtilString.normalizeFilename(fileName);
-    assertTrue("_-e.txt".equals(normFileName));
-
-    // Contains an accent
-    fileName = '\u00E0' + "" + '\u00E9' + "!?-e.txt";
-    normFileName = UtilString.normalizeFilename(fileName);
-    assertTrue("ae!_-e.txt".equals(normFileName));
+    // TODO: implement test
   }
-
 }
diff --git a/src/test/java/org/jajuk/util/TestUtilSystem.java b/src/test/java/org/jajuk/util/TestUtilSystem.java
index 3ff5061..91e1b24 100644
--- a/src/test/java/org/jajuk/util/TestUtilSystem.java
+++ b/src/test/java/org/jajuk/util/TestUtilSystem.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,13 +16,12 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util;
 
 import java.awt.HeadlessException;
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -30,29 +29,24 @@ import java.util.Random;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.SystemUtils;
-import org.jajuk.JUnitHelpers;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
+import org.jajuk.base.Device;
+import org.jajuk.base.Directory;
 import org.jajuk.util.error.JajukException;
+import org.junit.Test;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestUtilSystem extends JajukTestCase {
-  
-  /** DOCUMENT_ME. */
   private File file1, file2;
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see junit.framework.TestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
-    file1 = File.createTempFile("test", ".jajuk");
-    file2 = File.createTempFile("test", ".jajuk");
-
-    super.setUp();
+  protected void specificSetUp() throws Exception {
+    file1 = File.createTempFile("test", ".jajuk", new java.io.File(ConstTest.DEVICES_BASE_PATH));
+    file2 = File.createTempFile("test", ".jajuk", new java.io.File(ConstTest.DEVICES_BASE_PATH));
   }
 
   /*
@@ -66,7 +60,6 @@ public class TestUtilSystem extends JajukTestCase {
     // been created
     file1.delete();
     file2.delete();
-
     super.tearDown();
   }
 
@@ -79,14 +72,23 @@ public class TestUtilSystem extends JajukTestCase {
     // first test with no backup size set
     Conf.setProperty(Const.CONF_BACKUP_SIZE, "0");
     UtilSystem.backupFile(file1, 1);
-
     // then set some backup size
     Conf.setProperty(Const.CONF_BACKUP_SIZE, "100");
     UtilSystem.backupFile(file1, 1);
-
     // TODO: create a huge file and make sure it is truncated during backup
   }
 
+  @Test
+  public void testGetDeviceForFio() {
+    org.jajuk.base.File file = TestHelpers.getFile();
+    Device device = file.getDevice();
+    // Case where the file is attached to a known device
+    assertEquals(device, UtilSystem.getDeviceForFio(file.getFIO()));
+    // Case where it is not the case
+    java.io.File fioOutsideAnyKnownDevice = new java.io.File("/tmp/toto");
+    assertEquals(null, UtilSystem.getDeviceForFio(fioOutsideAnyKnownDevice));
+  }
+
   /**
    * Test method for.
    *
@@ -95,57 +97,27 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testCopyFileFile() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     UtilSystem.copy(file1, file2);
-
     assertEquals("this is some test data", FileUtils.readFileToString(file2));
   }
 
-  /**
-   * Test copy file exception.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testCopyFileException() throws Exception {
-    FileUtils.writeStringToFile(file1, "this is some test data");
-    assertTrue(file2.delete());
-    assertTrue(file2.mkdirs()); // should not be able to write if a directory
-    // already exists
-
-    try {
-      UtilSystem.copy(file1, file2);
-      fail("Should report exception");
-    } catch (IOException e) {
-      //
-    }
-  }
-
-  /**
-   * Test copy file file empty.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
   public void testCopyFileFileEmpty() throws Exception {
     FileUtils.writeStringToFile(file1, "");
-
     UtilSystem.copy(file1, file2);
-
     assertEquals("", FileUtils.readFileToString(file2));
   }
 
   /**
    * Test copy file file not exists.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testCopyFileFileNotExists() throws Exception {
-    assertTrue(file1.delete());
-    assertFalse(file1.exists());
+    File file = new File("noexistance");
+    assertFalse(file.exists());
     try {
-      UtilSystem.copy(file1, file2);
+      UtilSystem.copy(file, file2);
       fail("Should throw exception");
     } catch (JajukException e) {
       assertEquals(9, e.getCode());
@@ -159,47 +131,26 @@ public class TestUtilSystem extends JajukTestCase {
    * {@link org.jajuk.util.UtilSystem#copy(java.io.File, java.lang.String)}.
    */
   public void testCopyFileString() throws Exception {
+    File file1 = TestHelpers.getFile("testfile1", true).getFIO();
+    File file2 = TestHelpers.getFile("testfile2", true).getFIO();
     FileUtils.writeStringToFile(file1, "this is some test data");
-
-    UtilSystem.copy(file1, "testfile");
-
+    UtilSystem.copy(file1, file2);
     // file is written into same directory as file1 here
-    assertEquals("this is some test data", FileUtils.readFileToString(new File(new StringBuilder(
-        file1.getParentFile().getAbsolutePath()).append('/').append("testfile").toString())));
+    assertEquals("this is some test data", FileUtils.readFileToString(file2));
   }
 
   /**
    * Test copy file string empty.
-   * DOCUMENT_ME
-   *
+   *    *
    * @throws Exception the exception
    */
   public void testCopyFileStringEmpty() throws Exception {
     FileUtils.writeStringToFile(file1, "");
-
-    UtilSystem.copy(file1, "testfile");
-
+    UtilSystem.copy(file1, file2);
     assertEquals("", FileUtils.readFileToString(file2));
   }
 
   /**
-   * Test copy file string not exists.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testCopyFileStringNotExists() throws Exception {
-    assertTrue(file1.delete());
-    assertFalse(file1.exists());
-    try {
-      UtilSystem.copy(file1, "testfile");
-      fail("Should throw exception");
-    } catch (JajukException e) {
-      assertEquals(9, e.getCode());
-    }
-  }
-
-  /**
    * Test method for.
    *
    * @throws Exception the exception
@@ -207,9 +158,7 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testCopyURLString() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     UtilSystem.copy(file1.toURI().toURL(), file2.getAbsolutePath());
-
     // file is written into same directory as file1 here
     // TODO: currently the copy(URL) methods adds a newline at the end, should
     // we change that??
@@ -219,27 +168,23 @@ public class TestUtilSystem extends JajukTestCase {
 
   /**
    * Test copy url string empty.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testCopyURLStringEmpty() throws Exception {
     FileUtils.writeStringToFile(file1, "");
-
-    UtilSystem.copy(file1.toURI().toURL(), "testfile");
-
+    UtilSystem.copy(file1.toURI().toURL(), file2.getAbsolutePath());
     assertEquals("", FileUtils.readFileToString(file2));
   }
 
   /**
    * Test copy url string not exists.
-   * DOCUMENT_ME
+   * 
    */
   public void testCopyURLStringNotExists() {
-    assertTrue(file1.delete());
-    assertFalse(file1.exists());
     try {
-      UtilSystem.copy(file1.toURI().toURL(), "testfile");
+      UtilSystem.copy(file1.toURI().toURL(), "testfile/foo");
       fail("Should throw exception");
     } catch (IOException e) {
       // assertEquals(9, e.getCode());
@@ -255,56 +200,24 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testCopyRecursivelySimple() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     UtilSystem.copyRecursively(file1, file2);
-
     assertEquals("this is some test data", FileUtils.readFileToString(file2));
   }
 
   /**
    * Test copy recursively.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testCopyRecursively() throws Exception {
-    assertTrue(file1.delete());
-    assertTrue(file1.mkdir());
-    assertTrue(file2.delete());
-
-    FileUtils.writeStringToFile(new File(file1.getAbsolutePath() + File.separator + "testfile"),
-        "this is some test data");
-
-    UtilSystem.copyRecursively(file1, file2);
-
-    assertEquals("this is some test data", FileUtils.readFileToString(new File(file2
-        .getAbsolutePath()
-        + File.separator + "testfile")));
-  }
-
-  /**
-   * Test copy recursively cannot make dir.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testCopyRecursivelyCannotMakeDir() throws Exception {
-    assertTrue(file1.delete());
-    assertTrue(file1.mkdir());
-
-    FileUtils.writeStringToFile(new File(file1.getAbsolutePath() + File.separator + "testfile"),
-        "this is some test data");
-
-    try {
-      UtilSystem.copyRecursively(file1, file2);
-      fail("should throw exception because there is a file where we want to create a directory!");
-    } catch (FileNotFoundException e) {
-
-    }
-
-    // assertEquals("", FileUtils.readFileToString(new
-    // File(file2.getAbsolutePath() + File.separator
-    // + "testfile")));
+    Directory dir1 = TestHelpers.getDirectory("dir1");
+    Directory dir2 = TestHelpers.getDirectory("dir2");
+    File file = new File(dir1.getAbsolutePath() + "/testfile");
+    FileUtils.writeStringToFile(file, "this is some test data");
+    UtilSystem.copyRecursively(dir1.getFio(), dir2.getFio());
+    assertEquals("this is some test data",
+        FileUtils.readFileToString(new File(dir2.getAbsolutePath() + File.separator + "testfile")));
   }
 
   /**
@@ -315,26 +228,23 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testCopyToDir() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-    assertTrue(file2.delete());
-    assertTrue(file2.mkdir());
-
-    UtilSystem.copyToDir(file1, file2);
-
-    assertEquals("this is some test data", FileUtils.readFileToString(new File(file2
-        .getAbsolutePath()
-        + File.separator + file1.getName())));
+    Directory dir = TestHelpers.getDirectory();
+    UtilSystem.copyToDir(file1, dir.getFio());
+    assertEquals(
+        "this is some test data",
+        FileUtils.readFileToString(new File(dir.getAbsolutePath() + File.separator
+            + file1.getName())));
   }
 
   /**
    * Test copy to dir exception.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testCopyToDirException() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
     assertTrue(file1.delete());
-
     try {
       UtilSystem.copyToDir(file1, file2);
       fail("Should throw exception");
@@ -350,34 +260,19 @@ public class TestUtilSystem extends JajukTestCase {
    * {@link org.jajuk.util.UtilSystem#createEmptyFile(java.io.File)}.
    */
   public void testCreateEmptyFile() throws Exception {
-    assertTrue(file1.delete());
-    assertFalse(file1.exists());
-
     UtilSystem.createEmptyFile(file1);
-
     assertEquals("", FileUtils.readFileToString(file1));
   }
 
-  /**
-   * Test create empty file exception.
-   * DOCUMENT_ME
-   */
   public void testCreateEmptyFileException() {
-    assertTrue(file1.delete());
-    assertFalse(file1.exists());
-    assertTrue(file1.mkdir()); // test should fail if we try to create a file
-    // when a directory already exists
-
     try {
       UtilSystem.createEmptyFile(file1);
-      fail("Should report exception");
     } catch (IOException e) {
       //
     }
-
     // still a directory now
     assertTrue(file1.exists());
-    assertTrue(file1.isDirectory());
+    assertFalse(file1.isDirectory());
   }
 
   /**
@@ -385,48 +280,24 @@ public class TestUtilSystem extends JajukTestCase {
    *
    * @throws Exception the exception
    */
-  public void testDeleteDir() throws Exception {
-    assertTrue(file1.delete());
-    assertTrue(file1.mkdir());
-
-    FileUtils.writeStringToFile(new File(file1.getAbsolutePath() + File.separator + "testfile"),
-        "this is some test data");
-
-    UtilSystem.deleteDir(file1);
-
-    assertFalse(file1.exists());
+  public void testDeleteDirWithContent() throws Exception {
+    File file = TestHelpers.getDirectory().getFio();
+    UtilSystem.deleteDir(file);
+    assertFalse(file.exists());
   }
 
   /**
-   * Test delete dir file.
-   * DOCUMENT_ME
-   *
-   * @throws Exception the exception
-   */
-  public void testDeleteDirFile() throws Exception {
-    UtilSystem.deleteDir(file1);
-
-    assertFalse(file1.exists());
-  }
-
-  /**
-   * Test delete dir dir.
-   * DOCUMENT_ME
+   * Test method for {@link org.jajuk.util.UtilSystem#deleteDir(java.io.File)}.
    *
    * @throws Exception the exception
    */
   public void testDeleteDirDir() throws Exception {
-    assertTrue(file1.delete());
-
-    // create a directory inside a directory
-    assertTrue(new File(file1.getAbsolutePath() + File.separator + "testdir").mkdirs());
-
-    FileUtils.writeStringToFile(new File(file1.getAbsolutePath() + File.separator + "testdir"
-        + File.separator + "testfile"), "this is some test data");
-
-    UtilSystem.deleteDir(file1);
-
-    assertFalse(file1.exists());
+    Directory top = TestHelpers.getDirectory();
+    File fileChild = new File(top.getAbsolutePath() + "/child");
+    fileChild.mkdirs();
+    UtilSystem.deleteDir(fileChild);
+    assertFalse(fileChild.exists());
+    assertTrue(top.getFio().exists());
   }
 
   /**
@@ -436,9 +307,7 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testDeleteFile() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     UtilSystem.deleteFile(file1);
-
     assertFalse(file1.exists());
   }
 
@@ -453,7 +322,7 @@ public class TestUtilSystem extends JajukTestCase {
 
   /**
    * Test get extension file none.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetExtensionFileNone() {
     assertEquals("", UtilSystem.getExtension("/tmp/testfile"));
@@ -461,7 +330,7 @@ public class TestUtilSystem extends JajukTestCase {
 
   /**
    * Test get extension file dot.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetExtensionFileDot() {
     // TODO: why do we return the full filename in this case? I.e. if there is a
@@ -487,16 +356,14 @@ public class TestUtilSystem extends JajukTestCase {
   public void testGetFileChecksum() throws Exception {
     assertNotNull(UtilSystem.getFileChecksum(file1));
     assertFalse(UtilSystem.getFileChecksum(file1).equals(""));
-
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     assertNotNull(UtilSystem.getFileChecksum(file1));
     assertFalse(UtilSystem.getFileChecksum(file1).equals(""));
   }
 
   /**
    * Test get file checksum error.
-   * DOCUMENT_ME
+   * 
    */
   public void testGetFileChecksumError() {
     try {
@@ -505,7 +372,6 @@ public class TestUtilSystem extends JajukTestCase {
     } catch (JajukException e) {
       assertEquals(103, e.getCode());
     }
-
   }
 
   /**
@@ -526,7 +392,6 @@ public class TestUtilSystem extends JajukTestCase {
     assertNotNull(JajukException.class.getProtectionDomain());
     assertNotNull(JajukException.class.getProtectionDomain().getCodeSource());
     assertNotNull(JajukException.class.getProtectionDomain().getCodeSource().getLocation());
-
     assertNotNull(UtilSystem.getJarLocation(JajukException.class));
   }
 
@@ -552,7 +417,6 @@ public class TestUtilSystem extends JajukTestCase {
   public void testGetNormalizedFilename() {
     // assertEquals(file1.getAbsolutePath(),
     // UtilSystem.getNormalizedFilename(file1.getAbsolutePath()));
-
     assertEquals("-tmp  -test1----", UtilSystem.getNormalizedFilename("/tmp*|/te\"?st1<>\\:"));
   }
 
@@ -572,7 +436,6 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testGetResource() {
     assertNull(UtilSystem.getResource("unfoundresource"));
-
     assertNotNull(UtilSystem.getResource("icons/16x16/add_16x16.png"));
   }
 
@@ -642,18 +505,12 @@ public class TestUtilSystem extends JajukTestCase {
     assertFalse(UtilSystem.isValidFileName(null, null));
     assertFalse(UtilSystem.isValidFileName(file1, null));
     assertFalse(UtilSystem.isValidFileName(null, "test.txt"));
-
     // true with valid filenames
     assertTrue(UtilSystem.isValidFileName(new File("/tmp"), "testfile"));
-
     // already exists
     assertTrue(UtilSystem.isValidFileName(file1.getParentFile(), file1.getName()));
-
     // can be created
-    assertTrue(file1.delete());
     assertTrue(UtilSystem.isValidFileName(file1.getParentFile(), file1.getName()));
-    // should not exist after doing the test
-    assertFalse(file1.exists());
   }
 
   /**
@@ -671,14 +528,13 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testReadFile() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     StringBuilder builder = UtilSystem.readFile(file1.getAbsolutePath());
     assertEquals("this is some test data", builder.toString());
   }
 
   /**
    * Test read file error.
-   * DOCUMENT_ME
+   * 
    */
   public void testReadFileError() {
     try {
@@ -715,7 +571,6 @@ public class TestUtilSystem extends JajukTestCase {
       // TODO: we cannot run this test in eclipse as we do not have a Jajuk.jar
       // file available...
     }
-
   }
 
   /**
@@ -759,23 +614,19 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testReplaceInFileNotReplaced() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     assertFalse(UtilSystem.replaceInFile(file1, "notfound", "replaced", "UTF-8"));
-
     assertEquals("this is some test data", FileUtils.readFileToString(file1));
   }
 
   /**
    * Test replace in file replaced.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testReplaceInFileReplaced() throws Exception {
     FileUtils.writeStringToFile(file1, "this is some test data");
-
     assertTrue(UtilSystem.replaceInFile(file1, "test", "replaced", "UTF-8"));
-
     assertEquals("this is some replaced data", FileUtils.readFileToString(file1));
   }
 
@@ -807,7 +658,6 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testIsRunning() {
     assertTrue(UtilSystem.isRunning(new MockProcess(true)));
-
     assertFalse(UtilSystem.isRunning(new MockProcess(false)));
   }
 
@@ -818,22 +668,19 @@ public class TestUtilSystem extends JajukTestCase {
    */
   public void testGetExitValue() {
     assertEquals(0, UtilSystem.getExitValue(new MockProcess(false)));
-
     assertEquals(-100, UtilSystem.getExitValue(new MockProcess(true)));
   }
 
   /**
-   * DOCUMENT_ME.
+   * .
    */
   private static final class MockProcess extends Process {
-    
-    /** DOCUMENT_ME. */
     boolean throwInExitValue;
 
     /**
      * Instantiates a new mock process.
      *
-     * @param throwInWait DOCUMENT_ME
+     * @param throwInWait 
      */
     public MockProcess(boolean throwInWait) {
       super();
@@ -853,7 +700,6 @@ public class TestUtilSystem extends JajukTestCase {
      */
     @Override
     public OutputStream getOutputStream() {
-
       return null;
     }
 
@@ -862,7 +708,6 @@ public class TestUtilSystem extends JajukTestCase {
      */
     @Override
     public InputStream getInputStream() {
-
       return null;
     }
 
@@ -871,7 +716,6 @@ public class TestUtilSystem extends JajukTestCase {
      */
     @Override
     public InputStream getErrorStream() {
-
       return null;
     }
 
@@ -883,7 +727,6 @@ public class TestUtilSystem extends JajukTestCase {
       if (throwInExitValue) {
         throw new IllegalThreadStateException("testexception");
       }
-
       return 0;
     }
 
@@ -892,19 +735,18 @@ public class TestUtilSystem extends JajukTestCase {
      */
     @Override
     public void destroy() {
-
     }
   }
 
   // helper method to emma-coverage of the unused constructor
   /**
    * Test private constructor.
-   * DOCUMENT_ME
+   * 
    *
    * @throws Exception the exception
    */
   public void testPrivateConstructor() throws Exception {
     // For EMMA code-coverage tests
-    JUnitHelpers.executePrivateConstructor(UtilSystem.class);
+    TestHelpers.executePrivateConstructor(UtilSystem.class);
   }
 }
diff --git a/src/test/java/org/jajuk/util/error/TestCannotRenameException.java b/src/test/java/org/jajuk/util/error/TestCannotRenameException.java
index f050c12..750cde3 100644
--- a/src/test/java/org/jajuk/util/error/TestCannotRenameException.java
+++ b/src/test/java/org/jajuk/util/error/TestCannotRenameException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,17 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestCannotRenameException extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -35,7 +34,6 @@ public class TestCannotRenameException extends JajukTestCase {
    */
   public void testCannotRenameExceptionInt() {
     new CannotRenameException(10);
-
   }
 
   /**
@@ -47,5 +45,4 @@ public class TestCannotRenameException extends JajukTestCase {
   public void testCannotRenameExceptionIntThrowable() {
     new CannotRenameException(22, new Throwable());
   }
-
 }
diff --git a/src/test/java/org/jajuk/util/error/TestJajukException.java b/src/test/java/org/jajuk/util/error/TestJajukException.java
index 1f9f8aa..6036135 100644
--- a/src/test/java/org/jajuk/util/error/TestJajukException.java
+++ b/src/test/java/org/jajuk/util/error/TestJajukException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,17 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestJajukException extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -67,7 +66,7 @@ public class TestJajukException extends JajukTestCase {
 
   /**
    * Test jajuk exception int string throwable null.
-   * DOCUMENT_ME
+   * 
    */
   public void testJajukExceptionIntStringThrowableNull() {
     new JajukException(28, null, new Throwable("Testthrowable"));
@@ -86,7 +85,7 @@ public class TestJajukException extends JajukTestCase {
 
   /**
    * Test jajuk exception int string null.
-   * DOCUMENT_ME
+   * 
    */
   public void testJajukExceptionIntStringNull() {
     new JajukException(29, (String) null);
diff --git a/src/test/java/org/jajuk/util/error/TestNoneAccessibleFileException.java b/src/test/java/org/jajuk/util/error/TestNoneAccessibleFileException.java
index 8962f14..8557457 100644
--- a/src/test/java/org/jajuk/util/error/TestNoneAccessibleFileException.java
+++ b/src/test/java/org/jajuk/util/error/TestNoneAccessibleFileException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,17 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestNoneAccessibleFileException extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -46,5 +45,4 @@ public class TestNoneAccessibleFileException extends JajukTestCase {
   public void testNoneAccessibleFileExceptionIntThrowable() {
     new NoneAccessibleFileException(23, new Throwable("testexception"));
   }
-
 }
diff --git a/src/test/java/org/jajuk/util/error/TestTimeOutException.java b/src/test/java/org/jajuk/util/error/TestTimeOutException.java
index 28af640..f424fd4 100644
--- a/src/test/java/org/jajuk/util/error/TestTimeOutException.java
+++ b/src/test/java/org/jajuk/util/error/TestTimeOutException.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,17 +16,16 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.error;
 
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestTimeOutException extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -45,5 +44,4 @@ public class TestTimeOutException extends JajukTestCase {
   public void testTimeOutExceptionIntThrowable() {
     new TimeOutException(24, new Throwable("TestException"));
   }
-
 }
diff --git a/src/test/java/org/jajuk/util/filters/TestAnyFileFilter.java b/src/test/java/org/jajuk/util/filters/TestAnyFileFilter.java
index bd71b81..d3c8f74 100644
--- a/src/test/java/org/jajuk/util/filters/TestAnyFileFilter.java
+++ b/src/test/java/org/jajuk/util/filters/TestAnyFileFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -25,10 +25,9 @@ import java.io.File;
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAnyFileFilter extends JajukTestCase {
-
   /**
    * Test method for.
    *
diff --git a/src/test/java/org/jajuk/util/filters/TestAudioFilter.java b/src/test/java/org/jajuk/util/filters/TestAudioFilter.java
index 0598fb4..bea4a4c 100644
--- a/src/test/java/org/jajuk/util/filters/TestAudioFilter.java
+++ b/src/test/java/org/jajuk/util/filters/TestAudioFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -24,14 +24,14 @@ import java.io.File;
 
 import org.apache.commons.lang.StringUtils;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 import org.jajuk.base.TypeManager;
 import org.jajuk.services.startup.StartupCollectionService;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestAudioFilter extends JajukTestCase {
-
   /**
    * Test method for.
    *
@@ -39,35 +39,21 @@ public class TestAudioFilter extends JajukTestCase {
    */
   public void testAcceptFile() {
     StartupCollectionService.registerTypes();
-
     // normal files
     assertFalse(AudioFilter.getInstance().accept(new File("test.tst")));
     assertTrue(AudioFilter.getInstance().accept(new File("test.mp3")));
     assertTrue(AudioFilter.getInstance().accept(new File("test.ogg")));
-    assertTrue(AudioFilter.getInstance().accept(new File("test.MP3"))); // files
-    // copied
-    // from
-    // windows
-    // to
-    // linux
-    // might
-    // be
-    // uppercase
+    assertTrue(AudioFilter.getInstance().accept(new File("test.MP3")));
+    // files copied from windows to linux might be uppercase
     assertTrue(AudioFilter.getInstance().accept(new File("test.OGG")));
-    assertTrue(AudioFilter.getInstance().accept(new File("test.mP3"))); // manually
-    // entered
-    // filenames
-    // might
-    // be
-    // lowercase/uppercase
-    // mixed
+    assertTrue(AudioFilter.getInstance().accept(new File("test.mP3")));
+    // manually entered filenames might be lowercase/uppercase  mixed
     assertTrue(AudioFilter.getInstance().accept(new File("test.ogG")));
-
     // directories, depends on the setting
     AudioFilter.getInstance().setAcceptDirectories(false);
-    assertFalse(AudioFilter.getInstance().accept(new File(System.getProperty("java.io.tmpdir"))));
+    assertFalse(AudioFilter.getInstance().accept(TestHelpers.getDirectory().getFio()));
     AudioFilter.getInstance().setAcceptDirectories(true);
-    assertTrue(AudioFilter.getInstance().accept(new File(System.getProperty("java.io.tmpdir"))));
+    assertTrue(AudioFilter.getInstance().accept(TestHelpers.getDirectory().getFio()));
   }
 
   /**
@@ -76,12 +62,10 @@ public class TestAudioFilter extends JajukTestCase {
    */
   public void testGetDescription() {
     StartupCollectionService.registerTypes();
-
-    assertTrue(AudioFilter.getInstance().getDescription(), StringUtils.containsIgnoreCase(
-        AudioFilter.getInstance().getDescription(), "mp3"));
-    assertTrue(AudioFilter.getInstance().getDescription(), StringUtils.containsIgnoreCase(
-        AudioFilter.getInstance().getDescription(), "ogg"));
-
+    assertTrue(AudioFilter.getInstance().getDescription(),
+        StringUtils.containsIgnoreCase(AudioFilter.getInstance().getDescription(), "mp3"));
+    assertTrue(AudioFilter.getInstance().getDescription(),
+        StringUtils.containsIgnoreCase(AudioFilter.getInstance().getDescription(), "ogg"));
     // try removing all types
     TypeManager.getInstance().clear();
     assertEquals("", AudioFilter.getInstance().getDescription());
diff --git a/src/test/java/org/jajuk/util/filters/TestDirectoryFilter.java b/src/test/java/org/jajuk/util/filters/TestDirectoryFilter.java
index 0e88fec..abac50f 100644
--- a/src/test/java/org/jajuk/util/filters/TestDirectoryFilter.java
+++ b/src/test/java/org/jajuk/util/filters/TestDirectoryFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,28 +16,31 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
 import java.io.File;
+import java.io.IOException;
 
 import org.apache.commons.lang.StringUtils;
+import org.jajuk.ConstTest;
 import org.jajuk.JajukTestCase;
+import org.jajuk.TestHelpers;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestDirectoryFilter extends JajukTestCase {
-
   /**
    * Test method for.
    *
    * {@link org.jajuk.util.filters.DirectoryFilter#accept(java.io.File)}.
+   * @throws IOException 
    */
-  public void testAcceptFile() {
-    assertTrue(DirectoryFilter.getInstance().accept(new File(System.getProperty("java.io.tmpdir"))));
-    assertFalse(DirectoryFilter.getInstance().accept(new File("notexisting")));
+  public void testAcceptFile() throws IOException {
+    assertTrue(DirectoryFilter.getInstance().accept(new File(ConstTest.TEMP_PATH)));
+    assertFalse(DirectoryFilter.getInstance().accept(TestHelpers.getFile().getFIO()));
   }
 
   /**
diff --git a/src/test/java/org/jajuk/util/filters/TestGIFFilter.java b/src/test/java/org/jajuk/util/filters/TestGIFFilter.java
index 7047c41..2fe8d70 100644
--- a/src/test/java/org/jajuk/util/filters/TestGIFFilter.java
+++ b/src/test/java/org/jajuk/util/filters/TestGIFFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -25,10 +25,9 @@ import java.io.File;
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestGIFFilter extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.util.filters.GIFFilter#getInstance()}.
    */
@@ -38,7 +37,7 @@ public class TestGIFFilter extends JajukTestCase {
 
   /**
    * Test accept.
-   * DOCUMENT_ME
+   * 
    */
   public void testAccept() {
     assertTrue(GIFFilter.getInstance().accept(new File("test.gif")));
diff --git a/src/test/java/org/jajuk/util/filters/TestHTMLFilter.java b/src/test/java/org/jajuk/util/filters/TestHTMLFilter.java
index a559193..169b310 100644
--- a/src/test/java/org/jajuk/util/filters/TestHTMLFilter.java
+++ b/src/test/java/org/jajuk/util/filters/TestHTMLFilter.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,7 +16,7 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.filters;
 
@@ -25,10 +25,9 @@ import java.io.File;
 import org.jajuk.JajukTestCase;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestHTMLFilter extends JajukTestCase {
-
   /**
    * Test method for {@link org.jajuk.util.filters.HTMLFilter#getInstance()}.
    */
@@ -38,7 +37,7 @@ public class TestHTMLFilter extends JajukTestCase {
 
   /**
    * Test accept.
-   * DOCUMENT_ME
+   * 
    */
   public void testAccept() {
     assertTrue(HTMLFilter.getInstance().accept(new File("test.html")));
@@ -58,5 +57,4 @@ public class TestHTMLFilter extends JajukTestCase {
     // typed
     // manually
   }
-
 }
diff --git a/src/test/java/org/jajuk/util/log/TestLog.java b/src/test/java/org/jajuk/util/log/TestLog.java
index b3e4e38..a0f1600 100644
--- a/src/test/java/org/jajuk/util/log/TestLog.java
+++ b/src/test/java/org/jajuk/util/log/TestLog.java
@@ -1,6 +1,6 @@
 /*
  *  Jajuk
- *  Copyright (C) 2003-2011 The Jajuk Team
+ *  Copyright (C) The Jajuk Team
  *  http://jajuk.info
  *
  *  This program is free software; you can redistribute it and/or
@@ -16,32 +16,23 @@
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *  $Revision$
+ *  
  */
 package org.jajuk.util.log;
 
 import java.util.List;
 
 import org.jajuk.JajukTestCase;
-import org.jajuk.util.Const;
 import org.jajuk.util.error.JajukException;
 
 /**
- * DOCUMENT_ME.
+ * .
  */
 public class TestLog extends JajukTestCase {
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.jajuk.JajukTestCase#setUp()
-   */
   @Override
-  protected void setUp() throws Exception {
+  protected void specificSetUp() throws Exception {
     // make sure we have logging initialized for these tests
     Log.init();
-
-    super.setUp();
   }
 
   /**
@@ -83,7 +74,7 @@ public class TestLog extends JajukTestCase {
 
   /**
    * Test debug string throwable null.
-   * DOCUMENT_ME
+   * 
    */
   public void testDebugStringThrowableNull() {
     Log.debug(null, new Throwable("testthrowable2"));
@@ -134,7 +125,7 @@ public class TestLog extends JajukTestCase {
 
   /**
    * Test warn int string throwable null.
-   * DOCUMENT_ME
+   * 
    */
   public void testWarnIntStringThrowableNull() {
     Log.warn(10, null, new Throwable("testthrowable"));
@@ -217,7 +208,6 @@ public class TestLog extends JajukTestCase {
     // set verbosity first as we can not rely on INFO being set because other
     // tests might have adjusted it somehow
     Log.setVerbosity(Log.INFO);
-
     assertEquals(Log.INFO, Log.getVerbosity());
     Log.setVerbosity(Log.DEBUG);
     assertEquals(Log.DEBUG, Log.getVerbosity());
@@ -256,50 +246,19 @@ public class TestLog extends JajukTestCase {
     assertFalse(Log.isDebugEnabled());
   }
 
-  /**
-   * Test method for {@link org.jajuk.util.log.Log#getSpool()}.
-   */
-  public void testGetSpool() {
-    // should return a list and not null
-    assertNotNull(Log.getSpool());
-
-    // create enough spool to overflow
-    for (int i = 0; i < Const.FEEDBACK_LINES + 10; i++) {
-      Log.debug("Spooltest-" + i + '|');
-    }
-
-    // should return the expected number of lines now
-    assertEquals(Log.getSpool().toString(), Const.FEEDBACK_LINES, Log.getSpool().size());
-
-    // now the first ten should be moved out
-    verifySpool("Spooltest-0|", false);
-    verifySpool("Spooltest-9|", false);
-    verifySpool("Spooltest-11|");
-    verifySpool("Spooltest-" + Integer.toString(Const.FEEDBACK_LINES + 9) + '|');
-
-    // more details tested in other methods
-  }
-
-  /**
-   * Verify spool.
-   * DOCUMENT_ME
-   *
-   * @param substring DOCUMENT_ME
-   */
   private void verifySpool(String substring) {
     verifySpool(substring, true);
   }
 
   /**
    * Verify spool.
-   * DOCUMENT_ME
+   * 
    *
-   * @param substring DOCUMENT_ME
-   * @param expected DOCUMENT_ME
+   * @param substring 
+   * @param expected 
    */
   private void verifySpool(String substring, boolean expected) {
-    List<String> list = Log.getSpool();
-
+    List<String> list = Log.getSpool(true);
     for (String str : list) {
       if (str.contains(substring)) {
         // expected => return, not expected => fail
@@ -310,7 +269,6 @@ public class TestLog extends JajukTestCase {
         }
       }
     }
-
     // if we expected the string, but did not find it we need to fail here
     if (expected) {
       fail("List does not contain expected string '" + substring + "' in spool: " + list.toString());
@@ -319,7 +277,7 @@ public class TestLog extends JajukTestCase {
 
   /**
    * Test anonymization.
-   * DOCUMENT_ME
+   * 
    */
   public void testAnonymization() {
     // things in {{...}} are replaced in the spool. Verify that this happens
@@ -327,14 +285,13 @@ public class TestLog extends JajukTestCase {
     verifySpool("this is");
     verifySpool("sensitive", false);
     verifySpool("data...");
-
     // replaced by "***"
     verifySpool("***");
   }
 
   /**
    * Test anonymization player state.
-   * DOCUMENT_ME
+   * 
    */
   public void testAnonymizationPlayerState() {
     // special replacement that is done to not show personal data in the spool
@@ -343,5 +300,4 @@ public class TestLog extends JajukTestCase {
     verifySpool("OPENING");
     verifySpool("secret", false);
   }
-
 }
diff --git a/src/tools/clean_dead_labels.sh b/src/tools/clean_dead_labels.sh
new file mode 100755
index 0000000..7eae863
--- /dev/null
+++ b/src/tools/clean_dead_labels.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# Copyright, the Jajuk team
+# This script is a tool available for jajuk developers to manage langpack files
+
+# Launch this script from its directory
+for label in `./detect_dead_labels.sh`;
+do
+ echo cleaning up : $label
+ for file in ../main/java/org/jajuk/i18n/*.properties
+ do 
+  echo Entering file : $file
+  sed -i "/^$label/D" $file
+ done
+done
+
diff --git a/src/tools/detect_dead_labels.sh b/src/tools/detect_dead_labels.sh
new file mode 100755
index 0000000..a2f8c85
--- /dev/null
+++ b/src/tools/detect_dead_labels.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright, the Jajuk team
+# This script is a tool available for jajuk developers to manage langpack files
+
+# Launch this script from its directory
+# CAUTION : some labels could be used indirectly or used by files out of java directory, check all the repository
+cd ../main/java
+
+# Find useless labels
+while read line;do echo -e "$line\n"; done < org/jajuk/i18n/jajuk.properties | grep -E ".*=.*" | grep -v "?xml" | grep -v '#' | awk -F'=' '{print $1}' > /tmp/list
+while read line; do  count=`grep -rH "\"$line" * | wc -l`; if [[ $count -eq 0 ]]; then echo $line; fi; done < /tmp/list | grep -v "TipOfTheDay" | grep -v "Language_desc" | grep -v "Error." | grep -v "Property" | grep -v "ReportAction" | grep -v "Wizard_" | grep -v "Notificator."
+
+# Note that this errors MAY be useless, check it and that useless errors may have been omitted
+#Find useless errors
+while read line;do echo -e "$line\n"; done < org/jajuk/i18n/jajuk.properties | grep -E ".*=.*" | grep -v '#' | grep -v "?xml" |awk -F'=' '{print $1}' | grep "Error." > /tmp/errors
+while read line; do  code=`echo $line|awk -F '.' '{print $2}'`; trimed_code=`echo $code | sed 's/0*//'`; count=`grep -rHE "showErrorMessage\($code|\"$line\"|showDetailedErrorMessage\($code|new JajukException\($code|Log.error\($code|\(${trimed_code}" org ext | wc -l`; if [[ $count -eq 0 ]]; then echo $line; fi; done < /tmp/errors
+
diff --git a/src/tools/jautodoc_templates.xml b/src/tools/jautodoc_templates.xml
deleted file mode 100644
index e066922..0000000
--- a/src/tools/jautodoc_templates.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-
-<templates>
-	<template kind="1" name="Type.Default" default="true"
-		signature="false">
-		<regex>.+</regex>
-		<example>ExampleType</example>
-		<text>/**
-			## type: class|interface|enum
-			* DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="2" name="Field.serialVersionUID" default="false"
-		signature="false">
-		<regex>serialVersionUID</regex>
-		<example>serialVersionUID</example>
-		<text>/** Generated serialVersionUID */</text>
-	</template>
-	<template kind="2" name="Field.fPrefix" default="false"
-		signature="false">
-		<regex>f([A-Z].+)</regex>
-		<example>fExampleMember</example>
-		<text>/**
-			* The DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="2" name="Field.thePrefix" default="false"
-		signature="false">
-		<regex>the[A-Z].+</regex>
-		<example>theNumberOfQuestions</example>
-		<text>/**
-			* ${e.rsfu()}. DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="2" name="Field.Default" default="true"
-		signature="false">
-		<regex>.+</regex>
-		<example>numberOfQuestions</example>
-		<text>/**
-			#if(${e.isStatic()} && ${e.isFinal()})
-			* The Constant
-			${e}. DOCUMENT_ME
-			#else
-			* DOCUMENT_ME
-			#end
-			*/</text>
-	</template>
-	<template kind="3" name="Method.getInstance" default="false"
-		signature="false">
-		<regex>getInstance</regex>
-		<example>getInstance</example>
-		<text>/**
-			* Gets the single instance of ${e.getDeclaringType()}.
-			*
-			*
-			@return single instance of ${e.getDeclaringType()}
-			*/</text>
-	</template>
-	<template kind="3" name="Method.Getter" default="false"
-		signature="true">
-		<regex>\S+ get(\S+)\(.*\)</regex>
-		<example>int getNumberOfQuestions()</example>
-		<text>/**
-			* Gets the ${e.g(1).rsfl()}.
-			*
-			* @return the ${e.g(1).rsfl()}
-			*/</text>
-	</template>
-	<template kind="3" name="Method.Setter" default="false"
-		signature="true">
-		<regex>void set(\S+)\([^,]+ ([^,]+)\)</regex>
-		<example>void setNumberOfQuestions(int number)</example>
-		<text>/**
-			* Sets the ${e.g(1).rsfl()}.
-			*
-			* @param ${e.g(2)} the new
-			${e.g(1).rsfl()}
-			*/</text>
-	</template>
-	<template kind="3" name="Method.boolean Getter" default="false"
-		signature="true">
-		<regex>boolean is(.+)\(.*\)</regex>
-		<example>boolean isBlue()</example>
-		<text>/**
-			* Checks if is ${e.g(1).rsfl()}.
-			*
-			* @return true, if is
-			${e.g(1).rsfl()}
-			*/</text>
-	</template>
-	<template kind="3" name="Method.Main-Method" default="false"
-		signature="true">
-		<regex>void main\(String\[\] (\S+)\)</regex>
-		<example>void main(String[] args)</example>
-		<text>/**
-			* The main method.
-			*
-			* @param ${e.g(1)} the arguments
-			*/</text>
-	</template>
-	<template kind="3" name="Method.Constructor" default="false"
-		signature="true">
-		<regex>(\S+)\(.*\)</regex>
-		<example>SimpleClass()</example>
-		<text>/**
-			* Instantiates a new ${e.g(1).rsfl()}.
-			*/</text>
-	</template>
-	<template kind="3" name="Method.Returns void" default="false"
-		signature="true">
-		<regex>void (.+)\(.*\)</regex>
-		<example>void doSomething()</example>
-		<text>/**
-			* ${e.g(1).rsfu()}.
-			* DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="3" name="Method.Returns boolean" default="false"
-		signature="true">
-		<regex>boolean (\S+)\(.*\)</regex>
-		<example>boolean doSomething(int parameter)</example>
-		<text>/**
-			* ${e.g(1).rsfu()}.
-			* DOCUMENT_ME
-			*
-			* @return true if... */</text>
-	</template>
-	<template kind="3" name="Method.Returns other" default="false"
-		signature="true">
-		<regex>(\S+) (\S+)\(.*\)</regex>
-		<example>ReturnValue calculateSomething()</example>
-		<text>/**
-			* ${e.g(2).rsfu()}.
-			* DOCUMENT_ME
-			*
-			* @return the
-			${e.g(1).rsfl()}
-			*/</text>
-	</template>
-	<template kind="3" name="Method.Default" default="true"
-		signature="false">
-		<regex>.+</regex>
-		<example>doSomething</example>
-		<text>/**
-			## Actually this is not used, because there
-			## are templates
-			for different return types
-			* ${e.rsfu()}. DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="4" name="Parameter.compUnit" default="false"
-		signature="false">
-		<regex>compUnit</regex>
-		<example>compUnit</example>
-		<text>/**
-			## Example for shortcuts
-			* @param ${e} DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="4" name="Parameter.pPrefix" default="false"
-		signature="false">
-		<regex>p([A-Z].+)</regex>
-		<example>pField</example>
-		<text>/**
-			* @param ${e} DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="4" name="Parameter.Default" default="true"
-		signature="false">
-		<regex>.+</regex>
-		<example>simpleParameter</example>
-		<text>/**
-			* @param ${e} DOCUMENT_ME
-			*/</text>
-	</template>
-	<template kind="5" name="Exception.IOException" default="false"
-		signature="false">
-		<regex>IOException</regex>
-		<example>IOException</example>
-		<text>/**
-			* @throws ${e} Signals that an I/O exception has occurred.
-			*/</text>
-	</template>
-	<template kind="5" name="Exception.Default" default="true"
-		signature="false">
-		<regex>.+</regex>
-		<example>ExampleException</example>
-		<text>/**
-			* @throws the ${e.sfl()}
-			*/</text>
-	</template>
-</templates>
-

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jajuk.git



More information about the pkg-java-commits mailing list