diff --git a/6_rendering/gtMakePoleFigure.m b/6_rendering/gtMakePoleFigure.m
index 2840f493df0273a20316efa8a1af6fabadfb6aa6..25c20d109d78e4a687eef6711cd707013b170faa 100644
--- a/6_rendering/gtMakePoleFigure.m
+++ b/6_rendering/gtMakePoleFigure.m
@@ -21,13 +21,14 @@ function [hfig, save_density, valid_poles_weight] = gtMakePoleFigure(varargin)
 %       'poles'       = poles from gtReadBoundariesStructure
 %                       [poles, weigths] = gtReadBoundariesStructure(boundaries_structure, vThr, DoSym)
 %
-%       'range'       = {'sst'}/'phi90'/'phi360'
-%                       standard stereographic triangle, or quarter or whole hemisphere.
+%       'range'       = 'sst'/'phi90'/'phi360'/{'hex'}
+%                       standard stereographic triangle, quarter or whole
+%                       hemisphere or hexagonal sst
 %
 %       'label_poles' = 'all'/'bcc'/'main'/{'none'}
 %                       all hkl poles or just the corners of the sst.
 %
-%       'mark_poles'  = {'all'}/'bcc'/'main'/'none'
+%       'mark_poles'  = 'all'/'bcc'/{'main'}/'none'
 %
 %       'weights'     = can supply a vector the same length as poles to weight the
 %                       pole data {[]}
@@ -38,7 +39,7 @@ function [hfig, save_density, valid_poles_weight] = gtMakePoleFigure(varargin)
 %
 %       'plot_figure' = can choose not to plot figure, and use the returned
 %                       density values (non normalised) for something
-%                       {true}
+%                       {true}/false
 %
 %     Version 002 26-06-2012 by LNervo
 %       Add phaseid as input argument for multiple phases materials
@@ -54,7 +55,7 @@ appdefaults.poles              = [];
 appdefaults.density            = [];
 appdefaults.valid_poles_weight = [];
 appdefaults.weights            = [];
-appdefaults.range              = 'sst'; %or phi90, phi360
+appdefaults.range              = 'hex'; %or phi90, phi360, sst
 appdefaults.label_poles        = 'none';
 appdefaults.mark_poles         = 'all';
 appdefaults.increment          = 0.01;
@@ -77,6 +78,7 @@ valid_poles_weight = app.valid_poles_weight;
 parameters = [];
 load('parameters.mat');
 spacegroup = parameters.cryst(phaseid).spacegroup;
+crystal_system = parameters.cryst(phaseid).crystal_system;
 
 if ~isempty(poles)
     
@@ -86,7 +88,7 @@ if ~isempty(poles)
     end
     
     % before building figure, take only those poles that fall in the range 0-phimax,
-    % 0-psimax (allowing for seach radius)
+    % 0-psimax (allowing for search radius)
     if strcmp(app.range, 'sst')
         % for standard stereographic triangle
         phimax=pi/4;
@@ -114,6 +116,15 @@ if ~isempty(poles)
         weights=weights(dum);
         valid_poles_weight=sum(weights(poles(:,3)>=0));
         total_solid_angle=2*pi;
+    elseif strcmp(app.range, 'hex')
+        % for hexagonal sst
+        phimax=pi/6;
+        psimax=pi/2;
+        dum=find(poles(:,1)>-sin(searchR) & poles(:,2)>-sin(searchR) & poles(:,3)>cos(psimax)-sin(searchR));
+        poles=poles(dum, :);
+        weights=weights(dum);
+        valid_poles_weight=sum(weights(poles(:,1)>=0 & poles(:,2)>=0 & poles(:,3)>=0));
+        total_solid_angle=pi/12;
     else
         disp('unrecognised plot range :-(')
         return
@@ -167,6 +178,11 @@ else
         phimax=2*pi;
         psimax=pi/2;
         total_solid_angle=2*pi;
+    elseif strcmp(app.range, 'hex')
+        % for standard stereographic triangle
+        phimax=pi/6; % 30 degrees
+        psimax=pi/2;
+        total_solid_angle=pi/12;
     else
         disp('unrecognised plot range :-(')
         return
@@ -183,29 +199,38 @@ if app.plot_figure
     % have: density as a function of phi and psi.
     % Can convert to x,y,z, and use surf.
     % modify for steorographic projection
-    phi=[0:inc:phimax phimax]; %around z-axis
-    psi=[0:inc:psimax psimax]; %away from z axis
+    phi=[0:inc:phimax phimax]; % around z-axis
+    psi=[0:inc:psimax psimax]; % away from z axis
     %radius distorted for stereographic proj
     r=tan(psi/2);
     [phi,r]=meshgrid(phi,r);
     [x,y]=pol2cart(phi,r);
     
     if app.new_figure
-        hfig=figure();
+        hfig = figure();
     end
     
+    % plot the poles
     surf(x,y,density')
     hold on
     shading('interp')
+    axis auto
     axis equal
     
+    if strcmp(app.range, 'phi360')
+        app.mark_poles = 'all';
+    elseif strcmp(app.range, 'hex')
+        app.mark_poles = 'main';
+        app.label_poles = 'none';
+    end
+    
     if ~strcmp(app.mark_poles, 'none') %draw poles
         
         % Get symmetry operators
         symm = gtCrystGetSymmetryOperators([], spacegroup); 
         
         % cubic materials
-        if spacegroup==225 || spacegroup==229
+        if strcmp(crystal_system, 'cubic')
             
             if strcmp(app.mark_poles, 'main')
                 uvw_poles=[0 0 1; 1 0 1; 1 1 1];
@@ -219,6 +244,7 @@ if app.plot_figure
             else
                 disp('unrecognised "mark_poles" option - should be all/main/none')
             end
+
             uvw_poles2=[];
             for i=1:length(symm)
                 uvw_poles2=[uvw_poles2; uvw_poles*symm(i).g];
@@ -226,39 +252,30 @@ if app.plot_figure
             uvw_poles=[uvw_poles2; -uvw_poles2];
             
         % hexagonal materials
-        elseif spacegroup==194 || spacegroup==167 || spacegroup==663
+        elseif strcmp(crystal_system, 'hexagonal')
             uvw_poles_hex=[...
-                1 0 -1 0;...
-                0 0 0 1;...
-                0 1 -1 2;...
-                0 1 -1 1;...
-                1 1 -2 3;...
-                1 1 -2 0];
-            
-            % permute
-            uvw_poles_hex2=[];
-            for ii = 1:size(uvw_poles_hex,1)
-                uvw_poles_hex2 = [uvw_poles_hex2 ; gtGetReflections(uvw_poles_hex(ii,:), spacegroup)];
+                  0 0 0 1;...
+                  2 -1 -1 0;...
+                  1 0 -1 0];
+            if strcmp(app.mark_poles, 'all')
+                
+                % permute
+                uvw_poles_hex2=[];
+                for ii = 1:size(uvw_poles_hex,1)
+                    uvw_poles_hex2 = [uvw_poles_hex2 ; gtGetReflections(uvw_poles_hex(ii,:), spacegroup)];
+                end
+
+                % convert to cartesian            
+                uvw_poles = gtCrystHKL2Cartesian(uvw_poles_hex2', gtCrystHKL2CartesianMatrix(parameters.cryst(phaseid).latticepar))';
             end
-            uvw_poles_hex=uvw_poles_hex2;
-            
-            % convert to cartesian
-            uvw_poles(:,1)= uvw_poles_hex(:,1) + 0.5 * uvw_poles_hex(:,2);
-            uvw_poles(:,2)= 3^0.5/2 *uvw_poles_hex(:,2);
-            uvw_poles(:,3)= uvw_poles_hex(:,4);
-            % account for cell parameters
-            uvw_poles(:,1)=uvw_poles(:,1)*2/(sqrt(3)*parameters.cryst(phaseid).latticepar(1));
-            uvw_poles(:,2)=uvw_poles(:,2)*2/(sqrt(3)*parameters.cryst(phaseid).latticepar(1));
-            uvw_poles(:,3)=uvw_poles(:,3)/parameters.cryst(phaseid).latticepar(3);
-            % add invert through origin
-            uvw_poles=[uvw_poles; -uvw_poles];
+            z_uvw = gtCrystHKL2Cartesian(uvw_poles_hex', gtCrystHKL2CartesianMatrix(parameters.cryst(phaseid).latticepar))';
         else
-            disp('spacegroup not recognised...')
+            disp('crystal system not recognised...')
         end
         
         % get the relevent uvw_poles
         if strcmp(app.range, 'sst')
-            %for standard stereographic triangle
+            %for standard stereographic triangle for cubic
             dum=(uvw_poles(:,2)>=0 & uvw_poles(:,2)<=uvw_poles(:,1) & uvw_poles(:,3)>=uvw_poles(:,1));
             uvw_poles=uvw_poles(dum, :);
         elseif strcmp(app.range, 'phi90')
@@ -268,24 +285,58 @@ if app.plot_figure
         elseif strcmp(app.range, 'phi360')
             %for 360 pole figure - reduce only using psi
             uvw_poles=uvw_poles(uvw_poles(:,3)>=0, :);
+            
+            [~,ind_uvw,~]=findDifferentRowIntoMatrix(uvw_poles, z_uvw, false);
+            z_hkl=uvw_poles(ind_uvw,:);
+            [~,ind_hkl,~]=findDifferentRowIntoMatrix(z_uvw, z_hkl, false);
+        elseif strcmp(app.range, 'hex')
+            %for the unitary triangle for hexagonal
+            dum=(uvw_poles(:,1)>=0 & uvw_poles(:,2)<=uvw_poles(:,1)*tand(30) & uvw_poles(:,3)>=0);
+            uvw_poles=uvw_poles(dum, :);
+            
+            [~,ind_uvw,~]=findDifferentRowIntoMatrix(uvw_poles, z_uvw, false);
+            z_hkl=uvw_poles(ind_uvw,:);
+            [~,ind_hkl,~]=findDifferentRowIntoMatrix(z_uvw, z_hkl, false);
+        else
+            disp('range not recognised...')
         end
         
         % plot these uvw/hkl poles
         phi_uvw=atan2(uvw_poles(:,2), uvw_poles(:,1));
         psi_uvw=acos(uvw_poles(:,3)./(sqrt(sum(uvw_poles.*uvw_poles, 2))));
         r_uvw=tan(psi_uvw/2);
+        
         dummy=find(r_uvw>1);
         r_uvw(dummy)=[];
         phi_uvw(dummy)=[];
+        psi_uvw(dummy)=[];
+        uvw_poles(dummy,:)=[];
+        
         [x_uvw,y_uvw]=pol2cart(phi_uvw, r_uvw);
         dummy=find(x_uvw<-1 | x_uvw>1 | y_uvw<-1 | y_uvw>1);
         x_uvw(dummy)=[];
         y_uvw(dummy)=[];
-        
+        uvw_poles(dummy,:)=[];
+
+        % drawing the poles
         plot3(x_uvw, y_uvw, ones(size(x_uvw))*(max(density(:))+1), 'k*')
         
+        if strcmp(app.range, 'hex')
+            x_labels = x_uvw(ind_uvw(ind_hkl))+0.01;
+            y_labels = y_uvw(ind_uvw(ind_hkl))-0.02;
+            alignment_h = {'left','right','left'};
+            alignment_v = {'top','top','bottom'};
+        
+            % drawing the labels
+            for ii=1:size(z_uvw,1)
+                text(x_labels(ii), y_labels(ii), ['[' num2str(uvw_poles_hex(ii,:)) ']'],...
+                     'HorizontalAlignment',alignment_h{ii},...
+                     'VerticalAlignment', alignment_v{ii})
+            end
+        end
     end
     
+   
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     %%% plot rings on phi360 figures
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -299,8 +350,8 @@ if app.plot_figure
             ring_z=ones(size(ring_phi))*(max(density(:))+1);
             plot3(ring_x, ring_y, ring_z, 'w-');
             % label rings
-            %h=text(ring_x(1)+0.01, 0, (max(density(:))+1), num2str(ring));
-            %set(h, 'color', 'w');
+            h=text(ring_x(1)+0.01, 0, (max(density(:))+1), num2str(ring));
+            set(h, 'color', 'w');
         end
     end
     
@@ -311,10 +362,11 @@ if app.plot_figure
     set(gca, 'XTickLabel','');
     set(gca, 'YTickLabel','');
     set(gca, 'GridLineStyle','none');
-    set(gca, 'Ycolor', 'w');
     set(gca, 'Xcolor', 'w');
-    colorbar();
-    
+    set(gca, 'Ycolor', 'w');
+    c=colorbar();
+    set(c, 'Location', 'EastOutside')
+
     %change to x-y view
     set(gca, 'CameraPosition', [(min(x(:))+max(x(:)))/2 (min(y(:))+max(y(:)))/2 5*(max(density(:))+1)]);
     set(gca, 'CameraUpVector', [0 1 0]);
@@ -365,7 +417,7 @@ if app.plot_figure
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     % label poles
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-    if ~strcmp(app.label_poles, 'none')
+    if ~strcmp(app.label_poles, 'none') && strcmp(crystal_system, 'cubic')
         
         label_z=max(density(:))+1;
         
@@ -408,7 +460,7 @@ if app.plot_figure
     end
     
 else
-    hfig=[];
+    hfig = [];
 end
 
 end % end of function
diff --git a/6_rendering/gtRandomAxisCmap.m b/6_rendering/gtRandomAxisCmap.m
new file mode 100644
index 0000000000000000000000000000000000000000..1124e58289adce9d90adea776f5581fe8d0056b3
--- /dev/null
+++ b/6_rendering/gtRandomAxisCmap.m
@@ -0,0 +1,103 @@
+function [axis, axismap] = gtRandomAxisCmap(phaseid, pl_norm, r_vectors)
+% GTRANDOMAXISCMAP  Make a colourmap according to an axis orientation
+%     [axis, axismap] = gtRandomAxisCmap(phaseid, pl_norm, r_vectors)
+%     ---------------------------------------------------------------
+%     Loads parameters.mat
+%     Saves 6_rendering/axis_[pl_norm].mat and 6_rendering/axismap_[pl_norm].mat
+%
+%     INPUT:
+%       phaseid   = phase number <int> {1}
+%       pl_norm   = hkil of the plane normal wrt calculate the poles <double 1x4> 
+%                   {c_axis = [0 0 0 1], a_axis = [1 0 -1 0], ...}
+%       r_vectors = r_vectors <double Nx4>
+%
+%     OUTPUT:
+%       axis    = list of axis direction of all the grains
+%       axismap = axis colourmap calculated from r_vectors
+%
+%
+%     r_vectors -> axis -> phi/psi -> hsl -> rgb colormap
+%     use psi to give brightness; phi to give colour
+%
+%     Version 003 19-10-2012 by YGuilhem
+%       Factorized using gtVectorOrientationColor
+%
+%     Version 002 28-06-2012 by LNervo
+%       Update to version 2 of parameters; cleaning formatting
+
+
+if ~exist('phaseid','var') || isempty(phaseid)
+    phaseid = 1;
+end
+if ~exist('pl_norm','var') || isempty(pl_norm)
+    pl_norm = [0 0 0 1];
+end
+
+pl_norm_str = num2str(pl_norm);
+pl_norm_str = strrep(pl_norm_str,' ','');
+
+parameters = [];
+load('parameters.mat');
+
+if size(r_vectors,2) == 3
+    r_vectors(:,2:4) = r_vectors;
+    r_vectors(:,1) = 1:size(r_vectors,1);
+end
+
+all_hkils=[];
+for i = 1:size(pl_norm,1)
+    all_hkils = [all_hkils ; gtGetReflections(pl_norm(i,:), parameters.cryst(phaseid).spacegroup)];
+end
+
+% going to cartesian reciprocal space + normalisation of the cartesian
+% space
+all_hkls(:, 1) = all_hkils(:, 1) + 0.5 * all_hkils(:, 2);
+all_hkls(:, 2) = sqrt(3)/2 * all_hkils(:, 2);
+all_hkls(:, 3) = all_hkils(:, 4);
+
+all_hkls(:, 1) = all_hkls(:, 1)*2/(sqrt(3)*parameters.cryst(phaseid).latticepar(1));
+all_hkls(:, 2) = all_hkls(:, 2)*2/(sqrt(3)*parameters.cryst(phaseid).latticepar(1));
+all_hkls(:, 3) = all_hkls(:, 3)/parameters.cryst(phaseid).latticepar(3);
+
+% normalise hkls vector
+tmp = sqrt(sum((all_hkls.*all_hkls),2));
+normalised_hkls = all_hkls./(repmat(tmp,1,3));
+%%%%% can be replaced with gtHexToCart 
+
+
+axis = zeros(size(r_vectors, 1), 4);
+axis(:, 1) = r_vectors(:, 1);
+for i=1:size(r_vectors,1)
+    crys2sam = Rod2g(r_vectors(i,2:4));
+    all_normals = (crys2sam * normalised_hkls')';
+    if all_normals(2,3)>=0
+        axis(i,2)=all_normals(2,1);
+        axis(i,3)=all_normals(2,2);
+        axis(i,4)=all_normals(2,3);
+    else
+        axis(i,2)=all_normals(1,1);
+        axis(i,3)=all_normals(1,2);
+        axis(i,4)=all_normals(1,3);
+    end
+end
+
+
+fname = fullfile('6_rendering',['axis_' pl_norm_str '.mat']);
+save(fname,'axis'); % list of the axis
+disp(['Saved axis list in ' fname])
+
+% Get the orientation color defined by HSL color code, translated to RGB
+rgb = gtVectorOrientationColor(axis(:, 2:4));
+
+% Add black background and expand list length of max(grainid)+1
+axismap = zeros(max(axis(:, 1))+1, 3);
+for i=1:length(axis)
+    axismap(axis(i,1)+1, :) = rgb(i, :);
+end
+
+% Save the axis colourmap
+fname = fullfile('6_rendering',['axismap_' pl_norm_str '.mat']);
+save(fname,'axismap');
+disp(['Saved colour map in ' fname])
+
+end % end of function