diff --git a/package/contrib/smstools3/Makefile b/package/contrib/smstools3/Makefile
new file mode 100644
index 0000000..efbaa55
--- /dev/null
+++ b/package/contrib/smstools3/Makefile
@@ -0,0 +1,73 @@
+#
+# Copyright (C) 2014 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=smstools3
+PKG_VERSION:=3.1.15
+PKG_RELEASE:=3
+
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=LICENSE
+
+PKG_BUILD_PARALLEL:=0
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=http://smstools3.kekekasvi.com/packages/
+PKG_MD5SUM:=0241ef60e646fac1a06254a848e61ed7
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
+PKG_BUILD_DEPENDS:=libiconv-full iconv socket nsl
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/smstools3
+  SECTION:=utils
+  CATEGORY:=Utilities
+  TITLE:=SMS Server Tools 3
+  DEPENDS:=+libiconv-full +iconv
+  URL:=http://smstools3.kekekasvi.com/
+endef
+
+define Package/smstools3/description
+ The SMS Server Tools 3 is a SMS Gateway software which can send and receive
+ short messages through GSM modems and mobile phones.
+endef
+
+TARGET_CFLAGS = -D NUMBER_OF_MODEMS=1
+TARGET_CFLAGS += -D USE_ICONV
+TARGET_CFLAGS += -D DISABLE_INET_SOCKET
+TARGET_CFLAGS += -W -Wall
+TARGET_CFLAGS += -D_FILE_OFFSET_BITS=64
+
+TARGET_LDFLAGS += -liconv
+
+BINDIR=/usr/local/bin
+
+define Build/Compile
+	$(MAKE) -C "$(PKG_BUILD_DIR)"/src \
+		CC="$(TARGET_CC)" \
+		USER_CFLAGS='$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS) \
+		-I"$(STAGING_DIR)/usr/lib/libiconv-full/include"' \
+		USER_LDFLAGS='$(TARGET_LFLAGS) $(EXTRA_LDFLAGS) -L"$(STAGING_DIR)/usr/lib/libiconv-full/lib"' \
+		all
+endef
+
+define Package/smstools3/install
+	$(INSTALL_DIR) $(1)/$(BINDIR)
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/smsd $(1)/$(BINDIR)/smsd
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/sendsms $(1)/$(BINDIR)/sendsms
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/sms2html $(1)/$(BINDIR)/sms2html
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/sms2unicode $(1)/$(BINDIR)/sms2unicode
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/unicode2sms $(1)/$(BINDIR)/unicode2sms
+	$(INSTALL_DIR) $(1)/etc/init.d
+	$(INSTALL_DATA) -m 0755 ./files/smstools3.init $(1)/etc/init.d/smstools3
+	$(INSTALL_DIR) $(1)/etc
+	$(INSTALL_DATA) -m 0755 ./files/smstools3.conf $(1)/etc/smsd.conf
+endef
+
+$(eval $(call BuildPackage,smstools3))
diff --git a/package/contrib/smstools3/files/smstools3.conf b/package/contrib/smstools3/files/smstools3.conf
new file mode 100644
index 0000000..c8732e3
--- /dev/null
+++ b/package/contrib/smstools3/files/smstools3.conf
@@ -0,0 +1,20 @@
+#
+# Description: Main configuration file for the smsd
+#
+
+devices = GSM1
+incoming = /var/spool/sms/incoming
+outgoing = /var/spool/sms/outgoing
+checked = /var/spool/sms/checked
+failed = /var/spool/sms/failed
+sent = /var/spool/sms/sent
+receive_before_send = no
+autosplit = 3
+
+[GSM1]
+init = AT+CPMS="ME","ME","ME"
+device = /dev/ttyUSB0
+incoming = yes
+pin = 0000
+baudrate = 9600
+
diff --git a/package/contrib/smstools3/files/smstools3.init b/package/contrib/smstools3/files/smstools3.init
new file mode 100644
index 0000000..1638c60
--- /dev/null
+++ b/package/contrib/smstools3/files/smstools3.init
@@ -0,0 +1,152 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2014 OpenWrt.org
+# smsd initscript openwrt mod
+
+START=99
+STOP=99
+
+EXTRA_COMMANDS="status"
+EXTRA_HELP="        status  View pid and service status "
+
+# Set USER and GROUP, if necessary:
+USER=""
+GROUP=""
+
+# If an unpriviledged user is selected, make sure that next two
+# files are writable by that user:
+PIDFILE="/var/run/smsd.pid"
+INFOFILE="/var/run/smsd.working"
+# Logfile can also be defined in here:
+LOGFILE="/var/log/smsd.log"
+
+DAEMON=/usr/local/bin/smsd
+# A program which turns power off for couple of seconds:
+RESETMODEMS=/usr/local/bin/smsd_resetmodems
+NAME=smsd
+PSOPT=""
+
+# Set/edit this before starting service !!!!!
+WRT_SPOOL=/var/spool
+
+# Maximum time to stop smsd, after that it gets killed hardly:
+MAXWAIT=45
+
+boot() {
+	start
+}
+
+start() {
+	test -x $DAEMON || exit 0
+
+	echo "Creating minimum spool directories"
+	mkdir -p $WRT_SPOOL
+	mkdir -p $WRT_SPOOL/sms
+	mkdir -p $WRT_SPOOL/sms/incoming
+	mkdir -p $WRT_SPOOL/sms/outgoing
+	mkdir -p $WRT_SPOOL/sms/checked
+	mkdir -p $WRT_SPOOL/sms/failed
+	mkdir -p $WRT_SPOOL/sms/sent
+
+	echo -n "Starting SMS Daemon: "
+	MSG="."
+	ARGS="-n MAINPROCESS -p$PIDFILE -i$INFOFILE"
+	[ "x$USER" != x ] && ARGS="$ARGS -u$USER"
+	[ "x$GROUP" != x ] && ARGS="$ARGS -g$GROUP"
+	[ "x$LOGFILE" != x ] && ARGS="$ARGS -l$LOGFILE"
+	PID=`cat $PIDFILE 2>/dev/null`
+	if [ "x$PID" != x ]; then
+	  if kill -0 $PID 2>/dev/null; then
+	    MSG=" already running ($PID)."
+	  else
+	    PID=""
+	  fi
+	fi
+	if [ "x$PID" = x ]; then
+	  if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
+	    MSG=" already running."
+	  else
+	    $DAEMON $ARGS
+	    sleep 1
+	    PIDS=`ps $PSOPT | grep $NAME | grep -v grep`
+	    [ "x$PIDS" = x ] && MSG=" failed."
+	  fi
+	fi
+	echo "$NAME$MSG"
+}
+
+stop() {
+	if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
+	  PID=`cat $PIDFILE 2>/dev/null`
+	  if [ "x$PID" != x ]; then
+	    P=`kill -0 $PID 2>/dev/null`
+	    [ "x$P" != x ] && PID=""
+	  fi
+	  if [ "x$PID" != x ]; then
+	    kill $PID
+	  else
+	    kill `ps $PSOPT | grep $NAME | grep -v grep | awk '{print $1}'` >/dev/null 2>&1
+	  fi
+	  sleep 1
+	  if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
+	    echo "Allowing $NAME to terminate gracefully within $MAXWAIT seconds"
+	    infofound=0
+	    dots=0
+	    seconds=0
+	    while ps $PSOPT | grep $NAME | grep -v grep >/dev/null; do
+	      if [ $infofound -lt 1 ]; then
+	        if [ -f $INFOFILE ]; then
+	          infofound=1
+	          if [ $dots -gt 0 ]; then
+	            echo ""
+	            dots=0
+	          fi
+	          $ECHO -n "$NAME is currently "
+	          cat $INFOFILE
+	          echo "Time counting is now disabled and we will wait until this job is complete."
+	        fi
+	      fi
+	      [ $infofound -lt 1 ] && seconds=`expr $seconds + 1`
+	      echo -n "."
+	      dots=`expr $dots + 1`
+	      if [ "$seconds" -ge $MAXWAIT ]; then
+	        if [ $dots -gt 0 ]; then
+	          echo ""
+	          dots=0
+	        fi
+	        echo "Timeout occured, killing $NAME hardly."
+	        kill -9 `ps $PSOPT | grep $NAME | grep -v grep | awk '{print $1}'` >/dev/null 2>&1
+	        [ -f $PIDFILE ] && rm $PIDFILE
+	        seconds=0
+	      fi
+	      sleep 1
+	    done
+	    [ $dots -gt 0 ] && echo ""
+	    #echo "$NAME is stopped."
+	  fi
+	fi
+}
+
+restart() {
+	stop
+	start
+}
+
+
+status() {
+	PID=$(cat $PIDFILE)
+
+	test -e $PIDFILE
+	if [ $? == 0 ]; then
+		echo $NAME " running! pid $PID"
+	else
+		echo $NAME " not running !!!"
+	fi
+}
+
+reset() {
+	$0 stop
+	[ -f "$RESETMODEMS" ] && "$RESETMODEMS"
+	sleep 30
+	$0 start
+}
+
diff --git a/package/contrib/smstools3/patches/001-smsd.patch b/package/contrib/smstools3/patches/001-smsd.patch
new file mode 100644
index 0000000..6761661
--- /dev/null
+++ b/package/contrib/smstools3/patches/001-smsd.patch
@@ -0,0 +1,13 @@
+--- a/src/smsd.c	2010-09-21 13:47:48.000000000 +0300
++++ b/src/smsd.c	2013-03-05 05:26:26.000000000 +0300
+@@ -5200,8 +5200,8 @@
+ 	int result = 1;
+ 	char *cmd;
+ 	char *p;
+-	char answer[500];
+-	char buffer[600];
++	char answer[1024];
++	char buffer[1024];
+ 	int fd;
+ 	int log_retry = 3;
+ 	int i;
diff --git a/package/contrib/smstools3/patches/002-Makefile.patch b/package/contrib/smstools3/patches/002-Makefile.patch
new file mode 100644
index 0000000..a8445ef
--- /dev/null
+++ b/package/contrib/smstools3/patches/002-Makefile.patch
@@ -0,0 +1,12 @@
+--- a/src/Makefile	2014-12-20 18:33:55.654252867 +0100
++++ b/src/Makefile	2014-12-20 18:31:10.241359741 +0100
+@@ -43,7 +43,7 @@
+ 
+ ifneq (,$(findstring SOLARIS,$(CFLAGS)))
+ ifeq (,$(findstring DISABLE_INET_SOCKET,$(CFLAGS)))
+-override LFLAGS += -lsocket -lnsl
++	override LFLAGS += -lsocket -lnsl
+ endif
+ endif
+ 
+
