diff --git a/graf3d/gl/inc/TGLOrthoCamera.h b/graf3d/gl/inc/TGLOrthoCamera.h
index 0ac99f39727bfe074e69553726ed8c79dab67dcb..64675ce048a498304bc1ac42ad885741e5aa9c32 100644
--- a/graf3d/gl/inc/TGLOrthoCamera.h
+++ b/graf3d/gl/inc/TGLOrthoCamera.h
@@ -39,7 +39,8 @@ class TGLPaintDevice;
 
 class TGLOrthoCamera : public TGLCamera {
 public:
-   enum EType { kZOY, kXOZ, kX0Y  }; // pair of world axes aligned to h/v screen
+   enum EType { kZOY,  kXOZ,  kXOY,    // Pair of world axes aligned to h/v screen.
+                kZnOY, kXnOZ, kXnOY }; // 'n' means preceeding axis is negated.
 private:
    // Fields
    EType          fType;         //! camera type
@@ -71,9 +72,11 @@ private:
    static   UInt_t   fgZoomDeltaSens;
 public:
    TGLOrthoCamera();
-   TGLOrthoCamera(const TGLVector3 & hAxis, const TGLVector3 & vAxis);
+   TGLOrthoCamera(EType type, const TGLVector3 & hAxis, const TGLVector3 & vAxis);
    virtual ~TGLOrthoCamera();
 
+   virtual Bool_t IsOrthographic() const { return kTRUE; }
+
    virtual void   Setup(const TGLBoundingBox & box, Bool_t reset=kTRUE);
    virtual void   Reset();
 
diff --git a/graf3d/gl/inc/TGLPerspectiveCamera.h b/graf3d/gl/inc/TGLPerspectiveCamera.h
index 30816c1f59ff51bfcad08b3562da11e372cf69bc..a374994fc0d9c8db60e0e6c76dbcad13f64efa9c 100644
--- a/graf3d/gl/inc/TGLPerspectiveCamera.h
+++ b/graf3d/gl/inc/TGLPerspectiveCamera.h
@@ -42,6 +42,8 @@ public:
    TGLPerspectiveCamera(const TGLVector3 & hAxis, const TGLVector3 & vAxis);
    virtual ~TGLPerspectiveCamera();
 
+   virtual Bool_t IsPersepective() const { return kTRUE; }
+
    virtual void   Setup(const TGLBoundingBox & box, Bool_t reset=kTRUE);
    virtual void   Reset();
    virtual Bool_t Zoom (Int_t delta, Bool_t mod1, Bool_t mod2);
diff --git a/graf3d/gl/inc/TGLSAViewer.h b/graf3d/gl/inc/TGLSAViewer.h
index 79f7f76cdd1a07e6be5e96d854cc32fb9eb3f996..73abc8840c06e26c8c514a679afcabc285ced336 100644
--- a/graf3d/gl/inc/TGLSAViewer.h
+++ b/graf3d/gl/inc/TGLSAViewer.h
@@ -49,7 +49,8 @@ public:
    enum EGLSACommands {
       kGLHelpAbout, kGLHelpViewer,
       kGLPerspYOZ, kGLPerspXOZ, kGLPerspXOY,
-      kGLXOY, kGLXOZ, kGLZOY,
+      kGLXOY,  kGLXOZ,  kGLZOY,
+      kGLXnOY, kGLXnOZ, kGLZnOY,
       kGLOrthoRotate, kGLOrthoDolly,
       kGLSaveEPS, kGLSavePDF, kGLSavePNG, kGLSaveGIF,
       kGLSaveJPG, kGLSaveAS, kGLCloseViewer, kGLQuitROOT,
diff --git a/graf3d/gl/inc/TGLViewer.h b/graf3d/gl/inc/TGLViewer.h
index 6483572bb1ddca8505e980fe4864f7e7908a6b6b..c2768542379e77ae084429c1c7f352b9043ff0a6 100644
--- a/graf3d/gl/inc/TGLViewer.h
+++ b/graf3d/gl/inc/TGLViewer.h
@@ -55,8 +55,9 @@ class TGLViewer : public TVirtualViewer3D,
    friend class TGLEventHandler;
 public:
 
-   enum ECameraType { kCameraPerspXOZ, kCameraPerspYOZ, kCameraPerspXOY,
-                      kCameraOrthoXOY, kCameraOrthoXOZ, kCameraOrthoZOY };
+   enum ECameraType { kCameraPerspXOZ,  kCameraPerspYOZ,  kCameraPerspXOY,
+                      kCameraOrthoXOY,  kCameraOrthoXOZ,  kCameraOrthoZOY,
+                      kCameraOrthoXnOY, kCameraOrthoXnOZ, kCameraOrthoZnOY };
 
 private:
    TGLViewer(const TGLViewer &);             // Not implemented
@@ -79,6 +80,9 @@ protected:
    TGLOrthoCamera       fOrthoXOYCamera;       //!
    TGLOrthoCamera       fOrthoXOZCamera;       //!
    TGLOrthoCamera       fOrthoZOYCamera;       //!
+   TGLOrthoCamera       fOrthoXnOYCamera;       //!
+   TGLOrthoCamera       fOrthoXnOZCamera;       //!
+   TGLOrthoCamera       fOrthoZnOYCamera;       //!
    TGLCamera          * fCurrentCamera;        //!
 
    // Lights
diff --git a/graf3d/gl/src/TGLOrthoCamera.cxx b/graf3d/gl/src/TGLOrthoCamera.cxx
index 1414de16917d81455b63f00a48441ce247b54531..d3af4c22633a42cecb3db6bc61f860f2f645d8ea 100644
--- a/graf3d/gl/src/TGLOrthoCamera.cxx
+++ b/graf3d/gl/src/TGLOrthoCamera.cxx
@@ -37,9 +37,9 @@ ClassImp(TGLOrthoCamera)
 UInt_t   TGLOrthoCamera::fgZoomDeltaSens = 500;
 
 //______________________________________________________________________________
-TGLOrthoCamera::TGLOrthoCamera(const TGLVector3 & hAxes, const TGLVector3 & vAxes) :
-   TGLCamera(hAxes, vAxes),
-   fType(kZOY),
+TGLOrthoCamera::TGLOrthoCamera(EType type, const TGLVector3 & hAxis, const TGLVector3 & vAxis) :
+   TGLCamera(hAxis, vAxis),
+   fType(type),
    fEnableRotate(kFALSE), fDollyToZoom(kTRUE),
    fZoomMin(0.001), fZoomDefault(0.78), fZoomMax(1000.0),
    fVolume(TGLVertex3(-100.0, -100.0, -100.0), TGLVertex3(100.0, 100.0, 100.0)),
@@ -48,15 +48,6 @@ TGLOrthoCamera::TGLOrthoCamera(const TGLVector3 & hAxes, const TGLVector3 & vAxe
    // Construct orthographic camera.
 
    Setup(TGLBoundingBox(TGLVertex3(-100,-100,-100), TGLVertex3(100,100,100)));
-
-   // define camera type relative to horizontal vector
-   TGLVector3 v = fCamBase.GetBaseVec(1);
-   for (Int_t i=0; i<3; i++) {
-      if (TMath::Abs(v[i]) == 1) {
-         fType = (TGLOrthoCamera::EType)i;
-         break;
-      }
-   }
 }
 
 //______________________________________________________________________________
@@ -90,18 +81,24 @@ void TGLOrthoCamera::Reset()
 
    TGLVector3 e = fVolume.Extents();
    switch (fType) {
-      case kX0Y: {
+      case kXOY: 
+      case kXnOY:
+      {
          // X -> X, Y -> Y, Z -> Z
          fDefXSize = e.X(); fDefYSize = e.Y();
          break;
       }
-      case kXOZ: {
+      case kXOZ:
+      case kXnOZ:
+      {
          // X -> X, Z -> Y, Y -> Z
          fDefXSize = e.X(); fDefYSize = e.Z();
          break;
       }
 
-      case kZOY: {
+      case kZOY:
+      case kZnOY:
+      {
          // Z -> X, Y -> Y, X -> Z
          fDefXSize = e.Z(); fDefYSize = e.Y();
          break;
diff --git a/graf3d/gl/src/TGLSAViewer.cxx b/graf3d/gl/src/TGLSAViewer.cxx
index f12da00f7bccef4bee7e85ebc935b37f73627b0b..12062712f8fa02db7a05661b6482574559fdd484 100644
--- a/graf3d/gl/src/TGLSAViewer.cxx
+++ b/graf3d/gl/src/TGLSAViewer.cxx
@@ -286,6 +286,9 @@ void TGLSAViewer::CreateMenus()
    fCameraMenu->AddEntry("Orthographic (XOY)", kGLXOY);
    fCameraMenu->AddEntry("Orthographic (XOZ)", kGLXOZ);
    fCameraMenu->AddEntry("Orthographic (ZOY)", kGLZOY);
+   fCameraMenu->AddEntry("Orthographic (XnOY)", kGLXnOY);
+   fCameraMenu->AddEntry("Orthographic (XnOZ)", kGLXnOZ);
+   fCameraMenu->AddEntry("Orthographic (ZnOY)", kGLZnOY);
    fCameraMenu->AddSeparator();
    fCameraMenu->AddEntry("Ortho allow rotate", kGLOrthoRotate);
    fCameraMenu->AddEntry("Ortho allow dolly",  kGLOrthoDolly);
@@ -438,6 +441,15 @@ Bool_t TGLSAViewer::ProcessFrameMessage(Long_t msg, Long_t parm1, Long_t)
          case kGLZOY:
             SetCurrentCamera(TGLViewer::kCameraOrthoZOY);
             break;
+         case kGLXnOY:
+            SetCurrentCamera(TGLViewer::kCameraOrthoXnOY);
+            break;
+         case kGLXnOZ:
+            SetCurrentCamera(TGLViewer::kCameraOrthoXnOZ);
+            break;
+         case kGLZnOY:
+            SetCurrentCamera(TGLViewer::kCameraOrthoZnOY);
+            break;
          case kGLOrthoRotate:
             ToggleOrthoRotate();
             break;
diff --git a/graf3d/gl/src/TGLViewer.cxx b/graf3d/gl/src/TGLViewer.cxx
index d7e47bd6a689fb9d490dbc34b2099926aef68579..2a65ff11683817022fcdeb15c9425a6c590e917f 100644
--- a/graf3d/gl/src/TGLViewer.cxx
+++ b/graf3d/gl/src/TGLViewer.cxx
@@ -88,9 +88,12 @@ TGLViewer::TGLViewer(TVirtualPad * pad, Int_t x, Int_t y,
    fPerspectiveCameraXOZ(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // XOZ floor
    fPerspectiveCameraYOZ(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)), // YOZ floor
    fPerspectiveCameraXOY(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // XOY floor
-   fOrthoXOYCamera(TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down Z axis, X horz, Y vert
-   fOrthoXOZCamera(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking down Y axis, X horz, Z vert
-   fOrthoZOYCamera(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down X axis, Z horz, Y vert
+   fOrthoXOYCamera (TGLOrthoCamera::kXOY,  TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  Z axis,  X horz, Y vert
+   fOrthoXOZCamera (TGLOrthoCamera::kXOZ,  TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking along Y axis,  X horz, Z vert
+   fOrthoZOYCamera (TGLOrthoCamera::kZOY,  TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along X axis,  Z horz, Y vert
+   fOrthoXnOYCamera(TGLOrthoCamera::kXnOY, TGLVector3( 0.0, 0.0,-1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along Z axis, -X horz, Y vert
+   fOrthoXnOZCamera(TGLOrthoCamera::kXnOZ, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking down  Y axis, -X horz, Z vert
+   fOrthoZnOYCamera(TGLOrthoCamera::kZnOY, TGLVector3( 1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  X axis, -Z horz, Y vert
    fCurrentCamera(&fPerspectiveCameraXOZ),
 
    fLightSet          (0),
@@ -139,9 +142,12 @@ TGLViewer::TGLViewer(TVirtualPad * pad) :
    fPerspectiveCameraXOZ(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // XOZ floor
    fPerspectiveCameraYOZ(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)), // YOZ floor
    fPerspectiveCameraXOY(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // XOY floor
-   fOrthoXOYCamera(TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down Z axis, X horz, Y vert
-   fOrthoXOZCamera(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking down Y axis, X horz, Z vert
-   fOrthoZOYCamera(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down X axis, Z horz, Y vert
+   fOrthoXOYCamera (TGLOrthoCamera::kXOY,  TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  Z axis,  X horz, Y vert
+   fOrthoXOZCamera (TGLOrthoCamera::kXOZ,  TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking along Y axis,  X horz, Z vert
+   fOrthoZOYCamera (TGLOrthoCamera::kZOY,  TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along X axis,  Z horz, Y vert
+   fOrthoXnOYCamera(TGLOrthoCamera::kXnOY, TGLVector3( 0.0, 0.0,-1.0), TGLVector3(0.0, 1.0, 0.0)), // Looking along Z axis, -X horz, Y vert
+   fOrthoXnOZCamera(TGLOrthoCamera::kXnOZ, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)), // Looking down  Y axis, -X horz, Z vert
+   fOrthoZnOYCamera(TGLOrthoCamera::kZnOY, TGLVector3( 1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // Looking down  X axis, -Z horz, Y vert
    fCurrentCamera(&fPerspectiveCameraXOZ),
 
    fLightSet          (0),
@@ -956,6 +962,12 @@ TGLCamera& TGLViewer::RefCamera(ECameraType cameraType)
          return fOrthoXOZCamera;
       case kCameraOrthoZOY:
          return fOrthoZOYCamera;
+      case kCameraOrthoXnOY:
+         return fOrthoXnOYCamera;
+      case kCameraOrthoXnOZ:
+         return fOrthoXnOZCamera;
+      case kCameraOrthoZnOY:
+         return fOrthoZnOYCamera;
       default:
          Error("TGLViewer::SetCurrentCamera", "invalid camera type");
          return *fCurrentCamera;
@@ -1000,6 +1012,18 @@ void TGLViewer::SetCurrentCamera(ECameraType cameraType)
          fCurrentCamera = &fOrthoZOYCamera;
          break;
       }
+      case kCameraOrthoXnOY: {
+         fCurrentCamera = &fOrthoXnOYCamera;
+         break;
+      }
+      case kCameraOrthoXnOZ: {
+         fCurrentCamera = &fOrthoXnOZCamera;
+         break;
+      }
+      case kCameraOrthoZnOY: {
+         fCurrentCamera = &fOrthoZnOYCamera;
+         break;
+      }
       default: {
          Error("TGLViewer::SetCurrentCamera", "invalid camera type");
          break;