diff --git a/cmd/gqgmc/main.go b/cmd/gqgmc/main.go
index 1f2f2f8126121760560645f497d723f41777afa7..066974e5741c58045792890cd0047bab0d51600f 100644
--- a/cmd/gqgmc/main.go
+++ b/cmd/gqgmc/main.go
@@ -19,6 +19,7 @@ func main() {
 		gc       geiger.Counter
 		cps, cpm uint16
 		volts    int16
+		temp     float64
 		ser      string
 		err      error
 		t        time.Time
@@ -71,4 +72,13 @@ func main() {
 	}
 	fmt.Printf("Volts: %d\n", volts)
 
+	temp, err = gc.GetTemp()
+	if err != nil {
+		fmt.Printf("Failed: '%s'\n", err)
+		return
+	}
+	fmt.Printf("Temp: %g\n", temp)
+
+	gc.GetConfiguration()
+
 }
diff --git a/devices/geiger/geiger.go b/devices/geiger/geiger.go
index 8dcc5c847f7f41bf12386aab74c0fd12cd7f1754..af32bf3988361bb48f09d9c0fd1baecdc5b127eb 100644
--- a/devices/geiger/geiger.go
+++ b/devices/geiger/geiger.go
@@ -36,6 +36,8 @@ type Counter interface {
 	SetConfiguration()
 	SetTime(time.Time)
 	GetTime() (time.Time, error)
+	GetTemp() (float64, error)
+	GetGyro() (int16, int16, int16, error)
 	FactoryReset()
 	Reboot()
 }
diff --git a/devices/geiger/gqgmc.go b/devices/geiger/gqgmc.go
index 9ee2de0d40134fdd3372fb713685993dcc1b9a0e..e68b2016696758bd604d6172e7bb9d666c5a91ea 100644
--- a/devices/geiger/gqgmc.go
+++ b/devices/geiger/gqgmc.go
@@ -42,6 +42,11 @@ const (
 	cmdGetGyro      = "<GETGYRO>>"      // GMC-320 Re.3.01
 )
 
+var (
+	mod280n300 = []string{"GMC-280", "GMC-300"}
+	mod320     = []string{"GMC-320"}
+)
+
 // GQGMCCounter is a GQ GMC Counter
 type GQGMCCounter struct {
 	port   *serial.Port
@@ -96,8 +101,14 @@ func (gc *GQGMCCounter) Model() string {
 
 // SerialNum gets the serial number of the device
 func (gc *GQGMCCounter) SerialNum() (string, error) {
-	serStr := ""
+	if !gc.supportedModels(mod280n300) {
+		return "", errors.New("Unsupported model")
+	}
+	if gc.versionLT("Re 2.11") {
+		return "", errors.New("Unsupported version")
+	}
 
+	serStr := ""
 	ser, err := gc.communicate(cmdGetSerial, 7)
 	if err == nil {
 		for _, b := range ser {
@@ -127,17 +138,15 @@ func (gc *GQGMCCounter) GetCPS() (uint16, error) {
 	return gc.getReading(cmdGetCPS)
 }
 
-// Volts returns current battery voltage
+// Volts returns current battery voltage (times 10)
 func (gc *GQGMCCounter) Volts() (int16, error) {
-	// Do this differently - for 9.6 return 96. And if not supported,
-	// Return -1.
-	// Public method to read voltage value of battery. The GQ GMC returns
-	// a single byte whose integer value converted to a float divided by 10
-	// equals the battery voltage. For example, 0x60 = 96 converts to 9.6 Volts.
-	// The ideal value is 9.8 volts. So practically speaking, we should not
-	// expect to see a value higher than 100. The command is get_voltage_cmd
-	// (see GQ GMC COMMANDS above). If the voltage falls below 7.5V, GQ LLC
-	// says the geiger counter cannot be expected to operate properly.
+	if !gc.supportedModels(mod280n300) {
+		return 0, errors.New("Unsupported model")
+	}
+	if gc.versionLT("Re 2.00") {
+		return 0, errors.New("Unsupported version")
+	}
+
 	volts, err := gc.communicate(cmdGetVoltage, 1)
 	if err != nil {
 		return 0, err
@@ -153,12 +162,26 @@ func (gc *GQGMCCounter) GetHistoryData() {
 
 // TurnOnCPS turns on CPS collection
 func (gc *GQGMCCounter) TurnOnCPS() error {
+	if !gc.supportedModels(mod280n300) {
+		return errors.New("Unsupported model")
+	}
+	if gc.versionLT("Re 2.10") {
+		return errors.New("Unsupported version")
+	}
+
 	gc.sendCmd(cmdTurnOnCPS)
 	return nil
 }
 
 // TurnOffCPS turns off CPS collection
 func (gc *GQGMCCounter) TurnOffCPS() error {
+	if !gc.supportedModels(mod280n300) {
+		return errors.New("Unsupported model")
+	}
+	if gc.versionLT("Re 2.10") {
+		return errors.New("Unsupported version")
+	}
+
 	gc.sendCmd(cmdTurnOffCPS)
 	gc.Clear()
 	return nil
@@ -177,18 +200,39 @@ func (gc *GQGMCCounter) GetAutoCPS() (uint16, error) {
 
 // TurnOnPower turns the device on
 func (gc *GQGMCCounter) TurnOnPower() {
+	if !gc.supportedModels(mod280n300) {
+		return
+	}
+	if gc.versionLT("Re 3.10") {
+		return
+	}
+
 	gc.sendCmd(cmdTurnOnPwr)
 	return
 }
 
 // TurnOffPower turns the device off
 func (gc *GQGMCCounter) TurnOffPower() {
+	if !gc.supportedModels(mod280n300) {
+		return
+	}
+	if gc.versionLT("Re 2.11") {
+		return
+	}
+
 	gc.sendCmd(cmdTurnOffPwr)
 	return
 }
 
 // GetConfiguration reads configuration data
 func (gc *GQGMCCounter) GetConfiguration() {
+	if !gc.supportedModels(mod280n300) {
+		return
+	}
+	if gc.versionLT("Re 2.10") {
+		return
+	}
+
 	cfg, err := gc.communicate(cmdGetCfg, 256)
 	if err != nil {
 		return
@@ -198,12 +242,19 @@ func (gc *GQGMCCounter) GetConfiguration() {
 
 // SetConfiguration writes configuration data
 func (gc *GQGMCCounter) SetConfiguration() {
+	if !gc.supportedModels(mod280n300) {
+		return
+	}
+	if gc.versionLT("Re 2.10") {
+		return
+	}
+
 	// See the ConfigurationData functions in gqgmc.cc
 }
 
 // SetTime sets the time
 func (gc *GQGMCCounter) SetTime(t time.Time) {
-	if !gc.supportedModels([]string{"GMC-280", "GMC-300"}) {
+	if !gc.supportedModels(mod280n300) {
 		return
 	}
 	if gc.versionLT("Re 2.23") {
@@ -254,6 +305,13 @@ func (gc *GQGMCCounter) setTimeAll(t time.Time) {
 
 // GetTime gets the time
 func (gc *GQGMCCounter) GetTime() (time.Time, error) {
+	if !gc.supportedModels(mod280n300) {
+		return time.Unix(0, 0), errors.New("Unsupported model")
+	}
+	if gc.versionLT("Re 3.00") {
+		return time.Unix(0, 0), errors.New("Unsupported version")
+	}
+
 	b, err := gc.communicate(cmdGetTime, 7)
 	if err != nil {
 		return time.Unix(0, 0), err
@@ -265,6 +323,13 @@ func (gc *GQGMCCounter) GetTime() (time.Time, error) {
 
 // GetTemp gets the temp
 func (gc *GQGMCCounter) GetTemp() (float64, error) {
+	if !gc.supportedModels(mod320) {
+		return 0, errors.New("Unsupported model")
+	}
+	if gc.versionLT("Re 3.01") {
+		return 0, errors.New("Unsupported version")
+	}
+
 	t, err := gc.communicate(cmdGetTemp, 4)
 	if err != nil {
 		return 0, err
@@ -283,6 +348,13 @@ func (gc *GQGMCCounter) GetTemp() (float64, error) {
 
 // GetGyro gets the position in space
 func (gc *GQGMCCounter) GetGyro() (int16, int16, int16, error) {
+	if !gc.supportedModels(mod320) {
+		return 0, 0, 0, errors.New("Unsupported model")
+	}
+	if gc.versionLT("Re 3.01") {
+		return 0, 0, 0, errors.New("Unsupported version")
+	}
+
 	buf, err := gc.communicate(cmdGetGyro, 7)
 	if err != nil {
 		return 0, 0, 0, err
@@ -298,12 +370,26 @@ func (gc *GQGMCCounter) GetGyro() (int16, int16, int16, error) {
 
 // FactoryReset does a factory reset
 func (gc *GQGMCCounter) FactoryReset() {
+	if !gc.supportedModels(mod280n300) {
+		return
+	}
+	if gc.versionLT("Re 3.00") {
+		return
+	}
+
 	gc.sendCmd(cmdFactoryReset)
 	return
 }
 
 // Reboot reboots the device
 func (gc *GQGMCCounter) Reboot() {
+	if !gc.supportedModels(mod280n300) {
+		return
+	}
+	if gc.versionLT("Re 3.00") {
+		return
+	}
+
 	gc.sendCmd(cmdReboot)
 	return
 }