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/pom.xml b/pom.xml
old mode 100644
new mode 100755
index 9b3dfec4b6744e4f5839e5a2ace936085f0ac007..0e945cd2ffd5559419c619539700ff7e621a06e6
--- 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.6.0</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);
 }
 
 // ============================================================================