diff --git a/MPW/Sync/FTP.rb b/MPW/Sync/FTP.rb
new file mode 100644
index 0000000..6a6b236
--- /dev/null
+++ b/MPW/Sync/FTP.rb
@@ -0,0 +1,115 @@
+#!/usr/bin/ruby
+# author: nishiki
+# mail: nishiki@yaegashi.fr
+# info: a simple script who manage your passwords
+
+module MPW
+
+	module Sync
+
+		require 'rubygems'
+		require 'i18n'
+		require 'net/ftp'
+		
+		class FTP
+		
+			attr_accessor :error_msg
+			attr_accessor :enable
+		
+			# Constructor
+			def initialize
+				@error_msg = nil
+				@enable    = false
+			end
+		
+			# Connect to server
+			# @args: host -> the server host
+			#        port -> ther connection port
+			#        gpg_key -> the gpg key
+			#        password -> the remote password
+			#        suffix -> the suffix file
+			# @rtrn: false if the connection fail
+			def connect(host, user, password, path, port=nil)
+				@host     = host
+				@user     = user
+				@password = password
+				@path     = path
+				@port     = port.instance_of?(Integer) ? 21 : port
+					
+				Net::FTP.open(@host) do |ftp|
+					ftp.login(@user, @password)
+					@enable = true
+				end
+			rescue Exception => e
+				@error_msg = "#{I18n.t('error.sync.connection')}\n#{e}"
+				@enable    = false
+			else
+				return @enable
+			end
+		
+			# Get data on server
+			# @args: gpg_password -> the gpg password
+			# @rtrn: nil if nothing data or error
+			def get(gpg_password)
+				if !@enable
+					return nil
+				end
+				
+				tmp_file = tmpfile
+				Net::FTP.open(@host) do |ftp|
+					ftp.login(@user, @password)
+					ftp.gettextfile(@path, tmp_file)
+				end
+			
+				mpw = MPW.new(tmp_file)
+				if !mpw.decrypt(gpg_password)
+					@error_msg = mpw.error_msg
+					return nil
+				end
+		
+				File.unlink(tmp_file)
+				return mpw.search
+			rescue Exception => e
+				@error_msg = "#{I18n.t('error.sync.download')}\n#{e}"
+				return nil
+			end
+		
+			# Update the remote data
+			# @args: data -> the data to send on server
+			# @rtrn: false if there is a problem
+			def update(data)
+				if !@enable
+					return true
+				end
+		
+				tmp_file = tmpfile
+				File.open(tmp_file, "w") do |file|
+					file << data
+				end
+
+				Net::FTP.open(@host) do |ftp|
+					ftp.login(@user, @password)
+					ftp.puttextfile(tmp_file, @path)
+				end
+
+				File.unlink(tmp_file)
+				return true
+			rescue Exception => e
+				@error_msg = "#{I18n.t('error.sync.upload')}\n#{e}"
+				return false
+			end
+
+			# Generate a random string
+			# @rtrn: a random string
+			def tmpfile
+				result = ''
+				result << ([*('A'..'Z'),*('a'..'z'),*('0'..'9')]).sample(6).join
+		
+				return "/tmp/mpw-#{result}"
+			end
+	
+		end
+
+	end
+
+end
diff --git a/MPW/UI/Cli.rb b/MPW/UI/Cli.rb
index ead9701..75adfa0 100644
--- a/MPW/UI/Cli.rb
+++ b/MPW/UI/Cli.rb
@@ -11,8 +11,9 @@ require 'i18n'
 require 'yaml'
 
 require "#{APP_ROOT}/MPW/MPW"
-require "#{APP_ROOT}/MPW/Sync/MPW"
+require "#{APP_ROOT}/MPW/Sync/MPWSync"
 require "#{APP_ROOT}/MPW/Sync/SSH"
+require "#{APP_ROOT}/MPW/Sync/FTP"
 
 class Cli
 
@@ -32,6 +33,8 @@ class Cli
 				@sync = MPW::Sync::MPWSync.new
 			when 'sftp', 'scp', 'ssh'
 				@sync = MPW::Sync::SSH.new
+			when 'ftp'
+				@sync = MPW::Sync::FTP.new
 			else
 				return false
 			end