diff --git a/Rendering/Core/Testing/Cxx/CMakeLists.txt b/Rendering/Core/Testing/Cxx/CMakeLists.txt
index 2c9af5e1ac2af78c4ac2a3db3e835a2188b47df3..229f5cfe47f7a30f20a1d42dfeb6433330e3d6af 100644
--- a/Rendering/Core/Testing/Cxx/CMakeLists.txt
+++ b/Rendering/Core/Testing/Cxx/CMakeLists.txt
@@ -58,6 +58,7 @@ vtk_add_test_cxx(${vtk-module}CxxTests tests
   TestGradientBackground.cxx
   TestHiddenLineRemovalPass.cxx
   TestHomogeneousTransformOfActor.cxx
+  TestImageAndAnnotations.cxx,NO_DATA
   TestInteractorStyleImageProperty.cxx,NO_VALID
   TestInteractorTimers.cxx,NO_VALID
   TestLabeledContourMapper.cxx
diff --git a/Rendering/Core/Testing/Cxx/TestImageAndAnnotations.cxx b/Rendering/Core/Testing/Cxx/TestImageAndAnnotations.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c7e32385f0a14e13985fd327baae1ef1c4f03e15
--- /dev/null
+++ b/Rendering/Core/Testing/Cxx/TestImageAndAnnotations.cxx
@@ -0,0 +1,133 @@
+#include <vtkCornerAnnotation.h>
+#include <vtkImageData.h>
+#include <vtkImageMapper.h>
+#include <vtkInteractorStyleImage.h>
+#include <vtkProperty2D.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkSmartPointer.h>
+#include <vtkTextProperty.h>
+
+#include <vtkTestUtilities.h>
+#include <vtkRegressionTestImage.h>
+
+namespace
+{
+
+vtkSmartPointer<vtkImageData> CreateColorImage(unsigned int dim, bool transparent)
+{
+  vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
+  image->SetDimensions(dim, dim, 1);
+  image->AllocateScalars(VTK_UNSIGNED_CHAR, 4);
+
+  for (unsigned int x = 0; x < dim; x++)
+    {
+    for (unsigned int y = 0; y < dim; y++)
+      {
+      unsigned char* pixel = static_cast<unsigned char*>(image->GetScalarPointer(x, y, 0));
+      pixel[0] = 255;
+      pixel[1] = 0;
+      pixel[2] = 255;
+      pixel[3] = transparent ? 127 : 255;
+      }
+    }
+
+  return image;
+}
+
+vtkSmartPointer<vtkActor2D> CreateImageActor(int dim, int displayLocation, bool transparent)
+{
+  vtkSmartPointer<vtkImageData> colorImage = CreateColorImage(dim, transparent);
+
+  vtkSmartPointer<vtkImageMapper> imageMapper = vtkSmartPointer<vtkImageMapper>::New();
+  imageMapper->SetInputData(colorImage);
+  imageMapper->SetColorWindow(255);
+  imageMapper->SetColorLevel(127.5);
+
+  vtkSmartPointer<vtkActor2D> imageActor = vtkSmartPointer<vtkActor2D>::New();
+  imageActor->SetMapper(imageMapper);
+  imageActor->SetPosition(dim, 0);
+  imageActor->GetProperty()->SetDisplayLocation(displayLocation);
+
+  return imageActor;
+}
+
+} // namespace
+
+int TestImageAndAnnotations(int argc, char *argv[])
+{
+  // Setup renderer
+  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
+
+  // Setup render window
+  vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
+  renderWindow->SetSize(600, 600);
+  renderWindow->AddRenderer(renderer);
+
+  // Setup render window interactor
+  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
+    vtkSmartPointer<vtkRenderWindowInteractor>::New();
+  vtkSmartPointer<vtkInteractorStyleImage> style =
+    vtkSmartPointer<vtkInteractorStyleImage>::New();
+  renderWindowInteractor->SetInteractorStyle(style);
+
+  // Setup corner annotation
+  vtkSmartPointer<vtkCornerAnnotation> cornerAnnotation =
+    vtkSmartPointer<vtkCornerAnnotation>::New();
+  cornerAnnotation->SetLinearFontScaleFactor(2);
+  cornerAnnotation->SetNonlinearFontScaleFactor(1);
+  cornerAnnotation->SetMaximumFontSize(20);
+  cornerAnnotation->SetText(0, "background/opaque"); // lower left
+  cornerAnnotation->SetText(1, "foreground/opaque"); // lower right
+  cornerAnnotation->SetText(2, "background/transparent"); // upper left
+  cornerAnnotation->SetText(3, "foreground/transparent"); // upper right
+  cornerAnnotation->GetTextProperty()->SetColor(1, 1, 1);
+
+  renderer->AddViewProp(cornerAnnotation);
+
+  // Setup images
+  const unsigned int Dim = 300;
+  {
+    // lower left: background/opaque
+    bool transparent = false;
+    vtkSmartPointer<vtkActor2D> imageActor = CreateImageActor(Dim, VTK_BACKGROUND_LOCATION, transparent);
+    imageActor->SetPosition(0, 0);
+    renderer->AddActor(imageActor);
+    }
+  {
+    // lower right: foreground/opaque
+    bool transparent = false;
+    vtkSmartPointer<vtkActor2D> imageActor = CreateImageActor(Dim, VTK_FOREGROUND_LOCATION, transparent);
+    imageActor->SetPosition(Dim, 0);
+    renderer->AddActor(imageActor);
+  }
+  {
+    // upper left: background/transparent
+    bool transparent = true;
+    vtkSmartPointer<vtkActor2D> imageActor = CreateImageActor(Dim, VTK_BACKGROUND_LOCATION, transparent);
+    imageActor->SetPosition(0, Dim);
+    renderer->AddActor(imageActor);
+  }
+  {
+    // upper right: foreground/transparent
+    bool transparent = true;
+    vtkSmartPointer<vtkActor2D> imageActor = CreateImageActor(Dim, VTK_FOREGROUND_LOCATION, transparent);
+    imageActor->SetPosition(Dim, Dim);
+    renderer->AddActor(imageActor);
+  }
+
+  renderer->ResetCamera();
+
+  // Render and start interaction
+  renderWindowInteractor->SetRenderWindow(renderWindow);
+  renderWindowInteractor->Initialize();
+
+  int retVal = vtkRegressionTestImage( renderWindow );
+  if ( retVal == vtkRegressionTester::DO_INTERACTOR)
+    {
+    renderWindowInteractor->Start();
+    }
+
+  return !retVal;
+}
diff --git a/Rendering/Core/Testing/Data/Baseline/TestImageAndAnnotations.png.md5 b/Rendering/Core/Testing/Data/Baseline/TestImageAndAnnotations.png.md5
new file mode 100644
index 0000000000000000000000000000000000000000..0bee814c4074fb4e35a54e9a46dfe837dc962e37
--- /dev/null
+++ b/Rendering/Core/Testing/Data/Baseline/TestImageAndAnnotations.png.md5
@@ -0,0 +1 @@
+27dff115bc20d630b32da6da2581c199
diff --git a/Rendering/OpenGL2/glsl/vtkPolyData2DFS.glsl b/Rendering/OpenGL2/glsl/vtkPolyData2DFS.glsl
index e46e9d494caebf5ccae1e556202770e2892476f6..b2aeb53284fe308dbd03293a9668da8a224ed046 100644
--- a/Rendering/OpenGL2/glsl/vtkPolyData2DFS.glsl
+++ b/Rendering/OpenGL2/glsl/vtkPolyData2DFS.glsl
@@ -42,6 +42,12 @@ void main()
 
   //VTK::Color::Impl
   //VTK::TCoord::Impl
+
   //VTK::DepthPeeling::Impl
   //VTK::Picking::Impl
+
+  if (gl_FragData[0].a <= 0.0)
+    {
+    discard;
+    }
 }
diff --git a/Rendering/OpenGL2/vtkOpenGLImageMapper.cxx b/Rendering/OpenGL2/vtkOpenGLImageMapper.cxx
index c8143318ca6d7848119518c57ba9909cc0ba7db3..32e969024e55ae1d8893513829f001fe51ebe6ba 100644
--- a/Rendering/OpenGL2/vtkOpenGLImageMapper.cxx
+++ b/Rendering/OpenGL2/vtkOpenGLImageMapper.cxx
@@ -607,6 +607,9 @@ void vtkOpenGLImageMapper::RenderData(vtkViewport* viewport,
     return;
     }
 
+
+  this->Actor->SetProperty(actor->GetProperty());
+
   // Make this window current. May have become not current due to
   // data updates since the render started.
   window->MakeCurrent();
@@ -691,9 +694,7 @@ void vtkOpenGLImageMapper::DrawPixels(vtkViewport *viewport, int width, int heig
 
   this->Actor->GetTexture()->SetInputData(id);
 
-  glDisable(GL_DEPTH_TEST);
   this->Actor->RenderOverlay(viewport);
-  glEnable(GL_DEPTH_TEST);
   id->Delete();
 }