Merge branch 'Release_2_8_1_Branch' into JAL-1372_referenceseq
authorJim Procter <jprocter@dundee.ac.uk>
Fri, 2 May 2014 10:10:28 +0000 (11:10 +0100)
committerJim Procter <jprocter@dundee.ac.uk>
Fri, 2 May 2014 10:10:28 +0000 (11:10 +0100)
Conflicts:
src/jalview/appletgui/APopupMenu.java
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/SequenceCollectionI.java
src/jalview/gui/AlignFrame.java

resolved without functionality change

12 files changed:
1  2 
resources/lang/Messages.properties
src/jalview/api/AlignViewportI.java
src/jalview/appletgui/APopupMenu.java
src/jalview/appletgui/IdCanvas.java
src/jalview/appletgui/SequenceRenderer.java
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/SequenceCollectionI.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/IdCanvas.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/SequenceRenderer.java
src/jalview/viewmodel/AlignmentViewport.java

index 0000000,906db68..7edc787
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,740 +1,742 @@@
+ action.refresh_services = Refresh Services\r
+ action.reset_services = Reset Services\r
+ action.merge_results = Merge Results\r
+ action.load_scheme = Load scheme\r
+ action.save_scheme = Save scheme\r
+ action.save_image = Save Image\r
+ action.paste = Paste\r
+ action.show_html_source = Show HTML Source\r
+ action.print = Print\r
+ action.web_service = Web Service\r
+ action.cancel_job = Cancel Job\r
+ action.start_job = Start Job\r
+ action.revert = Revert\r
+ action.move_down = Move Down\r
+ action.move_up = Move Up\r
+ action.remove_return_datatype = Remove return datatype\r
+ action.add_return_datatype = Add return datatype\r
+ action.remove_input_parameter = Remove selected input parameter\r
+ action.add_input_parameter = Add input parameter\r
+ action.edit = Edit\r
+ action.new = New\r
+ action.open_file = Open file\r
+ action.show_unconserved = Show Unconserved\r
+ action.open_new_aligmnent = Open new alignment\r
+ action.raise_associated_windows = Raise Associated Windows\r
+ action.minimize_associated_windows = Minimize Associated Windows\r
+ action.close_all = Close all\r
+ action.load_project = Load Project\r
+ action.save_project = Save Project\r
+ action.quit = Quit\r
+ action.expand_views = Expand Views\r
+ action.gather_views = Gather Views\r
+ action.page_setup = Page Setup\r
+ action.reload = Reload\r
+ action.load = Load\r
+ action.open = Open\r
+ action.cancel = Cancel\r
+ action.create = Create\r
+ action.update = Update\r
+ action.delete = Delete\r
+ action.snapshot = Snapshot\r
+ action.clear = Clear\r
+ action.accept = Accept\r
+ action.select_ddbb = --- Select Database ---\r
+ action.undo = Undo\r
+ action.redo = Redo\r
+ action.reset = Reset\r
+ action.remove_left = Remove left\r
+ action.remove_right = Remove right\r
+ action.remove_empty_columns = Remove Empty Columns\r
+ action.remove_all_gaps = Remove All Gaps\r
+ action.left_justify_alignment = Left Justify Alignment\r
+ action.right_justify_alignment = Right Justify Alignment\r
+ action.boxes = Boxes\r
+ action.text = Text\r
+ action.by_pairwise_id = by Pairwise Identity\r
+ action.by_id = by Id\r
+ action.by_length = by Length\r
+ action.by_group = by Group\r
++action.unmark_as_reference = Unmark as Reference \r
++action.set_as_reference = Set as Reference \r
+ action.remove = Remove\r
+ action.remove_redundancy = Remove Redundancy...\r
+ action.pairwise_alignment = Pairwise Alignments...\r
+ action.by_rna_helixes = by RNA Helices\r
+ action.user_defined = User Defined...\r
+ action.by_conservation = By Conservation\r
+ action.wrap = Wrap\r
+ action.show_gaps = Show Gaps\r
+ action.show_hidden_markers = Show Hidden Markers\r
+ action.find = Find\r
+ action.undefine_groups = Undefine Groups\r
+ action.create_groups = Create Groups\r
+ action.make_groups_selection = Make Groups For Selection\r
+ action.copy = Copy\r
+ action.cut = Cut\r
+ action.font = Font...\r
+ action.scale_above = Scale Above\r
+ action.scale_left = Scale Left\r
+ action.scale_right = Scale Right\r
+ action.by_tree_order = By Tree Order\r
+ action.sort = Sort\r
+ action.calculate_tree = Calculate Tree\r
+ action.help = Help\r
+ action.by_annotation = by Annotation...\r
+ action.invert_sequence_selection = Invert Sequence Selection\r
+ action.invert_column_selection = Invert Column Selection\r
+ action.show = Show\r
+ action.hide = Hide\r
+ action.ok = OK\r
+ action.set_defaults = Defaults\r
+ action.create_group = Create Group\r
+ action.remove_group = Remove Group\r
+ action.edit_group = Edit Group\r
+ action.border_colour = Border colour\r
+ action.edit_new_group = Edit New Group\r
+ action.hide_sequences = Hide Sequences\r
+ action.sequences = Sequences\r
+ action.ids = IDS\r
+ action.ids_sequences = IDS and sequences\r
+ action.reveal_all = Reveal All\r
+ action.reveal_sequences = Reveal Sequences\r
+ action.find_all = Find all\r
+ action.find_next = Find next\r
+ action.file = File\r
+ action.view = View\r
+ action.change_params = Change Parameters\r
+ action.apply = Apply\r
+ action.apply_threshold_all_groups = Apply threshold to all groups\r
+ action.apply_all_groups = Apply to all Groups\r
+ action.by_chain = By chain\r
+ action.by_sequence = By Sequence\r
+ action.paste_annotations = Paste Annotations\r
+ action.format = Format\r
+ action.select = Select\r
+ action.new_view = New View\r
+ action.close = Close\r
+ action.add = Add\r
+ action.save_as_default = Save as default\r
+ action.save_as = Save as\r
+ action.save = Save\r
+ action.cancel_fetch = Cancel Fetch\r
+ action.save_omit_hidden_columns = Save / Omit Hidden Columns\r
+ action.change_font = Change Font\r
+ action.change_font_tree_panel = Change Font (Tree Panel)\r
+ action.colour = Colour\r
+ action.calculate = Calculate\r
+ action.select_all = Select all\r
+ action.deselect_all = Deselect all\r
+ action.invert_selection = Invert selection\r
+ action.using_jmol = Using Jmol\r
+ action.link = Link\r
+ action.group_link = Group Links\r
+ action.show_chain = Show Chain\r
+ action.show_group = Show Group\r
+ action.fetch_db_references = Fetch DB References\r
+ action.edit = Edit\r
+ action.view_flanking_regions = Show flanking regions\r
+ label.view_flanking_regions = Show sequence data either side of the subsequences involved in this alignment\r
+ label.str = Str:\r
+ label.seq = Seq:\r
+ label.structures_manager = Structures Manager\r
+ label.nickname = Nickname:\r
+ label.url = URL:\r
+ label.input_file_url = Enter URL or Input File\r
+ label.select_feature = Select feature:\r
+ label.name = Name\r
+ label.name_param = Name: {0}\r
+ label.group = Group\r
+ label.group_name = Group Name\r
+ label.group_description = Group Description\r
+ label.edit_group_name_description = Edit Group Name/Description\r
+ label.colour = Colour:\r
+ label.description = Description:\r
+ label.start = Start:\r
+ label.end = End:\r
+ label.current_parameter_set_name = Current parameter set name:\r
+ label.service_action = Service Action:\r
+ label.post_url = POST URL:\r
+ label.url_suffix = URL Suffix\r
+ label.sequence_source = Sequence Source\r
+ label.per_seq = per Sequence\r
+ label.result_vertically_separable = Results are vertically separable\r
+ label.amend = Amend\r
+ label.undo_command = Undo {0}\r
+ label.redo_command = Redo {0}\r
+ label.principal_component_analysis = Principal Component Analysis\r
+ label.average_distance_identity = Average Distance Using % Identity\r
+ label.neighbour_joining_identity = Neighbour Joining Using % Identity\r
+ label.treecalc_title = {0} Using {1}\r
+ label.tree_calc_av = Average Distance\r
+ label.tree_calc_nj = Neighbour Joining\r
+ label.select_score_model = Select score model\r
+ label.score_model_pid = % Identity\r
+ label.score_model_blosum62 = BLOSUM62\r
+ label.score_model_pam250 = PAM 250\r
+ label.score_model_conservation = Physicochemical property conservation\r
+ label.score_model_enhconservation = Physicochemical property conservation\r
+ label.status_bar = Status bar\r
+ label.out_to_textbox = Output to Textbox\r
+ label.clustalx = Clustalx\r
+ label.clustal = Clustal\r
+ label.zappo = Zappo\r
+ label.taylor = Taylor\r
+ label.blc = BLC\r
+ label.fasta = Fasta\r
+ label.msf = MSF\r
+ label.pfam = PFAM\r
+ label.pileup = Pileup\r
+ label.pir = PIR\r
+ label.hydrophobicity = Hydrophobicity\r
+ label.helix_propensity = Helix Propensity\r
+ label.strand_propensity = Strand Propensity\r
+ label.turn_propensity = Turn Propensity\r
+ label.buried_index = Buried Index\r
+ label.purine_pyrimidine = Purine/Pyrimidine\r
+ label.percentage_identity = Percentage Identity\r
+ label.blosum62 = BLOSUM62\r
+ label.blosum62_score = BLOSUM62 Score\r
+ label.tcoffee_scores = T-Coffee Scores\r
+ label.average_distance_bloslum62 = Average Distance Using BLOSUM62\r
+ label.neighbour_blosum62 = Neighbour Joining Using BLOSUM62\r
+ label.show_annotations = Show annotations\r
+ label.colour_text = Colour Text\r
+ label.show_non_conversed = Show nonconserved\r
+ label.overview_window = Overview Window\r
+ label.none = None\r
+ label.above_identity_threshold = Above Identity Threshold\r
+ label.show_sequence_features = Show Sequence Features\r
+ label.nucleotide = Nucleotide\r
+ label.to_new_alignment = To New Alignment\r
+ label.to_this_alignment = Add To This Alignment\r
+ label.apply_colour_to_all_groups = Apply Colour To All Groups\r
+ label.modify_identity_thereshold = Modify Identity Threshold...\r
+ label.modify_conservation_thereshold = Modify Conservation Threshold...\r
+ label.input_from_textbox = Input from textbox\r
+ label.centre_column_labels = Centre column labels\r
+ label.automatic_scrolling = Automatic Scrolling\r
+ label.documentation = Documentation\r
+ label.about = About...\r
+ label.show_sequence_limits = Show Sequence Limits\r
+ label.feature_settings = Feature Settings...\r
+ label.sequence_features = Sequence Features\r
+ label.all_columns = All Columns\r
+ label.all_sequences = All Sequences\r
+ label.selected_columns = Selected Columns \r
+ label.selected_sequences = Selected Sequences\r
+ label.all_but_selected_region = All but Selected Region (Shift+Ctrl+H)\r
+ label.selected_region = Selected Region\r
+ label.all_sequences_columns = All Sequences and Columns\r
+ label.group_consensus = Group Consensus\r
+ label.group_conservation = Group Conservation\r
+ label.show_consensus_histogram = Show Consensus Histogram\r
+ label.show_consensus_logo = Show Consensus Logo\r
+ label.norm_consensus_logo = Normalise Consensus Logo\r
+ label.apply_all_groups = Apply to all groups\r
+ label.autocalculated_annotation = Autocalculated Annotation\r
+ label.min_colour = Minimum Colour\r
+ label.max_colour = Maximum Colour\r
+ label.use_original_colours = Use Original Colours\r
+ label.threshold_minmax = Threshold is min/max\r
+ label.represent_group_with = Represent Group with {0}\r
+ label.selection = Selection\r
+ label.group_colour = Group Colour\r
+ label.sequence = Sequence\r
+ label.view_pdb_structure = View PDB Structure\r
+ label.min = Min:\r
+ label.max = Max:\r
+ label.colour_by_label = Colour by label\r
+ label.new_feature = New Feature\r
+ label.match_case = Match Case\r
+ label.view_alignment_editor = View in alignment editor\r
+ label.labels = Labels\r
+ label.output_values = Output Values...\r
+ label.output_points = Output points...\r
+ label.output_transformed_points = Output transformed points\r
+ label.input_data = Input Data...\r
+ label.nucleotide_matrix = Nucleotide matrix\r
+ label.protein_matrix = Protein matrix\r
+ label.show_bootstrap_values = Show Bootstrap Values\r
+ label.show_distances = Show distances\r
+ label.mark_unassociated_leaves = Mark Unassociated Leaves\r
+ label.fit_to_window = Fit To Window\r
+ label.newick_format = Newick Format\r
+ label.select_newick_like_tree_file = Select a newick-like tree file\r
+ label.colours = Colours\r
+ label.view_mapping = View Mapping\r
+ label.wireframe = Wireframe\r
+ label.depthcue = Depthcue\r
+ label.z_buffering = Z Buffering\r
+ label.charge_cysteine = Charge & Cysteine\r
+ label.all_chains_visible = All Chains Visible\r
+ label.successfully_added_features_alignment = Successfully added features to alignment\r
+ label.keyboard_editing_mode = Keyboard editing mode is {0}\r
+ label.paste_features_annotations_Tcoffee_here = Paste your features / annotations / T-coffee score file here.\r
+ label.removed_columns = Removed {0} columns.\r
+ label.removed_empty_columns = Removed {0} empty columns.\r
+ label.paste_newick_tree_file = Paste your Newick tree file here.\r
+ label.order_by_params = Order by {0}\r
+ label.html_content = <html>{0}</html>\r
+ label.paste_pdb_file= Paste your PDB file here.\r
+ label.paste_pdb_file_for_sequence = Paste PDB file for sequence {0}\r
+ label.could_not_parse_newick_file  = Could not parse Newick file\!\n {0}\r
+ label.successfully_pasted_tcoffee_scores_to_alignment= Successfully pasted T-Coffee scores to alignment.\r
+ label.failed_add_tcoffee_scores = Failed to add T-Coffee scores: \r
+ label.successfully_pasted_annotation_to_alignment= Successfully pasted annotation to alignment.\r
+ label.couldnt_parse_pasted_text_as_valid_annotation_feature_GFF_tcoffee_file = Couldn't parse pasted text as a valid annotation, feature, GFF, or T-Coffee score file\r
+ label.successfully_pasted_alignment_file = Successfully pasted alignment file\r
+ label.paste_your_alignment_file = Paste your alignment file here\r
+ label.paste_your = Paste your\r
+ label.finished_searching = Finished searching\r
+ label.search_results= Search results {0} : {1}\r
+ label.found_match_for = Found match for {0}\r
+ label.font = Font:\r
+ label.size = Size:\r
+ label.style = Style:\r
+ label.enter_redundancy_threshold = Enter the redundancy threshold\r
+ label.calculating = Calculating....\r
+ label.modify_conservation_visibility = Modify conservation visibility\r
+ label.colour_residues_above_occurence = Colour residues above % occurence\r
+ label.set_this_label_text = set this label text\r
+ label.sequences_from = Sequences from {0}\r
+ label.successfully_loaded_file  = Successfully loaded file {0}\r
+ label.successfully_saved_to_file_in_format = Successfully saved to file: {0} in {1} format.\r
+ label.copied_sequences_to_clipboard = Copied {0} sequences to clipboard.\r
+ label.check_file_matches_sequence_ids_alignment = Check that the file matches sequence IDs in the alignment.\r
+ label.problem_reading_tcoffee_score_file = Problem reading T-COFFEE score file\r
+ label.source_to_target = {0} ... {1}\r
+ label.per_sequence_only= Per-sequence only\r
+ label.to_file = to File\r
+ label.to_textbox = to Textbox\r
+ label.jalview = Jalview\r
+ label.csv_spreadsheet = CSV (Spreadsheet)\r
+ label.status =  [Status]\r
+ label.channels = Channels\r
+ label.channel_title_item_count = {0} ({1})\r
+ label.blog_item_published_on_date = {0} {1} \r
+ label.select_das_service_from_table = Select a DAS service from the table to read a full description here.</font></html>\r
+ label.session_update = Session Update\r
+ label.new_vamsas_session = New Vamsas Session\r
+ label.load_vamsas_session = Load Vamsas Session\r
+ label.save_vamsas_session = Save Vamsas Session\r
+ label.select_vamsas_session_opened_as_new_vamsas_session= Select a vamsas session to be opened as a new vamsas session.\r
+ label.open_saved_vamsas_session = Open a saved VAMSAS session\r
+ label.groovy_console = Groovy Console...\r
+ label.lineart = Lineart\r
+ label.dont_ask_me_again = Don't ask me again\r
+ label.select_eps_character_rendering_style = Select EPS character rendering style\r
+ label.invert_selection = Invert Selection\r
+ label.optimise_order = Optimise Order\r
+ label.seq_sort_by_score = Seq sort by Score\r
+ label.load_colours = Load Colours\r
+ label.save_colours = Save Colours\r
+ label.fetch_das_features = Fetch DAS Features\r
+ label.selected_database_to_fetch_from = Selected {0} database {1} to fetch from {2} \r
+ label.database_param = Database: {0}\r
+ label.example = Example\r
+ label.example_param = Example: {0}\r
+ label.select_file_format_before_saving = You must select a file format before saving!\r
+ label.file_format_not_specified = File format not specified\r
+ label.alignment_contains_hidden_columns = The Alignment contains hidden columns.\nDo you want to save only the visible alignment?\r
+ label.couldnt_save_file = Couldn't save file: {0}\r
+ label.error_saving_file = Error Saving File\r
+ label.remove_from_default_list = Remove from default list?\r
+ label.remove_user_defined_colour = Remove user defined colour\r
+ label.you_must_select_least_two_sequences = You must select at least 2 sequences.\r
+ label.invalid_selection = Invalid Selection\r
+ label.principal_component_analysis_must_take_least_four_input_sequences = Principal component analysis must take\nat least 4 input sequences.\r
+ label.sequence_selection_insufficient = Sequence selection insufficient\r
+ label.you_need_more_two_sequences_selected_build_tree = You need to have more than two sequences selected to build a tree!\r
+ label.not_enough_sequences = Not enough sequences\r
+ label.selected_region_to_tree_may_only_contain_residues_or_gaps =  The selected region to create a tree may\nonly contain residues or gaps.\nTry using the Pad function in the edit menu,\nor one of the multiple sequence alignment web services.\r
+ label.sequences_selection_not_aligned = Sequences in selection are not aligned\r
+ label.sequences_must_be_aligned_before_creating_tree = The sequences must be aligned before creating a tree.\nTry using the Pad function in the edit menu,\n or one of the multiple sequence alignment web services.\r
+ label.sequences_not_aligned = Sequences not aligned\r
+ label.problem_reading_tree_file =  Problem reading tree file\r
+ label.possible_problem_with_tree_file = Possible problem with tree file\r
+ label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation = Please select at least three bases in at least one sequence in order to perform a cDNA translation.\r
+ label.translation_failed = Translation Failed\r
+ label.error_when_translating_sequences_submit_bug_report = Unfortunately, something went wrong when translating your sequences.\nPlease take a look in the Jalview java console\nand submit a bug report including the stacktrace.\r
+ label.implementation_error  = Implementation error:\r
+ label.automatically_associate_pdb_files_with_sequences_same_name = Do you want to automatically associate the {0} PDB files with sequences in the alignment that have the same name?\r
+ label.automatically_associate_pdb_files_by_name = Automatically Associate PDB files by name\r
+ label.ignore_unmatched_dropped_files_info = <html>Do you want to <em>ignore</em> the {0} files whose names did not match any sequence IDs ?</html>\r
+ label.ignore_unmatched_dropped_files = Ignore unmatched dropped files?\r
+ label.enter_view_name = Enter View Name\r
+ label.enter_label = Enter label\r
+ label.enter_label_for_the_structure = Enter a label for the structure?\r
+ label.pdb_entry_is_already_displayed = {0} is already displayed.\nDo you want to re-use this viewer ?\r
+ label.map_sequences_to_visible_window = Map Sequences to Visible Window: {0}\r
+ label.add_pdbentry_to_view = Do you want to add {0} to the view called\n'{1}'\n\r
+ label.align_to_existing_structure_view = Align to existing structure view\r
+ label.pdb_entries_couldnt_be_retrieved = The following pdb entries could not be retrieved from the PDB\:\n{0}\nPlease try downloading them manually.\r
+ label.couldnt_load_file = Couldn't load file\r
+ label.couldnt_find_pdb_id_in_file = Couldn't find a PDB id in the file supplied. Please enter an Id to identify this structure.\r
+ label.no_pdb_id_in_file = No PDB Id in File\r
+ label.couldnt_read_pasted_text = Couldn't read the pasted text {0}\r
+ label.error_parsing_text = Error parsing text\r
+ label.enter_local_das_source = Enter Nickname & URL of Local DAS Source\r
+ label.you_can_only_edit_or_remove_local_das_sources = You can only edit or remove local DAS Sources!\r
+ label.public_das_source = Public DAS source - not editable\r
+ label.input_alignment_from_url = Input Alignment From URL\r
+ label.input_alignment = Input Alignment\r
+ label.couldnt_import_as_vamsas_session = Couldn't import '{0}' as a new vamsas session.\r
+ label.vamsas_document_import_failed = Vamsas Document Import Failed\r
+ label.couldnt_locate = Couldn't locate {0}\r
+ label.url_not_found = URL not found\r
+ label.no_link_selected = No link selected\r
+ label.new_sequence_url_link = New sequence URL link\r
+ label.cannot_edit_annotations_in_wrapped_view = Cannot edit annotations in wrapped view\r
+ label.wrapped_view_no_edit = Wrapped view - no edit\r
+ label.error_retrieving_data = Error Retrieving Data\r
+ label.user_colour_scheme_must_have_name = User colour scheme must have a name\r
+ label.no_name_colour_scheme = No name for colour scheme\r
+ label.invalid_url = Invalid URL !\r
+ label.error_loading_file = Error loading file\r
+ label.problems_opening_file = Encountered problems opening {0}!!\r
+ label.file_open_error = File open error\r
+ label.no_das_sources_selected_warn = No das sources were selected.\nPlease select some sources and\ntry again.\r
+ label.no_das_sources_selected_title = No DAS Sources Selected\r
+ label.colour_scheme_exists_overwrite = Colour scheme {0} exists.\nContinue saving colour scheme as {1}?"\r
+ label.duplicate_scheme_name = Duplicate scheme name\r
+ label.jalview_new_questionnaire = There is a new Questionnaire available. Would you like to complete it now ?\n\r
+ label.jalview_user_survey = Jalview User Survey\r
+ label.alignment_properties = Alignment Properties: {0}\r
+ label.alignment_props = Alignment Properties\r
+ label.input_cut_paste = Cut & Paste Input\r
+ label.input_cut_paste_params = Cut & Paste Input - {0}\r
+ label.alignment_output_command = Alignment output - {0}\r
+ label.annotations = Annotations\r
+ label.features = Features\r
+ label.overview_params = Overview {0}\r
+ label.paste_newick_file = Paste Newick file\r
+ label.load_tree_from_file = From File - \r
+ label.colour_by_annotation = Colour by Annotation\r
+ label.selection_output_command = Selection output - {0}\r
+ label.annotation_for_displayid = <p><h2>Annotation for {0} </h2></p><p>\r
+ label.pdb_sequence_mapping = PDB - Sequence Mapping\r
+ label.pca_details = PCA details\r
+ label.redundancy_threshold_selection = Redundancy threshold selection\r
+ label.user_defined_colours = User defined colours\r
+ label.jalviewLite_release = JalviewLite - Release {0}\r
+ label.jaview_build_date = Build date: {0}\r
+ label.jalview_authors_1 = Authors: :  Jim Procter, Andrew Waterhouse, Lauren Lui, Jan Engelhardt, Natasha Sherstnev,\r
+ label.jalview_authors_2 = Daniel Barton, Michele Clamp, James Cuff, Steve Searle, David Martin & Geoff Barton.\r
+ label.jalview_dev_managers = Development managed by The Barton Group, University of Dundee, Scotland, UK.\r
+ label.jalview_distribution_lists = For help, see the FAQ at www.jalview.org and/or join the jalview-discuss@jalview.org mailing list\r
+ label.jalview_please_cite = If  you use Jalview, please cite:\r
+ label.jalview_cite_1_authors = Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)\r
+ label.jalview_cite_1_title = Jalview Version 2 - a multiple sequence alignment editor and analysis workbench\r
+ label.jalview_cite_1_ref = Bioinformatics doi: 10.1093/bioinformatics/btp033\r
+ label.right_click = Right click\r
+ label.to_add_annotation = to add annotation\r
+ label.alignment_has_no_annotations = Alignment has no annotations\r
+ label.retrieving_pdb_data = Retrieving PDB data...\r
+ label.label = Label\r
+ label.no_features_added_to_this_alignment = No Features added to this alignment!!\r
+ label.features_can_be_added_from_searches_1 = (Features can be added from searches or\r
+ label.features_can_be_added_from_searches_2 = from Jalview / GFF features files)\r
+ label.calculating_pca= Calculating PCA\r
+ label.reveal_columns = Reveal Columns\r
+ label.jalview_cannot_open_file = Jalview can't open file\r
+ label.jalview_applet = Jalview applet\r
+ label.loading_data = Loading data\r
+ label.memory_stats = Total Free Memory: {0} MB; Max Memory: {1} MB; {2} %\r
+ label.calculating_tree = Calculating tree\r
+ label.state_queueing = queuing\r
+ label.state_running = running\r
+ label.state_complete = complete\r
+ label.state_completed = finished\r
+ label.state_job_cancelled = job cancelled!!\r
+ label.state_job_error = job error!\r
+ label.server_error_try_later = Server Error! (try later)\r
+ label.error_loading_pdb_data = Error loading PDB data!!\r
+ label.fetching_pdb_data = Fetching PDB data...\r
+ label.structure_type = Structure type\r
+ label.settings_for_type = Settings for {0}\r
+ label.view_full_application = View in Full Application\r
+ label.load_associated_tree = Load Associated Tree ...\r
+ label.load_features_annotations = Load Features/Annotations ...\r
+ label.export_features = Export Features ...\r
+ label.export_annotations = Export Annotations ...\r
+ label.jalview_copy = Copy (Jalview Only)\r
+ label.jalview_cut = Cut (Jalview Only)\r
+ label.to_upper_case = To Upper Case\r
+ label.to_lower_case = To Lower Case\r
+ label.toggle_case = Toggle Case\r
+ label.edit_name_description = Edit Name/Description\r
+ label.create_sequence_feature = Create Sequence Feature\r
+ label.edit_sequence = Edit Sequence\r
+ label.edit_sequences = Edit Sequences\r
+ label.sequence_details = Sequence Details\r
+ label.jmol_help = Jmol Help\r
+ label.all = All\r
+ label.sort_by = Sort by\r
+ label.sort_by_score = Sort by Score\r
+ label.sort_by_density = Sort by Density\r
+ label.sequence_sort_by_density = Sequence sort by Density\r
+ label.reveal = Reveal\r
+ label.hide_columns = Hide Columns\r
+ label.load_jalview_annotations = Load Jalview Annotations or Features File\r
+ label.load_tree_file = Load a tree file\r
+ label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences = Retrieve and parse sequence database records for the alignment or the currently selected sequences\r
+ label.standard_databases = Standard Databases\r
+ label.fetch_embl_uniprot = Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources\r
+ label.reset_min_max_colours_to_defaults = Reset min and max colours to defaults from user preferences.\r
+ label.align_structures_using_linked_alignment_views = Align structures using {0} linked alignment views\r
+ label.connect_to_session = Connect to session {0}\r
+ label.threshold_feature_display_by_score = Threshold the feature display by score.\r
+ label.threshold_feature_no_thereshold = No Threshold\r
+ label.threshold_feature_above_thereshold = Above Threshold\r
+ label.threshold_feature_below_thereshold = Below Threshold\r
+ label.adjust_thereshold = Adjust threshold\r
+ label.toggle_absolute_relative_display_threshold = Toggle between absolute and relative display threshold.\r
+ label.display_features_same_type_different_label_using_different_colour = Display features of the same type with a different label using a different colour. (e.g. domain features)\r
+ label.select_colour_minimum_value = Select Colour for Minimum Value\r
+ label.select_colour_maximum_value = Select Colour for Maximum Value\r
+ label.open_new_jmol_view_with_all_structures_associated_current_selection_superimpose_using_alignment = Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.\r
+ label.open_url_param = Open URL {0}\r
+ label.open_url_seqs_param = Open URL ({0}..) ({1} seqs)\r
+ label.load_pdb_file_associate_with_sequence = Load a PDB file and associate it with sequence '{0}'\r
+ label.reveal_hidden_columns = Reveal Hidden Columns with Right Mouse Button\r
+ label.dark_colour = Dark Colour\r
+ label.light_colour = Light Colour\r
+ label.highlightnode = Left click to select leaves.<br>Double-click to invert leaves.<br>Right click to change colour.\r
+ label.load_colour_scheme = Load colour scheme\r
+ label.toggle_enabled_views = When enabled, allows many views to be selected.\r
+ label.edit_notes_parameter_set = Click to edit the notes for this parameter set.\r
+ label.open_local_file = Open local file\r
+ label.enable_automatically_sort_alignment_when_open_new_tree = Enable this to automatically sort<br>the alignment when you open<br> a new tree.\r
+ label.listen_for_selections = Listen for selections\r
+ label.selections_mirror_selections_made_same_sequences_other_views = When selected, selections in this view will mirror<br>selections made on the same sequences in other views.\r
+ label.toggle_sequence_visibility = Shift+H toggles sequence visiblity\r
+ label.toggle_columns_visibility = Ctrl+H toggles column visiblity.\r
+ label.toggles_visibility_hidden_selected_regions = H toggles visibility of hidden or selected regions\r
+ label.rename_tab_eXpand_reGroup=  Right-click to rename tab <br> Press X to eXpand tabs, G to reGroup.\r
+ label.right_align_sequence_id = Right Align Sequence Id\r
+ label.sequence_id_tooltip = Sequence ID Tooltip\r
+ label.no_services = <No Services>\r
+ label.select_copy_raw_html = Select this if you want to copy raw html\r
+ label.share_data_vamsas_applications = Share data with other vamsas applications\r
+ label.connect_to = Connect to\r
+ label.join_existing_vamsas_session = Join an existing vamsas session\r
+ label.from_url = from URL\r
+ label.any_trees_calculated_or_loaded_alignment_automatically_sort = When selected, any trees calculated or loaded onto the alignment will automatically sort the alignment\r
+ label.sort_with_new_tree = Sort With New Tree\r
+ label.from_textbox = from Textbox\r
+ label.window = Window\r
+ label.preferences = Preferences\r
+ label.tools = Tools\r
+ label.fetch_sequences = Fetch Sequence(s)\r
+ label.stop_vamsas_session = Stop Vamsas Session\r
+ label.collect_garbage = Collect Garbage\r
+ label.show_memory_usage = Show Memory Usage\r
+ label.show_java_console = Show Java Console\r
+ label.show_jalview_news = Show Jalview News\r
+ label.monospaced_fonts_faster_to_render = Monospaced fonts are faster to render\r
+ label.anti_alias_fonts = Anti-alias Fonts (Slower to render)\r
+ label.monospaced_font= Monospaced\r
+ label.quality = Quality\r
+ label.maximize_window = Maximize Window\r
+ label.conservation = Conservation\r
+ label.consensus = Consensus\r
+ label.histogram = Histogram\r
+ label.logo = Logo\r
+ label.non_positional_features = Non-positional Features\r
+ label.database_references = Database References\r
+ label.share_selection_across_views = Share selection across views\r
+ label.scroll_highlighted_regions = Scroll to highlighted regions\r
+ label.gap_symbol = Gap Symbol\r
+ label.alignment_colour = Alignment Colour\r
+ label.address = Address\r
+ label.port = Port\r
+ label.default_browser_unix = Default Browser (Unix)\r
+ label.send_usage_statistics = Send usage statistics\r
+ label.check_for_questionnaires = Check for questionnaires\r
+ label.check_for_latest_version = Check for latest version\r
+ label.url_linkfrom_sequence_id = URL link from Sequence ID\r
+ label.use_proxy_server = Use a proxy server\r
+ label.eps_rendering_style = EPS rendering style\r
+ label.append_start_end = Append /start-end (/15-380)\r
+ label.full_sequence_id = Full Sequence Id\r
+ label.smooth_font = Smooth Font\r
+ label.autocalculate_consensus = AutoCalculate Consensus\r
+ label.pad_gaps = Pad Gaps\r
+ label.pad_gaps_when_editing = Pad Gaps When Editing\r
+ label.automatically_set_id_width = Automatically set ID width\r
+ label.figure_id_column_width = Figure ID column width\r
+ label.use_modeller_output = Use Modeller Output\r
+ label.wrap_alignment = Wrap Alignment\r
+ label.right_align_ids = Right Align Ids\r
+ label.sequence_name_italics = Sequence Name Italics\r
+ label.open_overview = Open Overview\r
+ label.default_colour_scheme_for_alignment = Default Colour Scheme for alignment\r
+ label.annotation_shading_default = Annotation Shading Default\r
+ label.default_minimum_colour_annotation_shading = Default Minimum Colour for annotation shading\r
+ label.default_maximum_colour_annotation_shading = Default Maximum Colour for annotation shading\r
+ label.visual = Visual\r
+ label.connections = Connections\r
+ label.output = Output\r
+ label.editing = Editing\r
+ label.das_settings = DAS Settings\r
+ label.web_services = Web Services\r
+ label.right_click_to_edit_currently_selected_parameter = Right click to edit currently selected parameter.\r
+ label.let_jmol_manage_structure_colours = Let Jmol manage structure colours\r
+ label.marks_leaves_tree_not_associated_with_sequence = Marks leaves of tree not associated with a sequence\r
+ label.index_web_services_menu_by_host_site = Index web services in menu by the host site\r
+ label.option_want_informed_web_service_URL_cannot_be_accessed_jalview_when_starts_up = Check this option if you want to be informed<br>when a web service URL cannot be accessed by Jalview<br>when it starts up\r
+ label.new_service_url = New Service URL\r
+ label.edit_service_url = Edit Service URL\r
+ label.delete_service_url = Delete Service URL\r
+ label.details = Details\r
+ label.options = Options\r
+ label.parameters = Parameters\r
+ label.available_das_sources = Available DAS Sources\r
+ label.full_details = Full Details\r
+ label.authority = Authority\r
+ label.type = Type\r
+ label.proxy_server = Proxy Server\r
+ label.file_output = File Output\r
+ label.select_input_type = Select input type\r
+ label.set_options_for_type = Set options for type\r
+ label.data_input_parameters = Data input parameters\r
+ label.data_returned_by_service = Data returned by service\r
+ label.rsbs_encoded_service = RSBS Encoded Service\r
+ label.parsing_errors = Parsing errors\r
+ label.simple_bioinformatics_rest_services = Simple Bioinformatics Rest Services\r
+ label.web_service_discovery_urls = Web Service Discovery URLS\r
+ label.input_parameter_name = Input Parameter name\r
+ label.short_descriptive_name_for_service = Short descriptive name for service\r
+ label.function_service_performs = What kind of function the service performs (e.g. alignment, analysis, search, etc).\r
+ label.brief_description_service = Brief description of service\r
+ label.url_post_data_service = URL to post data to service. Include any special parameters needed here\r
+ label.optional_suffix = Optional suffix added to URL when retrieving results from service\r
+ label.preferred_gap_character = Which gap character does this service prefer?\r
+ label.gap_character = Gap character\r
+ label.move_return_type_up_order= Move return type up order\r
+ label.move_return_type_down_order= Move return type down order\r
+ label.update_user_parameter_set = Update this existing user parameter set\r
+ label.delete_user_parameter_set = Delete the currently selected user parameter set\r
+ label.create_user_parameter_set = Create a new parameter set with the current settings.\r
+ label.revert_changes_user_parameter_set = Undo all changes to the current parameter set\r
+ label.start_job_current_settings = Start Job with current settings\r
+ label.cancel_job_close_dialog = Close this dialog and cancel job\r
+ label.input_output = Input/Output\r
+ label.cut_paste = Cut'n'Paste\r
+ label.adjusting_parameters_for_calculation = Adjusting parameters for existing Calculation\r
+ label.2d_rna_structure_line = 2D RNA {0}\r
+ label.2d_rna_sequence_name = 2D RNA - {0}\r
+ label.edit_name_and_description_current_group = Edit name and description of current group.\r
+ label.view_structure_for = View structure for {0}\r
+ label.view_all_structures = View all {0} structures.\r
+ label.view_all_representative_structures = View all {0} representative structures.\r
+ label.open_new_jmol_view_with_all_representative_structures_associated_current_selection_superimpose_using_alignment = "Opens a new Jmol view with all representative structures\nassociated with the current selection\nsuperimposed with the current alignment."\r
+ label.associate_structure_with_sequence = Associate Structure with Sequence\r
+ label.from_file = from file\r
+ label.enter_pdb_id = Enter PDB Id\r
+ label.discover_pdb_ids = Discover PDB ids\r
+ label.text_colour = Text Colour\r
+ label.structure = Structure\r
+ label.view_structure = View Structure\r
+ label.clustalx_colours = Clustalx colours\r
+ label.above_identity_percentage = Above % Identity\r
+ label.create_sequence_details_report_annotation_for = Annotation for {0}\r
+ label.sequece_details_for = Sequece Details for {0}\r
+ label.sequence_name = Sequence Name\r
+ label.sequence_description = Sequence Description\r
+ label.edit_sequence_name_description = Edit Sequence Name/Description\r
+ label.spaces_converted_to_backslashes = Spaces have been converted to _\r
+ label.no_spaces_allowed_sequence_name = No spaces allowed in Sequence Name\r
+ label.select_outline_colour = Select Outline Colour\r
+ label.web_browser_not_found_unix = Unixers\: Couldn't find default web browser.\nAdd the full path to your browser in Preferences."\r
+ label.web_browser_not_found = Web browser not found\r
+ label.select_pdb_file_for = Select a PDB file for {0}\r
+ label.html = HTML\r
+ label.wrap = Wrap\r
+ label.show_database_refs = Show Database Refs\r
+ label.show_non_positional_features = Show Non-Positional Features\r
+ label.save_png_image = Save As PNG Image\r
+ label.load_tree_for_sequence_set = Load a tree for this sequence set\r
+ label.export_image = Export Image\r
+ label.vamsas_store = VAMSAS store\r
+ label.translate_cDNA = Translate cDNA\r
+ label.extract_scores = Extract Scores\r
+ label.get_cross_refs = Get Cross References\r
+ label.sort_alignment_new_tree = Sort Alignment With New Tree\r
+ label.add_sequences = Add Sequences\r
+ label.new_window = New Window\r
+ label.refresh_available_sources = Refresh Available Sources\r
+ label.use_registry = Use Registry\r
+ label.add_local_source = Add Local Source\r
+ label.set_as_default = Set as Default\r
+ label.show_labels = Show labels\r
+ label.background_colour = Background Colour\r
+ label.associate_nodes_with = Associate Nodes With\r
+ label.jalview_pca_calculation = Jalview PCA Calculation\r
+ label.link_name = Link Name\r
+ label.pdb_file = PDB file\r
+ label.colour_with_jmol = Colour with Jmol\r
+ label.align_structures = Align structures\r
+ label.jmol = Jmol\r
+ label.sort_alignment_by_tree = Sort Alignment By Tree\r
+ label.mark_unlinked_leaves = Mark Unlinked Leaves\r
+ label.associate_leaves_with = Associate Leaves With\r
+ label.save_colour_scheme_with_unique_name_added_to_colour_menu = Save your colour scheme with a unique name and it will be added to the Colour menu\r
+ label.case_sensitive = Case Sensitive\r
+ label.lower_case_colour = Lower Case Colour\r
+ label.index_by_host = Index by host\r
+ label.index_by_type = Index by type\r
+ label.enable_jabaws_services = Enable JABAWS Services\r
+ label.display_warnings = Display warnings\r
+ label.move_url_up = Move URL up\r
+ label.move_url_down = Move URL down\r
+ label.add_sbrs_definition = Add a SBRS definition\r
+ label.edit_sbrs_definition = Edit SBRS definition\r
+ label.delete_sbrs_definition = Delete SBRS definition\r
+ label.your_sequences_have_been_verified = Your sequences have been verified against known sequence databases. Some of the ids have been\n altered, most likely the start/end residue will have been updated.\n Save your alignment to maintain the updated id.\n\n\r
+ label.sequence_names_updated = Sequence names updated\r
+ label.dbref_search_completed = DBRef search completed\r
+ label.show_all_chains = Show all chains\r
+ label.fetch_all_param = Fetch all {0}\r
+ label.paste_new_window = Paste To New Window\r
+ label.settings_for_param = Settings for {0}\r
+ label.view_params = View {0}\r
+ label.select_all_views = Select all views\r
+ label.align_sequences_to_existing_alignment = Align sequences to an existing alignment\r
+ label.realign_with_params = Realign with {0}\r
+ label.calcname_with_default_settings = {0} with Defaults\r
+ label.action_with_default_settings = {0} with default settings\r
+ label.edit_settings_and_run = Edit settings and run...\r
+ label.view_and_change_parameters_before_alignment = View and change the parameters before alignment\r
+ label.run_with_preset_params = Run {0} with preset\r
+ label.view_and_change_parameters_before_running_calculation = View and change parameters before running calculation\r
+ label.view_documentation = View documentation\r
+ label.select_return_type = Select return type\r
+ label.translation_of_params = Translation of {0}\r
+ label.features_for_params = Features for - {0}\r
+ label.annotations_for_params = Annotations for - {0}\r
+ label.generating_features_for_params = Generating features for - {0}\r
+ label.generating_annotations_for_params = Generating annotations for - {0}\r
+ label.varna_params = VARNA - {0}\r
+ label.sequence_feature_settings = Sequence Feature Settings\r
+ label.pairwise_aligned_sequences = Pairwise Aligned Sequences\r
+ label.original_data_for_params = Original Data for {0}\r
+ label.points_for_params = Points for {0}\r
+ label.transformed_points_for_params = Transformed points for {0}\r
+ label.graduated_color_for_params = Graduated Feature Colour for {0}\r
+ label.select_backgroud_colour = Select Background Colour\r
+ label.invalid_font = Invalid Font\r
+ label.separate_multiple_accession_ids = Separate multiple accession ids with semi colon ";"\r
+ label.replace_commas_semicolons = Replace commas with semi-colons\r
+ label.parsing_failed_syntax_errors_shown_below_param = Parsing failed. Syntax errors shown below {0}\r
+ label.parsing_failed_unrecoverable_exception_thrown_param = \nParsing failed. An unrecoverable exception was thrown:\n {0}\r
+ label.example_query_param = Example query: {0}\r
+ label.enter_value_increase_conservation_visibility = Enter value to increase conservation visibility\r
+ label.enter_percentage_identity_above_which_colour_residues = Enter % identity above which to colour residues\r
+ label.wswublast_client_credits = To display sequence features an exact Uniprot id with 100% sequence identity match must be entered.\nIn order to display these features, try changing the names of your sequences to the ids suggested below.\n\nRunning WSWUBlast at EBI.\nPlease quote Pillai S., Silventoinen V., Kallio K., Senger M., Sobhany S., Tate J., Velankar S., Golovin A., Henrick K., Rice P., Stoehr P., Lopez R.\nSOAP-based services provided by the European Bioinformatics Institute.\nNucleic Acids Res. 33(1):W25-W28 (2005));\r
+ label.blasting_for_unidentified_sequence = BLASTing for unidentified sequences
+ label.select_columns_containing = Select columns containing\r
+ label.select_columns_not_containing = Select columns that do not contain\r
+ option.trim_retrieved_seqs = Trim retrieved sequences\r
+ label.trim_retrieved_sequences = When the reference sequence is longer than the sequence that you are working with, only keep the relevant subsequences.\r
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.api;
  
+ import java.awt.Color;
  import java.util.Hashtable;
  import java.util.Map;
  
+ import jalview.analysis.Conservation;
  import jalview.datamodel.AlignmentAnnotation;
  import jalview.datamodel.AlignmentI;
+ import jalview.datamodel.AlignmentView;
+ import jalview.datamodel.CigarArray;
  import jalview.datamodel.ColumnSelection;
  import jalview.datamodel.SequenceCollectionI;
+ import jalview.datamodel.SequenceGroup;
  import jalview.datamodel.SequenceI;
  import jalview.schemes.ColourSchemeI;
  
@@@ -154,28 -160,34 +160,57 @@@ public interface AlignViewport
     */
    void updateGroupAnnotationSettings(boolean applyGlobalSettings,
            boolean preserveNewGroupSettings);
 +  
 +  /**
 +   * @return true if a reference sequence is set and should be displayed
 +   */
 +  public boolean isDisplayReferenceSeq();
 +
 +  /**
 +   * @return set the flag for displaying reference sequences when they are
 +   *         available
 +   */
 +  public void setDisplayReferenceSeq(boolean displayReferenceSeq);
 +
 +  /**
 +   * @return true if colourschemes should render according to reference sequence
 +   *         rather than consensus if available
 +   */
 +  public boolean isColourByReferenceSeq();
 +
 +  /**
 +   * @return true set flag for deciding if colourschemes should render according
 +   *         to reference sequence rather than consensus if available
 +   */
 +  public void setColourByReferenceSeq(boolean colourByReferenceSeq);
  
+   void setSequenceColour(SequenceI seq, Color col);
+   Color getSequenceColour(SequenceI seq);
+   void updateSequenceIdColours();
+   SequenceGroup getSelectionGroup();
+   SequenceI[] getSequenceSelection();
+   void clearSequenceColours();
+   CigarArray getViewAsCigars(boolean selectedRegionOnly);
+   AlignmentView getAlignmentView(boolean selectedOnly);
+   AlignmentView getAlignmentView(boolean selectedOnly, boolean markGroups);
+   String[] getViewAsString(boolean selectedRegionOnly);
+   void setSelectionGroup(SequenceGroup sg);
+   char getGapCharacter();
+   void setColumnSelection(ColumnSelection cs);
+   void setConservation(Conservation cons);
  }
index daf5457,13dcd05..75cb494
mode 100755,100644..100644
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.appletgui;
  
  import java.util.*;
 -
  import java.awt.*;
  import java.awt.event.*;
  
@@@ -25,6 -27,7 +26,7 @@@ import jalview.analysis.*
  import jalview.commands.*;
  import jalview.datamodel.*;
  import jalview.schemes.*;
+ import jalview.util.MessageManager;
  import jalview.util.UrlLink;
  import jalview.io.AppletFormatAdapter;
  import jalview.io.SequenceAnnotationReport;
@@@ -68,6 -71,8 +70,8 @@@ public class APopupMenu extends java.aw
  
    MenuItem unGroupMenuItem = new MenuItem();
  
+   MenuItem createGroupMenuItem = new MenuItem();
    MenuItem nucleotideMenuItem = new MenuItem();
  
    Menu colourMenu = new Menu();
  
    CheckboxMenuItem displayNonconserved = new CheckboxMenuItem();
  
-   Menu editMenu = new Menu("Edit");
+   Menu editMenu = new Menu(MessageManager.getString("action.edit"));
  
-   MenuItem copy = new MenuItem("Copy (Jalview Only)");
+   MenuItem copy = new MenuItem(MessageManager.getString("label.jalview_copy"));
  
-   MenuItem cut = new MenuItem("Cut (Jalview Only)");
+   MenuItem cut = new MenuItem(MessageManager.getString("label.jalview_cut"));
  
-   MenuItem toUpper = new MenuItem("To Upper Case");
+   MenuItem toUpper = new MenuItem(MessageManager.getString("label.to_upper_case"));
  
-   MenuItem toLower = new MenuItem("To Lower Case");
+   MenuItem toLower = new MenuItem(MessageManager.getString("label.to_lower_case"));
  
-   MenuItem toggleCase = new MenuItem("Toggle Case");
+   MenuItem toggleCase = new MenuItem(MessageManager.getString("label.toggle_case"));
  
    Menu outputmenu = new Menu();
  
  
    MenuItem repGroup = new MenuItem();
  
-   MenuItem sequenceName = new MenuItem("Edit Name/Description");
+   MenuItem sequenceName = new MenuItem(MessageManager.getString("label.edit_name_description"));
  
-   MenuItem sequenceFeature = new MenuItem("Create Sequence Feature");
+   MenuItem sequenceFeature = new MenuItem(MessageManager.getString("label.create_sequence_feature"));
  
-   MenuItem editSequence = new MenuItem("Edit Sequence");
+   MenuItem editSequence = new MenuItem(MessageManager.getString("label.edit_sequence"));
  
-   MenuItem sequenceDetails = new MenuItem("Sequence Details ...");
+   MenuItem sequenceDetails = new MenuItem(MessageManager.getString("label.sequence_details") + "...");
  
-   MenuItem selSeqDetails = new MenuItem("Sequence Details ...");
+   MenuItem selSeqDetails = new MenuItem(MessageManager.getString("label.sequence_details") + "...");
  
 +  MenuItem makeReferenceSeq = new MenuItem();
 +  
    Sequence seq;
  
    MenuItem revealAll = new MenuItem();
  
      if (sg != null && sg.getSize() > 0)
      {
-       editGroupName.setLabel("Name: " + sg.getName());
+       editGroupName.setLabel(MessageManager.formatMessage("label.name_param", new String[]{sg.getName()}));
        showText.setState(sg.getDisplayText());
        showColourText.setState(sg.getColourText());
        showBoxes.setState(sg.getDisplayBoxes());
        displayNonconserved.setState(sg.getShowNonconserved());
        if (!ap.av.getAlignment().getGroups().contains(sg))
        {
+         menu1.setLabel(MessageManager.getString("action.edit_new_group"));
          groupMenu.remove(unGroupMenuItem);
+       } else {
+         menu1.setLabel(MessageManager.getString("action.edit_group"));
+         groupMenu.remove(createGroupMenuItem);
        }
  
      }
  
      if (links != null && links.size() > 0)
      {
-       Menu linkMenu = new Menu("Link");
+       Menu linkMenu = new Menu(MessageManager.getString("action.link"));
        String link;
        for (int i = 0; i < links.size(); i++)
        {
      if (seq != null)
      {
        seqMenu.setLabel(seq.getName());
 +      if (seq == ap.av.getAlignment().getSeqrep())
 +      {
-         makeReferenceSeq.setLabel("Unmark representative");
++        makeReferenceSeq.setLabel(MessageManager.getString("action.unmark_as_reference"));// Unmark representative");
 +      } else {
-         makeReferenceSeq.setLabel("Mark as representative");
++        makeReferenceSeq.setLabel(MessageManager.getString("action.set_as_reference")); // );
 +      }
-       repGroup.setLabel("Represent Group with " + seq.getName());
+       repGroup.setLabel(MessageManager.formatMessage("label.represent_group_with", new String[]{seq.getName()}));
      }
      else
      {
        unGroupMenuItem_actionPerformed();
      }
  
+     else if (source == createGroupMenuItem)
+     {
+       createGroupMenuItem_actionPerformed();
+     }
      else if (source == sequenceName)
      {
        editName();
      }
 +    else if (source == makeReferenceSeq)
 +    {
 +      makeReferenceSeq_actionPerformed();
 +    }
      else if (source == sequenceDetails)
      {
        showSequenceDetails();
      Frame frame = new Frame();
      frame.add(cap);
      jalview.bin.JalviewLite.addFrame(frame,
-             "Selection output - " + e.getActionCommand(), 600, 500);
+               MessageManager.formatMessage("label.selection_output_command", new String[]{e.getActionCommand()}),600, 500);
      // JBPNote: getSelectionAsNewSequence behaviour has changed - this method
      // now returns a full copy of sequence data
      // TODO consider using getSequenceSelection instead here
      StringBuffer contents = new StringBuffer();
      for (SequenceI seq : sequences)
      {
-       contents.append("<p><h2>Annotation for " + seq.getDisplayId(true)
-               + "</h2></p><p>");
+       contents.append(MessageManager.formatMessage("label.annotation_for_displayid",new String[]{seq.getDisplayId(true)}));
        new SequenceAnnotationReport(null)
                .createSequenceAnnotationReport(
                        contents,
      jalview.bin.JalviewLite.addFrame(frame, "Sequence Details for "
              + (sequences.length == 1 ? sequences[0].getDisplayId(true)
                      : "Selection"), 600, 500);
-     cap.setText("<html>" + contents.toString() + "</html>");
+     cap.setText(MessageManager.formatMessage("label.html_content", new String[]{contents.toString()}));
    }
  
    void editName()
      else
      {
        CutAndPasteTransfer cap = new CutAndPasteTransfer(true, ap.alignFrame);
-       cap.setText("Paste your PDB file here.");
+       cap.setText(MessageManager.getString("label.paste_pdb_file"));
        cap.setPDBImport(seq);
        Frame frame = new Frame();
        frame.add(cap);
        jalview.bin.JalviewLite.addFrame(frame,
-               "Paste PDB file for sequence " + seq.getName(), 400, 300);
+               MessageManager.formatMessage("label.paste_pdb_file_for_sequence",  new String[]{seq.getName()}), 400, 300);
      }
    }
  
    private void jbInit() throws Exception
    {
-     groupMenu.setLabel("Group");
-     groupMenu.setLabel("Selection");
+     groupMenu.setLabel(MessageManager.getString("label.selection"));
      sequenceFeature.addActionListener(this);
  
      editGroupName.addActionListener(this);
-     unGroupMenuItem.setLabel("Remove Group");
+     unGroupMenuItem.setLabel(MessageManager.getString("action.remove_group"));
      unGroupMenuItem.addActionListener(this);
  
-     nucleotideMenuItem.setLabel("Nucleotide");
+     createGroupMenuItem.setLabel(MessageManager.getString("action.create_group"));
+     createGroupMenuItem.addActionListener(this);
+     nucleotideMenuItem.setLabel(MessageManager.getString("label.nucleotide"));
      nucleotideMenuItem.addActionListener(this);
      conservationMenuItem.addItemListener(this);
      abovePIDColour.addItemListener(this);
-     colourMenu.setLabel("Group Colour");
-     showBoxes.setLabel("Boxes");
+     colourMenu.setLabel(MessageManager.getString("label.group_colour"));
+     showBoxes.setLabel(MessageManager.getString("label.boxes"));
      showBoxes.setState(true);
      showBoxes.addItemListener(this);
      sequenceName.addActionListener(this);
      sequenceDetails.addActionListener(this);
      selSeqDetails.addActionListener(this);
-     displayNonconserved.setLabel("Show Nonconserved");
+     displayNonconserved.setLabel(MessageManager.getString("label.show_non_conversed"));
      displayNonconserved.setState(false);
      displayNonconserved.addItemListener(this);
-     showText.setLabel("Text");
+     showText.setLabel(MessageManager.getString("label.text"));
      showText.addItemListener(this);
-     showColourText.setLabel("Colour Text");
+     showColourText.setLabel(MessageManager.getString("label.colour_text"));
      showColourText.addItemListener(this);
-     outputmenu.setLabel("Output to Textbox...");
-     seqMenu.setLabel("Sequence");
-     pdb.setLabel("View PDB Structure");
-     hideSeqs.setLabel("Hide Sequences");
-     repGroup.setLabel("Represent Group with");
-     revealAll.setLabel("Reveal All");
-     revealSeq.setLabel("Reveal Sequences");
-     menu1.setLabel("Group");
+     outputmenu.setLabel(MessageManager.getString("label.out_to_textbox"));
+     seqMenu.setLabel(MessageManager.getString("label.sequence"));
+     pdb.setLabel(MessageManager.getString("label.view_pdb_structure"));
+     hideSeqs.setLabel(MessageManager.getString("action.hide_sequences"));
+     repGroup.setLabel(MessageManager.formatMessage("label.represent_group_with", new String[]{""}));
+     revealAll.setLabel(MessageManager.getString("action.reveal_all"));
+     revealSeq.setLabel(MessageManager.getString("action.reveal_sequences"));
+     menu1.setLabel(MessageManager.getString("label.group")+":");
      add(groupMenu);
      this.add(seqMenu);
      this.add(hideSeqs);
      this.add(revealSeq);
      this.add(revealAll);
      // groupMenu.add(selSeqDetails);
      groupMenu.add(editMenu);
      groupMenu.add(outputmenu);
      groupMenu.add(sequenceFeature);
+     groupMenu.add(createGroupMenuItem);
+     groupMenu.add(unGroupMenuItem);
      groupMenu.add(menu1);
  
      colourMenu.add(noColourmenuItem);
      toLower.addActionListener(this);
      editMenu.add(toggleCase);
      seqMenu.add(sequenceName);
 +    seqMenu.add(makeReferenceSeq);
      // seqMenu.add(sequenceDetails);
  
      if (!ap.av.applet.useXtrnalSviewer)
        seqMenu.add(pdb);
      }
      seqMenu.add(repGroup);
-     menu1.add(unGroupMenuItem);
+     menu1.add(editGroupName);
      menu1.add(colourMenu);
      menu1.add(showBoxes);
      menu1.add(showText);
      repGroup.addActionListener(this);
      revealAll.addActionListener(this);
      revealSeq.addActionListener(this);
 +    makeReferenceSeq.addActionListener(this);
    }
  
    void refresh()
      ap.paintAlignment(true);
    }
  
+   void createGroupMenuItem_actionPerformed()
+   {
+     getGroup(); // implicitly create group
+     refresh();
+   }
    public void showColourText_itemStateChanged()
    {
      getGroup().setColourText(showColourText.getState());
      getGroup().setDisplayText(showText.getState());
      refresh();
    }
 +  public void makeReferenceSeq_actionPerformed()
 +  {
 +    if (!ap.av.getAlignment().hasSeqrep())
 +    {
 +      // initialise the display flags so the user sees something happen
 +      ap.av.setDisplayReferenceSeq(true);
 +      ap.av.setColourByReferenceSeq(true);
 +      ap.av.getAlignment().setSeqrep(seq);
 +    }
 +    else
 +    {
 +      if (ap.av.getAlignment().getSeqrep() == seq)
 +      {
 +        ap.av.getAlignment().setSeqrep(null);
 +      }
 +      else
 +      {
 +        ap.av.getAlignment().setSeqrep(seq);
 +      }
 +    }
 +    refresh();
 +  }
  
    public void showNonconserved_itemStateChanged()
    {
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
@@@ -14,6 -14,7 +14,7 @@@
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.appletgui;
  
@@@ -224,7 -225,7 +225,7 @@@ public class IdCanvas extends Pane
  
            SequenceI s = av.getAlignment().getSequenceAt(i);
            gg.setFont(italic);
 -          if (av.hasHiddenRows())
 +          if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
            {
              setHiddenFont(s);
            }
          }
          gg.setFont(italic);
          // boolean isrep=false;
 -        if (av.hasHiddenRows())
 +        if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
          {
            // isrep =
            setHiddenFont(seq);
      Font bold = new Font(av.getFont().getName(), Font.BOLD, av.getFont()
              .getSize());
  
 -    if (av.getHiddenRepSequences() != null
 -            && av.getHiddenRepSequences().containsKey(seq))
 +    if (av.isHiddenRepSequence(seq))
      {
        gg.setFont(bold);
        return true;
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
@@@ -14,6 -14,7 +14,7 @@@
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.appletgui;
  
@@@ -201,7 -202,7 +202,7 @@@ public class SequenceRenderer implement
      }
  
      char s = ' ';
 -
 +    boolean srep = av.isDisplayReferenceSeq();
      for (int i = start; i <= end; i++)
      {
        graphics.setColor(Color.black);
          }
          if (currentSequenceGroup.getShowNonconserved())
          {
 -          // cheat - use this if we have a consensus for each group: s =
 -          // getDisplayChar(currentSequenceGroup.getConsensus(), i, s, '.');
 -          s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
 +          s = getDisplayChar(srep, i, s,
                    '.');
          }
        }
          }
          if (av.getShowUnconserved())
          {
 -          s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
 +          s = getDisplayChar(srep, i, s,
                    '.');
  
          }
  
    }
  
 -  private char getDisplayChar(AlignmentAnnotation consensus, int position,
 +  private char getDisplayChar(final boolean usesrep, int position,
            char s, char c)
    {
 -    char conschar = consensus.annotations[position].displayCharacter
 +    // TODO - use currentSequenceGroup rather than alignemnt 
 +    // currentSequenceGroup.getConsensus()
 +    char conschar = (usesrep) ? av.getAlignment().getSeqrep().getCharAt(position) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
              .charAt(0);
      if (conschar != '-' && s == conschar)
      {
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
@@@ -14,6 -14,7 +14,7 @@@
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.datamodel;
  
@@@ -370,7 -371,7 +371,7 @@@ public class Alignment implements Align
              return;
            }
          }
+         sg.setContext(this);
          groups.add(sg);
        }
      }
        {
          removeAnnotationForGroup(null);
        }
+       for (SequenceGroup sg:groups) {
+         sg.setContext(null);
+       }
        groups.clear();
      }
    }
        {
          removeAnnotationForGroup(g);
          groups.remove(g);
+         g.setContext(null);
        }
      }
    }
       hasRNAStructure = true;
     }
   }
 +
 + private SequenceI seqrep=null;
 +
 + /**
 +  * 
 +  * @return the representative sequence for this group
 +  */
 + public SequenceI getSeqrep()
 + {
 +   return seqrep;
 + }
 +
 + /**
 +  * set the representative sequence for this group. Note - this affects the
 +  * interpretation of the Hidereps attribute.
 +  * 
 +  * @param seqrep
 +  *          the seqrep to set (null means no sequence representative)
 +  */
 + public void setSeqrep(SequenceI seqrep)
 + {
 +   this.seqrep = seqrep;
 + }
 +
 + /**
 +  * 
 +  * @return true if group has a sequence representative
 +  */
 + public boolean hasSeqrep()
 + {
 +   return seqrep != null;
 + }
++
+  @Override
+ public int getEndRes()
+ {
+   return getWidth()-1;
+ }@Override
+ public int getStartRes()
+ {
+   return 0;
+ }
+ /* In the case of AlignmentI - returns the dataset for the alignment, if set
+  * (non-Javadoc)
+  * @see jalview.datamodel.AnnotatedCollectionI#getContext()
+  */
+ @Override
+ public AnnotatedCollectionI getContext()
+ {
+   return dataset;
+ }
++
  }
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
@@@ -14,6 -14,7 +14,7 @@@
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.datamodel;
  
@@@ -26,21 -27,19 +27,34 @@@ public interface SequenceCollection
  
    List<SequenceI> getSequences(
            Map<SequenceI, SequenceCollectionI> hiddenReps);
 -
    int getWidth();
 +  /**
 +   * 
 +   * @return true if getSeqrep doesn't return null
 +   */
 +  boolean hasSeqrep();
 +  /**
 +   * get the reference or representative sequence within this collection
 +   * @return null or the current reference sequence
 +   */
 +  SequenceI getSeqrep();
 +  /**
 +   * set the reference or representative sequence for this collection. 
 +   * Reference is assumed to be present within the collection.
 +   * @return
 +   */
 +  void setSeqrep(SequenceI refseq);
+   /** 
+   * @return the first column included in this collection. Runs from 0<=i<N_cols
+   */
+   int getStartRes();
+   
+   /**
+    * 
+    * @return the last column in this collection. Runs from 0<=i<N_cols
+    */
+   int getEndRes();
  }
index 05799a8,d475c91..a494708
mode 100755,100644..100644
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.gui;
  
  import jalview.analysis.AAFrequency;
  import jalview.analysis.AlignmentSorter;
+ import jalview.analysis.AlignmentUtils;
  import jalview.analysis.Conservation;
  import jalview.analysis.CrossRef;
  import jalview.analysis.NJTree;
  import jalview.analysis.ParseProperties;
  import jalview.analysis.SequenceIdMatcher;
+ import jalview.api.AlignViewControllerGuiI;
+ import jalview.api.AlignViewControllerI;
+ import jalview.api.analysis.ScoreModelI;
  import jalview.bin.Cache;
  import jalview.commands.CommandI;
  import jalview.commands.EditCommand;
@@@ -75,12 -80,13 +80,13 @@@ import jalview.schemes.TaylorColourSche
  import jalview.schemes.TurnColourScheme;
  import jalview.schemes.UserColourScheme;
  import jalview.schemes.ZappoColourScheme;
+ import jalview.util.MessageManager;
  import jalview.ws.jws1.Discoverer;
  import jalview.ws.jws2.Jws2Discoverer;
+ import jalview.ws.jws2.jabaws2.Jws2Instance;
  import jalview.ws.seqfetcher.DbSourceProxy;
  
  import java.awt.BorderLayout;
- import java.awt.Color;
  import java.awt.Component;
  import java.awt.GridLayout;
  import java.awt.Rectangle;
@@@ -112,6 -118,7 +118,7 @@@ import java.util.List
  import java.util.Vector;
  
  import javax.swing.JButton;
+ import javax.swing.JCheckBoxMenuItem;
  import javax.swing.JEditorPane;
  import javax.swing.JInternalFrame;
  import javax.swing.JLabel;
@@@ -132,7 -139,7 +139,7 @@@ import javax.swing.SwingUtilities
   * @version $Revision$
   */
  public class AlignFrame extends GAlignFrame implements DropTargetListener,
-         IProgressIndicator
+         IProgressIndicator, AlignViewControllerGuiI
  {
  
    /** DOCUMENT ME!! */
    public AlignmentPanel alignPanel;
  
    AlignViewport viewport;
+  
+   public AlignViewControllerI avc;
+  
  
    Vector alignPanels = new Vector();
  
     */
    void init()
    {
+     avc = new jalview.controller.AlignViewController(this, viewport, alignPanel);
      if (viewport.getAlignmentConservationAnnotation() == null)
      {
        BLOSUM62Colour.setEnabled(false);
  
      setMenusFromViewport(viewport);
      buildSortByAnnotationScoresMenu();
+     buildTreeMenu();
      if (viewport.wrapAlignment)
      {
        wrapMenuItem_actionPerformed(null);
      }
  
      addKeyListener();
+     
    }
  
    /**
  
          case KeyEvent.VK_F2:
            viewport.cursorMode = !viewport.cursorMode;
-           statusBar.setText("Keyboard editing mode is "
-                   + (viewport.cursorMode ? "on" : "off"));
+           statusBar.setText(MessageManager.formatMessage("label.keyboard_editing_mode", new String[]{(viewport.cursorMode ? "on" : "off")}));
            if (viewport.cursorMode)
            {
              alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
    public void addAlignmentPanel(final AlignmentPanel ap, boolean newPanel)
    {
      ap.alignFrame = this;
+     avc = new jalview.controller.AlignViewController(this, viewport, alignPanel);
  
      alignPanels.addElement(ap);
  
      rnahelicesColour
              .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour);
      setShowProductsEnabled();
      updateEditMenuBar();
    }
  
      final JPanel progressPanel = (JPanel) progressBars.get(new Long(id));
      if (handler.canCancel())
      {
-       JButton cancel = new JButton("Cancel");
+       JButton cancel = new JButton(MessageManager.getString("action.cancel"));
        final IProgressIndicator us = this;
        cancel.addActionListener(new ActionListener()
        {
      return false;
    }
  
+   @Override
+   public void setStatus(String text) {
+     statusBar.setText(text);
+   };
    /*
     * Added so Castor Mapping file can obtain Jalview Version
     */
  
      chooser.setFileView(new JalviewFileView());
      chooser.setDialogTitle("Save Alignment to file");
-     chooser.setToolTipText("Save");
+     chooser.setToolTipText(MessageManager.getString("action.save"));\r
  
      int value = chooser.showSaveDialog(this);
  
        if (currentFileFormat == null)
        {
          JOptionPane.showInternalMessageDialog(Desktop.desktop,
-                 "You must select a file format before saving!",
-                 "File format not specified", JOptionPane.WARNING_MESSAGE);
+                 MessageManager.getString("label.select_file_format_before_saving"),
+                 MessageManager.getString("label.file_format_not_specified"), JOptionPane.WARNING_MESSAGE);
          value = chooser.showSaveDialog(this);
          return;
        }
  
        success = new Jalview2XML().SaveAlignment(this, file, shortName);
  
-       statusBar.setText("Successfully saved to file: " + fileName + " in "
-               + format + " format.");
+       statusBar.setText(MessageManager.formatMessage("label.successfully_saved_to_file_in_format",new String[]{fileName, format}));
  
      }
      else
          int reply = JOptionPane
                  .showInternalConfirmDialog(
                          Desktop.desktop,
-                         "The Alignment contains hidden columns."
-                                 + "\nDo you want to save only the visible alignment?",
-                         "Save / Omit Hidden Columns",
+                         MessageManager.getString("label.alignment_contains_hidden_columns"),
+                         MessageManager.getString("action.save_omit_hidden_columns"),
                          JOptionPane.YES_NO_OPTION,
                          JOptionPane.QUESTION_MESSAGE);
  
            out.print(output);
            out.close();
            this.setTitle(file);
-           statusBar.setText("Successfully saved to file: " + fileName
-                   + " in " + format + " format.");
+           statusBar.setText(MessageManager.formatMessage("label.successfully_saved_to_file_in_format",new String[]{fileName, format}));
          } catch (Exception ex)
          {
            success = false;
  
      if (!success)
      {
-       JOptionPane.showInternalMessageDialog(this, "Couldn't save file: "
-               + fileName, "Error Saving File", JOptionPane.WARNING_MESSAGE);
+       JOptionPane.showInternalMessageDialog(this, MessageManager.formatMessage("label.couldnt_save_file", new String[]{fileName}),
+               MessageManager.getString("label.error_saving_file"), JOptionPane.WARNING_MESSAGE);
      }
  
      return success;
        int reply = JOptionPane
                .showInternalConfirmDialog(
                        Desktop.desktop,
-                       "The Alignment contains hidden columns."
-                               + "\nDo you want to output only the visible alignment?",
-                       "Save / Omit Hidden Columns",
+                       MessageManager.getString("label.alignment_contains_hidden_columns"),
+                       MessageManager.getString("action.save_omit_hidden_columns"),
                        JOptionPane.YES_NO_OPTION,
                        JOptionPane.QUESTION_MESSAGE);
  
                viewport.getAlignment(), omitHidden,
                viewport.getColumnSelection()));
        Desktop.addInternalFrame(cap,
-               "Alignment output - " + e.getActionCommand(), 600, 500);
+               MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}), 600, 500);\r
      } catch (OutOfMemoryError oom)
      {
        new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom);
      JalviewFileChooser chooser = new JalviewFileChooser(
              jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
      chooser.setFileView(new JalviewFileView());
-     chooser.setDialogTitle("Load Jalview Annotations or Features File");
-     chooser.setToolTipText("Load Jalview Annotations / Features file");
+     chooser.setDialogTitle(MessageManager.getString("label.load_jalview_annotations"));\r
+     chooser.setToolTipText(MessageManager.getString("label.load_jalview_annotations"));\r
  
      int value = chooser.showOpenDialog(null);
  
      {
        undoMenuItem.setEnabled(true);
        CommandI command = (CommandI) viewport.historyList.peek();
-       undoMenuItem.setText("Undo " + command.getDescription());
+       undoMenuItem.setText(MessageManager.formatMessage("label.undo_command", new String[]{command.getDescription()}));
      }
      else
      {
        undoMenuItem.setEnabled(false);
-       undoMenuItem.setText("Undo");
+       undoMenuItem.setText(MessageManager.getString("action.undo"));
      }
  
      if (viewport.redoList.size() > 0)
        redoMenuItem.setEnabled(true);
  
        CommandI command = (CommandI) viewport.redoList.peek();
-       redoMenuItem.setText("Redo " + command.getDescription());
+       redoMenuItem.setText(MessageManager.formatMessage("label.redo_command", new String[]{command.getDescription()}));
      }
      else
      {
        redoMenuItem.setEnabled(false);
-       redoMenuItem.setText("Redo");
+       redoMenuItem.setText(MessageManager.getString("action.redo"));
      }
    }
  
  
      Desktop.jalviewClipboard = new Object[]
      { seqs, viewport.getAlignment().getDataset(), hiddenColumns };
-     statusBar.setText("Copied " + seqs.length + " sequences to clipboard.");
+     statusBar.setText(MessageManager.formatMessage("label.copied_sequences_to_clipboard", new String[]{Integer.valueOf(seqs.length).toString()}));
    }
  
    /**
      }
  
    }
+   @Override
+   protected void expand_newalign(ActionEvent e)
+   {
+     try {
+     AlignmentI alignment = AlignmentUtils.expandContext(getViewport().getAlignment(), -1);
+     AlignFrame af = new AlignFrame(alignment, DEFAULT_WIDTH,
+             DEFAULT_HEIGHT);
+     String newtitle = new String("Flanking alignment");
+     if (Desktop.jalviewClipboard != null
+             && Desktop.jalviewClipboard[2] != null)
+     {
+       Vector hc = (Vector) Desktop.jalviewClipboard[2];
+       for (int i = 0; i < hc.size(); i++)
+       {
+         int[] region = (int[]) hc.elementAt(i);
+         af.viewport.hideColumns(region[0], region[1]);
+       }
+     }
+     // >>>This is a fix for the moment, until a better solution is
+     // found!!<<<
+     af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
+             .transferSettings(
+                     alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
  
+     // TODO: maintain provenance of an alignment, rather than just make the
+     // title a concatenation of operations.
+     {
+       if (title.startsWith("Copied sequences"))
+       {
+         newtitle = title;
+       }
+       else
+       {
+         newtitle = newtitle.concat("- from " + title);
+       }
+     }
+     Desktop.addInternalFrame(af, newtitle, DEFAULT_WIDTH,
+             DEFAULT_HEIGHT);
+     } catch (Exception ex)
+     {
+       ex.printStackTrace();
+       System.out.println("Exception whilst pasting: " + ex);
+       // could be anything being pasted in here
+     }
+     catch (OutOfMemoryError oom)
+     {
+       new OOMWarning("Viewing flanking region of alignment", oom);
+     }
+   }
    /**
     * DOCUMENT ME!
     * 
    @Override
    protected void deleteGroups_actionPerformed(ActionEvent e)
    {
-     viewport.getAlignment().deleteAllGroups();
-     viewport.sequenceColours = null;
-     viewport.setSelectionGroup(null);
-     PaintRefresher.Refresh(this, viewport.getSequenceSetId());
-     alignPanel.updateAnnotation();
-     alignPanel.paintAlignment(true);
+     if (avc.deleteGroups()) {
+       PaintRefresher.Refresh(this, viewport.getSequenceSetId());
+       alignPanel.updateAnnotation();
+       alignPanel.paintAlignment(true);
+     }
    }
  
    /**
                  viewport.getSelectionGroup());
        }
  
-       statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
+       statusBar.setText(MessageManager.formatMessage("label.removed_columns", new String[]{Integer.valueOf(trimRegion.getSize()).toString()}));
  
        addHistoryItem(trimRegion);
  
  
      addHistoryItem(removeGapCols);
  
-     statusBar.setText("Removed " + removeGapCols.getSize()
-             + " empty columns.");
+     statusBar.setText(MessageManager.formatMessage("label.removed_empty_columns", new String[]{Integer.valueOf(removeGapCols.getSize()).toString()}));
  
      // This is to maintain viewport position on first residue
      // of first sequence
      newap.av.viewName = newViewName;
  
      addAlignmentPanel(newap, true);
+     newap.alignmentChanged();
+     
      if (alignPanels.size() == 2)
      {
        viewport.gatherViewsHere = true;
      editPane.setEditable(false);
      StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
              .formatAsHtml();
-     editPane.setText("<html>" + contents.toString() + "</html>");
+     editPane.setText(MessageManager.formatMessage("label.html_content", new String[]{contents.toString()}));
      JInternalFrame frame = new JInternalFrame();
      frame.getContentPane().add(new JScrollPane(editPane));
  
-     Desktop.instance.addInternalFrame(frame, "Alignment Properties: "
-             + getTitle(), 500, 400);
+     Desktop.instance.addInternalFrame(frame, MessageManager.formatMessage("label.alignment_properties", new String[]{getTitle()}), 500, 400);\r
    }
  
    /**
      JInternalFrame frame = new JInternalFrame();
      OverviewPanel overview = new OverviewPanel(alignPanel);
      frame.setContentPane(overview);
-     Desktop.addInternalFrame(frame, "Overview " + this.getTitle(),
+     Desktop.addInternalFrame(frame, MessageManager.formatMessage("label.overview_params", new String[]{this.getTitle()}),\r
              frame.getWidth(), frame.getHeight());
      frame.pack();
      frame.setLayer(JLayeredPane.PALETTE_LAYER);
        {
          threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
                  "Background");
          cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
-         viewport.setGlobalColourScheme(cs);
        }
        else
        {
    @Override
    public void userDefinedColour_actionPerformed(ActionEvent e)
    {
-     if (e.getActionCommand().equals("User Defined..."))
+     if (e.getActionCommand().equals(MessageManager.getString("action.user_defined")))\r
      {
        new UserDefinedColours(alignPanel, null);
      }
  
                int option = JOptionPane.showInternalConfirmDialog(
                        jalview.gui.Desktop.desktop,
-                       "Remove from default list?",
-                       "Remove user defined colour",
+                       MessageManager.getString("label.remove_from_default_list"),
+                       MessageManager.getString("label.remove_user_defined_colour"),
                        JOptionPane.YES_NO_OPTION);
                if (option == JOptionPane.YES_OPTION)
                {
              || (viewport.getSelectionGroup().getSize() < 2))
      {
        JOptionPane.showInternalMessageDialog(this,
-               "You must select at least 2 sequences.", "Invalid Selection",
+               MessageManager.getString("label.you_must_select_least_two_sequences"), MessageManager.getString("label.invalid_selection"),
                JOptionPane.WARNING_MESSAGE);
      }
      else
      {
        JInternalFrame frame = new JInternalFrame();
        frame.setContentPane(new PairwiseAlignPanel(viewport));
-       Desktop.addInternalFrame(frame, "Pairwise Alignment", 600, 500);
+       Desktop.addInternalFrame(frame, MessageManager.getString("action.pairwise_alignment"), 600, 500);\r
      }
    }
  
              || (viewport.getAlignment().getHeight() < 4))
      {
        JOptionPane.showInternalMessageDialog(this,
-               "Principal component analysis must take\n"
-                       + "at least 4 input sequences.",
-               "Sequence selection insufficient",
+               MessageManager.getString("label.principal_component_analysis_must_take_least_four_input_sequences"),
+               MessageManager.getString("label.sequence_selection_insufficient"),
                JOptionPane.WARNING_MESSAGE);
  
        return;
          JOptionPane
                  .showMessageDialog(
                          Desktop.desktop,
-                         "You need to have more than two sequences selected to build a tree!",
-                         "Not enough sequences", JOptionPane.WARNING_MESSAGE);
+                         MessageManager.getString("label.you_need_more_two_sequences_selected_build_tree"),
+                         MessageManager.getString("label.not_enough_sequences"), JOptionPane.WARNING_MESSAGE);
          return;
        }
  
            JOptionPane
                    .showMessageDialog(
                            Desktop.desktop,
-                           "The selected region to create a tree may\nonly contain residues or gaps.\n"
-                                   + "Try using the Pad function in the edit menu,\n"
-                                   + "or one of the multiple sequence alignment web services.",
-                           "Sequences in selection are not aligned",
+                           MessageManager.getString("label.selected_region_to_tree_may_only_contain_residues_or_gaps"),
+                           MessageManager.getString("label.sequences_selection_not_aligned"),
                            JOptionPane.WARNING_MESSAGE);
  
            return;
          JOptionPane
                  .showMessageDialog(
                          Desktop.desktop,
-                         "The sequences must be aligned before creating a tree.\n"
-                                 + "Try using the Pad function in the edit menu,\n"
-                                 + "or one of the multiple sequence alignment web services.",
-                         "Sequences not aligned",
+                         MessageManager.getString("label.sequences_must_be_aligned_before_creating_tree"),
+                         MessageManager.getString("label.sequences_not_aligned"),
                          JOptionPane.WARNING_MESSAGE);
  
          return;
    @Override
    public void buildTreeMenu()
    {
+     calculateTree.removeAll();
+     // build the calculate menu
+     
+     for (final String type:new String[] {"NJ", "AV"})
+     {
+       String treecalcnm = MessageManager.getString("label.tree_calc_"+type.toLowerCase());
+       for (final Object pwtype: ResidueProperties.scoreMatrices.keySet())
+       {
+         JMenuItem tm = new JMenuItem();
+         ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype);
+         if (sm.isProtein()==!viewport.getAlignment().isNucleotide())
+         {
+           String smn = MessageManager.getStringOrReturn(
+                   "label.score_model_", sm.getName());
+           final String title = MessageManager.formatMessage(
+                   "label.treecalc_title", treecalcnm, smn);
+           tm.setText(title);//
+           tm.addActionListener(new java.awt.event.ActionListener()
+           {
+             public void actionPerformed(ActionEvent e)
+             {
+               NewTreePanel(type, (String) pwtype, title);
+             }
+           });
+           calculateTree.add(tm);
+         }
+       }
+     }
      sortByTreeMenu.removeAll();
  
      Vector comps = (Vector) PaintRefresher.components.get(viewport
      JalviewFileChooser chooser = new JalviewFileChooser(
              jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
      chooser.setFileView(new JalviewFileView());
-     chooser.setDialogTitle("Select a newick-like tree file");
-     chooser.setToolTipText("Load a tree file");
+     chooser.setDialogTitle(MessageManager.getString("label.select_newick_like_tree_file"));\r
+     chooser.setToolTipText(MessageManager.getString("label.load_tree_file"));\r
  
      int value = chooser.showOpenDialog(null);
  
        } catch (Exception ex)
        {
          JOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(),
-                 "Problem reading tree file", JOptionPane.WARNING_MESSAGE);
+                 MessageManager.getString("label.problem_reading_tree_file"), JOptionPane.WARNING_MESSAGE);
          ex.printStackTrace();
        }
        if (fin != null && fin.hasWarningMessage())
        {
          JOptionPane.showMessageDialog(Desktop.desktop,
-                 fin.getWarningMessage(), "Possible problem with tree file",
+                 fin.getWarningMessage(), MessageManager.getString("label.possible_problem_with_tree_file"),
                  JOptionPane.WARNING_MESSAGE);
        }
      }
        @Override
        public void run()
        {
+         final List<JMenuItem> legacyItems=new ArrayList<JMenuItem>();
          try
          {
            System.err.println("Building ws menu again "
              // TODO: refactor to allow list of AbstractName/Handler bindings to
              // be
              // stored or retrieved from elsewhere
-             Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS");
+             // No MSAWS used any more:
+             // Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS");
              Vector secstrpr = (Vector) Discoverer.services
                      .get("SecStrPred");
-             Vector seqsrch = null; // (Vector)
-                                    // Discoverer.services.get("SeqSearch");
-             // TODO: move GUI generation code onto service implementation - so a
-             // client instance attaches itself to the GUI with method call like
-             // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance,
-             // alignframe)
-             if (msaws != null)
-             {
-               // Add any Multiple Sequence Alignment Services
-               for (int i = 0, j = msaws.size(); i < j; i++)
-               {
-                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws
-                         .get(i);
-                 jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
-                         .getServiceClient(sh);
-                 impl.attachWSMenuEntry(msawsmenu, me);
-               }
-             }
              if (secstrpr != null)
              {
                // Add any secondary structure prediction services
                          .get(i);
                  jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
                          .getServiceClient(sh);
+                 int p=secstrmenu.getItemCount();
                  impl.attachWSMenuEntry(secstrmenu, me);
-               }
-             }
-             if (seqsrch != null)
-             {
-               // Add any sequence search services
-               for (int i = 0, j = seqsrch.size(); i < j; i++)
-               {
-                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch
-                         .elementAt(i);
-                 jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer
-                         .getServiceClient(sh);
-                 impl.attachWSMenuEntry(seqsrchmenu, me);
+                 int q=secstrmenu.getItemCount();
+                 for (int litm=p;litm<q; litm++)
+                 {
+                   legacyItems.add(secstrmenu.getItem(litm));
+                 }
                }
              }
            }
+           
            // Add all submenus in the order they should appear on the web
            // services menu
            wsmenu.add(msawsmenu);
            wsmenu.add(secstrmenu);
            wsmenu.add(dismenu);
            wsmenu.add(analymenu);
-           // final ArrayList<JMenu> submens=new ArrayList<JMenu>();
-           // submens.add(msawsmenu);
-           // submens.add(secstrmenu);
-           // submens.add(dismenu);
-           // submens.add(analymenu);
            // No search services yet
            // wsmenu.add(seqsrchmenu);
  
                    webService.add(me.webServiceNoServices);
                  }
                  // TODO: move into separate menu builder class.
+                 boolean new_sspred=false;
                  if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
                  {
                    Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
                      if (jws2servs.hasServices())
                      {
                        jws2servs.attachWSMenuEntry(webService, me);
+                       for (Jws2Instance sv:jws2servs.getServices()) {
+                         if (sv.description.toLowerCase().contains("jpred"))
+                         {
+                           for (JMenuItem jmi:legacyItems)
+                           {
+                             jmi.setVisible(false);
+                           }
+                         }
+                       }
+                       
                      }
                      if (jws2servs.isRunning())
                      {
                      }
                    }
                  }
                  build_urlServiceMenu(me.webService);
                  build_fetchdbmenu(webService);
                  for (JMenu item : wsmenu)
                JvSwingUtils.findOrCreateMenu(webService, client.getAction()),
                this);
      }
-     if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
-     {
-       jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(
-               webService, this);
-     }
    }
  
    /*
        JOptionPane
                .showMessageDialog(
                        Desktop.desktop,
-                       "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
-                       "Translation Failed", JOptionPane.WARNING_MESSAGE);
+                       MessageManager.getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
+                       MessageManager.getString("label.translation_failed"), JOptionPane.WARNING_MESSAGE);
      }
      else
      {
        AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
-       Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
+       Desktop.addInternalFrame(af, MessageManager.formatMessage("label.translation_of_params", new String[]{this.getTitle()}),\r
                DEFAULT_WIDTH, DEFAULT_HEIGHT);
      }
    }
        JOptionPane
        .showMessageDialog(
                Desktop.desktop,
-               "Unfortunately, something went wrong when translating your sequences.\nPlease take a look in the Jalview java console\nand submit a bug report including the stacktrace.",
-               "Implementation error: Translation Failed", JOptionPane.ERROR_MESSAGE);
+               MessageManager.getString("label.error_when_translating_sequences_submit_bug_report"),
+               MessageManager.getString("label.implementation_error") + MessageManager.getString("translation_failed"), JOptionPane.ERROR_MESSAGE);
        return;
      }
      if (al == null)
        JOptionPane
                .showMessageDialog(
                        Desktop.desktop,
-                       "Please select at least three bases in at least one sequence in order to perform a cDNA translation.",
-                       "Translation Failed", JOptionPane.WARNING_MESSAGE);
+                       MessageManager.getString("label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation"),
+                       MessageManager.getString("label.translation_failed"), JOptionPane.WARNING_MESSAGE);
      }
      else
      {
        AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
-       Desktop.addInternalFrame(af, "Translation of " + this.getTitle(),
+       Desktop.addInternalFrame(af, MessageManager.formatMessage("label.translation_of_params", new String[]{this.getTitle()}),\r
                DEFAULT_WIDTH, DEFAULT_HEIGHT);
      }
    }
                    || JOptionPane
                            .showConfirmDialog(
                                    this,
-                                   "Do you want to automatically associate the "
-                                           + filesmatched.size()
-                                           + " PDB files with sequences in the alignment that have the same name ?",
-                                   "Automatically Associate PDB files by name",
+                                   MessageManager.formatMessage("label.automatically_associate_pdb_files_with_sequences_same_name",
+                                                 new String[]{Integer.valueOf(filesmatched.size()).toString()}),
+                                   MessageManager.getString("label.automatically_associate_pdb_files_by_name"),
                                    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
  
            {
                            "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane
                            .showConfirmDialog(
                                    this,
-                                   "<html>Do you want to <em>ignore</em> the "
-                                           + filesnotmatched.size()
-                                           + " files whose names did not match any sequence IDs ?</html>",
-                                   "Ignore unmatched dropped files ?",
+                                   MessageManager.formatMessage("label.ignore_unmatched_dropped_files_info", new String[]{Integer.valueOf(filesnotmatched.size()).toString()}),
+                                   MessageManager.getString("label.ignore_unmatched_dropped_files"),
                                    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION))
            {
              return;
                tcoffeeColour.setSelected(true);
                changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
                isAnnotation = true;
-               statusBar
-                       .setText("Successfully pasted T-Coffee scores to alignment.");
+               statusBar.setText(MessageManager.getString("label.successfully_pasted_tcoffee_scores_to_alignment"));
              }
              else
              {
                JOptionPane
                        .showMessageDialog(
                                Desktop.desktop,
-                               tcf.getWarningMessage() == null ? "Check that the file matches sequence IDs in the alignment."
+                               tcf.getWarningMessage() == null ? MessageManager.getString("label.check_file_matches_sequence_ids_alignment")
                                        : tcf.getWarningMessage(),
-                               "Problem reading T-COFFEE score file",
+                               MessageManager.getString("label.problem_reading_tcoffee_score_file"),
                                JOptionPane.WARNING_MESSAGE);
              }
            }
      {
        alignPanel = (AlignmentPanel) alignPanels.elementAt(index);
        viewport = alignPanel.av;
+       avc.setViewportAndAlignmentPanel(viewport, alignPanel);
        setMenusFromViewport(viewport);
      }
    }
      if (SwingUtilities.isRightMouseButton(e))
      {
        String reply = JOptionPane.showInternalInputDialog(this,
-               "Enter View Name", "Edit View Name",
+               MessageManager.getString("label.enter_view_name"), MessageManager.getString("label.enter_view_name"),
                JOptionPane.QUESTION_MESSAGE);
  
        if (reply != null)
      // TODO We probably want to store a sequence database checklist in
      // preferences and have checkboxes.. rather than individual sources selected
      // here
-     final JMenu rfetch = new JMenu("Fetch DB References");
-     rfetch.setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences");
+     final JMenu rfetch = new JMenu(MessageManager.getString("action.fetch_db_references"));\r
+     rfetch.setToolTipText(MessageManager.getString("label.retrieve_parse_sequence_database_records_alignment_or_selected_sequences"));\r
      webService.add(rfetch);
  
-     JMenuItem fetchr = new JMenuItem("Standard Databases");
-     fetchr.setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources");
+     final JCheckBoxMenuItem trimrs = new JCheckBoxMenuItem(MessageManager.getString("option.trim_retrieved_seqs"));
+     trimrs.setToolTipText(MessageManager.getString("label.trim_retrieved_sequences"));
+     trimrs.setSelected(Cache.getDefault("TRIM_FETCHED_DATASET_SEQS", true));
+     trimrs.addActionListener(new ActionListener()
+     {
+       public void actionPerformed(ActionEvent e) {
+       trimrs.setSelected(trimrs.isSelected());
+       Cache.setProperty("TRIM_FETCHED_DATASET_SEQS", Boolean.valueOf(trimrs.isSelected()).toString());
+     };
+     });
+     rfetch.add(trimrs);
+     JMenuItem fetchr = new JMenuItem(MessageManager.getString("label.standard_databases"));\r
+     fetchr.setToolTipText(MessageManager.getString("label.fetch_embl_uniprot"));\r
      fetchr.addActionListener(new ActionListener()
      {
  
                          .toArray(new DbSourceProxy[0]);
                  // fetch all entry
                  DbSourceProxy src = otherdb.get(0);
-                 fetchr = new JMenuItem("Fetch All '" + src.getDbSource()
-                         + "'");
+                 fetchr = new JMenuItem(MessageManager.formatMessage("label.fetch_all_param", new String[]{src.getDbSource()}));\r
                  fetchr.addActionListener(new ActionListener()
                  {
                    @Override
                    ++i;
                    if (++icomp >= mcomp || i == (otherdb.size()))
                    {
-                     ifetch.setText(imname + " to '" + sname + "'");
+                     ifetch.setText(MessageManager.formatMessage("label.source_to_target",imname,sname));
                      dfetch.add(ifetch);
                      ifetch = new JMenu();
                      imname = null;
                ++dbi;
                if (comp >= mcomp || dbi >= (dbclasses.length))
                {
-                 dfetch.setText(mname + " to '" + dbclass + "'");
+                 dfetch.setText(MessageManager.formatMessage("label.source_to_target",mname,dbclass));
                  rfetch.add(dfetch);
                  dfetch = new JMenu();
                  mname = null;
    @Override
    protected void makeGrpsFromSelection_actionPerformed(ActionEvent e)
    {
-     if (viewport.getSelectionGroup() != null)
-     {
-       SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom(
-               viewport.getSequenceSelection(),
-               viewport.getAlignmentView(true).getSequenceStrings(
-                       viewport.getGapCharacter()), viewport.getAlignment()
-                       .getGroups());
-       viewport.getAlignment().deleteAllGroups();
-       viewport.sequenceColours = null;
-       viewport.setSelectionGroup(null);
-       // set view properties for each group
-       for (int g = 0; g < gps.length; g++)
-       {
-         gps[g].setShowNonconserved(viewport.getShowUnconserved());
-         gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
-         viewport.getAlignment().addGroup(gps[g]);
-         Color col = new Color((int) (Math.random() * 255),
-                 (int) (Math.random() * 255), (int) (Math.random() * 255));
-         col = col.brighter();
-         for (SequenceI s : gps[g].getSequences())
-           viewport.setSequenceColour(s, col);
-       }
+     if (avc.makeGroupsFromSelection()) {
        PaintRefresher.Refresh(this, viewport.getSequenceSetId());
        alignPanel.updateAnnotation();
        alignPanel.paintAlignment(true);
      }
    }
 +  public void clearAlignmentSeqRep()
 +  {
++    // TODO refactor alignmentseqrep to controller
 +    if (viewport.getAlignment().hasSeqrep()) {
 +      viewport.getAlignment().setSeqrep(null);
 +      PaintRefresher.Refresh(this, viewport.getSequenceSetId());
 +      alignPanel.updateAnnotation();
 +      alignPanel.paintAlignment(true);
 +    }
 +  }
+   @Override
+   protected void createGroup_actionPerformed(ActionEvent e)
+   {
+     if (avc.createGroup())
+     {
+       alignPanel.alignmentChanged();
+     }
+   }
+   @Override
+   protected void unGroup_actionPerformed(ActionEvent e)
+   {
+     if (avc.unGroup())
+     {
+       alignPanel.alignmentChanged();
+     }
+   }
    /**
     * make the given alignmentPanel the currently selected tab
     * 
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
@@@ -14,6 -14,7 +14,7 @@@
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.gui;
  
@@@ -307,7 -308,7 +308,7 @@@ public class IdCanvas extends JPane
          for (int i = starty; i < alheight; i++)
          {
            SequenceI s = av.getAlignment().getSequenceAt(i);
 -          if (av.hasHiddenRows())
 +          if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
            {
              setHiddenFont(s);
            }
            continue;
          }
  
 -        if (av.hasHiddenRows())
 +        if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
          {
            setHiddenFont(sequence);
          }
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.gui;
  
  import java.util.*;
 -
  import java.awt.*;
  import java.awt.event.*;
  
@@@ -30,6 -32,7 +31,7 @@@ import jalview.io.*
  import jalview.schemes.*;
  import jalview.util.GroupUrlLink;
  import jalview.util.GroupUrlLink.UrlStringTooLongException;
+ import jalview.util.MessageManager;\r
  import jalview.util.UrlLink;
  
  /**
@@@ -86,11 -89,9 +88,11 @@@ public class PopupMenu extends JPopupMe
    JMenuItem sequenceDetails = new JMenuItem();
  
    JMenuItem sequenceSelDetails = new JMenuItem();
 +  
 +  JMenuItem makeReferenceSeq = new JMenuItem();
  
    SequenceI sequence;
+   JMenuItem createGroupMenuItem = new JMenuItem();
    JMenuItem unGroupMenuItem = new JMenuItem();
  
    JMenuItem outline = new JMenuItem();
      if (seq != null)
      {
        sequenceMenu.setText(sequence.getName());
 +      if (seq == ap.av.getAlignment().getSeqrep())
 +      {
 +        makeReferenceSeq.setText("Unmark representative");
 +      } else {
 +        makeReferenceSeq.setText("Mark as representative");
 +      }
  
        if (seq.getDatasetSequence().getPDBId() != null
                && seq.getDatasetSequence().getPDBId().size() > 0)
          }
          // structureMenu.remove(colStructureMenu);
        }
 -
        if (ap.av.getAlignment().isNucleotide() == true)
        {
          AlignmentAnnotation[] aa = ap.av.getAlignment()
              final String rnastruc = aa[i].getRNAStruc();
              final String structureLine = aa[i].label;
              menuItem = new JMenuItem();
-             menuItem.setText("2D RNA " + structureLine);
+             menuItem.setText(MessageManager.formatMessage("label.2d_rna_structure_line", new String[]{structureLine}));\r
              menuItem.addActionListener(new java.awt.event.ActionListener()
              {
                public void actionPerformed(ActionEvent e)
  
                // TODO: make rnastrucF a bit more nice
                menuItem = new JMenuItem();
-               menuItem.setText("2D RNA - " + seq.getName());
+               menuItem.setText(MessageManager.formatMessage("label.2d_rna_sequence_name", new String[]{seq.getName()}));\r
                menuItem.addActionListener(new java.awt.event.ActionListener()
                {
                  public void actionPerformed(ActionEvent e)
              }
            }
          }
 -
        }
  
-       menuItem = new JMenuItem("Hide Sequences");
+       menuItem = new JMenuItem(MessageManager.getString("action.hide_sequences"));\r
        menuItem.addActionListener(new java.awt.event.ActionListener()
        {
          public void actionPerformed(ActionEvent e)
        if (ap.av.getSelectionGroup() != null
                && ap.av.getSelectionGroup().getSize() > 1)
        {
-         menuItem = new JMenuItem("Represent Group with " + seq.getName());
+         menuItem = new JMenuItem(MessageManager.formatMessage("label.represent_group_with", new String[]{seq.getName()}));\r
          menuItem.addActionListener(new java.awt.event.ActionListener()
          {
            public void actionPerformed(ActionEvent e)
          if (ap.av.adjustForHiddenSeqs(index)
                  - ap.av.adjustForHiddenSeqs(index - 1) > 1)
          {
-           menuItem = new JMenuItem("Reveal Sequences");
+           menuItem = new JMenuItem(MessageManager.getString("action.reveal_sequences"));\r
            menuItem.addActionListener(new ActionListener()
            {
              public void actionPerformed(ActionEvent e)
      if (ap.av.hasHiddenRows())
      {
        {
-         menuItem = new JMenuItem("Reveal All");
+         menuItem = new JMenuItem(MessageManager.getString("action.reveal_all"));\r
          menuItem.addActionListener(new ActionListener()
          {
            public void actionPerformed(ActionEvent e)
      }
  
      SequenceGroup sg = ap.av.getSelectionGroup();
+     boolean isDefinedGroup = (sg!=null) ? ap.av.getAlignment().getGroups().contains(sg) : false;
  
      if (sg != null && sg.getSize() > 0)
-     {
-       groupName.setText("Name: " + sg.getName());
-       groupName.setText("Edit name and description of current group.");
+     {      
+       groupName.setText(MessageManager.formatMessage("label.name_param", new String[]{sg.getName()}));\r
+       groupName.setText(MessageManager.getString("label.edit_name_and_description_current_group"));\r
  
        if (sg.cs instanceof ZappoColourScheme)
        {
          buildGroupURLMenu(sg, groupLinks);
        }
        // Add a 'show all structures' for the current selection
-       Hashtable<String, PDBEntry> pdbe = new Hashtable<String, PDBEntry>();
+       Hashtable<String, PDBEntry> pdbe = new Hashtable<String, PDBEntry>(),reppdb=new Hashtable<String,PDBEntry>();
        SequenceI sqass = null;
        for (SequenceI sq : ap.av.getSequenceSelection())
        {
                  .getPDBId();
          if (pes != null)
          {
+           reppdb.put(pes.get(0).getId(),pes.get(0));
            for (PDBEntry pe : pes)
            {
              pdbe.put(pe.getId(), pe);
        if (pdbe.size() > 0)
        {
          final PDBEntry[] pe = pdbe.values().toArray(
-                 new PDBEntry[pdbe.size()]);
-         final JMenuItem gpdbview;
+                 new PDBEntry[pdbe.size()]),pr = reppdb.values().toArray(
+                         new PDBEntry[reppdb.size()]);
+         final JMenuItem gpdbview,rpdbview;
          if (pdbe.size() == 1)
          {
-           structureMenu.add(gpdbview = new JMenuItem("View structure for "
-                   + sqass.getDisplayId(false)));
+           structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_structure_for", new String[]{sqass.getDisplayId(false)})));\r
          }
          else
          {
-           structureMenu.add(gpdbview = new JMenuItem("View all "
-                   + pdbe.size() + " structures."));
+           structureMenu.add(gpdbview = new JMenuItem(MessageManager.formatMessage("label.view_all_structures", new String[]{new Integer(pdbe.size()).toString()})));          \r
          }
-         gpdbview.setToolTipText("Open a new Jmol view with all structures associated with the current selection and superimpose them using the alignment.");
+         gpdbview.setToolTipText(MessageManager.getString("label.open_new_jmol_view_with_all_structures_associated_current_selection_superimpose_using_alignment"));\r
          gpdbview.addActionListener(new ActionListener()
          {
  
              new AppJmol(ap, pe, ap.av.collateForPDB(pe));
            }
          });
+         if (reppdb.size()>1 && reppdb.size()<pdbe.size())
+         {
+           structureMenu.add(rpdbview = new JMenuItem(MessageManager.formatMessage("label.view_all_representative_structures", new String[]{new Integer(reppdb.size()).toString()})));
+           rpdbview.setToolTipText(MessageManager.getString("label.open_new_jmol_view_with_all_representative_structures_associated_current_selection_superimpose_using_alignment"));
+           rpdbview.addActionListener(new ActionListener()
+           {
+             @Override
+             public void actionPerformed(ActionEvent e)
+             {
+               new AppJmol(ap, pr, ap.av.collateForPDB(pr));
+             }
+           });
+         }
        }
      }
      else
        editMenu.setVisible(false);
      }
  
-     if (!ap.av.getAlignment().getGroups().contains(sg))
+     if (!isDefinedGroup)
      {
+       createGroupMenuItem.setVisible(true);
        unGroupMenuItem.setVisible(false);
+       jMenu1.setText(MessageManager.getString("action.edit_new_group"));\r
+     } else {
+       createGroupMenuItem.setVisible(false);
+       unGroupMenuItem.setVisible(true);
+       jMenu1.setText(MessageManager.getString("action.edit_group"));\r
      }
  
      if (seq == null)
      if (links != null && links.size() > 0)
      {
  
-       JMenu linkMenu = new JMenu("Link");
+       JMenu linkMenu = new JMenu(MessageManager.getString("action.link"));\r
        Vector linkset = new Vector();
        for (int i = 0; i < links.size(); i++)
        {
      // menu appears asap
      // sequence only URLs
      // ID/regex match URLs
-     groupLinksMenu = new JMenu("Group Link");
+     groupLinksMenu = new JMenu(MessageManager.getString("action.group_link"));\r
      JMenu[] linkMenus = new JMenu[]
-     { null, new JMenu("IDS"), new JMenu("Sequences"),
-         new JMenu("IDS and Sequences") }; // three types of url that might be
+     { null, new JMenu(MessageManager.getString("action.ids")), new JMenu(MessageManager.getString("action.sequences")),\r
+         new JMenu(MessageManager.getString("action.ids_sequences")) }; // three types of url that might be\r
                                            // created.
      SequenceI[] seqs = ap.av.getSelectionAsNewSequence();
      String[][] idandseqs = GroupUrlLink.formStrings(seqs);
      }
      if (addMenu)
      {
-       groupLinksMenu = new JMenu("Group Links");
+       groupLinksMenu = new JMenu(MessageManager.getString("action.group_link"));\r
        for (int m = 0; m < linkMenus.length; m++)
        {
          if (linkMenus[m] != null
    private void addshowLink(JMenu linkMenu, String label, final String url)
    {
      JMenuItem item = new JMenuItem(label);
-     item.setToolTipText("open URL: " + url);
+     item.setToolTipText(MessageManager.formatMessage("label.open_url_param", new String[]{url}));\r
      item.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
            final GroupUrlLink urlgenerator, final Object[] urlstub)
    {
      JMenuItem item = new JMenuItem(label);
-     item.setToolTipText("open URL (" + urlgenerator.getUrl_prefix()
-             + "..) (" + urlgenerator.getNumberInvolved(urlstub) + " seqs)"); // TODO:
-                                                                              // put
-                                                                              // in
-                                                                              // info
-                                                                              // about
-                                                                              // what
-                                                                              // is
-                                                                              // being
-                                                                              // sent.
+     item.setToolTipText(MessageManager.formatMessage("label.open_url_seqs_param", new Object[]{urlgenerator.getUrl_prefix(),urlgenerator.getNumberInvolved(urlstub)}));\r
+     // TODO: put in info about what is being sent.\r
      item.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
     */
    private void jbInit() throws Exception
    {
-     groupMenu.setText("Group");
-     groupMenu.setText("Selection");
-     groupName.setText("Name");
+     groupMenu.setText(MessageManager.getString("label.group"));\r
+     groupMenu.setText(MessageManager.getString("label.selection"));\r
+     groupName.setText(MessageManager.getString("label.name"));\r
      groupName.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          groupName_actionPerformed();
        }
      });
-     sequenceMenu.setText("Sequence");
-     sequenceName.setText("Edit Name/Description");
+     sequenceMenu.setText(MessageManager.getString("label.sequence"));\r
+     sequenceName.setText(MessageManager.getString("label.edit_name_description"));\r
      sequenceName.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          sequenceName_actionPerformed();
        }
      });
-     sequenceDetails.setText("Sequence Details ...");
+     sequenceDetails.setText(MessageManager.getString("label.sequence_details") + "...");\r
      sequenceDetails.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          sequenceDetails_actionPerformed();
        }
      });
-     sequenceSelDetails.setText("Sequence Details ...");
+     sequenceSelDetails.setText(MessageManager.getString("label.sequence_details") + "...");\r
      sequenceSelDetails
              .addActionListener(new java.awt.event.ActionListener()
              {
                }
              });
      PIDColour.setFocusPainted(false);
-     unGroupMenuItem.setText("Remove Group");
+     unGroupMenuItem.setText(MessageManager.getString("action.remove_group"));\r
      unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          unGroupMenuItem_actionPerformed();
        }
      });
+     createGroupMenuItem.setText(MessageManager.getString("action.create_group"));\r
+     createGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
+     {
+       public void actionPerformed(ActionEvent e)
+       {
+         createGroupMenuItem_actionPerformed();
+       }
+     });
  
-     outline.setText("Border colour");
+     outline.setText(MessageManager.getString("action.border_colour"));\r
      outline.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          outline_actionPerformed();
        }
      });
-     nucleotideMenuItem.setText("Nucleotide");
+     nucleotideMenuItem.setText(MessageManager.getString("label.nucleotide"));\r
      nucleotideMenuItem.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          nucleotideMenuItem_actionPerformed();
        }
      });
-     colourMenu.setText("Group Colour");
-     showBoxes.setText("Boxes");
+     colourMenu.setText(MessageManager.getString("label.group_colour"));\r
+     showBoxes.setText(MessageManager.getString("action.boxes"));\r
      showBoxes.setState(true);
      showBoxes.addActionListener(new ActionListener()
      {
          showBoxes_actionPerformed();
        }
      });
-     showText.setText("Text");
+     showText.setText(MessageManager.getString("action.text"));\r
      showText.setState(true);
      showText.addActionListener(new ActionListener()
      {
          showText_actionPerformed();
        }
      });
-     showColourText.setText("Colour Text");
+     showColourText.setText(MessageManager.getString("label.colour_text"));\r
      showColourText.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          showColourText_actionPerformed();
        }
      });
-     displayNonconserved.setText("Show Nonconserved");
+     displayNonconserved.setText(MessageManager.getString("label.show_non_conversed"));\r
      displayNonconserved.setState(true);
      displayNonconserved.addActionListener(new ActionListener()
      {
          showNonconserved_actionPerformed();
        }
      });
-     editMenu.setText("Edit");
-     cut.setText("Cut");
+     editMenu.setText(MessageManager.getString("action.edit"));\r
+     cut.setText(MessageManager.getString("action.cut"));\r
      cut.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          cut_actionPerformed();
        }
      });
-     upperCase.setText("To Upper Case");
+     upperCase.setText(MessageManager.getString("label.to_upper_case"));\r
      upperCase.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          changeCase(e);
        }
      });
-     copy.setText("Copy");
+     copy.setText(MessageManager.getString("action.copy"));\r
      copy.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          copy_actionPerformed();
        }
      });
-     lowerCase.setText("To Lower Case");
+     lowerCase.setText(MessageManager.getString("label.to_lower_case"));\r
      lowerCase.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          changeCase(e);
        }
      });
-     toggle.setText("Toggle Case");
+     toggle.setText(MessageManager.getString("label.toggle_case"));\r
      toggle.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          changeCase(e);
        }
      });
-     pdbMenu.setText("Associate Structure with Sequence");
-     pdbFromFile.setText("From File");
+     pdbMenu.setText(MessageManager.getString("label.associate_structure_with_sequence"));\r
+     pdbFromFile.setText(MessageManager.getString("label.from_file"));\r
      pdbFromFile.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          pdbFromFile_actionPerformed();
        }
      });
-     enterPDB.setText("Enter PDB Id");
+     enterPDB.setText(MessageManager.getString("label.enter_pdb_id"));\r
      enterPDB.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          enterPDB_actionPerformed();
        }
      });
-     discoverPDB.setText("Discover PDB ids");
+     discoverPDB.setText(MessageManager.getString("label.discover_pdb_ids"));\r
      discoverPDB.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          discoverPDB_actionPerformed();
        }
      });
-     outputMenu.setText("Output to Textbox...");
-     sequenceFeature.setText("Create Sequence Feature");
+     outputMenu.setText(MessageManager.getString("label.out_to_textbox") + "...");\r
+     sequenceFeature.setText(MessageManager.getString("label.create_sequence_feature"));\r
      sequenceFeature.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          sequenceFeature_actionPerformed();
        }
      });
-     textColour.setText("Text Colour");
+     textColour.setText(MessageManager.getString("label.text_colour"));\r
      textColour.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          textColour_actionPerformed();
        }
      });
-     jMenu1.setText("Group");
-     structureMenu.setText("Structure");
-     viewStructureMenu.setText("View Structure");
+     jMenu1.setText(MessageManager.getString("label.group"));\r
+     structureMenu.setText(MessageManager.getString("label.structure"));\r
+     viewStructureMenu.setText(MessageManager.getString("label.view_structure"));\r
      // colStructureMenu.setText("Colour By Structure");
-     editSequence.setText("Edit Sequence...");
+     editSequence.setText(MessageManager.getString("label.edit_sequence") + "...");\r
      editSequence.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent actionEvent)
          editSequence_actionPerformed(actionEvent);
        }
      });
 -
 +    makeReferenceSeq.setText("Mark as representative");
 +    makeReferenceSeq.addActionListener(new ActionListener()
 +    {
 +      
 +      @Override
 +      public void actionPerformed(ActionEvent actionEvent)
 +      {
 +        makeReferenceSeq_actionPerformed(actionEvent);
 +        
 +      }
 +    });
      /*
       * annotationMenuItem.setText("By Annotation");
       * annotationMenuItem.addActionListener(new ActionListener() { public void
      groupMenu.add(editMenu);
      groupMenu.add(outputMenu);
      groupMenu.add(sequenceFeature);
+     groupMenu.add(createGroupMenuItem);
+     groupMenu.add(unGroupMenuItem);
      groupMenu.add(jMenu1);
      sequenceMenu.add(sequenceName);
      sequenceMenu.add(sequenceDetails);
 +    sequenceMenu.add(makeReferenceSeq);
      colourMenu.add(textColour);
      colourMenu.add(noColourmenuItem);
      colourMenu.add(clustalColour);
      pdbMenu.add(enterPDB);
      pdbMenu.add(discoverPDB);
      jMenu1.add(groupName);
-     jMenu1.add(unGroupMenuItem);
      jMenu1.add(colourMenu);
      jMenu1.add(showBoxes);
      jMenu1.add(showText);
      structureMenu.add(pdbMenu);
      structureMenu.add(viewStructureMenu);
      // structureMenu.add(colStructureMenu);
-     noColourmenuItem.setText("None");
+     noColourmenuItem.setText(MessageManager.getString("label.none"));\r
      noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        }
      });
  
-     clustalColour.setText("Clustalx colours");
+     clustalColour.setText(MessageManager.getString("label.clustalx_colours"));\r
      clustalColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          clustalColour_actionPerformed();
        }
      });
-     zappoColour.setText("Zappo");
+     zappoColour.setText(MessageManager.getString("label.zappo"));\r
      zappoColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          zappoColour_actionPerformed();
        }
      });
-     taylorColour.setText("Taylor");
+     taylorColour.setText(MessageManager.getString("label.taylor"));\r
      taylorColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          taylorColour_actionPerformed();
        }
      });
-     hydrophobicityColour.setText("Hydrophobicity");
+     hydrophobicityColour.setText(MessageManager.getString("label.hydrophobicity"));\r
      hydrophobicityColour
              .addActionListener(new java.awt.event.ActionListener()
              {
                  hydrophobicityColour_actionPerformed();
                }
              });
-     helixColour.setText("Helix propensity");
+     helixColour.setText(MessageManager.getString("label.helix_propensity"));\r
      helixColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          helixColour_actionPerformed();
        }
      });
-     strandColour.setText("Strand propensity");
+     strandColour.setText(MessageManager.getString("label.strand_propensity"));\r
      strandColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          strandColour_actionPerformed();
        }
      });
-     turnColour.setText("Turn propensity");
+     turnColour.setText(MessageManager.getString("label.turn_propensity"));\r
      turnColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          turnColour_actionPerformed();
        }
      });
-     buriedColour.setText("Buried Index");
+     buriedColour.setText(MessageManager.getString("label.buried_index"));\r
      buriedColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          buriedColour_actionPerformed();
        }
      });
-     abovePIDColour.setText("Above % Identity");
+     abovePIDColour.setText(MessageManager.getString("label.above_identity_percentage"));\r
      abovePIDColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          abovePIDColour_actionPerformed();
        }
      });
-     userDefinedColour.setText("User Defined...");
+     userDefinedColour.setText(MessageManager.getString("action.user_defined"));\r
      userDefinedColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          userDefinedColour_actionPerformed(e);
        }
      });
-     PIDColour.setText("Percentage Identity");
+     PIDColour.setText(MessageManager.getString("label.percentage_identity"));\r
      PIDColour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          PIDColour_actionPerformed();
        }
      });
-     BLOSUM62Colour.setText("BLOSUM62");
+     BLOSUM62Colour.setText(MessageManager.getString("label.blosum62"));\r
      BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(ActionEvent e)
          BLOSUM62Colour_actionPerformed();
        }
      });
-     purinePyrimidineColour.setText("Purine/Pyrimidine");
+     purinePyrimidineColour.setText(MessageManager.getString("label.purine_pyrimidine"));\r
      purinePyrimidineColour
              .addActionListener(new java.awt.event.ActionListener()
              {
       * covariationColour_actionPerformed(); } });
       */
  
-     conservationMenuItem.setText("Conservation");
+     conservationMenuItem.setText(MessageManager.getString("label.conservation"));\r
      conservationMenuItem
              .addActionListener(new java.awt.event.ActionListener()
              {
              });
    }
  
 +  protected void makeReferenceSeq_actionPerformed(ActionEvent actionEvent)
 +  {
 +    if (!ap.av.getAlignment().hasSeqrep())
 +    {
 +      // initialise the display flags so the user sees something happen
 +      ap.av.setDisplayReferenceSeq(true);
 +      ap.av.setColourByReferenceSeq(true);
 +      ap.av.getAlignment().setSeqrep(sequence);
 +    }
 +    else
 +    {
 +      if (ap.av.getAlignment().getSeqrep() == sequence)
 +      {
 +        ap.av.getAlignment().setSeqrep(null);
 +      }
 +      else
 +      {
 +        ap.av.getAlignment().setSeqrep(sequence);
 +      }
 +    }
 +    refresh();
 +  }
 +
    protected void sequenceSelectionDetails_actionPerformed()
    {
      createSequenceDetailsReport(ap.av.getSequenceSelection());
      StringBuffer contents = new StringBuffer();
      for (SequenceI seq : sequences)
      {
-       contents.append("<p><h2>Annotation for " + seq.getDisplayId(true)
+       contents.append("<p><h2>" + MessageManager.formatMessage("label.create_sequence_details_report_annotation_for", new String[]{seq.getDisplayId(true)})\r
                + "</h2></p><p>");
        new SequenceAnnotationReport(null)
                .createSequenceAnnotationReport(
      }
      cap.setText("<html>" + contents.toString() + "</html>");
  
-     Desktop.instance.addInternalFrame(cap, "Sequence Details for "
-             + (sequences.length == 1 ? sequences[0].getDisplayId(true)
-                     : "Selection"), 500, 400);
+     Desktop.instance.addInternalFrame(cap, MessageManager.formatMessage("label.sequece_details_for", (sequences.length == 1 ? new String[]{sequences[0].getDisplayId(true)}: new String[]{MessageManager.getString("label.selection")}))\r
+               ,500, 400);\r
  
    }
  
    {
      SequenceGroup sg = getGroup();
  
-     if (e.getActionCommand().equals("User Defined..."))
+     if (e.getSource().equals(userDefinedColour))\r
      {
        new UserDefinedColours(ap, sg);
      }
  
      if (conservationMenuItem.isSelected())
      {
+     // JBPNote: Conservation name shouldn't be i18n translated
        Conservation c = new Conservation("Group",
                ResidueProperties.propHash, 3, sg.getSequences(ap.av
                        .getHiddenRepSequences()), sg.getStartRes(),
              sequence.getAnnotation()[0], null,
              AnnotationColourGradient.NO_THRESHOLD);
  
-     acg.predefinedColours = true;
+     acg.setPredefinedColours(true);
      sg.cs = acg;
  
      refresh();
  
      SequenceGroup sg = getGroup();
      EditNameDialog dialog = new EditNameDialog(sg.getName(),
-             sg.getDescription(), "       Group Name ",
-             "Group Description ", "Edit Group Name/Description",
+             sg.getDescription(), "       " + MessageManager.getString("label.group_name") + " ",\r
+             MessageManager.getString("label.group_description") + " ", MessageManager.getString("label.edit_group_name_description"),\r
              ap.alignFrame);
  
      if (!dialog.accept)
    void sequenceName_actionPerformed()
    {
      EditNameDialog dialog = new EditNameDialog(sequence.getName(),
-             sequence.getDescription(), "       Sequence Name ",
-             "Sequence Description ", "Edit Sequence Name/Description",
+             sequence.getDescription(), "       " + MessageManager.getString("label.sequence_name") + " ",\r
+             MessageManager.getString("label.sequence_description") + " ", MessageManager.getString("label.edit_sequence_name_description"),\r
              ap.alignFrame);
  
      if (!dialog.accept)
        if (dialog.getName().indexOf(" ") > -1)
        {
          JOptionPane.showMessageDialog(ap,
-                 "Spaces have been converted to \"_\"",
-                 "No spaces allowed in Sequence Name",
+                 MessageManager.getString("label.spaces_converted_to_backslashes"),\r
+                 MessageManager.getString("label.no_spaces_allowed_sequence_name"),\r
                  JOptionPane.WARNING_MESSAGE);
        }
  
      ap.av.setSelectionGroup(null);
      refresh();
    }
+   void createGroupMenuItem_actionPerformed()
+   {
+     getGroup(); // implicitly creates group - note - should apply defaults / use standard alignment window logic for this
+     refresh();
+   }
  
    /**
     * DOCUMENT ME!
    protected void outline_actionPerformed()
    {
      SequenceGroup sg = getGroup();
-     Color col = JColorChooser.showDialog(this, "Select Outline Colour",
+     Color col = JColorChooser.showDialog(this, MessageManager.getString("label.select_outline_colour"),\r
              Color.BLUE);
  
      if (col != null)
        JOptionPane
                .showInternalMessageDialog(
                        Desktop.desktop,
-                       "Unixers: Couldn't find default web browser."
-                               + "\nAdd the full path to your browser in Preferences.",
-                       "Web browser not found", JOptionPane.WARNING_MESSAGE);
+                       MessageManager.getString("label.web_browser_not_found_unix"),\r
+                       MessageManager.getString("label.web_browser_not_found"), JOptionPane.WARNING_MESSAGE);\r
  
        ex.printStackTrace();
      }
  
        if (source == toggle)
        {
-         description = "Toggle Case";
+         description = MessageManager.getString("label.toggle_case");\r
          caseChange = ChangeCaseCommand.TOGGLE_CASE;
        }
        else if (source == upperCase)
        {
-         description = "To Upper Case";
+         description = MessageManager.getString("label.to_upper_case");\r
          caseChange = ChangeCaseCommand.TO_UPPER;
        }
        else
        {
-         description = "To Lower Case";
+         description = MessageManager.getString("label.to_lower_case");\r
          caseChange = ChangeCaseCommand.TO_LOWER;
        }
  
      CutAndPasteTransfer cap = new CutAndPasteTransfer();
      cap.setForInput(null);
      Desktop.addInternalFrame(cap,
-             "Alignment output - " + e.getActionCommand(), 600, 500);
+             MessageManager.formatMessage("label.alignment_output_command", new String[]{e.getActionCommand()}), 600, 500);\r
  
      String[] omitHidden = null;
  
      jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
              jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
      chooser.setFileView(new jalview.io.JalviewFileView());
-     chooser.setDialogTitle("Select a PDB file for "
-             + sequence.getDisplayId(false));
-     chooser.setToolTipText("Load a PDB file and associate it with sequence '"
-             + sequence.getDisplayId(false) + "'");
+     chooser.setDialogTitle(MessageManager.formatMessage("label.select_pdb_file_for", new String[]{sequence.getDisplayId(false)}));\r
+     chooser.setToolTipText(MessageManager.formatMessage("label.load_pdb_file_associate_with_sequence", new String[]{new Integer(sequence.getDisplayId(false)).toString()}));\r
  
      int value = chooser.showOpenDialog(null);
  
    public void enterPDB_actionPerformed()
    {
      String id = JOptionPane.showInternalInputDialog(Desktop.desktop,
-             "Enter PDB Id", "Enter PDB Id", JOptionPane.QUESTION_MESSAGE);
+             MessageManager.getString("label.enter_pdb_id"), MessageManager.getString("label.enter_pdb_id"), JOptionPane.QUESTION_MESSAGE);\r
  
      if (id != null && id.length() > 0)
      {
  
        EditNameDialog dialog = new EditNameDialog(
                sequence.getSequenceAsString(sg.getStartRes(),
-                       sg.getEndRes() + 1), null, "Edit Sequence ", null,
-               "Edit Sequence", ap.alignFrame);
+                       sg.getEndRes() + 1), null, MessageManager.getString("label.edit_sequence"), null,\r
+                       MessageManager.getString("label.edit_sequence"), ap.alignFrame);\r
  
        if (dialog.accept)
        {
-         EditCommand editCommand = new EditCommand("Edit Sequences",
+         EditCommand editCommand = new EditCommand(MessageManager.getString("label.edit_sequences"),\r
                  EditCommand.REPLACE, dialog.getName().replace(' ',
                          ap.av.getGapCharacter()),
                  sg.getSequencesAsArray(ap.av.getHiddenRepSequences()),
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
@@@ -14,6 -14,7 +14,7 @@@
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.gui;
  
@@@ -287,7 -288,6 +288,7 @@@ public class SequenceRenderer implement
      }
      else
      {
 +      boolean srep = av.isDisplayReferenceSeq();
        boolean getboxColour = false;
        for (int i = start; i <= end; i++)
        {
            if (currentSequenceGroup.getShowNonconserved()) // todo optimize
            {
              // todo - use sequence group consensus
 -            s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
 +            s = getDisplayChar(srep, i, s,
                      '.');
  
            }
            }
            if (av.getShowUnconserved())
            {
 -            s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
 +            s = getDisplayChar(srep, i, s,
                      '.');
  
            }
      }
    }
  
 -  private char getDisplayChar(AlignmentAnnotation consensus, int position,
 +  private char getDisplayChar(final boolean usesrep, int position,
            char s, char c)
    {
 -    char conschar = consensus.annotations[position].displayCharacter
 +    // TODO - use currentSequenceGroup rather than alignemnt 
 +    // currentSequenceGroup.getConsensus()
 +    char conschar = (usesrep) ? av.getAlignment().getSeqrep().getCharAt(position) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
              .charAt(0);
      if (conschar != '-' && s == conschar)
      {
@@@ -1,6 -1,6 +1,6 @@@
  /*
-  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
-  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+  * Copyright (C) 2014 The Jalview Authors
   * 
   * This file is part of Jalview.
   * 
@@@ -14,6 -14,7 +14,7 @@@
   * PURPOSE.  See the GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+  * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.viewmodel;
  
@@@ -40,7 -41,9 +41,9 @@@ import jalview.workers.AlignCalcManager
  import jalview.workers.ConsensusThread;
  import jalview.workers.StrucConsensusThread;
  
+ import java.awt.Color;
  import java.util.ArrayList;
+ import java.util.BitSet;
  import java.util.Hashtable;
  import java.util.List;
  import java.util.Map;
@@@ -209,6 -212,24 +212,24 @@@ public abstract class AlignmentViewpor
      // calculation till later or to do all calculations in thread.
      // via changecolour
      globalColourScheme = cs;
+     boolean recalc=false;
+     if (cs!=null)
+     {
+       cs.setConservationApplied(recalc = getConservationSelected());
+       if (getAbovePIDThreshold() || cs instanceof PIDColourScheme || cs instanceof Blosum62ColourScheme)
+       {
+         recalc = true;
+         cs.setThreshold(threshold, ignoreGapsInConsensusCalculation);
+       } else {
+         cs.setThreshold(0, ignoreGapsInConsensusCalculation);
+       }
+       if (recalc)
+       {
+         cs.setConsensus(hconsensus);
+         cs.setConservation(hconservation);
+       }
+       cs.alignmentChanged(alignment, hiddenRepSequences);
+     }
      if (getColourAppliesToAllGroups())
      {
        for (SequenceGroup sg : getAlignment().getGroups())
            sg.cs = null;
            continue;
          }
-         if (cs instanceof ClustalxColourScheme)
-         {
-           sg.cs = new ClustalxColourScheme(sg, getHiddenRepSequences());
-         }
-         else
-         {
-           try
-           {
-             sg.cs = cs.getClass().newInstance();
-           } catch (Exception ex)
-           {
-             ex.printStackTrace();
-             sg.cs = cs;
-           }
-         }
+         sg.cs = cs.applyTo(sg, getHiddenRepSequences());
+         sg.setConsPercGaps(ConsPercGaps);
          if (getAbovePIDThreshold() || cs instanceof PIDColourScheme
                  || cs instanceof Blosum62ColourScheme)
          {
            sg.cs.setThreshold(threshold, getIgnoreGapsConsensus());
-           sg.cs.setConsensus(AAFrequency.calculate(
-                   sg.getSequences(getHiddenRepSequences()), 0,
-                   sg.getWidth()));
+           recalc=true;
          }
          else
          {
  
          if (getConservationSelected())
          {
-           Conservation c = new Conservation("Group",
-                   ResidueProperties.propHash, 3,
-                   sg.getSequences(getHiddenRepSequences()), 0,
-                   getAlignment().getWidth() - 1);
-           c.calculate();
-           c.verdict(false, getConsPercGaps());
-           sg.cs.setConservation(c);
+           sg.cs.setConservationApplied(true);
+           recalc=true;
          }
          else
          {
            sg.cs.setConservation(null);
-           sg.cs.setThreshold(0, getIgnoreGapsConsensus());
+           // sg.cs.setThreshold(0, getIgnoreGapsConsensus());
+         }
+         if (recalc) {
+           sg.recalcConservation();
+         } else {
+           sg.cs.alignmentChanged(sg, hiddenRepSequences);
          }
        }
      }
  
     * view
     */
    protected Hashtable[] hStrucConsensus = null;
+   
+   protected Conservation hconservation = null;
+   @Override
+   public void setConservation(Conservation cons)
+   {
+     hconservation = cons;
+   }
    /**
     * percentage gaps allowed in a column before all amino acid properties should
     * be considered unconserved
     * 
     * @return null or the currently selected sequence region
     */
+   @Override
    public SequenceGroup getSelectionGroup()
    {
      return selectionGroup;
     *          - group holding references to sequences in this alignment view
     * 
     */
+   @Override
    public void setSelectionGroup(SequenceGroup sg)
    {
      selectionGroup = sg;
  
    protected boolean showConsensus = true;
  
+   Hashtable sequenceColours;
    /**
     * Property change listener for changes in alignment
     * 
  
    public boolean isHiddenRepSequence(SequenceI seq)
    {
 -    return hiddenRepSequences != null
 -            && hiddenRepSequences.containsKey(seq);
 +    return alignment.getSeqrep()==seq || (hiddenRepSequences != null
 +            && hiddenRepSequences.containsKey(seq));
    }
  
    public SequenceGroup getRepresentedSequences(SequenceI seq)
     * 
     * @return array of references to sequence objects
     */
+   @Override
    public SequenceI[] getSequenceSelection()
    {
      SequenceI[] sequences = null;
     * 
     * @return String[]
     */
+   @Override
    public jalview.datamodel.CigarArray getViewAsCigars(
            boolean selectedRegionOnly)
    {
     *          boolean true to just return the selected view
     * @return AlignmentView
     */
+   @Override
    public jalview.datamodel.AlignmentView getAlignmentView(
            boolean selectedOnly)
    {
     *          is true)
     * @return AlignmentView
     */
+   @Override
    public jalview.datamodel.AlignmentView getAlignmentView(
            boolean selectedOnly, boolean markGroups)
    {
     * 
     * @return String[]
     */
+   @Override
    public String[] getViewAsString(boolean selectedRegionOnly)
    {
      String[] selection = null;
      ColourSchemeI cs = globalColourScheme;
      if (cs != null)
      {
-       cs.alignmentChanged(alignment, null);
+       cs.alignmentChanged(alignment, hiddenRepSequences);
  
        cs.setConsensus(hconsensus);
        if (cs.conservationApplied())
      int charHeight = getCharHeight();
      if (aa != null)
      {
-       boolean graphgrp[] = null;
+       BitSet graphgrp = new BitSet();
        for (int i = 0; i < aa.length; i++)
        {
          if (aa[i] == null)
          }
          if (aa[i].graphGroup > -1)
          {
-           if (graphgrp == null)
-           {
-             graphgrp = new boolean[aa.length];
-           }
-           if (graphgrp[aa[i].graphGroup])
+           if (graphgrp.get(aa[i].graphGroup))
            {
              continue;
            }
            else
            {
-             graphgrp[aa[i].graphGroup] = true;
+             graphgrp.set(aa[i].graphGroup);
            }
          }
          aa[i].height = 0;
          if (aan[an].autoCalculated && aan[an].groupRef != null)
          {
            oldrfs.add(aan[an].groupRef);
-           alignment.deleteAnnotation(aan[an]);
-           aan[an] = null;
+           alignment.deleteAnnotation(aan[an],false);
          }
        }
      }
      }
      oldrfs.clear();
    }
 +  /**
 +   * show the reference sequence in the alignment view
 +   */
 +  private boolean displayReferenceSeq=false;
 +  /**
 +   * colour according to the reference sequence defined on the alignment
 +   */
 +  private boolean colourByReferenceSeq=false;
 +
 +  public boolean isDisplayReferenceSeq()
 +  {
 +    return alignment.hasSeqrep() && displayReferenceSeq;
 +  }
 +
 +  public void setDisplayReferenceSeq(boolean displayReferenceSeq)
 +  {
 +    this.displayReferenceSeq = displayReferenceSeq;
 +  }
 +
 +  public boolean isColourByReferenceSeq()
 +  {
 +    return alignment.hasSeqrep() && colourByReferenceSeq;
 +  }
 +
 +  public void setColourByReferenceSeq(boolean colourByReferenceSeq)
 +  {
 +    this.colourByReferenceSeq = colourByReferenceSeq;
 +  }
  
+   @Override
+   public Color getSequenceColour(SequenceI seq)
+   {
+     Color sqc=Color.white;
+     if (sequenceColours != null)
+     {
+       sqc = (Color) sequenceColours.get(seq);
+       if (sqc == null) {
+         sqc = Color.white;
+       }
+     }
+     return sqc;
+   }
+   @Override
+   public void setSequenceColour(SequenceI seq, Color col)
+   {
+     if (sequenceColours == null)
+     {
+       sequenceColours = new Hashtable();
+     }
+     if (col == null)
+     {
+       sequenceColours.remove(seq);
+     }
+     else
+     {
+       sequenceColours.put(seq, col);
+     }
+   }
+   @Override
+   public void updateSequenceIdColours()
+   {
+     if (sequenceColours == null)
+     {
+       sequenceColours = new Hashtable();
+     }
+     for (SequenceGroup sg : alignment.getGroups())
+     {
+       if (sg.idColour != null)
+       {
+         for (SequenceI s : sg.getSequences(getHiddenRepSequences()))
+         {
+           sequenceColours.put(s, sg.idColour);
+         }
+       }
+     }
+   }
+   @Override
+   public void clearSequenceColours()
+   {
+     sequenceColours = null;
+   };
  }