diff --git a/src/python/dm/common/plugins/__init__.py b/src/python/dm/common/plugins/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/python/dm/common/plugins/fileProcessorInterface.py b/src/python/dm/common/plugins/fileProcessorInterface.py
new file mode 100755
index 0000000000000000000000000000000000000000..03546ebd084e378b0ee126750b5fa388b3d82191
--- /dev/null
+++ b/src/python/dm/common/plugins/fileProcessorInterface.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python
+
+import abc
+class FileProcessorInterface:
+
+    @abc.abstractmethod
+    def processFile(self, srcPath):
+        return NotImplemented
+        
diff --git a/src/python/dm/common/plugins/fileTransferPlugin.py b/src/python/dm/common/plugins/fileTransferPlugin.py
new file mode 100755
index 0000000000000000000000000000000000000000..969fd6d2306bd809d32c432d2c3ef125a9ca3436
--- /dev/null
+++ b/src/python/dm/common/plugins/fileTransferPlugin.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+from dm.common.utility.loggingManager import LoggingManager
+from dm.common.utility.dmSubprocess import DmSubprocess
+from dm.common.exceptions.invalidArgument import InvalidArgument
+from dm.common.exceptions.invalidRequest import InvalidRequest
+from fileProcessorInterface import FileProcessorInterface
+
+class FileTransferPlugin(FileProcessorInterface):
+
+    def __init__(self, command, src=None, dest=None):
+        self.src = src
+        self.dest = dest
+        self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
+        if command is None or not len(command):
+            raise InvalidArgument('File transfer command must be non-empty string.')
+        self.command = command
+        self.subprocess = None
+
+    def processFile(self, src):
+        self.start(src)
+
+    def getFullCommand(self):
+        return '%s %s %s' % (self.command, self.src, self.dest)
+
+    def setSrc(self, src):
+        self.src = src
+
+    def setDest(self, dest):
+        self.dest = dest
+
+    def start(self, src=None):
+        if src is not None:
+            self.src = src
+        if not self.src or not self.dest:
+            raise InvalidRequest('Both source and destination must be non-empty strings.')
+        self.subprocess = DmSubprocess.getSubprocess(self.getFullCommand())
+        return self.subprocess.run()
+
+    def wait(self):
+        if self.subprocess:
+            return self.subprocess.wait()
+        return None
+
+    def poll(self):
+        if self.subprocess:
+            return self.subprocess.poll()
+        return None
+
+    def getStdOut(self):
+        if self.subprocess:
+            return self.subprocess.getStdOut()
+        return None
+
+
+    def getStdErr(self):
+        if self.subprocess:
+            return self.subprocess.getStdErr()
+        return None
+
+    def getExitStatus(self):
+        if self.subprocess:
+            return self.subprocess.getExitStatus()
+        return None
+
+    def reset(self):
+        self.subprocess = None
+
+#######################################################################
+# Testing.
+if __name__ == '__main__':
+    ft = FileTransfer('rsync -arv', '/tmp/xyz', '/tmp/xyz2')
+    ft.start()
+    print 'StdOut: ', ft.getStdOut()
+    print 'StdErr: ', ft.getStdErr()
+    print 'Exit Status: ', ft.getExitStatus()
diff --git a/src/python/dm/common/plugins/rsyncFileTransferPlugin.py b/src/python/dm/common/plugins/rsyncFileTransferPlugin.py
new file mode 100755
index 0000000000000000000000000000000000000000..16b10a76549c8cc4aff946daa0675af01a02ab00
--- /dev/null
+++ b/src/python/dm/common/plugins/rsyncFileTransferPlugin.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+
+from fileTransferPlugin import FileTransferPlugin
+class RsyncFileTransferPlugin(FileTransferPlugin):
+
+    COMMAND = 'rsync -arvlP'
+
+    def __init__(self, src=None, dest=None):
+        FileTransferPlugin.__init__(self, self.COMMAND, src, dest)
+
+#######################################################################
+# Testing.
+if __name__ == '__main__':
+    ft = RsyncFileTransferPlugin('/tmp/xyz', '/tmp/xyz2')
+    ft.start()
+    print 'StdOut: ', ft.getStdOut()
+    print 'StdErr: ', ft.getStdErr()
+    print 'Exit Status: ', ft.getExitStatus()