diff --git a/include/AbstractElectrometerClass.h b/include/AbstractElectrometerClass.h
index 44005f6c36517b3f6f7d4d47d0934b33a97ed54a..a1d68dda8ce4a81754ca263feee3c3f302e2d261 100644
--- a/include/AbstractElectrometerClass.h
+++ b/include/AbstractElectrometerClass.h
@@ -170,13 +170,15 @@ public:
 	*  \brief Keithley Electrometer methods
 	*/
 	void autoRange_on		  (void);
+	std::string is_autoRange_on(void);
+	
 	void zero_check_on		(void);
 	void zero_check_off		(void);
 	void zero_correct_on	(void);
 	void zero_correct_off	(void);
+	virtual void autoRange_off		(void);
 	virtual void auto_zero_on		  (void);
 	virtual void auto_zero_off		(void);
-	virtual void autoRange_off		(void);
 	virtual void setAmperMeterMode(void);
 	virtual void setVoltMeterMode	(void);
 	virtual void setOhmMeterMode	(void);
@@ -216,6 +218,7 @@ public:
 	virtual void set_integrationTime	(double);
 	virtual short get_buffer_size			(void);
 	virtual short get_triggerMode			(void) { return _trigMod;}
+// 	virtual void set_range(std::size_t idx) = 0;
 
 	/**
 	*  \brief  VSource operations (only for K_6517)
@@ -246,7 +249,8 @@ public:
 	virtual std::string get_ElectroMeterFrequency (void);
 	virtual std::string get_ElectroMeterGain      (void);
 	virtual unsigned short get_ElectroChannel	    (void);
-	virtual void set_ElectroMeterRange			(std::string rang);
+    virtual void set_ElectroMeterRange          (std::string rangeStr);
+    virtual void set_ElectroMeterRange          (std::size_t rangeIdx);
 	virtual void set_ElectroMeterPolarity		(std::string pola);
 	virtual void set_ElectroMeterFrequency	(std::string freq);
 	virtual void set_ElectroMeterGain			  (std::string gain);
@@ -268,6 +272,7 @@ public:
 	*/
 	virtual std::string get_ElectroMeterMode	(void);
 	virtual std::string get_ElectroMeterRange	(void);
+    virtual std::vector<std::string> ranges_list(void)=0;
 
 
 protected :
diff --git a/include/ElectrometerProtocol.h b/include/ElectrometerProtocol.h
index 69357164f00cbb988369e3e3bcc42fb60b8ba68b..278d1b9f390a9c5e932c62b7e02a322e83e1bcf9 100644
--- a/include/ElectrometerProtocol.h
+++ b/include/ElectrometerProtocol.h
@@ -132,7 +132,8 @@ public:
 	/**
 	*  \brief Common Electrometer Functions.
 	*/
-	virtual void set_range (std::string val)= 0;
+    virtual void set_range (std::string val)= 0;
+    virtual void set_range (std::size_t val);
 	virtual void reset			(void) = 0; 
 	virtual void local			(void); 
 	virtual void remote			(void); 
@@ -142,7 +143,7 @@ public:
 	*/
 	virtual std::string get_value(void)		= 0;
 	virtual std::string get_mode (void)		= 0;
-	virtual std::string get_range(void)		= 0;
+    virtual std::string get_range(void)     = 0;
 	virtual std::vector<double> get_integratedValue		(void);
 	virtual std::vector<double> get_fetchValue		    (void);
 	virtual bool SRQLineState             (void); //- used to know if the integration cycle is done! 
@@ -187,7 +188,7 @@ public:
 	virtual void setCoulombMeterMode(void);
 	virtual void autoRange_on		  (void);
 	virtual void autoRange_off		(void);
-	
+	virtual std::string is_autoRange_on  (void);
 	virtual void zero_check_on		(void);
 	virtual void zero_check_off		(void);
 	virtual void zero_correct_on	(void);
diff --git a/include/KeithleySCPIProtocol.h b/include/KeithleySCPIProtocol.h
index 80e0b5042d8381ef1facc9855420383155db9ccf..de328102622be346a6ae8bc8d68db90151b83bc5 100644
--- a/include/KeithleySCPIProtocol.h
+++ b/include/KeithleySCPIProtocol.h
@@ -63,6 +63,7 @@ public:
 	void set_range			  (std::string value) ;
 	void autoRange_on		  (void);
 	void autoRange_off		(void);
+	std::string is_autoRange_on(void);
 
 	void zero_check_on		(void);
 	void zero_check_off		(void);
diff --git a/include/Keithley_485.h b/include/Keithley_485.h
index 90ce6bb7f6e99ec6a65dbe04cfefb3ebb1e437fd..c32b4e2b7fd71d1a55496ecee233a50a1b2cf44b 100644
--- a/include/Keithley_485.h
+++ b/include/Keithley_485.h
@@ -62,6 +62,8 @@ public:
 	*  \brief getter(s) & setter(s)	
 	*/
 	std::string get_ElectroMeterRange(void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 	
 	/**
 	*  \brief Electrometer Status.
diff --git a/include/Keithley_486.h b/include/Keithley_486.h
index 1f74840d619d93d38a3994edbbb42a60f0e067e9..9b5bd8108abe05b98b7b051d47c7fc36c6f36296 100644
--- a/include/Keithley_486.h
+++ b/include/Keithley_486.h
@@ -67,6 +67,8 @@ public:
 	*  \brief getter(s) & setter(s)	
 	*/
 	std::string get_ElectroMeterRange(void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 	
 	/**
 	*  \brief Electrometer status.
diff --git a/include/Keithley_487.h b/include/Keithley_487.h
index 33baa33f99d26098caef4b65fb13b343ee5b6641..84f5ce5fce544130641cdb5173abe053ec17fa3b 100644
--- a/include/Keithley_487.h
+++ b/include/Keithley_487.h
@@ -68,6 +68,8 @@ public:
 	*/
 	std::string get_ElectroMeterMode(void);
 	std::string get_ElectroMeterRange(void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 	
 	/**
 	*  \brief The integration time (sec).
diff --git a/include/Keithley_617.h b/include/Keithley_617.h
index d90bf9f8d4f730d919af5c4cc2e41f88fcb0ba8b..7fbd83beeb46e08c7e03a430bbde701e345eb210 100644
--- a/include/Keithley_617.h
+++ b/include/Keithley_617.h
@@ -70,6 +70,8 @@ public:
 	*/
 	std::string get_ElectroMeterMode (void);
 	std::string get_ElectroMeterRange(void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 
   /**
 	*  \brief Electrometer status.
diff --git a/include/Keithley_6485.h b/include/Keithley_6485.h
index b32b9d6ddba0ce8efce50703bba959813f60b083..2f6ab429ba10871fcf997b272647ed1f45090a34 100644
--- a/include/Keithley_6485.h
+++ b/include/Keithley_6485.h
@@ -66,6 +66,8 @@ public:
 	void range_up   (void);
 	void range_down (void);
   std::string get_ElectroMeterRange (void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 
 	/**
 	*  \brief Methods to configure the integration mode.
diff --git a/include/Keithley_6487.h b/include/Keithley_6487.h
index 3823bd697c8c80ea64a72d21b93326fe414875cf..cfb6272e8b41888a39e88accdce6bc1ee22b94f1 100644
--- a/include/Keithley_6487.h
+++ b/include/Keithley_6487.h
@@ -59,6 +59,8 @@ public:
 	void range_up (void);
 	void range_down (void);
   std::string get_ElectroMeterRange (void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 	
   std::vector<double> get_integratedValue (void);
 	std::vector<double> get_fetchValue      (void);
diff --git a/include/Keithley_6512.h b/include/Keithley_6512.h
index e834aa296df24e065116b92156b162b3da329edd..8117941860da1753190f73bc4e9c50e03a051df4 100644
--- a/include/Keithley_6512.h
+++ b/include/Keithley_6512.h
@@ -70,6 +70,8 @@ public:
 	*/
 	std::string get_ElectroMeterMode (void);
 	std::string get_ElectroMeterRange(void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 	
 	/**
 	*  \brief Electrometer status.
diff --git a/include/Keithley_6514.h b/include/Keithley_6514.h
index 14384f9743343a5696c6c051068abf35626338fb..3f3c32e0351b55bfd33d731ba3c5f71b7e05984f 100644
--- a/include/Keithley_6514.h
+++ b/include/Keithley_6514.h
@@ -59,6 +59,8 @@ public:
 	void range_up (void);
 	void range_down (void);
   std::string get_ElectroMeterRange (void) ;
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 	
 	std::vector<double> get_integratedValue (void);
 	std::vector<double> get_fetchValue      (void);
diff --git a/include/Keithley_6517.h b/include/Keithley_6517.h
index 7eb5f62960d4f374cefedc482cb310c3e2b6632e..b2acfc59c68744ad444be6bb187f833a229a36f8 100644
--- a/include/Keithley_6517.h
+++ b/include/Keithley_6517.h
@@ -45,7 +45,7 @@ public:
 	/**
 	*  \brief protocole initailisation.
 	*/
-  bool init_protocol (void);
+    bool init_protocol (void);
 
 	/**
 	*  \brief Functions to save/restore specifics configuration.
@@ -58,7 +58,9 @@ public:
 	*/
 	void range_up   (void);
 	void range_down (void);
-  std::string get_ElectroMeterRange (void);
+    std::string get_ElectroMeterRange (void);
+    std::vector<std::string> ranges_list(void);
+    void set_ElectroMeterRange (std::size_t rangeIdx);
 	
 	std::vector<double> get_integratedValue (void);
 	std::vector<double> get_fetchValue      (void);
diff --git a/include/N_PhotoConducteur.h b/include/N_PhotoConducteur.h
old mode 100644
new mode 100755
index 2be4fc33bd33b1536493d21265e31c6ecbfd280f..14b21839d0970ea4eb82826cc15b9d65bb4c197e
--- a/include/N_PhotoConducteur.h
+++ b/include/N_PhotoConducteur.h
@@ -54,6 +54,7 @@ public:
 	*/
 	void set_ElectroMeterRange(std::string range_str);
 	std::string get_ElectroMeterRange();
+	std::vector<std::string> ranges_list(void);
 
 	/**
 	*  \brief getters and setters.
diff --git a/include/N_PhotoVoltaique.h b/include/N_PhotoVoltaique.h
old mode 100644
new mode 100755
index 9a63c3d571839920973cb0823f9fa7796994a783..39f215ef368bc4f7f6af121bc7d00841df1453bd
--- a/include/N_PhotoVoltaique.h
+++ b/include/N_PhotoVoltaique.h
@@ -54,6 +54,7 @@ public:
 	*/
 	void set_ElectroMeterRange(std::string range_str);
 	std::string get_ElectroMeterRange();
+	std::vector<std::string> ranges_list(void);
 
 	/**
 	*  \brief getters and setters.
diff --git a/include/Novelec_MCCE2.h b/include/Novelec_MCCE2.h
old mode 100644
new mode 100755
index 906efeb9e4b536def9e5e488e36894974781b92b..e4912018b7e1f99eaa537088f3dd75295dfa8a30
--- a/include/Novelec_MCCE2.h
+++ b/include/Novelec_MCCE2.h
@@ -46,13 +46,13 @@ public:
   bool init_protocol(void);
 
 	std::string get_ElectroMeterPolarity(void);
-	void set_ElectroMeterPolarity	(std::string);
-
-	short get_electrometer_type() {
-    return this->_MCCE2electroTypeNumber;
+	void set_ElectroMeterPolarity	(std::string);
+
+	short get_electrometer_type() {
+    return this->_MCCE2electroTypeNumber;
   }
-	std::string get_electrometer_typeStr() {
-    return this->_MCCE2electroTypeStr;
+	std::string get_electrometer_typeStr() {
+    return this->_MCCE2electroTypeStr;
   }
 
 	/**
@@ -67,7 +67,7 @@ public:
 	/**
 	*	\brief Sets the new range value
 	*/
-	//virtual void set_ElectroMeterRange(std::string range_str) = 0;
+	//virtual void set_ElectroMeterRange(std::string range_str) = 0;
   virtual void range_up	     (void) {};
   virtual void range_down    (void) {};
 
@@ -86,15 +86,20 @@ public:
 	*/
 	std::string electrometer_status		(void);
 
+  virtual std::vector<std::string> ranges_list(void) {
+  	return std::vector<std::string>() ;
+  };
+
+
 protected :
 	unsigned short _rangeLimit;				      //- define the range limit for each novelec type
   unsigned short _address;                //- a DAIP manages 2 "channels" (or address)
-	unsigned short _MCCE2electroTypeNumber;	//- the mcce2 electrometer type number (to check range value)
+	unsigned short _MCCE2electroTypeNumber;	//- the mcce2 electrometer type number (to check range value)
     std::string _MCCE2electroTypeStr;       //-  "      "   "   "   "   "   as string
 	/**
 	*	\brief Checks the new range value
 	*/
-	short check_range_value(const std::string& rgToCheck, const std::string* electroRangeList);
+	short check_range_value(const std::string& rgToCheck, const std::vector<std::string>	 electroRangeList);
 
 };
 
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
index 9b3dfec4b6744e4f5839e5a2ace936085f0ac007..46cb27ed0bebfac6d341794545ceedfd1ecef103
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
    </parent>
    <groupId>fr.soleil.lib</groupId>
    <artifactId>Electrometers-${aol}-${library}-${mode}</artifactId>
-   <version>2.5.29</version>
+   <version>2.7.1</version>
    <packaging>nar</packaging>
    <name>Electrometers library</name>
    <description>Electrometers library</description>
diff --git a/src/AbstractElectrometerClass.cpp b/src/AbstractElectrometerClass.cpp
index 6695583ca0ec9bce8ec25f3035428d4b67df4548..f1e4c0ecdf1ac8a2e7ebf8635f018a3eb4b7238c 100644
--- a/src/AbstractElectrometerClass.cpp
+++ b/src/AbstractElectrometerClass.cpp
@@ -244,6 +244,14 @@ void AbstractElectrometerClass::autoRange_off (void)
 	_electrometerProtocol->autoRange_off( );
 }
 
+// ============================================================================
+// AbstractElectrometerClass::is_autoRange_on
+// ============================================================================
+std::string AbstractElectrometerClass::is_autoRange_on (void)
+{
+	return _electrometerProtocol->is_autoRange_on( );
+}
+
 // ============================================================================
 // AbstractElectrometerClass::auto_zero_on
 // ============================================================================
@@ -728,12 +736,20 @@ std::string AbstractElectrometerClass::get_ElectroMeterGain (void)
 	return _electrometerProtocol->get_gain( );
 }
 
+// ============================================================================
+// AbstractElectrometerClass::set_ElectroMeterRange
+// ============================================================================
+void AbstractElectrometerClass::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+    _electrometerProtocol->set_range(rangeIdx);
+}
+
 // ============================================================================
 // AbstractElectrometerClass::set_ElectroMeterRange
 // ============================================================================
 void AbstractElectrometerClass::set_ElectroMeterRange (std::string rang)
 {
-	_electrometerProtocol->set_range(rang);
+    _electrometerProtocol->set_range(rang);
 }
 
 // ============================================================================
diff --git a/src/ElectrometerProtocol.cpp b/src/ElectrometerProtocol.cpp
index 07dd9efaff7f6da545cebdaf8d95b4d372c45cd0..dca956f0c73d2a7b05a2557f030b4a504073ebd5 100644
--- a/src/ElectrometerProtocol.cpp
+++ b/src/ElectrometerProtocol.cpp
@@ -66,9 +66,19 @@ void ElectrometerProtocol::remote (void)
 // ============================================================================
 std::vector<double> ElectrometerProtocol::get_integratedValue (void) 
 {
-	throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED", 
-											"This Electrometer does not support this command.",
-											"ElectrometerProtocol::get_integratedValue( ).");
+    throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED", 
+                                            "This Electrometer does not support this command.",
+                                            "ElectrometerProtocol::get_integratedValue( ).");
+}
+
+// ============================================================================
+// ElectrometerProtocol::set_range
+// ============================================================================
+void ElectrometerProtocol::set_range (std::size_t) 
+{
+    throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED", 
+                                            "This Electrometer does not support this command.",
+                                            "ElectrometerProtocol::set_range( ).");
 }
 
 // ============================================================================
@@ -241,6 +251,16 @@ void ElectrometerProtocol::autoRange_off (void)
 											"ElectrometerProtocol::autoRange_off( ).");
 }
 
+// ============================================================================
+// ElectrometerProtocol::is_autoRange_on
+// ============================================================================
+std::string ElectrometerProtocol::is_autoRange_on (void) 
+{
+	throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED", 
+											"Novelec does not support this command.",
+											"ElectrometerProtocol::is_autoRange_on( ).");
+}
+
 
 // ============================================================================
 // ElectrometerProtocol::zero_check_on
diff --git a/src/KeithleySCPIProtocol.cpp b/src/KeithleySCPIProtocol.cpp
index ef71f5888a66ca51b911386e80c3cdbd9b691b6d..486abeac963366d257d75da2a5710f4d4dbf8be0 100644
--- a/src/KeithleySCPIProtocol.cpp
+++ b/src/KeithleySCPIProtocol.cpp
@@ -314,6 +314,35 @@ std::string tmpMode;
 
 }
 
+// ============================================================================
+// KeithleySCPIProtocol::is_autoRange_on
+// ============================================================================
+std::string KeithleySCPIProtocol::is_autoRange_on (void)
+{
+std::string cmd_to_send("");
+std::string tmpMode;
+
+	if( !this->_communication_link )
+	{
+		throw electrometer::ElectrometerException(
+												"INITIALIZATION_ERROR",
+												"No communication protocol available.",
+												"KeithleySCPIProtocol::is_autoRange_on()");
+	}
+
+	//- get electrometer mode
+	tmpMode = get_mode( );
+
+	//- erase bad caracters
+	tmpMode.erase(tmpMode.find("\n") );
+
+	//- send command
+	cmd_to_send = tmpMode + ":RANGe:AUTO?";
+	
+	return _communication_link->write_read(cmd_to_send);
+
+}
+
 // ============================================================================
 // KeithleySCPIProtocol::auto_zero_on
 // ============================================================================
diff --git a/src/Keithley_485.cpp b/src/Keithley_485.cpp
index 5a514d6eae1336cfec907ab44f9455aa89d2918f..f972ddfed0fcd6df29bf6caa3a3c89b853e91e0e 100644
--- a/src/Keithley_485.cpp
+++ b/src/Keithley_485.cpp
@@ -25,7 +25,7 @@
 /*
 * Valid Range values for a K_485
 */
-static const std::string K485_rangeValue[] = {"AUTO ON","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3"};
+static const std::vector<std::string> K485_rangeValue {"AUTO ON","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3"};
 
 /*
 * Range limit
@@ -154,6 +154,34 @@ std::string Keithley_485::get_ElectroMeterRange (void)
 	return _rangeStr;
 }
 
+// ============================================================================
+// Keithley_485::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_485::ranges_list (void)
+{
+  return K485_rangeValue;
+}
+
+// ============================================================================
+// Keithley_485::set_ElectroMeterRange
+// ============================================================================
+void Keithley_485::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  if ( rangeIdx >= K485_rangeLimit )
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_485::set_ElectroMeterRange( ).");
+  }
+  
+  range_str = K485_rangeValue[rangeIdx];
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_485::set_triggerMode
 // ============================================================================
diff --git a/src/Keithley_486.cpp b/src/Keithley_486.cpp
index ba2dcbe1b46f6eaf0c7c91462c745f246c9d9f75..a8cb2db6c01154def06568dff18eef6fa47bb849 100644
--- a/src/Keithley_486.cpp
+++ b/src/Keithley_486.cpp
@@ -26,7 +26,7 @@
 /*
 * Valid Range values for a K_486
 */
-static const std::string K486_rangeValue[] = {"AUTO ON","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3", "AUTO OFF"};
+static const std::vector<std::string> K486_rangeValue {"AUTO ON","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3", "AUTO OFF"};
 /*
 * Range limit : no range for values R8 & R9 (R10 = AUTORANGE OFF)
 */
@@ -173,6 +173,34 @@ std::string Keithley_486::get_ElectroMeterRange (void)
 	return _rangeStr;
 }
 
+// ============================================================================
+// Keithley_486::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_486::ranges_list (void)
+{
+  return K486_rangeValue;
+}
+
+// ============================================================================
+// Keithley_486::set_ElectroMeterRange
+// ============================================================================
+void Keithley_486::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  if ( rangeIdx >= K486_rangeLimit)
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_486::set_ElectroMeterRange( ).");
+  }
+  
+  range_str = K486_rangeValue[rangeIdx];
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_486::set_buffer_size()
 // ============================================================================
diff --git a/src/Keithley_487.cpp b/src/Keithley_487.cpp
index fd0f17fd5084cf95e322abec4e297bf0c9d5c05f..8a78eadcb50c6fc1a8ea66bad1233613cd169b0f 100644
--- a/src/Keithley_487.cpp
+++ b/src/Keithley_487.cpp
@@ -26,7 +26,7 @@
 /*
 * Valid Range values for a K_487
 */
-static const std::string K487_rangeValue[] = {"AUTO ON","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3", "AUTO OFF"};
+static const std::vector<std::string> K487_rangeValue {"AUTO ON","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3", "AUTO OFF"};
 /*
 * Range limit : no range for values R8 & R9 (R10 = AUTORANGE OFF)
 */
@@ -172,6 +172,34 @@ std::string Keithley_487::get_ElectroMeterRange (void)
 	return _rangeStr;
 }
 
+// ============================================================================
+// Keithley_487::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_487::ranges_list (void)
+{
+  return K487_rangeValue;
+}
+
+// ============================================================================
+// Keithley_487::set_ElectroMeterRange
+// ============================================================================
+void Keithley_487::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  if ( rangeIdx >= K487_rangeLimit )
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_487::set_ElectroMeterRange( ).");
+  }
+  
+  range_str = K487_rangeValue[rangeIdx];
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_487::set_buffer_size()
 // ============================================================================
diff --git a/src/Keithley_617.cpp b/src/Keithley_617.cpp
index dc70d1891c4eada6197066597cd7ce722eaca780..17188300d24aaef5376edc313b5c66eaf8a13d24 100644
--- a/src/Keithley_617.cpp
+++ b/src/Keithley_617.cpp
@@ -25,12 +25,12 @@
 /*
 * Valid Range values for a K_617
 */
-static const std::string K617_AmpRangeValue[] = {"AUTO ON","2E-12","2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2", "AUTO OFF"};
-static const std::string K617_VoltRangeValue[]= {"AUTO ON","2E-1","2","20","200","200","200","200","200","200","200","200", "AUTO OFF"};
-static const std::string K617_OhmRangeValue[] = {"AUTO ON","2E3","2E4","2E5","2E6","2E7","2E8","2E9","2E10","2E11","2E11","2E11", "AUTO OFF"};
-static const std::string K617_CouRangeValue[] = {"AUTO ON","2E-10","2E-9","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10", "AUTO OFF"};
-static const std::string K617_XfdbRangeValue[]= {"AUTO ON","2E-1","2","20","20","20","20","20","20","20","20","20", "AUTO OFF"};
-static const std::string K617_VonIRangeValue[]= {"AUTO ON","200E12","20E12","2E12","200E9","20E9","2E9","200E6","20E6","2E6","200E3","200E3", "AUTO OFF"};
+static const std::vector<std::string> K617_AmpRangeValue {"AUTO ON","2E-12","2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2", "AUTO OFF"};
+static const std::vector<std::string> K617_VoltRangeValue {"AUTO ON","2E-1","2","20","200","200","200","200","200","200","200","200", "AUTO OFF"};
+static const std::vector<std::string> K617_OhmRangeValue {"AUTO ON","2E3","2E4","2E5","2E6","2E7","2E8","2E9","2E10","2E11","2E11","2E11", "AUTO OFF"};
+static const std::vector<std::string> K617_CouRangeValue {"AUTO ON","2E-10","2E-9","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10", "AUTO OFF"};
+static const std::vector<std::string> K617_XfdbRangeValue {"AUTO ON","2E-1","2","20","20","20","20","20","20","20","20","20", "AUTO OFF"};
+static const std::vector<std::string> K617_VonIRangeValue {"AUTO ON","200E12","20E12","2E12","200E9","20E9","2E9","200E6","20E6","2E6","200E3","200E3", "AUTO OFF"};
 /*
 * Range limit
 */
@@ -170,6 +170,80 @@ std::string Keithley_617::get_ElectroMeterRange (void)
   return _rangeStr;
 }
 
+// ============================================================================
+// Keithley_617::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_617::ranges_list (void)
+{
+  std::vector<std::string> vrangeslist;
+  
+  //- get device mode
+  _mode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  //- check range validity
+  if(_mode.find("CURR") != std::string::npos)
+  {
+    vrangeslist = K617_AmpRangeValue;
+  }
+  else if (_mode.find("VOLT") != std::string::npos)
+  {
+    vrangeslist = K617_VoltRangeValue;
+  }
+  else if (_mode.find("RES") != std::string::npos)
+  {
+    vrangeslist = K617_OhmRangeValue;
+  }
+  else if (_mode.find("CHAR") != std::string::npos)
+  {
+    vrangeslist = K617_CouRangeValue;
+  }
+  else
+      throw electrometer::ElectrometerException("UNKNOWN_MODE",
+                                              "Unable to find the electrometer mode used.",
+                                              "Keithley_617::ranges_list( ).");
+
+  return vrangeslist;
+}
+
+// ============================================================================
+// Keithley_617::set_ElectroMeterRange
+// ============================================================================
+void Keithley_617::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  //- get device mode
+  _mode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  if ( rangeIdx >= K617_rangeLimit)
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_617::set_ElectroMeterRange( ).");
+  }
+
+  //- check range validity
+  if(_mode.find("CURR") != std::string::npos)
+  {
+    range_str = K617_AmpRangeValue[rangeIdx];
+  }
+  else if (_mode.find("VOLT") != std::string::npos)
+  {
+    range_str = K617_VoltRangeValue[rangeIdx];
+  }
+  else if (_mode.find("RES") != std::string::npos)
+  {
+    range_str = K617_OhmRangeValue[rangeIdx];
+  }
+  else if (_mode.find("CHAR") != std::string::npos)
+  {
+    range_str = K617_CouRangeValue[rangeIdx];
+  }
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_617::set_buffer_size()
 // ============================================================================
diff --git a/src/Keithley_6485.cpp b/src/Keithley_6485.cpp
index 8e020df72a9e462f2e639815edd3272365e0acad..86e8b10819dc11ee9ce74529ec73897ed0767d6f 100644
--- a/src/Keithley_6485.cpp
+++ b/src/Keithley_6485.cpp
@@ -24,7 +24,7 @@
 /*
 * Valid Range values for a K_6485
 */
-static const std::string K6485_rangeValue[] = {"2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2"};
+static const std::vector<std::string> K6485_rangeValue {"2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2"};
 /*
 * Max Index Range value for a K_6485
 */
@@ -191,6 +191,34 @@ std::string Keithley_6485::get_ElectroMeterRange (void)
   return range_str;
 }
 
+// ============================================================================
+// Keithley_6485::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_6485::ranges_list (void)
+{
+  return K6485_rangeValue;
+}
+
+// ============================================================================
+// Keithley_6485::set_ElectroMeterRange
+// ============================================================================
+void Keithley_6485::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  if ( rangeIdx >= K6485_rangeLimit )
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_6485::set_ElectroMeterRange( ).");
+  }
+  
+  range_str = K6485_rangeValue[rangeIdx];
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_6485::get_integratedValue
 // ============================================================================
diff --git a/src/Keithley_6487.cpp b/src/Keithley_6487.cpp
index e1709efd267bc15a1decfafee9c16e0eef8a35a1..a56009c2780cf660af0cabeab86914b6c976a923 100644
--- a/src/Keithley_6487.cpp
+++ b/src/Keithley_6487.cpp
@@ -24,7 +24,7 @@
 /*
 * Valid Range values for a K_6487
 */
-static const std::string K6487_rangeValue[8] = {"2E-2","2E-3","2E-4","2E-5","2E-6","2E-7","2E-8","2E-9"};
+static const std::vector<std::string> K6487_rangeValue {"2E-2","2E-3","2E-4","2E-5","2E-6","2E-7","2E-8","2E-9"};
 /*
 * Max Index Range value for a K_6487
 */
@@ -151,6 +151,34 @@ std::stringstream cmd_to_send;
 	_electrometerProtocol->set_range(cmd_to_send.str());
 }
 
+// ============================================================================
+// Keithley_6487::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_6487::ranges_list (void)
+{
+  return K6487_rangeValue;
+}
+
+// ============================================================================
+// Keithley_6487::set_ElectroMeterRange
+// ============================================================================
+void Keithley_6487::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  if ( rangeIdx >= K6487_rangeLimit)
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_6487::set_ElectroMeterRange( ).");
+  }
+  
+  range_str = K6487_rangeValue[rangeIdx];
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_6487::setAmperMeterMode
 // ============================================================================
diff --git a/src/Keithley_6512.cpp b/src/Keithley_6512.cpp
index 8919229c04d557b2cdb1013c82a06938f38cc4b4..f8aef9c140b1ddeeeb831ff791548fe461d9b4f7 100644
--- a/src/Keithley_6512.cpp
+++ b/src/Keithley_6512.cpp
@@ -25,11 +25,11 @@
 /*
 * Valid Range values for a K_6512
 */
-static const std::string K6512_AmpRangeValue[] = {"AUTO ON","2E-12","2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2", "AUTO OFF"};
-static const std::string K6512_VoltRangeValue[]= {"AUTO ON","2E-1","2","20","200","200","200","200","200","200","200","200", "AUTO OFF"};
-static const std::string K6512_OhmRangeValue[] = {"AUTO ON","2E3","2E4","2E5","2E6","2E7","2E8","2E9","2E10","2E11","2E11","2E11", "AUTO OFF"};
-static const std::string K6512_CouRangeValue[] = {"AUTO ON","2E-10","2E-9","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10", "AUTO OFF"};
-static const std::string K6512_XfdbRangeValue[]= {"AUTO ON","2E-1","2","20","20","20","20","20","20","20","20","20", "AUTO OFF"};
+static const std::vector<std::string> K6512_AmpRangeValue {"AUTO ON","2E-12","2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2", "AUTO OFF"};
+static const std::vector<std::string> K6512_VoltRangeValue {"AUTO ON","2E-1","2","20","200","200","200","200","200","200","200","200", "AUTO OFF"};
+static const std::vector<std::string> K6512_OhmRangeValue {"AUTO ON","2E3","2E4","2E5","2E6","2E7","2E8","2E9","2E10","2E11","2E11","2E11", "AUTO OFF"};
+static const std::vector<std::string> K6512_CouRangeValue {"AUTO ON","2E-10","2E-9","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10","2E-10", "AUTO OFF"};
+static const std::vector<std::string> K6512_XfdbRangeValue {"AUTO ON","2E-1","2","20","20","20","20","20","20","20","20","20", "AUTO OFF"};
 /*
 * Range limit
 */
@@ -169,6 +169,80 @@ std::string Keithley_6512::get_ElectroMeterRange (void)
 	return _rangeStr;
 }
 
+// ============================================================================
+// Keithley_6512::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_6512::ranges_list (void)
+{
+  std::vector<std::string> vrangeslist;
+  
+  //- get device mode
+  _mode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  //- check range validity
+  if(_mode.find("CURR") != std::string::npos)
+  {
+    vrangeslist = K6512_AmpRangeValue;
+  }
+  else if (_mode.find("VOLT") != std::string::npos)
+  {
+    vrangeslist = K6512_VoltRangeValue;
+  }
+  else if (_mode.find("RES") != std::string::npos)
+  {
+    vrangeslist = K6512_OhmRangeValue;
+  }
+  else if (_mode.find("CHAR") != std::string::npos)
+  {
+    vrangeslist = K6512_CouRangeValue;
+  }
+  else
+      throw electrometer::ElectrometerException("UNKNOWN_MODE",
+                                              "Unable to find the electrometer mode used.",
+                                              "Keithley_6512::ranges_list( ).");
+
+  return vrangeslist;
+}
+
+// ============================================================================
+// Keithley_6512::set_ElectroMeterRange
+// ============================================================================
+void Keithley_6512::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  //- get device mode
+  _mode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  if ( rangeIdx >= K6512_rangeLimit )
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_6512::set_ElectroMeterRange( ).");
+  }
+  
+  //- check range validity
+  if(_mode.find("CURR") != std::string::npos)
+  {
+    range_str = K6512_AmpRangeValue[rangeIdx];
+  }
+  else if (_mode.find("VOLT") != std::string::npos)
+  {
+    range_str = K6512_VoltRangeValue[rangeIdx];
+  }
+  else if (_mode.find("RES") != std::string::npos)
+  {
+    range_str = K6512_OhmRangeValue[rangeIdx];
+  }
+  else if (_mode.find("CHAR") != std::string::npos)
+  {
+    range_str = K6512_CouRangeValue[rangeIdx];
+  }
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_6512::set_buffer_size()
 // ============================================================================
diff --git a/src/Keithley_6514.cpp b/src/Keithley_6514.cpp
index 1d1c32d9adc0aa4656744e9853286c4a8fa01f31..a2427d12af2f395fc1829ab0b65c90ed47512831 100644
--- a/src/Keithley_6514.cpp
+++ b/src/Keithley_6514.cpp
@@ -25,10 +25,10 @@
 /*
 * Valid Range values for a K_6514
 */
-static const std::string K6514_AMP_rangeStr[] = {"2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2"};
-static const std::string K6514_VOLT_rangeStr[]= {"2","20","200"};
-static const std::string K6514_OHM_rangeStr[] = {"2E3","2E4","2E5","2E6","2E7","2E8","2E9","2E10","2E11"};
-static const std::string K6514_COU_rangeStr[] = {"2E-8","2E-7","2E-6","2E-5"};
+static const std::vector<std::string> K6514_AMP_rangeStr {"2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2"};
+static const std::vector<std::string> K6514_VOLT_rangeStr {"2","20","200"};
+static const std::vector<std::string> K6514_OHM_rangeStr {"2E3","2E4","2E5","2E6","2E7","2E8","2E9","2E10","2E11"};
+static const std::vector<std::string> K6514_COU_rangeStr {"2E-8","2E-7","2E-6","2E-5"};
 /*
 * Max Index Range value for a K_6514
 */
@@ -222,6 +222,85 @@ std::stringstream cmd_to_send;
 	_electrometerProtocol->set_range(cmd_to_send.str());
 }
 
+// ============================================================================
+// Keithley_6514::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_6514::ranges_list (void)
+{
+  std::vector<std::string> vrangeslist;
+  
+  //- get device mode
+  _kmode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  //- check range validity
+  if(_kmode.find("CURR") != std::string::npos)
+  {
+    vrangeslist = K6514_AMP_rangeStr;
+  }
+  else if (_kmode.find("VOLT") != std::string::npos)
+  {
+    vrangeslist = K6514_VOLT_rangeStr;
+  }
+  else if (_kmode.find("RES") != std::string::npos)
+  {
+    vrangeslist = K6514_OHM_rangeStr;
+  }
+  else if (_kmode.find("CHAR") != std::string::npos)
+  {
+    vrangeslist = K6514_COU_rangeStr;
+  }
+  else
+      throw electrometer::ElectrometerException("UNKNOWN_MODE",
+                                              "Unable to find the electrometer mode used.",
+                                              "Keithley_6514::ranges_list( ).");
+
+  return vrangeslist;
+}
+
+// ============================================================================
+// Keithley_6514::set_ElectroMeterRange
+// ============================================================================
+void Keithley_6514::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  //- get device mode
+  _kmode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  //- check range validity
+  if(_kmode.find("CURR") != std::string::npos)
+  {
+    if ( range_limit <= K6514_AMP_rangeLimit)
+    {
+      range_str = K6514_AMP_rangeStr[rangeIdx];
+    }
+  }
+  else if (_kmode.find("VOLT") != std::string::npos)
+  {
+    if ( range_limit = K6514_VOLT_rangeLimit )
+    {
+      range_str = K6514_VOLT_rangeStr[rangeIdx];
+    }
+  }
+  else if (_kmode.find("RES") != std::string::npos)
+  {
+    if( range_limit = K6514_OHM_rangeLimit )
+    {
+      range_str = K6514_OHM_rangeStr[rangeIdx];
+    }
+  }
+  else if (_kmode.find("CHAR") != std::string::npos)
+  {
+    if ( range_limit = K6514_COU_rangeLimit )
+    {
+      range_str = K6514_COU_rangeStr[rangeIdx];
+    }
+  }
+  
+  _electrometerProtocol->set_range(range_str);
+}
+
 // ============================================================================
 // Keithley_6514::get_integratedValue
 // ============================================================================
diff --git a/src/Keithley_6517.cpp b/src/Keithley_6517.cpp
index d65dd9af32f694f4a17986cdf22eaeb49d7c0764..dc5a673e5d6b4594d81dd27504cb67a8b7cda2e4 100644
--- a/src/Keithley_6517.cpp
+++ b/src/Keithley_6517.cpp
@@ -24,10 +24,11 @@
 /*
 * Valid Range values for a K_6517
 */
-static const std::string K6517_AMP_rangeStr[] = {"2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2"};
-static const std::string K6517_VOLT_rangeStr[]= {"2","20","200"};
-static const std::string K6517_OHM_rangeStr[] = {"2E14","2E13","2E12","2E11","2E10","2E9","2E8","2E7","2E6","2E5"};
-static const std::string K6517_COU_rangeStr[] = {"2E-9","2E-8","2E-7","2E-6"};
+//static const std::string K6517_AMP_rangeStr[] = {"2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2"};
+static const std::vector<std::string> K6517_AMP_rangeStr {"2E-11","2E-10","2E-9","2E-8","2E-7","2E-6","2E-5","2E-4","2E-3","2E-2"};
+static const std::vector<std::string> K6517_VOLT_rangeStr {"2","20","200"};
+static const std::vector<std::string> K6517_OHM_rangeStr {"2E14","2E13","2E12","2E11","2E10","2E9","2E8","2E7","2E6","2E5"};
+static const std::vector<std::string> K6517_COU_rangeStr {"2E-9","2E-8","2E-7","2E-6"};
 /*
 * Max Index Range value for a K_6517
 */
@@ -183,37 +184,120 @@ void Keithley_6517::range_down (void)
 
 std::stringstream cmd_to_send;
 
-	//- update range value from hardware
-	this->get_ElectroMeterRange( );
+    //- update range value from hardware
+    this->get_ElectroMeterRange( );
 
-	_range -= 1;
+    _range -= 1;
 
-	if(_range < 0)
-	{
-		_range = 0;
+    if(_range < 0)
+    {
+        _range = 0;
 
-		throw electrometer::ElectrometerException("OUT_OF_RANGE",
-												"Range down limit reached.",
-												"Keithley_6517::range_down( ).");
-	}
+        throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                                "Range down limit reached.",
+                                                "Keithley_6517::range_down( ).");
+    }
 
-	//- check range validity
-	if(_kmode.find("CURR") != std::string::npos)
-		cmd_to_send << K6517_AMP_rangeStr[_range] << std::endl;
-	else if (_kmode.find("VOLT") != std::string::npos)
-		cmd_to_send << K6517_VOLT_rangeStr[_range] << std::endl;
-	else if (_kmode.find("RES") != std::string::npos)
-		cmd_to_send << K6517_OHM_rangeStr[_range] << std::endl;
-	else if (_kmode.find("CHAR") != std::string::npos)
-			cmd_to_send << K6517_COU_rangeStr[_range] << std::endl;
-	else
-		throw electrometer::ElectrometerException("UNKNOWN_MODE",
-												"Unable to find the electrometer mode used.",
-												"Keithley_6517::range_down( ).");
+    //- check range validity
+    if(_kmode.find("CURR") != std::string::npos)
+        cmd_to_send << K6517_AMP_rangeStr[_range] << std::endl;
+    else if (_kmode.find("VOLT") != std::string::npos)
+        cmd_to_send << K6517_VOLT_rangeStr[_range] << std::endl;
+    else if (_kmode.find("RES") != std::string::npos)
+        cmd_to_send << K6517_OHM_rangeStr[_range] << std::endl;
+    else if (_kmode.find("CHAR") != std::string::npos)
+            cmd_to_send << K6517_COU_rangeStr[_range] << std::endl;
+    else
+        throw electrometer::ElectrometerException("UNKNOWN_MODE",
+                                                "Unable to find the electrometer mode used.",
+                                                "Keithley_6517::range_down( ).");
+
+
+    //- build and send the command
+    _electrometerProtocol->set_range(cmd_to_send.str());
+}
 
+// ============================================================================
+// Keithley_6517::ranges_list
+// ============================================================================
+std::vector<std::string> Keithley_6517::ranges_list (void)
+{
+  std::vector<std::string> vrangeslist;
+  std::size_t nb_ranges = 0;
+  
+  //- get device mode
+  _kmode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  //- check range validity
+  if(_kmode.find("CURR") != std::string::npos)
+  {
+    nb_ranges = K6517_AMP_rangeLimit;
+    vrangeslist = K6517_AMP_rangeStr;
+  }
+  else if (_kmode.find("VOLT") != std::string::npos)
+  {
+    nb_ranges = K6517_VOLT_rangeLimit;
+    vrangeslist = K6517_VOLT_rangeStr;
+  }
+  else if (_kmode.find("RES") != std::string::npos)
+  {
+    nb_ranges = K6517_OHM_rangeLimit;
+    vrangeslist = K6517_OHM_rangeStr;
+  }
+  else if (_kmode.find("CHAR") != std::string::npos)
+  {
+    nb_ranges = K6517_COU_rangeLimit;
+    vrangeslist = K6517_COU_rangeStr;
+  }
+  else
+      throw electrometer::ElectrometerException("UNKNOWN_MODE",
+                                              "Unable to find the electrometer mode used.",
+                                              "Keithley_6517::ranges_list( ).");
 
-	//- build and send the command
-	_electrometerProtocol->set_range(cmd_to_send.str());
+  return vrangeslist;
+}
+
+// ============================================================================
+// Keithley_6517::set_ElectroMeterRange
+// ============================================================================
+void Keithley_6517::set_ElectroMeterRange (std::size_t rangeIdx)
+{
+  std::string range_str("");
+  std::size_t range_limit = 0;
+  
+  //- get device mode
+  _kmode = AbstractElectrometerClass::get_ElectroMeterMode();
+
+  //- check range validity
+  if(_kmode.find("CURR") != std::string::npos)
+  {
+    range_limit = K6517_AMP_rangeLimit;
+    range_str = K6517_AMP_rangeStr[rangeIdx];
+  }
+  else if (_kmode.find("VOLT") != std::string::npos)
+  {
+    range_limit = K6517_VOLT_rangeLimit;
+    range_str = K6517_VOLT_rangeStr[rangeIdx];
+  }
+  else if (_kmode.find("RES") != std::string::npos)
+  {
+    range_limit = K6517_OHM_rangeLimit;
+    range_str = K6517_OHM_rangeStr[rangeIdx];
+  }
+  else if (_kmode.find("CHAR") != std::string::npos)
+  {
+    range_limit = K6517_COU_rangeLimit;
+    range_str = K6517_COU_rangeStr[rangeIdx];
+  }
+  
+  if ( rangeIdx >= range_limit )
+  {
+    throw electrometer::ElectrometerException("OUT_OF_RANGE",
+                                              "Range index is above the max range value.",
+                                              "Keithley_6517::set_ElectroMeterRange( ).");
+  }
+  
+  _electrometerProtocol->set_range(range_str);
 }
 
 // ============================================================================
diff --git a/src/N_PhotoConducteur.cpp b/src/N_PhotoConducteur.cpp
old mode 100644
new mode 100755
index a40516cad4ad41494a365959eb3830f22dc7da8b..f11be52174f8b459c0c2c39400fbf4c4fa826bec
--- a/src/N_PhotoConducteur.cpp
+++ b/src/N_PhotoConducteur.cpp
@@ -24,8 +24,8 @@
 /*
 * Valid Range values for a N_PhotoConducteur
 */
-static const std::string NType4_rangeValue[] = {"100","30","10","3"};		//- MOhms
-static const std::string NType5_rangeValue[] = {"1000","300","100","30"};	//- KOhms
+static const std::vector<std::string> NType4_rangeValue {"100","30","10","3"};			//- MOhms
+static const std::vector<std::string> NType5_rangeValue {"1000","300","100","30"};	//- KOhms
 
 
 // ============================================================================
@@ -195,3 +195,21 @@ std::string rangeStr("");
 
 	return rangeStr;
 }
+
+// ============================================================================
+// N_PhotoConducteur::ranges_list
+// ============================================================================
+std::vector<std::string> N_PhotoConducteur::ranges_list(void)
+{
+  std::vector<std::string> vrangeslist;
+
+	//- switch the novelec type :
+	switch(_MCCE2electroTypeNumber)
+	{
+	case 4 : vrangeslist = NType4_rangeValue;
+		break;
+	case 5 : vrangeslist = NType5_rangeValue;
+		break;
+	}
+	return vrangeslist;
+}
diff --git a/src/N_PhotoVoltaique.cpp b/src/N_PhotoVoltaique.cpp
old mode 100644
new mode 100755
index 0209ac40cd8c81fea84f87106831b94264f95a37..fe1b6c612197ba0e946af6fe99af31ee76117009
--- a/src/N_PhotoVoltaique.cpp
+++ b/src/N_PhotoVoltaique.cpp
@@ -24,9 +24,9 @@
 /*
 * Valid Range values for a N_PhotoVoltaique
 */
-static const std::string NType1_rangeValue[] = {"1E-11AcC","3E-11AcC","1E-10AcC","3E-10AcC"};
-static const std::string NType2_rangeValue[] = {"1E-10AcC","3E-10AcC","1E-09AcC","3E-09AcC","1E-08AcC","3E-08AcC","1E-07AcC","3E-07AcC"};
-static const std::string NType3_rangeValue[] = {"1E-08AcC","3E-08AcC","1E-07AcC","3E-07AcC","1E-06AcC","3E-06AcC","1E-05AcC","3E-05AcC"};
+static const std::vector<std::string> NType1_rangeValue {"1E-11AcC","3E-11AcC","1E-10AcC","3E-10AcC"};
+static const std::vector<std::string> NType2_rangeValue {"1E-10AcC","3E-10AcC","1E-09AcC","3E-09AcC","1E-08AcC","3E-08AcC","1E-07AcC","3E-07AcC"};
+static const std::vector<std::string> NType3_rangeValue {"1E-08AcC","3E-08AcC","1E-07AcC","3E-07AcC","1E-06AcC","3E-06AcC","1E-05AcC","3E-05AcC"};
 
 
 // ============================================================================
@@ -226,3 +226,23 @@ std::string rangeStr("");
 
 	return rangeStr;
 }
+
+// ============================================================================
+// N_PhotoVoltaique::ranges_list
+// ============================================================================
+std::vector<std::string> N_PhotoVoltaique::ranges_list(void)
+{
+  std::vector<std::string> vrangeslist;
+
+	//- switch the novelec type :
+	switch(_MCCE2electroTypeNumber)
+	{
+	case 1 : vrangeslist = NType1_rangeValue;
+		break;
+	case 2 : vrangeslist = NType2_rangeValue;
+		break;
+	case 3 : vrangeslist = NType3_rangeValue;
+		break;
+	}
+	return vrangeslist;
+}
diff --git a/src/Novelec_MCCE2.cpp b/src/Novelec_MCCE2.cpp
old mode 100644
new mode 100755
index 9756356b9fc8e037b5c79027e637386a09ee4f7c..bba1fac3b2687d1d57f48f8f5e44183da6c00638
--- a/src/Novelec_MCCE2.cpp
+++ b/src/Novelec_MCCE2.cpp
@@ -393,7 +393,7 @@ std::string Novelec_MCCE2::electrometer_status (void)
 // ============================================================================
 // Novelec_MCCE2::check_range_value
 // ============================================================================
-short Novelec_MCCE2::check_range_value (const std::string& rgToCheck, const std::string* electroRangeList)
+short Novelec_MCCE2::check_range_value (const std::string& rgToCheck, const std::vector<std::string> electroRangeList)
 {
 	std::string electroRg("");
 	for (unsigned int idx = 0; idx <= _rangeLimit; idx++)