diff --git a/src/app/ui/color_bar.cpp b/src/app/ui/color_bar.cpp
index 1e9b3ad17..8fd8b0293 100644
--- a/src/app/ui/color_bar.cpp
+++ b/src/app/ui/color_bar.cpp
@@ -98,7 +98,7 @@ ColorBar* ColorBar::m_instance = NULL;
 ColorBar::ColorBar(int align)
   : Box(align)
   , m_buttons(int(PalButton::MAX))
-  , m_paletteView(true, this,
+  , m_paletteView(true, PaletteView::FgBgColors, this,
       App::instance()->preferences().colorBar.boxSize() * guiscale())
   , m_remapButton("Remap")
   , m_fgColor(app::Color::fromRgb(255, 255, 255), IMAGE_RGB)
@@ -220,12 +220,14 @@ app::Color ColorBar::getBgColor()
 void ColorBar::setFgColor(const app::Color& color)
 {
   m_fgColor.setColor(color);
+  m_paletteView.invalidate();
   FgColorChange(color);
 }
 
 void ColorBar::setBgColor(const app::Color& color)
 {
   m_bgColor.setColor(color);
+  m_paletteView.invalidate();
   BgColorChange(color);
 }
 
@@ -463,8 +465,10 @@ void ColorBar::onPaletteViewPasteColors(
 
 void ColorBar::onFgColorButtonChange(const app::Color& color)
 {
-  if (!m_lock)
+  if (!m_lock) {
     m_paletteView.deselect();
+    m_paletteView.invalidate();
+  }
 
   FgColorChange(color);
   onColorButtonChange(color);
@@ -472,8 +476,10 @@ void ColorBar::onFgColorButtonChange(const app::Color& color)
 
 void ColorBar::onBgColorButtonChange(const app::Color& color)
 {
-  if (!m_lock)
+  if (!m_lock) {
     m_paletteView.deselect();
+    m_paletteView.invalidate();
+  }
 
   BgColorChange(color);
   onColorButtonChange(color);
diff --git a/src/app/ui/color_selector.cpp b/src/app/ui/color_selector.cpp
index 628151f55..bf8d5ff7f 100644
--- a/src/app/ui/color_selector.cpp
+++ b/src/app/ui/color_selector.cpp
@@ -55,7 +55,7 @@ ColorSelector::ColorSelector()
   , m_vbox(JI_VERTICAL)
   , m_topBox(JI_HORIZONTAL)
   , m_color(app::Color::fromMask())
-  , m_colorPalette(false, this, 7*guiscale())
+  , m_colorPalette(false, PaletteView::SelectOneColor, this, 7*guiscale())
   , m_indexButton("Index", 1, kButtonWidget)
   , m_rgbButton("RGB", 1, kButtonWidget)
   , m_hsvButton("HSB", 1, kButtonWidget)
diff --git a/src/app/ui/palette_view.cpp b/src/app/ui/palette_view.cpp
index 76f099519..300c0a5ca 100644
--- a/src/app/ui/palette_view.cpp
+++ b/src/app/ui/palette_view.cpp
@@ -16,6 +16,7 @@
 #include "app/modules/editors.h"
 #include "app/modules/gui.h"
 #include "app/modules/palettes.h"
+#include "app/ui/color_bar.h"   // TODO avoid depending on ColorBar
 #include "app/ui/editor/editor.h"
 #include "app/ui/palette_view.h"
 #include "app/ui/skin/skin_theme.h"
@@ -55,10 +56,11 @@ WidgetType palette_view_type()
   return type;
 }
 
-PaletteView::PaletteView(bool editable, PaletteViewDelegate* delegate, int boxsize)
+PaletteView::PaletteView(bool editable, PaletteViewStyle style, PaletteViewDelegate* delegate, int boxsize)
   : Widget(palette_view_type())
   , m_state(State::WAITING)
   , m_editable(editable)
+  , m_style(style)
   , m_delegate(delegate)
   , m_columns(16)
   , m_boxsize(boxsize)
@@ -395,6 +397,13 @@ void PaletteView::onPaint(ui::PaintEvent& ev)
   ui::Graphics* g = ev.getGraphics();
   gfx::Rect bounds = getClientBounds();
   Palette* palette = get_current_palette();
+  int fgIndex = -1;
+  int bgIndex = -1;
+
+  if (m_style == FgBgColors) {
+    fgIndex = findExactIndex(ColorBar::instance()->getFgColor());
+    bgIndex = findExactIndex(ColorBar::instance()->getBgColor());
+  }
 
   g->fillRect(gfx::rgba(0, 0, 0), bounds);
 
@@ -408,9 +417,28 @@ void PaletteView::onPaint(ui::PaintEvent& ev)
 
     g->fillRect(color, box);
 
-    if (m_currentEntry == i)
-      g->fillRect(color_utils::blackandwhite_neg(color),
-        gfx::Rect(box.getCenter(), gfx::Size(1, 1)));
+    switch (m_style) {
+
+      case SelectOneColor:
+        if (m_currentEntry == i)
+          g->fillRect(color_utils::blackandwhite_neg(color),
+                      gfx::Rect(box.getCenter(), gfx::Size(1, 1)));
+        break;
+
+      case FgBgColors:
+        if (fgIndex == i) {
+          gfx::Color neg = color_utils::blackandwhite_neg(color);
+          for (int i=0; i<m_boxsize/2; ++i)
+            g->drawHLine(neg, box.x, box.y+i, m_boxsize/2-i);
+        }
+
+        if (bgIndex == i) {
+          gfx::Color neg = color_utils::blackandwhite_neg(color);
+          for (int i=0; i<m_boxsize/4; ++i)
+            g->drawHLine(neg, box.x+box.w-(i+1), box.y+box.h-m_boxsize/4+i, i+1);
+        }
+        break;
+    }
   }
 
   // Draw selected entries
@@ -735,4 +763,24 @@ void PaletteView::setCursor()
     ui::set_mouse_cursor(kArrowCursor);
 }
 
+int PaletteView::findExactIndex(const app::Color& color) const
+{
+  switch (color.getType()) {
+
+    case Color::MaskType:
+      return (current_editor ? current_editor->sprite()->transparentColor(): -1);
+
+    case Color::RgbType:
+    case Color::HsvType:
+    case Color::GrayType:
+      return get_current_palette()->findExactMatch(color.getRed(), color.getGreen(), color.getBlue());
+
+    case Color::IndexType:
+      return color.getIndex();
+  }
+
+  ASSERT(false);
+  return -1;
+}
+
 } // namespace app
diff --git a/src/app/ui/palette_view.h b/src/app/ui/palette_view.h
index af48c97e4..305b5b169 100644
--- a/src/app/ui/palette_view.h
+++ b/src/app/ui/palette_view.h
@@ -39,7 +39,12 @@ namespace app {
   class PaletteView : public ui::Widget
                     , public MarchingAnts {
   public:
-    PaletteView(bool editable, PaletteViewDelegate* delegate, int boxsize);
+    enum PaletteViewStyle {
+      SelectOneColor,
+      FgBgColors
+    };
+
+    PaletteView(bool editable, PaletteViewStyle style, PaletteViewDelegate* delegate, int boxsize);
 
     bool isEditable() const { return m_editable; }
 
@@ -118,9 +123,11 @@ namespace app {
     bool pickedXY(const doc::PalettePicks& entries, int i, int dx, int dy) const;
     void updateCopyFlag(ui::Message* msg);
     void setCursor();
+    int findExactIndex(const app::Color& color) const;
 
     State m_state;
     bool m_editable;
+    PaletteViewStyle m_style;
     PaletteViewDelegate* m_delegate;
     int m_columns;
     int m_boxsize;