diff --git a/install.sh b/install.sh
index 4eb1699ef2..935c724f0c 100755
--- a/install.sh
+++ b/install.sh
@@ -282,6 +282,7 @@ VAR_DIRS="$VAR_LOCATION/remotes \
$VAR_LOCATION/remotes/tm/ \
$VAR_LOCATION/remotes/tm/dummy \
$VAR_LOCATION/remotes/tm/shared \
+ $VAR_LOCATION/remotes/tm/shared_lvm \
$VAR_LOCATION/remotes/tm/qcow2 \
$VAR_LOCATION/remotes/tm/ssh \
$VAR_LOCATION/remotes/tm/vmfs \
@@ -464,6 +465,7 @@ INSTALL_FILES=(
VMM_EXEC_VMWARE_SCRIPTS:$VAR_LOCATION/remotes/vmm/vmware
TM_FILES:$VAR_LOCATION/remotes/tm
TM_SHARED_FILES:$VAR_LOCATION/remotes/tm/shared
+ TM_SHARED_LVM_FILES:$VAR_LOCATION/remotes/tm/shared_lvm
TM_QCOW2_FILES:$VAR_LOCATION/remotes/tm/qcow2
TM_SSH_FILES:$VAR_LOCATION/remotes/tm/ssh
TM_VMFS_FILES:$VAR_LOCATION/remotes/tm/vmfs
@@ -945,6 +947,7 @@ NETWORK_VMWARE_FILES="src/vnm_mad/remotes/vmware/clean \
#-------------------------------------------------------------------------------
# Transfer Manager commands, to be installed under $LIB_LOCATION/tm_commands
# - SHARED TM, $VAR_LOCATION/tm/shared
+# - SHARED_LVM TM, $VAR_LOCATION/tm/shared_lvm
# - QCOW2 TM, $VAR_LOCATION/tm/qcow2
# - SSH TM, $VAR_LOCATION/tm/ssh
# - DUMMY TM, $VAR_LOCATION/tm/dummy
@@ -968,6 +971,15 @@ TM_SHARED_FILES="src/tm_mad/shared/clone \
src/tm_mad/shared/mvds \
src/tm_mad/shared/cpds"
+TM_SHARED_LVM_FILES="src/tm_mad/shared_lvm/clone \
+ src/tm_mad/shared_lvm/ln \
+ src/tm_mad/shared_lvm/mv \
+ src/tm_mad/shared_lvm/mvds \
+ src/tm_mad/shared_lvm/cpds \
+ src/tm_mad/shared_lvm/premigrate \
+ src/tm_mad/shared_lvm/postmigrate \
+ src/tm_mad/shared_lvm/delete"
+
TM_QCOW2_FILES="src/tm_mad/qcow2/clone \
src/tm_mad/qcow2/delete \
src/tm_mad/qcow2/ln \
diff --git a/share/etc/oned.conf b/share/etc/oned.conf
index dd85ebad8a..1f9fc55f21 100644
--- a/share/etc/oned.conf
+++ b/share/etc/oned.conf
@@ -356,7 +356,8 @@ VM_MAD = [
TM_MAD = [
executable = "one_tm",
- arguments = "-t 15 -d dummy,lvm,shared,qcow2,ssh,vmfs,iscsi,ceph" ]
+ arguments = "-t 15 -d dummy,lvm,shared,shared_lvm,qcow2,ssh,vmfs,iscsi,ceph"
+]
#*******************************************************************************
# Datastore Driver Configuration
diff --git a/src/tm_mad/shared_lvm/clone b/src/tm_mad/shared_lvm/clone
new file mode 100755
index 0000000000..07dd1062ac
--- /dev/null
+++ b/src/tm_mad/shared_lvm/clone
@@ -0,0 +1,83 @@
+#!/bin/bash
+
+# -------------------------------------------------------------------------- #
+# Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
+# #
+# Licensed under the Apache License, Version 2.0 (the "License"); you may #
+# not use this file except in compliance with the License. You may obtain #
+# a copy of the License at #
+# #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+# #
+# Unless required by applicable law or agreed to in writing, software #
+# distributed under the License is distributed on an "AS IS" BASIS, #
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
+# See the License for the specific language governing permissions and #
+# limitations under the License. #
+#--------------------------------------------------------------------------- #
+
+# clone fe:SOURCE host:remote_system_ds/disk.i size
+# - fe is the front-end hostname
+# - SOURCE is the path of the disk image in the form DS_BASE_PATH/disk
+# - host is the target host to deploy the VM
+# - remote_system_ds is the path for the system datastore in the host
+
+SRC=$1
+DST=$2
+VM_ID=$3
+DS_ID=$4
+
+if [ -z "${ONE_LOCATION}" ]; then
+ TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh
+else
+ TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
+fi
+
+DRIVER_PATH=$(dirname $0)
+
+source $TMCOMMON
+source ${DRIVER_PATH}/../../datastore/libfs.sh
+
+#-------------------------------------------------------------------------------
+# Set dst path and dir
+#-------------------------------------------------------------------------------
+
+SRC_HOST=`arg_host $SRC`
+SRC_PATH=`arg_path $SRC`
+
+DST_PATH=`arg_path $DST`
+DST_HOST=`arg_host $DST`
+DST_DIR=`dirname $DST_PATH`
+
+DS_SYS_ID=$(echo $DST_DIR | $AWK -F '/' '{print $(NF-1)}')
+
+SIZE=`file_size $SRC_PATH`
+
+if [ "$SIZE" = "0" ]; then
+ log_error "Cannot determine size for $SRC_PATH"
+ exit -1
+fi
+
+DISK_ID=$(echo $DST_PATH | $AWK -F. '{print $NF}')
+
+LV_NAME="lv-one-$VM_ID-$DISK_ID"
+VG_NAME="vg-one-$DS_SYS_ID"
+DEV="/dev/${VG_NAME}/${LV_NAME}"
+
+#-------------------------------------------------------------------------------
+# Create the snapshot and link it
+#-------------------------------------------------------------------------------
+
+CLONE_CMD=$(cat <
+# - host is the target host to deploy the VM
+# - remote_system_ds is the path for the system datastore in the host
+
+DST=$1
+VM_ID=$2
+DS_ID=$3
+
+if [ -z "${ONE_LOCATION}" ]; then
+ TMCOMMON=/var/lib/one/remotes/tm/tm_common.sh
+else
+ TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh
+fi
+
+source $TMCOMMON
+
+#-------------------------------------------------------------------------------
+# Return if deleting a disk, we will delete them when removing the
+# remote_system_ds directory for the VM (remotely)
+#-------------------------------------------------------------------------------
+DST_PATH=`arg_path $DST`
+DST_HOST=`arg_host $DST`
+
+# Delete the device if it's a clone (LVM snapshot)
+DELETE_CMD=$(cat <