diff -ruN scanbuttond-0.2.3.cvs20090713.orig/backends/epson.c scanbuttond-0.2.3.cvs20090713_pylon/backends/epson.c
--- scanbuttond-0.2.3.cvs20090713.orig/backends/epson.c	2007-02-12 01:26:45.000000000 +0100
+++ scanbuttond-0.2.3.cvs20090713_pylon/backends/epson.c	2011-05-11 22:08:51.916830793 +0200
@@ -33,12 +33,13 @@
 
 static char* backend_name = "Epson USB";
 
-#define NUM_SUPPORTED_USB_DEVICES 15
+#define NUM_SUPPORTED_USB_DEVICES 16
 
 static int supported_usb_devices[NUM_SUPPORTED_USB_DEVICES][3] = {
 	// vendor, product, num_buttons
 	{ 0x04B8, 0x0107, 1 },	// Epson Expression 1600
 	{ 0x04B8, 0x010E, 1 },	// Epson Expression 1680
+	{ 0x04B8, 0x012C, 1 },	// Epson Perfection V700
 	{ 0x04B8, 0x0103, 1 },	// Epson Perfection 610
 	{ 0x04B8, 0x0101, 3 },	// Epson Perfection 636U
 	{ 0x04B8, 0x010C, 3 },	// Epson Perfection 640
@@ -58,6 +59,7 @@
 static char* usb_device_descriptions[NUM_SUPPORTED_USB_DEVICES][2] = {
 	{ "Epson", "Expression 1600"},
 	{ "Epson", "Expression 1680"},
+	{ "Epson", "Perfection V700"},
 	{ "Epson", "Perfection 610"},
 	{ "Epson", "Perfection 636U"},
 	{ "Epson", "Perfection 640"},
diff -ruN scanbuttond-0.2.3.cvs20090713.orig/backends/epson_vphoto.c scanbuttond-0.2.3.cvs20090713_pylon/backends/epson_vphoto.c
--- scanbuttond-0.2.3.cvs20090713.orig/backends/epson_vphoto.c	1970-01-01 01:00:00.000000000 +0100
+++ scanbuttond-0.2.3.cvs20090713_pylon/backends/epson_vphoto.c	2011-05-11 23:37:55.836830622 +0200
@@ -0,0 +1,273 @@
+// epson_vphoto.c: Epson ESC/V device backend
+// This file is part of scanbuttond.
+// Copyleft )c( 2011 by Philipp Klaus, based on code from Bernhard Stiftner
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <syslog.h>
+#include "scanbuttond/scanbuttond.h"
+#include "scanbuttond/libusbi.h"
+#include "epson_vphoto.h"
+
+#define	ESC        	0x1B		/* ASCII value for ESC */
+
+static char* backend_name = "Epson VX00 Photo USB";
+
+#define NUM_SUPPORTED_USB_DEVICES 1
+
+static int supported_usb_devices[NUM_SUPPORTED_USB_DEVICES][3] = {
+	// vendor, product, num_buttons
+	{ 0x04B8, 0x012E, 4 }	// Epson Perfection V200
+};
+
+static char* usb_device_descriptions[NUM_SUPPORTED_USB_DEVICES][2] = {
+	{ "Epson", "Perfection V200"}
+};
+
+
+static libusb_handle_t* libusb_handle;
+static scanner_t* epsonvp_scanners = NULL;
+
+
+// returns -1 if the scanner is unsupported, or the index of the
+// corresponding vendor-product pair in the supported_usb_devices array.
+int epsonvp_match_libusb_scanner(libusb_device_t* device)
+{
+	int index;
+	for (index = 0; index < NUM_SUPPORTED_USB_DEVICES; index++) {
+		if (supported_usb_devices[index][0] == device->vendorID &&
+				  supported_usb_devices[index][1] == device->productID) {
+			break;
+		}
+	}
+	if (index >= NUM_SUPPORTED_USB_DEVICES) return -1;
+	return index;
+}
+
+
+void epsonvp_attach_libusb_scanner(libusb_device_t* device)
+{
+	const char* descriptor_prefix = "epkowa:interpreter:";
+	int index = epsonvp_match_libusb_scanner(device);
+	if (index < 0) return; // unsupported
+	scanner_t* scanner = (scanner_t*)malloc(sizeof(scanner_t));
+	scanner->vendor = usb_device_descriptions[index][0];
+	scanner->product = usb_device_descriptions[index][1];
+	scanner->connection = CONNECTION_LIBUSB;
+	scanner->internal_dev_ptr = (void*)device;
+	scanner->lastbutton = 0;
+	scanner->sane_device = (char*)malloc(strlen(device->location) + 
+		strlen(descriptor_prefix) + 1);
+	strcpy(scanner->sane_device, descriptor_prefix);
+	strcat(scanner->sane_device, device->location);
+	scanner->num_buttons = supported_usb_devices[index][2];
+	scanner->is_open = 0;
+	scanner->next = epsonvp_scanners;
+	epsonvp_scanners = scanner;
+}
+
+
+void epsonvp_detach_scanners(void)
+{
+	scanner_t* next;
+	while (epsonvp_scanners != NULL) {
+		next = epsonvp_scanners->next;
+		free(epsonvp_scanners->sane_device);
+		free(epsonvp_scanners);
+		epsonvp_scanners = next;
+	}
+}
+
+
+void epsonvp_scan_devices(libusb_device_t* devices)
+{
+	int index;
+	libusb_device_t* device = devices;
+	while (device != NULL) {
+		index = epsonvp_match_libusb_scanner(device);
+		if (index >= 0)
+			epsonvp_attach_libusb_scanner(device);
+		device = device->next;
+	}
+}
+
+
+int epsonvp_init_libusb(void)
+{
+	libusb_device_t* devices;
+
+	libusb_handle = libusb_init();
+	devices = libusb_get_devices(libusb_handle);
+	epsonvp_scan_devices(devices);
+	return 0;
+}
+
+
+const char* scanbtnd_get_backend_name(void)
+{
+	return backend_name;
+}
+
+
+int scanbtnd_init(void)
+{
+	epsonvp_scanners = NULL;
+
+	syslog(LOG_INFO, "epson-vphoto-backend: init");
+	return epsonvp_init_libusb();
+}
+
+
+int scanbtnd_rescan(void)
+{
+	libusb_device_t *devices;
+
+	epsonvp_detach_scanners();
+	epsonvp_scanners = NULL;
+	libusb_rescan(libusb_handle);
+	devices = libusb_get_devices(libusb_handle);
+	epsonvp_scan_devices(devices);
+	return 0;
+}
+
+
+const scanner_t* scanbtnd_get_supported_devices(void)
+{
+	return epsonvp_scanners;
+}
+
+
+int scanbtnd_open(scanner_t* scanner)
+{
+	int result = -ENOSYS;
+	if (scanner->is_open)
+		return -EINVAL;
+	switch (scanner->connection) {
+		case CONNECTION_LIBUSB:
+			// if devices have been added/removed, return -ENODEV to
+			// make scanbuttond update its device list
+			if (libusb_get_changed_device_count() != 0)
+				return -ENODEV;
+			result = libusb_open((libusb_device_t*)scanner->internal_dev_ptr);
+			break;
+	}
+	if (result == 0)
+		scanner->is_open = 1;
+	return result;
+}
+
+
+int scanbtnd_close(scanner_t* scanner)
+{
+	int result = -ENOSYS;
+	if (!scanner->is_open)
+		return -EINVAL;
+	switch (scanner->connection) {
+		case CONNECTION_LIBUSB:
+			result = libusb_close((libusb_device_t*)scanner->internal_dev_ptr);
+			break;
+	}
+	if (result == 0)
+		scanner->is_open = 0;
+	return result;
+}
+
+
+int epsonvp_read(scanner_t* scanner, void* buffer, int bytecount)
+{
+	switch (scanner->connection) {
+		case CONNECTION_LIBUSB:
+			return libusb_read((libusb_device_t*)scanner->internal_dev_ptr, 
+				buffer, bytecount);
+			break;
+	}
+	return -1;
+}
+
+
+int epsonvp_write(scanner_t* scanner, void* buffer, int bytecount)
+{
+	switch (scanner->connection) {
+		case CONNECTION_LIBUSB:
+			return libusb_write((libusb_device_t*)scanner->internal_dev_ptr, 
+				buffer, bytecount);
+			break;
+	}
+	return -1;
+}
+
+
+void epsonvp_flush(scanner_t* scanner)
+{
+	switch (scanner->connection) {
+		case CONNECTION_LIBUSB:
+			libusb_flush((libusb_device_t*)scanner->internal_dev_ptr);
+			break;
+	}
+}
+
+
+int scanbtnd_get_button(scanner_t* scanner)
+{
+	#define BUFFER_SIZE 16
+	unsigned char bytes[BUFFER_SIZE];
+	int rcv_len;
+	int num_bytes;
+	if (!scanner->is_open)
+		return -EINVAL;
+
+	bytes[0] = 0x1E;
+	bytes[1] = 0x85;
+	bytes[2] = '\0';
+	num_bytes = epsonvp_write(scanner, (void*)bytes, 2);
+	if (num_bytes != 2) {
+		syslog(LOG_WARNING, "epson-vphoto-backend: communication error: "
+			"write length:%d (expected:%d)", num_bytes, 2);
+		epsonvp_flush(scanner); 
+		return 0;
+	}
+
+	num_bytes = epsonvp_read(scanner, (void*)bytes, 1);
+	if (num_bytes != 1) {
+		syslog(LOG_WARNING, "epson-vphoto-backend: communication error: "
+			"read length:%d (expected:%d)", num_bytes, 1);
+		epsonvp_flush(scanner);
+		return 0;
+	}
+	
+	return bytes[0];
+}
+
+
+const char* scanbtnd_get_sane_device_descriptor(scanner_t* scanner)
+{
+	return scanner->sane_device;
+}
+
+
+int scanbtnd_exit(void)
+{
+	syslog(LOG_INFO, "epson-vphoto-backend: exit");
+	epsonvp_detach_scanners();
+	libusb_exit(libusb_handle);
+	return 0;
+}
+
diff -ruN scanbuttond-0.2.3.cvs20090713.orig/backends/epson_vphoto.h scanbuttond-0.2.3.cvs20090713_pylon/backends/epson_vphoto.h
--- scanbuttond-0.2.3.cvs20090713.orig/backends/epson_vphoto.h	1970-01-01 01:00:00.000000000 +0100
+++ scanbuttond-0.2.3.cvs20090713_pylon/backends/epson_vphoto.h	2011-05-11 20:30:59.626830978 +0200
@@ -0,0 +1,24 @@
+// epson_vphoto.h: Epson ESC/V device backend
+// This file is part of scanbuttond.
+// Copyleft )c( 2011 by Philipp Klaus, based on code from Bernhard Stiftner
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+#ifndef __EPSON_VPHOTO_H_INCLUDED
+#define __EPSON_VPHOTO_H_INCLUDED
+
+#include "scanbuttond/backend.h"
+
+#endif
diff -ruN scanbuttond-0.2.3.cvs20090713.orig/backends/Makefile.am scanbuttond-0.2.3.cvs20090713_pylon/backends/Makefile.am
--- scanbuttond-0.2.3.cvs20090713.orig/backends/Makefile.am	2009-05-26 14:19:21.000000000 +0200
+++ scanbuttond-0.2.3.cvs20090713_pylon/backends/Makefile.am	2011-05-11 20:55:46.006830932 +0200
@@ -1,5 +1,6 @@
 lib_LTLIBRARIES = 	libscanbtnd-backend_artec_eplus48u.la \
 			libscanbtnd-backend_epson.la \
+			libscanbtnd-backend_epson_vphoto.la \
 			libscanbtnd-backend_genesys.la \
 			libscanbtnd-backend_meta.la \
 			libscanbtnd-backend_mustek.la \
@@ -16,6 +17,9 @@
 libscanbtnd_backend_epson_la_SOURCES = epson.c epson.h
 libscanbtnd_backend_epson_la_LIBADD = ../interface/libscanbtnd-interface_usb.la
 libscanbtnd_backend_epson_la_LDFLAGS = -module -version-info 1:0:0
+libscanbtnd_backend_epson_vphoto_la_SOURCES = epson_vphoto.c epson_vphoto.h
+libscanbtnd_backend_epson_vphoto_la_LIBADD = ../interface/libscanbtnd-interface_usb.la
+libscanbtnd_backend_epson_vphoto_la_LDFLAGS = -module -version-info 1:0:0
 libscanbtnd_backend_meta_la_SOURCES = meta.c meta.h ../lib/loader.c ../include/scanbuttond/loader.h ../include/scanbuttond/common.h
 libscanbtnd_backend_meta_la_LIBADD = ../interface/libscanbtnd-interface_usb.la @LIBDL@
 libscanbtnd_backend_meta_la_LDFLAGS = -module -version-info 1:0:0
diff -ruN scanbuttond-0.2.3.cvs20090713.orig/backends/meta.conf scanbuttond-0.2.3.cvs20090713_pylon/backends/meta.conf
--- scanbuttond-0.2.3.cvs20090713.orig/backends/meta.conf	2009-05-26 14:19:21.000000000 +0200
+++ scanbuttond-0.2.3.cvs20090713_pylon/backends/meta.conf	2011-05-11 20:53:07.456830937 +0200
@@ -1,5 +1,6 @@
 libscanbtnd-backend_artec_eplus48u
 libscanbtnd-backend_epson
+libscanbtnd-backend_epson_vphoto
 libscanbtnd-backend_genesys
 libscanbtnd-backend_hp3500
 libscanbtnd-backend_hp3900
