diff --git a/ROMFS/px4fmu_common/init.d/rc.sensors b/ROMFS/px4fmu_common/init.d/rc.sensors
index e356f939d7d5624b7653912c28be1aa78068fdb6..3fc86b0873c20afcaf4936a8bd578bcfbd95aa8d 100644
--- a/ROMFS/px4fmu_common/init.d/rc.sensors
+++ b/ROMFS/px4fmu_common/init.d/rc.sensors
@@ -201,7 +201,7 @@ else
 	fi
 fi
 
-if sf10a start
+if sf1xx start
 then
 fi
 
diff --git a/ROMFS/px4fmu_test/init.d/rc.sensors b/ROMFS/px4fmu_test/init.d/rc.sensors
index 9a4d12192ed0f5b5347dd81318d7f21f194f1830..a39bc4edba86fa5739781dd1279c2a3dd2848c45 100644
--- a/ROMFS/px4fmu_test/init.d/rc.sensors
+++ b/ROMFS/px4fmu_test/init.d/rc.sensors
@@ -190,7 +190,7 @@ else
 	fi
 fi
 
-if sf10a start
+if sf1xx start
 then
 fi
 
diff --git a/ROMFS/tap_common/init.d/rc.sensors b/ROMFS/tap_common/init.d/rc.sensors
index fdb835baffcf811acfd43f9070d95a27f0416760..4e767bdc6cae73fdec591c6f312b48da8d07ba22 100644
--- a/ROMFS/tap_common/init.d/rc.sensors
+++ b/ROMFS/tap_common/init.d/rc.sensors
@@ -35,7 +35,7 @@ if meas_airspeed start
 then
 fi
 
-if sf10a start
+if sf1xx start
 then
 fi
 
diff --git a/cmake/configs/nuttx_px4fmu-v4_default.cmake b/cmake/configs/nuttx_px4fmu-v4_default.cmake
index fe356e49d6730b54bdedfd0294d975d71ab7b6a1..866e19dc0d5b23cf68a3f772f51619969ad9e2d9 100644
--- a/cmake/configs/nuttx_px4fmu-v4_default.cmake
+++ b/cmake/configs/nuttx_px4fmu-v4_default.cmake
@@ -23,7 +23,7 @@ set(config_module_list
 	drivers/mb12xx
 	drivers/srf02
 	drivers/sf0x
-	drivers/sf10a
+	drivers/sf1xx
 	drivers/ll40ls
 	drivers/trone
 	drivers/gps
diff --git a/src/drivers/sf10a/CMakeLists.txt b/src/drivers/sf1xx/CMakeLists.txt
similarity index 97%
rename from src/drivers/sf10a/CMakeLists.txt
rename to src/drivers/sf1xx/CMakeLists.txt
index 5db2934a74eb5e2a7a4bb67359e05f8e96f8b792..098bd5417196f0bea76f9dd133e8721bb1bf1250 100644
--- a/src/drivers/sf10a/CMakeLists.txt
+++ b/src/drivers/sf1xx/CMakeLists.txt
@@ -32,12 +32,12 @@
 ############################################################################
 px4_add_module(
 
-	MODULE drivers__sf10a
-	MAIN sf10a
+	MODULE drivers__sf1xx
+	MAIN sf1xx
 	COMPILE_FLAGS
 		-Os
 	SRCS
-		sf10a.cpp
+		sf1xx.cpp
 	DEPENDS
 		platforms__common
 	)
diff --git a/src/drivers/sf10a/sf10a.cpp b/src/drivers/sf1xx/sf1xx.cpp
similarity index 86%
rename from src/drivers/sf10a/sf10a.cpp
rename to src/drivers/sf1xx/sf1xx.cpp
index ecfa4020d177b0c06fb587ade30daf3b65bfb7ad..6dc55d4916551e316f763b311945d21239bb616d 100644
--- a/src/drivers/sf10a/sf10a.cpp
+++ b/src/drivers/sf1xx/sf1xx.cpp
@@ -32,11 +32,12 @@
  ****************************************************************************/
 
 /**
- * @file sf10a.cpp
+ * @file sf1xx.cpp
  *
  * @author ecmnet <ecm@gmx.de>
+ * @author Vasily Evseenko <svpcom@gmail.com>
  *
- * Driver for the Lightware SF10x lidar range finder series.
+ * Driver for the Lightware SF1xx lidar range finder series.
  * Default I2C address 0x55 is used.
  */
 
@@ -75,18 +76,18 @@
 #include <board_config.h>
 
 /* Configuration Constants */
-#define SF10A_BUS 		PX4_I2C_BUS_EXPANSION
-#define SF10A_BASEADDR 	0x55
-#define SF10A_DEVICE_PATH	"/dev/sf10a"
+#define SF1XX_BUS 		PX4_I2C_BUS_EXPANSION
+#define SF1XX_BASEADDR 	0x55
+#define SF1XX_DEVICE_PATH	"/dev/sf1xx"
 
 /* Device limits */
-#define SF10A_MIN_DISTANCE 	(0.01f)
-#define SF10A_MAX_DISTANCE 	(25.0f)
+#define SF1XX_MIN_DISTANCE 	(0.01f)
+#define SF1XX_MAX_DISTANCE 	(120.0f)
 
 
 /* conversion rates */
 
-#define SF10A_CONVERSION_INTERVAL 		31250		// Maximum rate according to datasheet is 32Hz
+#define SF1XX_CONVERSION_INTERVAL 		50000		// Maximum rate according to datasheet is 20Hz
 
 
 /* oddly, ERROR is not defined for c++ */
@@ -99,11 +100,11 @@ static const int ERROR = -1;
 # error This requires CONFIG_SCHED_WORKQUEUE.
 #endif
 
-class SF10A : public device::I2C
+class SF1XX : public device::I2C
 {
 public:
-	SF10A(int bus = SF10A_BUS, int address = SF10A_BASEADDR);
-	virtual ~SF10A();
+	SF1XX(int bus = SF1XX_BUS, int address = SF1XX_BASEADDR);
+	virtual ~SF1XX();
 
 	virtual int 		init();
 
@@ -160,8 +161,8 @@ private:
 
 	/**
 	* Set the min and max distance thresholds if you want the end points of the sensors
-	* range to be brought in at all, otherwise it will use the defaults SF10A_MIN_DISTANCE
-	* and SF10A_MAX_DISTANCE
+	* range to be brought in at all, otherwise it will use the defaults SF1XX_MIN_DISTANCE
+	* and SF1XX_MAX_DISTANCE
 	*/
 	void				set_minimum_distance(float min);
 	void				set_maximum_distance(float max);
@@ -189,21 +190,21 @@ private:
 /*
  * Driver 'main' command.
  */
-extern "C" __EXPORT int sf10a_main(int argc, char *argv[]);
+extern "C" __EXPORT int sf1xx_main(int argc, char *argv[]);
 
-SF10A::SF10A(int bus, int address) :
-	I2C("SF10A", SF10A_DEVICE_PATH, bus, address, 100000),
-	_min_distance(SF10A_MIN_DISTANCE),
-	_max_distance(SF10A_MAX_DISTANCE),
+SF1XX::SF1XX(int bus, int address) :
+	I2C("SF1XX", SF1XX_DEVICE_PATH, bus, address, 400000),
+	_min_distance(SF1XX_MIN_DISTANCE),
+	_max_distance(SF1XX_MAX_DISTANCE),
 	_reports(nullptr),
 	_sensor_ok(false),
 	_measure_ticks(0),
 	_class_instance(-1),
 	_orb_class_instance(-1),
 	_distance_sensor_topic(nullptr),
-	_sample_perf(perf_alloc(PC_ELAPSED, "sf10a_read")),
-	_comms_errors(perf_alloc(PC_COUNT, "sf10a_com_err")),
-	_buffer_overflows(perf_alloc(PC_COUNT, "sf10a_buf_of"))
+	_sample_perf(perf_alloc(PC_ELAPSED, "sf1xx_read")),
+	_comms_errors(perf_alloc(PC_COUNT, "sf1xx_com_err")),
+	_buffer_overflows(perf_alloc(PC_COUNT, "sf1xx_buf_of"))
 
 {
 	/* enable debug() calls */
@@ -213,7 +214,7 @@ SF10A::SF10A(int bus, int address) :
 	memset(&_work, 0, sizeof(_work));
 }
 
-SF10A::~SF10A()
+SF1XX::~SF1XX()
 {
 	/* make sure we are truly inactive */
 	stop();
@@ -234,7 +235,7 @@ SF10A::~SF10A()
 }
 
 int
-SF10A::init()
+SF1XX::init()
 {
 	int ret = ERROR;
 
@@ -246,7 +247,7 @@ SF10A::init()
 	/* allocate basic report buffers */
 	_reports = new ringbuffer::RingBuffer(2, sizeof(distance_sensor_s));
 
-	set_address(SF10A_BASEADDR);
+	set_address(SF1XX_BASEADDR);
 
 	if (_reports == nullptr) {
 		return ret;
@@ -264,50 +265,50 @@ SF10A::init()
 		DEVICE_LOG("failed to create distance_sensor object. Did you start uOrb?");
 	}
 
-
+        // Select altitude register
 	int ret2 = measure();
 
 	if (ret2 == 0) {
 		ret = OK;
 		_sensor_ok = true;
-		DEVICE_LOG("SF10x with address %d found", SF10A_BASEADDR);
+		DEVICE_LOG("SF1xx with address %d found", SF1XX_BASEADDR);
 	}
 
 	return ret;
 }
 
 int
-SF10A::probe()
+SF1XX::probe()
 {
 	return measure();
 }
 
 void
-SF10A::set_minimum_distance(float min)
+SF1XX::set_minimum_distance(float min)
 {
 	_min_distance = min;
 }
 
 void
-SF10A::set_maximum_distance(float max)
+SF1XX::set_maximum_distance(float max)
 {
 	_max_distance = max;
 }
 
 float
-SF10A::get_minimum_distance()
+SF1XX::get_minimum_distance()
 {
 	return _min_distance;
 }
 
 float
-SF10A::get_maximum_distance()
+SF1XX::get_maximum_distance()
 {
 	return _max_distance;
 }
 
 int
-SF10A::ioctl(struct file *filp, int cmd, unsigned long arg)
+SF1XX::ioctl(struct file *filp, int cmd, unsigned long arg)
 {
 	switch (cmd) {
 
@@ -334,7 +335,7 @@ SF10A::ioctl(struct file *filp, int cmd, unsigned long arg)
 					bool want_start = (_measure_ticks == 0);
 
 					/* set interval for next measurement to minimum legal value */
-					_measure_ticks = USEC2TICK(SF10A_CONVERSION_INTERVAL);
+					_measure_ticks = USEC2TICK(SF1XX_CONVERSION_INTERVAL);
 
 					/* if we need to start the poll state machine, do it */
 					if (want_start) {
@@ -354,7 +355,7 @@ SF10A::ioctl(struct file *filp, int cmd, unsigned long arg)
 					int ticks = USEC2TICK(1000000 / arg);
 
 					/* check against maximum rate */
-					if (ticks < USEC2TICK(SF10A_CONVERSION_INTERVAL)) {
+					if (ticks < USEC2TICK(SF1XX_CONVERSION_INTERVAL)) {
 						return -EINVAL;
 					}
 
@@ -422,7 +423,7 @@ SF10A::ioctl(struct file *filp, int cmd, unsigned long arg)
 }
 
 ssize_t
-SF10A::read(struct file *filp, char *buffer, size_t buflen)
+SF1XX::read(struct file *filp, char *buffer, size_t buflen)
 {
 	unsigned count = buflen / sizeof(struct distance_sensor_s);
 	struct distance_sensor_s *rbuf = reinterpret_cast<struct distance_sensor_s *>(buffer);
@@ -463,7 +464,7 @@ SF10A::read(struct file *filp, char *buffer, size_t buflen)
 		}
 
 		/* wait for it to complete */
-		usleep(SF10A_CONVERSION_INTERVAL);
+		usleep(SF1XX_CONVERSION_INTERVAL);
 
 		/* run the collection phase */
 		if (OK != collect()) {
@@ -482,17 +483,16 @@ SF10A::read(struct file *filp, char *buffer, size_t buflen)
 }
 
 int
-SF10A::measure()
+SF1XX::measure()
 {
 	int ret;
 
 	/*
-	 * Send the command to begin a measurement.
+	 * Send the command '0' -- read altitude
 	 */
 
-	uint8_t cmd[1];
-	cmd[0] = SF10A_BASEADDR;
-	ret = transfer(cmd, 1, nullptr, 0);
+	uint8_t cmd = 0;
+	ret = transfer(&cmd, 1, nullptr, 0);
 
 	if (OK != ret) {
 		perf_count(_comms_errors);
@@ -506,16 +506,14 @@ SF10A::measure()
 }
 
 int
-SF10A::collect()
+SF1XX::collect()
 {
 	int	ret = -EIO;
 
 	/* read from the sensor */
 	uint8_t val[2] = {0, 0};
-	uint8_t cmd = SF10A_BASEADDR;
 	perf_begin(_sample_perf);
 
-	ret = transfer(&cmd, 1, nullptr, 0);
 	ret = transfer(nullptr, 0, &val[0], 2);
 
 	if (ret < 0) {
@@ -558,34 +556,35 @@ SF10A::collect()
 }
 
 void
-SF10A::start()
+SF1XX::start()
 {
 	/* reset the report ring and state machine */
 	_reports->flush();
 
+        /* set register to '0' */
+        measure();
+
 	/* schedule a cycle to start things */
-	work_queue(HPWORK, &_work, (worker_t)&SF10A::cycle_trampoline, this, 5);
+	work_queue(HPWORK, &_work, (worker_t)&SF1XX::cycle_trampoline, this, 5);
 }
 
 void
-SF10A::stop()
+SF1XX::stop()
 {
 	work_cancel(HPWORK, &_work);
 }
 
 void
-SF10A::cycle_trampoline(void *arg)
+SF1XX::cycle_trampoline(void *arg)
 {
-	SF10A *dev = (SF10A *)arg;
+	SF1XX *dev = (SF1XX *)arg;
 
 	dev->cycle();
 }
 
 void
-SF10A::cycle()
+SF1XX::cycle()
 {
-	set_address(SF10A_BASEADDR);
-
 	/* Collect results */
 	if (OK != collect()) {
 		DEVICE_DEBUG("collection error");
@@ -594,24 +593,17 @@ SF10A::cycle()
 		return;
 	}
 
-
-	/* Trigger measurement */
-	if (OK != measure()) {
-		DEVICE_DEBUG("measure error lidar");
-	}
-
-
-
 	/* schedule a fresh cycle call when the measurement is done */
 	work_queue(HPWORK,
 		   &_work,
-		   (worker_t)&SF10A::cycle_trampoline,
+		   (worker_t)&SF1XX::cycle_trampoline,
 		   this,
-		   USEC2TICK(SF10A_CONVERSION_INTERVAL));
+		   USEC2TICK(SF1XX_CONVERSION_INTERVAL));
+
 }
 
 void
-SF10A::print_info()
+SF1XX::print_info()
 {
 	perf_print_counter(_sample_perf);
 	perf_print_counter(_comms_errors);
@@ -623,7 +615,7 @@ SF10A::print_info()
 /**
  * Local functions in support of the shell command.
  */
-namespace sf10a
+namespace sf1xx
 {
 
 /* oddly, ERROR is not defined for c++ */
@@ -632,7 +624,7 @@ namespace sf10a
 #endif
 const int ERROR = -1;
 
-SF10A	*g_dev;
+SF1XX	*g_dev;
 
 void	start();
 void	stop();
@@ -653,7 +645,7 @@ start()
 	}
 
 	/* create the driver */
-	g_dev = new SF10A(SF10A_BUS);
+	g_dev = new SF1XX(SF1XX_BUS);
 
 	if (g_dev == nullptr) {
 		goto fail;
@@ -664,7 +656,7 @@ start()
 	}
 
 	/* set the poll rate to default, starts automatic data collection */
-	fd = open(SF10A_DEVICE_PATH, O_RDONLY);
+	fd = open(SF1XX_DEVICE_PATH, O_RDONLY);
 
 	if (fd < 0) {
 		goto fail;
@@ -714,10 +706,10 @@ test()
 	ssize_t sz;
 	int ret;
 
-	int fd = open(SF10A_DEVICE_PATH, O_RDONLY);
+	int fd = open(SF1XX_DEVICE_PATH, O_RDONLY);
 
 	if (fd < 0) {
-		err(1, "%s open failed (try 'sf10a start' if the driver is not running", SF10A_DEVICE_PATH);
+		err(1, "%s open failed (try 'sf1xx start' if the driver is not running", SF1XX_DEVICE_PATH);
 	}
 
 	/* do a simple demand read */
@@ -777,7 +769,7 @@ test()
 void
 reset()
 {
-	int fd = open(SF10A_DEVICE_PATH, O_RDONLY);
+	int fd = open(SF1XX_DEVICE_PATH, O_RDONLY);
 
 	if (fd < 0) {
 		err(1, "failed ");
@@ -813,41 +805,41 @@ info()
 } /* namespace */
 
 int
-sf10a_main(int argc, char *argv[])
+sf1xx_main(int argc, char *argv[])
 {
 	/*
 	 * Start/load the driver.
 	 */
 	if (!strcmp(argv[1], "start")) {
-		sf10a::start();
+		sf1xx::start();
 	}
 
 	/*
 	 * Stop the driver
 	 */
 	if (!strcmp(argv[1], "stop")) {
-		sf10a::stop();
+		sf1xx::stop();
 	}
 
 	/*
 	 * Test the driver/device.
 	 */
 	if (!strcmp(argv[1], "test")) {
-		sf10a::test();
+		sf1xx::test();
 	}
 
 	/*
 	 * Reset the driver.
 	 */
 	if (!strcmp(argv[1], "reset")) {
-		sf10a::reset();
+		sf1xx::reset();
 	}
 
 	/*
 	 * Print driver information.
 	 */
 	if (!strcmp(argv[1], "info") || !strcmp(argv[1], "status")) {
-		sf10a::info();
+		sf1xx::info();
 	}
 
 	errx(1, "unrecognized command, try 'start', 'test', 'reset' or 'info'");