diff --git a/uk/ac/sanger/artemis/components/alignment/LookSeqPanel.java b/uk/ac/sanger/artemis/components/alignment/LookSeqPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..13af786005d1be7b4759b5a1d0c300770abef560
--- /dev/null
+++ b/uk/ac/sanger/artemis/components/alignment/LookSeqPanel.java
@@ -0,0 +1,318 @@
+/* LookSeqFrame.java
+ *
+ * created: 2009
+ *
+ * This file is part of Artemis
+ *
+ * Copyright(C) 2009  Genome Research Limited
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or(at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
+
+package uk.ac.sanger.artemis.components.alignment;
+
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JFrame;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JSeparator;
+
+import uk.ac.sanger.artemis.components.DisplayAdjustmentEvent;
+import uk.ac.sanger.artemis.components.DisplayAdjustmentListener;
+import uk.ac.sanger.artemis.components.FeatureDisplay;
+import uk.ac.sanger.artemis.components.SwingWorker;
+
+public class LookSeqPanel extends JPanel
+                          implements DisplayAdjustmentListener
+{
+  private static final long serialVersionUID = 1L;
+  /** image icon */
+  private ImageIcon ii;
+  private String urlStr;
+  private String queryStr;
+  private FeatureDisplay feature_display;
+  private int lastStart = -1;
+  private int lastEnd   = -1;
+  final JPopupMenu popup  = new JPopupMenu("Plot Options");
+
+  public LookSeqPanel()
+  {
+    super();
+    setUpPopupMenu();
+  }
+  
+  public LookSeqPanel(URL url)
+  {
+    super();
+    ii = new ImageIcon(url);
+    setUpPopupMenu();
+  }
+  
+  /**
+   * 
+   * @param urlStr
+   * @param query
+   */
+  public LookSeqPanel(final String urlStr, final String queryStr)
+  {
+    super();
+    setImage(urlStr, queryStr);
+    setUpPopupMenu();
+  }
+  
+  private void setUpPopupMenu()
+  {
+    JCheckBoxMenuItem optionCoverage = new JCheckBoxMenuItem("Show coverage", false);
+    optionCoverage.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        queryStr = queryStr.replaceFirst("view=\\w+", "view=coverage");
+        setImage(urlStr, queryStr);
+        revalidate();
+      }
+    });
+    popup.add(optionCoverage);
+    
+    JCheckBoxMenuItem optionIndel = new JCheckBoxMenuItem("Show paired reads", true);
+    
+    optionIndel.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        queryStr = queryStr.replaceFirst("view=\\w+", "view=indel");
+        setImage(urlStr, queryStr);
+        revalidate();
+      }
+    });
+    popup.add(optionIndel);
+    
+    ButtonGroup group = new ButtonGroup();
+    group.add(optionCoverage);
+    group.add(optionIndel);
+    
+    popup.add(new JSeparator());
+    final JCheckBoxMenuItem perfectIndel = 
+      new JCheckBoxMenuItem("Show perfect paired matches", true);
+    perfectIndel.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(perfectIndel.isSelected(), "perfect");
+      }
+    });
+    popup.add(perfectIndel);
+    
+    final JCheckBoxMenuItem snps = 
+      new JCheckBoxMenuItem("Show paired reads with SNPs", true);
+    snps.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(snps.isSelected(), "snps");
+      }
+    });
+    popup.add(snps);
+    
+    final JCheckBoxMenuItem inversions = 
+      new JCheckBoxMenuItem("Show inversions", true);
+    inversions.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(inversions.isSelected(), "inversions");
+      }
+    });
+    popup.add(inversions);
+    
+    final JCheckBoxMenuItem single = 
+      new JCheckBoxMenuItem("Show single reads", true);
+    single.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(single.isSelected(), "single");
+      }
+    });
+    popup.add(single);
+    
+    final JCheckBoxMenuItem inversions_ext = 
+      new JCheckBoxMenuItem("Show inversions_ext", true);
+    inversions_ext.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(inversions_ext.isSelected(), "inversions_ext");
+      }
+    });
+    popup.add(inversions_ext);
+    
+    final JCheckBoxMenuItem pairlinks = 
+      new JCheckBoxMenuItem("Show link pairs", true);
+    pairlinks.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(inversions_ext.isSelected(), "pairlinks");
+      }
+    });
+    popup.add(pairlinks);
+    
+    final JCheckBoxMenuItem potsnps = 
+      new JCheckBoxMenuItem("Show known SNPs", true);
+    potsnps.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(inversions_ext.isSelected(), "potsnps");
+      }
+    });
+    popup.add(potsnps);
+    
+    final JCheckBoxMenuItem uniqueness = 
+      new JCheckBoxMenuItem("Show uniqueness", true);
+    uniqueness.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        setDisplayOption(inversions_ext.isSelected(), "uniqueness");
+      }
+    });
+    popup.add(uniqueness);
+    
+    addMouseListener(mouseListener);
+  }
+
+  public void setImage(final String urlStr, final String queryStr)
+  {
+    this.urlStr = urlStr;
+    this.queryStr = queryStr;
+    
+    
+    try
+    {
+      ii = new ImageIcon(new URL(urlStr+queryStr));
+      setPreferredSize(new Dimension(ii.getIconWidth(),
+          ii.getIconHeight()));
+    }
+    catch (MalformedURLException e)
+    {
+      e.printStackTrace();
+    }
+  }
+  
+  /**
+  * Override the paintComponent
+  */
+  public void paintComponent(Graphics g)
+  {
+    super.paintComponent(g);
+    if(ii != null)
+      ii.paintIcon(this,g,0,0);
+  }
+  
+  
+  public void displayAdjustmentValueChanged(DisplayAdjustmentEvent event)
+  {   
+    if(lastStart == event.getStart() && lastEnd == event.getEnd())
+      return;
+    
+    lastStart = event.getStart();
+    lastEnd   = event.getEnd();
+    queryStr = queryStr.replaceFirst("from=\\d+", "from="+Integer.toString(event.getStart()));
+    queryStr = queryStr.replaceFirst("to=\\d+", "to="+Integer.toString(event.getEnd()));    
+
+    if(feature_display != null)
+    {
+      int width = feature_display.getSize().width;
+      queryStr = queryStr.replaceFirst("width=\\d+", "width="+Integer.toString(width));
+    }
+    //System.out.println("displayAdjustmentValueChanged() "+
+    //    event.getStart()+".."+event.getEnd());
+    displayImage();
+  }
+  
+  private void displayImage()
+  {
+    SwingWorker worker = new SwingWorker()
+    {
+      public Object construct()
+      {
+        setImage(urlStr, queryStr);
+        //System.out.println(queryStr);
+        repaint();
+        return null;
+      }
+    };
+    worker.start();
+  }
+  
+  private void setDisplayOption(boolean selected, String option)
+  {
+    if(selected)
+      queryStr = queryStr.replaceFirst("display=", "display=\\|"+option);
+    else
+      queryStr = queryStr.replaceAll("\\|"+option, "");
+    
+    setImage(urlStr, queryStr);
+    repaint();
+    revalidate();
+  }
+  
+  final MouseListener mouseListener = new MouseAdapter()
+  {
+    /**
+     *  Listen for mouse press events.
+     **/
+    public void mousePressed(MouseEvent event)
+    {
+      if(!event.isPopupTrigger())
+        return;
+      popup.show(LookSeqPanel.this, event.getX(), event.getY());
+    }
+  };
+  
+  public static void main(String args[])
+  {
+    String urlStr = "http://www.sanger.ac.uk/cgi-bin/teams/team112/lookseq/get_data.pl?";
+    String queryStr = "from=157682&to=479328&chr=MAL1&output=image&width=1024&lane=sample_2a&view=indel&display=|perfect|snps|inversions|pairlinks|potsnps|uniqueness|&debug=0";
+    LookSeqPanel lookseq = new LookSeqPanel(urlStr, queryStr);
+    
+    JFrame f = new JFrame();
+    f.getContentPane().add(lookseq);
+    f.pack();
+    f.setVisible(true);
+  }
+
+  public void setFeatureDisplay(FeatureDisplay feature_display)
+  {
+    this.feature_display = feature_display;
+  }
+}
+