diff --git a/src/Graphic3d/FILES b/src/Graphic3d/FILES
index 5698da7e12..cbb660aba2 100755
--- a/src/Graphic3d/FILES
+++ b/src/Graphic3d/FILES
@@ -61,6 +61,7 @@ Graphic3d_Vec2.hxx
 Graphic3d_Vec3.hxx
 Graphic3d_Vec4.hxx
 Graphic3d_Mat4.hxx
+Graphic3d_ZLayerSettings.hxx
 Graphic3d_Vertex.hxx
 Graphic3d_Vertex.cxx
 Graphic3d_MarkerImage.hxx
diff --git a/src/Graphic3d/Graphic3d.cdl b/src/Graphic3d/Graphic3d.cdl
index 4f5c5405bf..f3a49f6aaf 100644
--- a/src/Graphic3d/Graphic3d.cdl
+++ b/src/Graphic3d/Graphic3d.cdl
@@ -419,6 +419,8 @@ is
     primitive Mat4;
     primitive Mat4d;
 
+    primitive ZLayerSettings;
+
     --------------------
     -- Category: Classes
     --------------------
diff --git a/src/Graphic3d/Graphic3d_GraphicDriver.cdl b/src/Graphic3d/Graphic3d_GraphicDriver.cdl
index c7e9c846c9..cf1e6f3739 100644
--- a/src/Graphic3d/Graphic3d_GraphicDriver.cdl
+++ b/src/Graphic3d/Graphic3d_GraphicDriver.cdl
@@ -53,6 +53,8 @@ uses
     PrintAlgo           from Aspect,
     DisplayConnection_Handle from Aspect,
 
+    ZLayerSettings      from Graphic3d,
+
     AspectLine3d        from Graphic3d,
     AspectMarker3d      from Graphic3d,
     AspectText3d        from Graphic3d,
@@ -945,6 +947,13 @@ is
         ---Purpose: Get Z layer ID of structure. If the structure doesn't
         -- exists in graphic driver, the method returns -1.
 
+    SetZLayerSettings( me          : mutable;
+                       theCView    : CView from Graphic3d;
+                       theLayerId  : Integer from Standard;
+                       theSettings : ZLayerSettings from Graphic3d)
+        is deferred;
+        ---Purpose:  Sets the settings for a single Z layer of specified view.
+
     -----------------------------
     -- Category: Internal methods
     -----------------------------
diff --git a/src/Graphic3d/Graphic3d_StructureManager.cdl b/src/Graphic3d/Graphic3d_StructureManager.cdl
index 4f2db7bfd2..710b35c787 100644
--- a/src/Graphic3d/Graphic3d_StructureManager.cdl
+++ b/src/Graphic3d/Graphic3d_StructureManager.cdl
@@ -40,6 +40,8 @@ uses
 	TypeOfHighlightMethod	from Aspect,
 	TypeOfUpdate		from Aspect,
 
+	ZLayerSettings      from Graphic3d,
+
 	DataStructureManager	from Graphic3d,
 	AspectFillArea3d	from Graphic3d,
 	AspectLine3d		from Graphic3d,
@@ -293,6 +295,17 @@ is
         ---Purpose: Get Z layer ID assigned to structure. If the structure
         -- has no layer ID (deleted from graphic driver), the method returns -1.
 
+        SetZLayerSettings ( me          : mutable;
+                            theLayerId  : Integer from Standard;
+                            theSettings : ZLayerSettings from Graphic3d )
+          is deferred;
+        ---Purpose: Sets the settings for a single Z layer for all managed views.
+
+        ZLayerSettings ( me          : mutable;
+                         theLayerId  : Integer from Standard )
+          returns ZLayerSettings from Graphic3d is deferred;
+        ---Purpose: Returns the settings of a single Z layer.
+        
         AddZLayer ( me : mutable;
                     theLayerId : in out Integer from Standard )
            returns Boolean from Standard is deferred;
diff --git a/src/Graphic3d/Graphic3d_ZLayerSettings.hxx b/src/Graphic3d/Graphic3d_ZLayerSettings.hxx
new file mode 100644
index 0000000000..e6a592a02b
--- /dev/null
+++ b/src/Graphic3d/Graphic3d_ZLayerSettings.hxx
@@ -0,0 +1,79 @@
+// Copyright (c) 2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Graphic3d_ZLayerSettings_HeaderFile
+#define _Graphic3d_ZLayerSettings_HeaderFile
+
+#include <Standard_TypeDef.hxx>
+
+enum Graphic3d_ZLayerSetting
+{
+  Graphic3d_ZLayerDepthTest = 1,
+  Graphic3d_ZLayerDepthWrite = 2,
+  Graphic3d_ZLayerDepthClear = 4,
+  Graphic3d_ZLayerDepthOffset = 8
+};
+
+struct Graphic3d_ZLayerSettings
+{
+  Graphic3d_ZLayerSettings()
+    : DepthOffsetFactor (1.0f),
+      DepthOffsetUnits  (1.0f),
+      Flags (Graphic3d_ZLayerDepthTest
+           | Graphic3d_ZLayerDepthWrite
+           | Graphic3d_ZLayerDepthClear)
+  {}
+
+  //! Returns true if theSetting is enabled.
+  const Standard_Boolean IsSettingEnabled (const Graphic3d_ZLayerSetting theSetting) const
+  {
+    return (Flags & theSetting) == theSetting;
+  }
+
+  //! Enables theSetting
+  void EnableSetting (const Graphic3d_ZLayerSetting theSetting)
+  {
+    Flags = Flags | theSetting;
+  }
+
+  //! Disables theSetting
+  void DisableSetting (const Graphic3d_ZLayerSetting theSetting)
+  {
+    Flags = Flags & (~theSetting);
+  }
+
+  //! Sets minimal possible positive depth offset.
+  //! Access DepthOffsetFactor and DepthOffsetUnits values for manual offset control.
+  void SetDepthOffsetPositive()
+  {
+    DepthOffsetFactor = 1.f;
+    DepthOffsetUnits  = 1.f;
+    EnableSetting (Graphic3d_ZLayerDepthOffset);
+  }
+
+  //! Sets minimal possible negative depth offset.
+  //! Access DepthOffsetFactor and DepthOffsetUnits values for manual offset control.
+  void SetDepthOffsetNegative()
+  {
+    DepthOffsetFactor =  1.f;
+    DepthOffsetUnits  = -1.f;
+    EnableSetting (Graphic3d_ZLayerDepthOffset);
+  }
+
+  Standard_ShortReal DepthOffsetFactor; //!< Factor argument value for OpenGl glPolygonOffset function.
+  Standard_ShortReal DepthOffsetUnits;  //!< Units argument value for OpenGl glPolygonOffset function.
+
+  Standard_Integer Flags; //!< Storage field for settings.
+};
+
+#endif // _Graphic3d_ZLayerSettings_HeaderFile
diff --git a/src/OpenGl/FILES b/src/OpenGl/FILES
index 4a801950b3..41edb199c5 100755
--- a/src/OpenGl/FILES
+++ b/src/OpenGl/FILES
@@ -108,6 +108,8 @@ OpenGl_LayerList.cxx
 OpenGl_LayerList.hxx
 OpenGl_IndexBuffer.hxx
 OpenGl_IndexBuffer.cxx
+OpenGl_Layer.cxx
+OpenGl_Layer.hxx
 OpenGl_TextureBufferArb.hxx
 OpenGl_TextureBufferArb.cxx
 OpenGl_Vec.hxx
diff --git a/src/OpenGl/OpenGl_GraphicDriver.hxx b/src/OpenGl/OpenGl_GraphicDriver.hxx
index ca4aede410..fedc272a54 100644
--- a/src/OpenGl/OpenGl_GraphicDriver.hxx
+++ b/src/OpenGl/OpenGl_GraphicDriver.hxx
@@ -305,6 +305,11 @@ public:
   //! graphic driver, the method returns -1. <br>
   Standard_EXPORT Standard_Integer GetZLayer(const Graphic3d_CStructure& theCStructure) const;
 
+  //! Sets the settings for a single Z layer of specified view.
+  Standard_EXPORT void SetZLayerSettings (const Graphic3d_CView& theCView,
+                                          const Standard_Integer theLayerId,
+                                          const Graphic3d_ZLayerSettings theSettings);
+
 public:
 
   //! @return the visualization options
diff --git a/src/OpenGl/OpenGl_GraphicDriver_7.cxx b/src/OpenGl/OpenGl_GraphicDriver_7.cxx
index 1cfee4ab7a..31f8198285 100644
--- a/src/OpenGl/OpenGl_GraphicDriver_7.cxx
+++ b/src/OpenGl/OpenGl_GraphicDriver_7.cxx
@@ -618,7 +618,6 @@ void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView,
 //function : RemoveZLayer
 //purpose  :
 //=======================================================================
-
 void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
                                          const Standard_Integer theLayerId)
 {
@@ -626,3 +625,16 @@ void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
   if (aCView)
     aCView->View->RemoveZLayer (theLayerId);
 }
+
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+Standard_EXPORT void OpenGl_GraphicDriver::SetZLayerSettings (const Graphic3d_CView& theCView,
+                                                              const Standard_Integer theLayerId,
+                                                              const Graphic3d_ZLayerSettings theSettings)
+{
+  const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
+  if (aCView)
+    aCView->View->SetZLayerSettings (theLayerId, theSettings);
+}
diff --git a/src/OpenGl/OpenGl_Layer.cxx b/src/OpenGl/OpenGl_Layer.cxx
new file mode 100644
index 0000000000..bbaa546612
--- /dev/null
+++ b/src/OpenGl/OpenGl_Layer.cxx
@@ -0,0 +1,88 @@
+// Created on: 2014-03-31
+// Created by: Danila ULYANOV
+// Copyright (c) 2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <OpenGl_Layer.hxx>
+
+#include <OpenGl_GlCore11.hxx>
+
+//=======================================================================
+//function : OpenGl_LayerSettings
+//purpose  : 
+//=======================================================================
+OpenGl_LayerSettings::OpenGl_LayerSettings()
+  : DepthOffsetFactor (1.0f),
+    DepthOffsetUnits  (1.0f),
+    Flags (OpenGl_LayerDepthTest
+          | OpenGl_LayerDepthWrite
+          | OpenGl_LayerDepthClear)
+{
+  //
+}
+
+//=======================================================================
+//function : OpenGl_Layer
+//purpose  : 
+//=======================================================================
+OpenGl_Layer::OpenGl_Layer (const Standard_Integer theNbPriorities)
+  : myPriorityList (theNbPriorities)
+{
+  //
+}
+
+//=======================================================================
+//function : Render
+//purpose  : 
+//=======================================================================
+void OpenGl_Layer::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
+{
+  // separate depth buffers
+  if (IsSettingEnabled (OpenGl_LayerDepthClear))
+  {
+    glClear (GL_DEPTH_BUFFER_BIT);
+  }
+
+  // handle depth test
+  if (IsSettingEnabled (OpenGl_LayerDepthTest))
+  {
+    glDepthFunc (GL_LESS);
+  }
+  else
+  {
+    glDepthFunc (GL_ALWAYS);
+  }
+
+  // handle depth offset
+  if (IsSettingEnabled (OpenGl_LayerDepthOffset))
+  {
+    glPolygonOffset (myLayerSettings.DepthOffsetFactor, myLayerSettings.DepthOffsetUnits);
+  }
+  else
+  {
+    glPolygonOffset (0.f, 0.f);
+  }
+
+  // handle depth write
+  if (IsSettingEnabled (OpenGl_LayerDepthWrite))
+  {
+    glDepthMask (GL_TRUE);
+  }
+  else
+  {
+    glDepthMask (GL_FALSE);
+  }
+
+  // render priority list
+  myPriorityList.Render (AWorkspace);
+}
diff --git a/src/OpenGl/OpenGl_Layer.hxx b/src/OpenGl/OpenGl_Layer.hxx
new file mode 100644
index 0000000000..d36fd9af2a
--- /dev/null
+++ b/src/OpenGl/OpenGl_Layer.hxx
@@ -0,0 +1,84 @@
+// Created on: 2014-03-31
+// Created by: Danila ULYANOV
+// Copyright (c) 2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _OpenGl_Layer_Header
+#define _OpenGl_Layer_Header
+
+#include <OpenGl_PriorityList.hxx>
+
+class Handle(OpenGl_Workspace);
+
+enum OpenGl_LayerSetting
+{
+  OpenGl_LayerDepthTest = 1,
+  OpenGl_LayerDepthWrite = 2,
+  OpenGl_LayerDepthClear = 4,
+  OpenGl_LayerDepthOffset = 8
+};
+
+struct OpenGl_LayerSettings
+{
+  //! Initializes settings
+  OpenGl_LayerSettings();
+
+  //! Returns true if theSetting is enabled.
+  const Standard_Boolean IsSettingEnabled (const OpenGl_LayerSetting theSetting) const
+  {
+    return (Flags & theSetting) == theSetting;
+  }
+
+  Standard_ShortReal DepthOffsetFactor; //!< Factor argument value for OpenGl glPolygonOffset function.
+  Standard_ShortReal DepthOffsetUnits;  //!< Units argument value for OpenGl glPolygonOffset function.
+
+  Standard_Integer Flags; //!< Storage field for settings.
+};
+
+class OpenGl_Layer
+{
+public:
+
+  //! Initializes associated priority list and layer properties
+  OpenGl_Layer (const Standard_Integer theNbPriorities = 11);
+
+  //! Returns settings of the layer object.
+  const OpenGl_LayerSettings LayerSettings() const { return myLayerSettings; };
+
+  //! Sets settings of the layer object.
+  void SetLayerSettings (OpenGl_LayerSettings theSettings)
+  {
+    myLayerSettings = theSettings;
+  }
+
+  //! Returns true if theSetting is enabled for the layer.
+  const Standard_Boolean IsSettingEnabled (const OpenGl_LayerSetting theSetting) const
+  {
+    return myLayerSettings.IsSettingEnabled (theSetting);
+  }
+
+  //! Returns reference to associated priority list.
+  OpenGl_PriorityList& PriorityList() { return myPriorityList; }
+
+  //! Returns const reference to associated priority list.
+  const OpenGl_PriorityList& PriorityList() const { return myPriorityList; }
+
+  void Render (const Handle(OpenGl_Workspace) &AWorkspace) const;
+
+private:
+
+  OpenGl_PriorityList myPriorityList;   //!< Associated priority list object.
+
+  OpenGl_LayerSettings myLayerSettings; //!< Layer setting flags.
+};
+#endif //_OpenGl_Layer_Header
diff --git a/src/OpenGl/OpenGl_LayerList.cxx b/src/OpenGl/OpenGl_LayerList.cxx
index b80d9d6b1b..e5cc9c0b45 100644
--- a/src/OpenGl/OpenGl_LayerList.cxx
+++ b/src/OpenGl/OpenGl_LayerList.cxx
@@ -35,7 +35,7 @@ OpenGl_LayerList::OpenGl_LayerList (const Standard_Integer theNbPriorities)
    myNbStructures (0)
 {
   // insert default priority layer
-  myLayers.Append (OpenGl_PriorityList (myNbPriorities));
+  myLayers.Append (OpenGl_Layer (myNbPriorities));
   myLayerIds.Bind (0, myLayers.Length());
 }
 
@@ -53,7 +53,7 @@ OpenGl_LayerList::~OpenGl_LayerList ()
 //purpose  :
 //=======================================================================
 
-OpenGl_PriorityList& OpenGl_LayerList::defaultLayer()
+OpenGl_Layer& OpenGl_LayerList::defaultLayer()
 {
   return myLayers.ChangeValue (1);
 }
@@ -89,7 +89,7 @@ void OpenGl_LayerList::AddLayer (const Standard_Integer theLayerId)
     return;
 
   // add the new layer
-  myLayers.Append (OpenGl_PriorityList (myNbPriorities));
+  myLayers.Append (OpenGl_Layer (myNbPriorities));
   myLayerIds.Bind (theLayerId, myLayers.Length());
 }
 
@@ -104,6 +104,24 @@ Standard_Boolean OpenGl_LayerList::HasLayer
   return myLayerIds.IsBound (theLayerId);
 }
 
+//=======================================================================
+//function : Layer
+//purpose  : 
+//=======================================================================
+OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId)
+{
+  return myLayers.ChangeValue (myLayerIds.Find (theLayerId));
+}
+
+//=======================================================================
+//function : Layer
+//purpose  : 
+//=======================================================================
+const OpenGl_Layer& OpenGl_LayerList::Layer (const Standard_Integer theLayerId) const
+{
+  return myLayers.Value (myLayerIds.Find (theLayerId));
+}
+
 //=======================================================================
 //function : RemoveLayer
 //purpose  :
@@ -117,8 +135,8 @@ void OpenGl_LayerList::RemoveLayer (const Standard_Integer theLayerId)
   Standard_Integer aRemovePos = myLayerIds.Find (theLayerId);
   
   // move all displayed structures to first layer
-  const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos);
-  defaultLayer ().Append (aList);
+  const OpenGl_PriorityList& aList = myLayers.Value (aRemovePos).PriorityList();
+  defaultLayer ().PriorityList().Append (aList);
 
   // remove layer
   myLayers.Remove (aRemovePos);
@@ -145,8 +163,8 @@ void OpenGl_LayerList::AddStructure (const OpenGl_Structure *theStructure,
 {
   // add structure to associated layer,
   // if layer doesn't exists, display structure in default layer
-  OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer () :
-    myLayers.ChangeValue (myLayerIds.Find (theLayerId));
+  OpenGl_PriorityList& aList = !HasLayer (theLayerId) ? defaultLayer ().PriorityList() :
+    myLayers.ChangeValue (myLayerIds.Find (theLayerId)).PriorityList();
 
   aList.Add (theStructure, thePriority);
   myNbStructures++;
@@ -167,7 +185,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
   Standard_Integer aSeqPos = !HasLayer (theLayerId) ?
     1 : myLayerIds.Find (theLayerId);
   
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos);
+  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
 
   // remove structure from associated list
   // if the structure is not found there,
@@ -191,7 +209,7 @@ void OpenGl_LayerList::RemoveStructure (const OpenGl_Structure *theStructure,
   OpenGl_SequenceOfLayers::Iterator anIts;
   for (anIts.Init (myLayers); anIts.More (); anIts.Next (), aSeqId++)
   {
-    OpenGl_PriorityList& aScanList = anIts.ChangeValue ();
+    OpenGl_PriorityList& aScanList = anIts.ChangeValue ().PriorityList();
     if (aSeqPos == aSeqId)
       continue;
   
@@ -223,7 +241,7 @@ void OpenGl_LayerList::ChangeLayer (const OpenGl_Structure *theStructure,
   Standard_Integer aSeqPos = !HasLayer (theOldLayerId) ?
     1 : myLayerIds.Find (theOldLayerId);
   
-  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos);
+  OpenGl_PriorityList& aList = myLayers.ChangeValue (aSeqPos).PriorityList();
   Standard_Integer aPriority;
 
   // take priority and remove structure from list found by <theOldLayerId>
@@ -264,14 +282,11 @@ void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
   OpenGl_SequenceOfLayers::Iterator anIts;
   for(anIts.Init (myLayers); anIts.More (); anIts.Next ())
   {
-    const OpenGl_PriorityList& aList = anIts.Value ();
-    if (aList.NbStructures () > 0)
+    const OpenGl_Layer& aLayer = anIts.Value ();
+    if (aLayer.PriorityList().NbStructures () > 0)
     {
-      // separate depth buffers
-      glClear (GL_DEPTH_BUFFER_BIT);
-
-      // render priority list
-      aList.Render (theWorkspace);
+      // render layer
+      aLayer.Render (theWorkspace);
     }
   }
 }
diff --git a/src/OpenGl/OpenGl_LayerList.hxx b/src/OpenGl/OpenGl_LayerList.hxx
index 32424495d2..98b05a50cd 100644
--- a/src/OpenGl/OpenGl_LayerList.hxx
+++ b/src/OpenGl/OpenGl_LayerList.hxx
@@ -17,6 +17,7 @@
 #define _OpenGl_LayerList_Header
 
 #include <OpenGl_PriorityList.hxx>
+#include <OpenGl_Layer.hxx>
 
 #include <InterfaceGraphic_telem.hxx>
 
@@ -26,7 +27,7 @@
 class OpenGl_Structure;
 class Handle(OpenGl_Workspace);
 
-typedef NCollection_Sequence<OpenGl_PriorityList> OpenGl_SequenceOfLayers;
+typedef NCollection_Sequence<OpenGl_Layer> OpenGl_SequenceOfLayers;
 typedef NCollection_DataMap<int, int> OpenGl_LayerSeqIds;
 
 class OpenGl_LayerList
@@ -71,6 +72,12 @@ class OpenGl_LayerList
   void ChangeLayer (const OpenGl_Structure *theStructure,
                     const Standard_Integer  theOldLayerId,
                     const Standard_Integer  theNewLayerId);
+
+  //! Returns reference to the layer with given ID.
+  OpenGl_Layer& Layer (const Standard_Integer theLayerId);
+
+  //! Returns reference to the layer with given ID.
+  const OpenGl_Layer& Layer (const Standard_Integer theLayerId) const;
   
   //! Render this element
   void Render (const Handle(OpenGl_Workspace) &theWorkspace) const;
@@ -88,7 +95,7 @@ class OpenGl_LayerList
  private:
   
   //! Get default layer
-  OpenGl_PriorityList& defaultLayer ();
+  OpenGl_Layer& defaultLayer ();
   
  protected:
 
diff --git a/src/OpenGl/OpenGl_View.hxx b/src/OpenGl/OpenGl_View.hxx
index d3ee169ce0..8f3f989c14 100644
--- a/src/OpenGl/OpenGl_View.hxx
+++ b/src/OpenGl/OpenGl_View.hxx
@@ -34,6 +34,7 @@
 #include <Graphic3d_CView.hxx>
 #include <Graphic3d_CGraduatedTrihedron.hxx>
 #include <Graphic3d_SequenceOfHClipPlane.hxx>
+#include <Graphic3d_ZLayerSettings.hxx>
 #include <Visual3d_TypeOfSurfaceDetail.hxx>
 
 #include <OpenGl_telem_view.hxx>
@@ -176,6 +177,10 @@ class OpenGl_View : public MMgt_TShared
   void ChangeZLayer (const OpenGl_Structure *theStructure,
                      const Standard_Integer  theNewLayerId);
 
+  //! Sets the settings for a single Z layer of specified view.
+  void SetZLayerSettings (const Standard_Integer theLayerId,
+                          const Graphic3d_ZLayerSettings theSettings);
+
   void CreateBackgroundTexture (const Standard_CString AFileName, const Aspect_FillMethod AFillStyle);
   void SetBackgroundTextureStyle (const Aspect_FillMethod FillStyle);
   void SetBackgroundGradient (const Quantity_Color& AColor1, const Quantity_Color& AColor2, const Aspect_GradientFillMethod AType);
diff --git a/src/OpenGl/OpenGl_View_2.cxx b/src/OpenGl/OpenGl_View_2.cxx
index 2bcfd37a8e..b9a0405c00 100644
--- a/src/OpenGl/OpenGl_View_2.cxx
+++ b/src/OpenGl/OpenGl_View_2.cxx
@@ -1510,3 +1510,21 @@ void OpenGl_View::ChangeZLayer (const OpenGl_Structure *theStructure,
   Standard_Integer anOldLayer = theStructure->GetZLayer ();
   myZLayers.ChangeLayer (theStructure, anOldLayer, theNewLayerId);
 }
+
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void OpenGl_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                     const Graphic3d_ZLayerSettings theSettings)
+{
+  // Convert Graphic3d_ZLayerSettings to OpenGl_LayerSettings
+  OpenGl_LayerSettings aConvertedSettings;
+
+  aConvertedSettings.DepthOffsetFactor = theSettings.DepthOffsetFactor;
+  aConvertedSettings.DepthOffsetUnits  = theSettings.DepthOffsetUnits;
+  aConvertedSettings.Flags             = theSettings.Flags;
+
+  myZLayers.Layer (theLayerId).SetLayerSettings (aConvertedSettings);
+}
+
diff --git a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx
index 2661fefccc..f1b5afe608 100755
--- a/src/OpenGl/OpenGl_Workspace_Raytrace.cxx
+++ b/src/OpenGl/OpenGl_Workspace_Raytrace.cxx
@@ -188,7 +188,7 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceGeometry (Standard_Boolean theC
 
   for (OpenGl_SequenceOfLayers::Iterator anLayerIt (aList.Layers()); anLayerIt.More(); anLayerIt.Next())
   {
-    const OpenGl_PriorityList& aPriorityList = anLayerIt.Value();
+    const OpenGl_PriorityList& aPriorityList = anLayerIt.Value().PriorityList();
 
     if (aPriorityList.NbStructures() == 0)
       continue;
diff --git a/src/V3d/V3d_Viewer.cdl b/src/V3d/V3d_Viewer.cdl
index 9d28516770..a0a25b762b 100644
--- a/src/V3d/V3d_Viewer.cdl
+++ b/src/V3d/V3d_Viewer.cdl
@@ -40,6 +40,7 @@ class Viewer from V3d inherits TShared from MMgt
 uses
 
         GraphicDriver from Graphic3d,
+        ZLayerSettings from Graphic3d,
         TypeOfUpdate from V3d,
         TypeOfVisualization from V3d,
         TypeOfShadingModel from V3d,
@@ -632,6 +633,17 @@ is
         ---Purpose:
         -- Display grid echo at requested point in the view.
 
+        SetZLayerSettings ( me          : mutable;
+                            theLayerId  : Integer from Standard;
+                            theSettings : ZLayerSettings from Graphic3d )
+          is static;
+        ---Purpose: Sets the settings for a single Z layer.
+
+        ZLayerSettings ( me          : mutable;
+                         theLayerId  : Integer from Standard )
+          returns ZLayerSettings from Graphic3d is static;
+        ---Purpose: Returns the settings of a single Z layer.
+
         AddZLayer ( me : mutable;
                     theLayerId : in out Integer from Standard )
            returns Boolean from Standard is static;
diff --git a/src/V3d/V3d_Viewer.cxx b/src/V3d/V3d_Viewer.cxx
index 48a59bbcc9..5cb58472c1 100644
--- a/src/V3d/V3d_Viewer.cxx
+++ b/src/V3d/V3d_Viewer.cxx
@@ -353,6 +353,27 @@ void V3d_Viewer::DelView( const Handle(V3d_View)& TheView ) {
   MyDefinedViews.Remove(TheView);
 }
 
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+
+void V3d_Viewer::SetZLayerSettings (const Standard_Integer theLayerId,
+                                    const Graphic3d_ZLayerSettings theSettings)
+{
+  MyViewer->SetZLayerSettings (theLayerId, theSettings);
+}
+
+//=======================================================================
+//function : ZLayerSettings
+//purpose  :
+//=======================================================================
+
+Graphic3d_ZLayerSettings V3d_Viewer::ZLayerSettings (const Standard_Integer theLayerId)
+{
+  return MyViewer->ZLayerSettings (theLayerId);
+}
+
 //=======================================================================
 //function : AddZLayer
 //purpose  :
diff --git a/src/ViewerTest/ViewerTest_ViewerCommands.cxx b/src/ViewerTest/ViewerTest_ViewerCommands.cxx
index 1e7f65cb49..83df6a86b9 100644
--- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx
+++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx
@@ -3319,12 +3319,21 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar
   }
   else if (argc < 2)
   {
-    di << "Use: vzlayer " << argv[0];
-    di << " add/del/get [id]\n";
+    di << "Use: vzlayer ";
+    di << " add/del/get/settings/enable/disable [id]\n";
     di << " add - add new z layer to viewer and print its id\n";
     di << " del - del z layer by its id\n";
     di << " get - print sequence of z layers in increasing order of their overlay level\n";
-    di << "id - the layer identificator value defined when removing z layer\n";
+    di << " settings - print status of z layer settings\n";
+    di << " enable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    enables given setting for the z layer\n";
+    di << " enable (p[ositive]offset/n[egative]offset) \n    enables given setting for the z layer\n";
+    di << " disable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    disables given setting for the z layer\n";
+    di << "\nWhere id is the layer identificator\n";
+    di << "\nExamples:\n";
+    di << "   vzlayer add\n";
+    di << "   vzlayer enable poffset 1\n";
+    di << "   vzlayer disable depthtest 1\n";
+    di << "   vzlayer del 1\n";
     return 1;
   }
 
@@ -3376,9 +3385,123 @@ static int VZLayer (Draw_Interpretor& di, Standard_Integer argc, const char** ar
 
     di << "\n";
   }
+  else if (anOp == "settings")
+  {
+    if (argc < 3)
+    {
+      di << "Please also provide an id\n";
+      return 1;
+    }
+
+    Standard_Integer anId = Draw::Atoi (argv[2]);
+    Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId);
+
+    di << "Depth test - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthTest) ? "enabled" : "disabled") << "\n";
+    di << "Depth write - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthWrite) ? "enabled" : "disabled") << "\n";
+    di << "Depth buffer clearing - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthClear) ? "enabled" : "disabled") << "\n";
+    di << "Depth offset - " << (aSettings.IsSettingEnabled (Graphic3d_ZLayerDepthOffset) ? "enabled" : "disabled") << "\n";
+
+  }
+  else if (anOp == "enable")
+  {
+    if (argc < 3)
+    {
+      di << "Please also provide an option to enable\n";
+      return 1;
+    }
+
+    if (argc < 4)
+    {
+      di << "Please also provide a layer id\n";
+      return 1;
+    }
+
+    TCollection_AsciiString aSubOp = TCollection_AsciiString (argv[2]);
+    Standard_Integer anId = Draw::Atoi (argv[3]);
+    Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId);
+
+    if (aSubOp == "depthtest" || aSubOp == "test")
+    {
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthTest);
+    }
+    else if (aSubOp == "depthwrite" || aSubOp == "write")
+    {
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthWrite);
+    }
+    else if (aSubOp == "depthclear" || aSubOp == "clear")
+    {
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthClear);
+    }
+    else if (aSubOp == "depthoffset" || aSubOp == "offset")
+    {
+      if (argc < 6)
+      {
+        di << "Please also provide a factor and units values for depth offset\n";
+        di << "Format is: vzlayer enable offset [factor] [units] [layerId]\n";
+        return 1;
+      }
+
+      Standard_ShortReal aFactor = static_cast<Standard_ShortReal> (Draw::Atof (argv[3]));
+      Standard_ShortReal aUnits  = static_cast<Standard_ShortReal> (Draw::Atof (argv[4]));
+      anId = Draw::Atoi (argv[5]);
+      aSettings = aViewer->ZLayerSettings (anId);
+
+      aSettings.DepthOffsetFactor = aFactor;
+      aSettings.DepthOffsetUnits  = aUnits;
+
+      aSettings.EnableSetting (Graphic3d_ZLayerDepthOffset);
+    }
+    else if (aSubOp == "positiveoffset" || aSubOp == "poffset")
+    {
+      aSettings.SetDepthOffsetPositive();
+    }
+    else if (aSubOp == "negativeoffset" || aSubOp == "noffset")
+    {
+      aSettings.SetDepthOffsetNegative();
+    }
+
+    aViewer->SetZLayerSettings (anId, aSettings);
+  }
+  else if (anOp == "disable")
+  {
+    if (argc < 3)
+    {
+      di << "Please also provide an option to disable\n";
+      return 1;
+    }
+
+    if (argc < 4)
+    {
+      di << "Please also provide a layer id\n";
+      return 1;
+    }
+
+    TCollection_AsciiString aSubOp = TCollection_AsciiString (argv[2]);
+    Standard_Integer anId = Draw::Atoi (argv[3]);
+    Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId);
+
+    if (aSubOp == "depthtest" || aSubOp == "test")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthTest);
+    }
+    else if (aSubOp == "depthwrite" || aSubOp == "write")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthWrite);
+    }
+    else if (aSubOp == "depthclear" || aSubOp == "clear")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthClear);
+    }
+    else if (aSubOp == "depthoffset" || aSubOp == "offset")
+    {
+      aSettings.DisableSetting (Graphic3d_ZLayerDepthOffset);
+    }
+
+    aViewer->SetZLayerSettings (anId, aSettings);
+  }
   else
   {
-    di << "Invalid operation, please use { add / del / get }\n";
+    di << "Invalid operation, please use { add / del / get / settings / enable / disable}\n";
     return 1;
   }
 
@@ -6118,7 +6241,20 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
     "vprintview : width height filename [algo=0] : Test print algorithm: algo = 0 - stretch, algo = 1 - tile",
     __FILE__,VPrintView,group);
   theCommands.Add("vzlayer",
-    "vzlayer : add/del/get [id] : Z layer operations in v3d viewer: add new z layer, delete z layer, get z layer ids",
+    "vzlayer add/del/get/settings/enable/disable [id]\n"
+    " add - add new z layer to viewer and print its id\n"
+    " del - del z layer by its id\n"
+    " get - print sequence of z layers in increasing order of their overlay level\n"
+    " settings - print status of z layer settings\n"
+    " enable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    enables given setting for the z layer\n"
+    " enable (p[ositive]offset/n[egative]offset) \n    enables given setting for the z layer\n"
+    " disable ([depth]test/[depth]write/[depth]clear/[depth]offset) \n    disables given setting for the z layer\n"
+    "\nWhere id is the layer identificator\n"
+    "\nExamples:\n"
+    "   vzlayer add\n"
+    "   vzlayer enable poffset 1\n"
+    "   vzlayer disable depthtest 1\n"
+    "   vzlayer del 1\n",
     __FILE__,VZLayer,group);
   theCommands.Add("voverlaytext",
     "voverlaytext : text x y [height] [font_name] [text_color: R G B] [display_type] [background_color: R G B]"
diff --git a/src/Visual3d/FILES b/src/Visual3d/FILES
index d8666a981d..de7bfeebb8 100755
--- a/src/Visual3d/FILES
+++ b/src/Visual3d/FILES
@@ -6,3 +6,4 @@ EXTERNLIB
 Visual3d_WOKSteps.edl 
 Visual3d_View_Print.cxx
 Visual3d_NListOfLayerItem.hxx
+Visual3d_MapOfZLayerSettings.hxx
diff --git a/src/Visual3d/Visual3d.cdl b/src/Visual3d/Visual3d.cdl
index 680ab567c7..6509d00807 100644
--- a/src/Visual3d/Visual3d.cdl
+++ b/src/Visual3d/Visual3d.cdl
@@ -297,6 +297,8 @@ is
     -- Category: Instantiated classes
     ---------------------------------
 
+    primitive MapOfZLayerSettings;
+
         imported NListOfLayerItem;
     
     class SequenceOfPickPath instantiates
diff --git a/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx b/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx
new file mode 100644
index 0000000000..e9e7947ee4
--- /dev/null
+++ b/src/Visual3d/Visual3d_MapOfZLayerSettings.hxx
@@ -0,0 +1,23 @@
+// Copyright (c) 2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and / or modify it
+// under the terms of the GNU Lesser General Public version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Visual3d_MapOfZLayerSettings_HeaderFile
+#define _Visual3d_MapOfZLayerSettings_HeaderFile
+
+#include <Standard_TypeDef.hxx>
+#include <NCollection_Map.hxx>
+#include <Graphic3d_ZLayerSettings.hxx>
+
+typedef NCollection_DataMap<Standard_Integer, Graphic3d_ZLayerSettings> Visual3d_MapOfZLayerSettings;
+
+#endif // _Visual3d_MapOfZLayerSettings_HeaderFile
diff --git a/src/Visual3d/Visual3d_View.cdl b/src/Visual3d/Visual3d_View.cdl
index 25b70ea369..e2cc7c4a04 100644
--- a/src/Visual3d/Visual3d_View.cdl
+++ b/src/Visual3d/Visual3d_View.cdl
@@ -85,6 +85,8 @@ uses
     SequenceOfStructure     from Graphic3d,
     MapOfStructure          from Graphic3d,
 
+    ZLayerSettings          from Graphic3d,
+
     ContextView             from Visual3d,
     Layer                   from Visual3d,
     Light                   from Visual3d,
@@ -799,6 +801,13 @@ is
 	---Purpose: Changes the display priority of the structure <AStructure>.
 	---Category: Private methods
 
+
+        SetZLayerSettings ( me          : mutable;
+                            theLayerId  : Integer from Standard;
+                            theSettings : ZLayerSettings from Graphic3d )
+          is static private;
+        ---Purpose: Sets the settings for a single Z layer of specified view.
+
         AddZLayer ( me         : mutable;
                     theLayerId : Integer from Standard )
           is static private;
diff --git a/src/Visual3d/Visual3d_View.cxx b/src/Visual3d/Visual3d_View.cxx
index 9494dab258..e7f1457bbd 100644
--- a/src/Visual3d/Visual3d_View.cxx
+++ b/src/Visual3d/Visual3d_View.cxx
@@ -3668,6 +3668,17 @@ Standard_Boolean Visual3d_View::Export (const Standard_CString       theFileName
                                   thePrecision, theProgressBarFunc, theProgressObject);
 }
 
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+
+void Visual3d_View::SetZLayerSettings (const Standard_Integer theLayerId,
+                                       const Graphic3d_ZLayerSettings theSettings)
+{
+  MyGraphicDriver->SetZLayerSettings (MyCView, theLayerId, theSettings);
+}
+
 //=======================================================================
 //function : AddZLayer
 //purpose  :
diff --git a/src/Visual3d/Visual3d_ViewManager.cdl b/src/Visual3d/Visual3d_ViewManager.cdl
index 2e54486345..b6f08a8111 100644
--- a/src/Visual3d/Visual3d_ViewManager.cdl
+++ b/src/Visual3d/Visual3d_ViewManager.cdl
@@ -41,6 +41,9 @@ uses
 	CView			from Graphic3d,
 	Vector                  from Graphic3d,
 
+	ZLayerSettings  from Graphic3d,
+	MapOfZLayerSettings from Visual3d,
+
 	ContextPick		from Visual3d,
 	Layer			from Visual3d,
 	PickDescriptor		from Visual3d,
@@ -290,6 +293,17 @@ is
            returns Integer from Standard is redefined static;
         ---Purpose: Get Z layer ID assigned for the structure.
 
+        SetZLayerSettings ( me          : mutable;
+                            theLayerId  : Integer from Standard;
+                            theSettings : ZLayerSettings from Graphic3d )
+          is redefined static;
+        ---Purpose: Sets the settings for a single Z layer for all managed views.
+
+        ZLayerSettings ( me          : mutable;
+                         theLayerId  : Integer from Standard )
+          returns ZLayerSettings from Graphic3d is redefined static;
+        ---Purpose: Returns the settings of a single Z layer.
+
         AddZLayer ( me : mutable;
                     theLayerId : in out Integer from Standard )
            returns Boolean from Standard is redefined static;
@@ -515,6 +529,8 @@ fields
         myLayerIds                      :       MapOfInteger from TColStd;
         myLayerSeq                      :       SequenceOfInteger from TColStd;
 
+        myMapOfZLayerSettings : MapOfZLayerSettings from Visual3d;
+
 friends
 
 	class View from Visual3d,
diff --git a/src/Visual3d/Visual3d_ViewManager.cxx b/src/Visual3d/Visual3d_ViewManager.cxx
index df76c22a5b..21622ddd74 100644
--- a/src/Visual3d/Visual3d_ViewManager.cxx
+++ b/src/Visual3d/Visual3d_ViewManager.cxx
@@ -103,6 +103,7 @@ MyTransparency (Standard_False)
   myLayerSeq.Append (0);
 
   MyGraphicDriver = theDriver;
+  myMapOfZLayerSettings.Bind (0, Graphic3d_ZLayerSettings());
 }
 
 //-Destructors
@@ -1191,6 +1192,41 @@ Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structu
   return MyGraphicDriver->GetZLayer (aStructure);
 }
 
+//=======================================================================
+//function : SetZLayerSettings
+//purpose  :
+//=======================================================================
+void Visual3d_ViewManager::SetZLayerSettings (const Standard_Integer theLayerId,
+                                              const Graphic3d_ZLayerSettings theSettings)
+{
+  // tell all managed views to set zlayer settings display layers
+  Visual3d_SetIteratorOfSetOfView aViewIt (MyDefinedView);
+  for ( ; aViewIt.More (); aViewIt.Next ())
+    (aViewIt.Value ())->SetZLayerSettings (theLayerId, theSettings);
+
+  if (myMapOfZLayerSettings.IsBound (theLayerId))
+  {
+    myMapOfZLayerSettings.ChangeFind (theLayerId) = theSettings;
+  }
+  else
+  {
+    myMapOfZLayerSettings.Bind (theLayerId, theSettings);
+  }
+  
+}
+
+//=======================================================================
+//function : ZLayerSettings
+//purpose  :
+//=======================================================================
+Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Standard_Integer theLayerId)
+{
+  if (!myLayerIds.Contains (theLayerId))
+    return Graphic3d_ZLayerSettings();
+
+  return myMapOfZLayerSettings.Find (theLayerId);
+}
+
 //=======================================================================
 //function : AddZLayer
 //purpose  :
@@ -1211,6 +1247,9 @@ Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
     return Standard_False;
   }
 
+  // default z-layer settings
+  myMapOfZLayerSettings.Bind (theLayerId, Graphic3d_ZLayerSettings());
+
   // tell all managed views to remove display layers
   Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
   for ( ; aViewIt.More (); aViewIt.Next ())
@@ -1230,7 +1269,7 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL
     return Standard_False;
 
   // tell all managed views to remove display layers
-  Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
+  Visual3d_SetIteratorOfSetOfView aViewIt (MyDefinedView);
   for ( ; aViewIt.More (); aViewIt.Next ())
     (aViewIt.Value ())->RemoveZLayer (theLayerId);
 
@@ -1238,11 +1277,15 @@ Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theL
 
   // remove index
   for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
-    if (myLayerSeq(aIdx) == theLayerId)
+  {
+    if (myLayerSeq (aIdx) == theLayerId)
     {
       myLayerSeq.Remove (aIdx);
       break;
     }
+  }
+
+  myMapOfZLayerSettings.UnBind (theLayerId);
 
   myLayerIds.Remove (theLayerId);
   getZLayerGenId ().Free (theLayerId);