diff --git a/Makefile b/Makefile
index b0df487..517a783 100644
--- a/Makefile
+++ b/Makefile
@@ -72,6 +72,7 @@ flac-objs		:= flac.lo
 mad-objs		:= mad.lo nomad.lo
 mikmod-objs		:= mikmod.lo
 modplug-objs		:= modplug.lo
+bass-objs		:= bass.lo
 mpc-objs		:= mpc.lo
 vorbis-objs		:= vorbis.lo
 wavpack-objs		:= wavpack.lo
@@ -86,6 +87,7 @@ ip-$(CONFIG_FLAC)	+= flac.so
 ip-$(CONFIG_MAD)	+= mad.so
 ip-$(CONFIG_MIKMOD)	+= mikmod.so
 ip-$(CONFIG_MODPLUG)	+= modplug.so
+ip-$(CONFIG_BASS)	+= bass.so
 ip-$(CONFIG_MPC)	+= mpc.so
 ip-$(CONFIG_VORBIS)	+= vorbis.so
 ip-$(CONFIG_WAVPACK)	+= wavpack.so
@@ -100,6 +102,7 @@ $(flac-objs):		CFLAGS += $(FLAC_CFLAGS)
 $(mad-objs):		CFLAGS += $(MAD_CFLAGS)
 $(mikmod-objs):		CFLAGS += $(MIKMOD_CFLAGS)
 $(modplug-objs):	CFLAGS += $(MODPLUG_CFLAGS)
+$(bass-objs):		CFLAGS += $(BASS_CFLAGS)
 $(mpc-objs):		CFLAGS += $(MPC_CFLAGS)
 $(vorbis-objs):		CFLAGS += $(VORBIS_CFLAGS)
 $(wavpack-objs):	CFLAGS += $(WAVPACK_CFLAGS)
@@ -123,6 +126,9 @@ mikmod.so: $(mikmod-objs) $(libcmus-y)
 modplug.so: $(modplug-objs) $(libcmus-y)
 	$(call cmd,ld_dl,$(MODPLUG_LIBS))
 
+bass.so: $(bass-objs) $(libcmus-y)
+	$(call cmd,ld_dl,$(BASS_LIBS))
+
 mpc.so: $(mpc-objs) $(libcmus-y)
 	$(call cmd,ld_dl,$(MPC_LIBS))
 
diff --git a/bass.c b/bass.c
new file mode 100644
index 0000000..84f6c31
--- /dev/null
+++ b/bass.c
@@ -0,0 +1,143 @@
+#include "ip.h"
+#include "xmalloc.h"
+#include "comment.h"
+#include "debug.h"
+
+#include <bass.h>
+
+struct bass_private {
+	HMUSIC file;
+};
+
+static int bass_open(struct input_plugin_data *ip_data)
+{
+	HMUSIC file;
+	struct bass_private *priv;
+
+	if (HIWORD(BASS_GetVersion()) != BASSVERSION) {
+		d_print("An incorrect version of BASS was loaded\n");
+		return -IP_ERROR_INTERNAL;
+	}
+
+	BASS_SetConfig(BASS_CONFIG_UPDATEPERIOD,0);
+
+	if (!BASS_Init(-1, 44100, 0, 0, NULL)) {
+		d_print("Can't initialize device\n");
+		return -IP_ERROR_INTERNAL;
+	}
+
+	file = BASS_MusicLoad(FALSE, ip_data->filename, 0, 0, BASS_MUSIC_DECODE | BASS_MUSIC_RAMP | BASS_MUSIC_PRESCAN, 0);
+	if (file == 0) {
+		d_print("Can't play the file");
+		return -IP_ERROR_INTERNAL;
+	}
+
+	priv = xnew(struct bass_private, 1);
+	priv->file = file;
+
+	ip_data->private = priv;
+	ip_data->sf = sf_bits(16) | sf_rate(44100) | sf_channels(2) | sf_signed(1);
+#ifdef WORDS_BIGENDIAN
+	ip_data->sf |= sf_bigendian(1);
+#endif
+	channel_map_init_stereo(ip_data->channel_map);
+
+	return 0;
+}
+
+static int bass_close(struct input_plugin_data *ip_data)
+{
+	BASS_Free();
+	free(ip_data->private);
+	ip_data->private = NULL;
+
+	return 0;
+}
+
+static int bass_read(struct input_plugin_data *ip_data, char *buffer, int count)
+{
+	struct bass_private *priv = ip_data->private;
+	int rc;
+
+	rc = BASS_ChannelGetData(priv->file, buffer, count);
+	if (rc == -1) {
+		if (BASS_ErrorGetCode() != BASS_ERROR_ENDED) {
+			return -IP_ERROR_INTERNAL;
+		} else {
+			rc = 0;
+		}
+	}
+
+	return rc;
+}
+
+static int bass_seek(struct input_plugin_data *ip_data, double offset)
+{
+	struct bass_private *priv = ip_data->private;
+
+	BASS_ChannelSetPosition(priv->file, BASS_ChannelSeconds2Bytes(priv->file, offset), BASS_POS_BYTE);
+
+	return 0;
+}
+
+static int bass_read_comments(struct input_plugin_data *ip_data, struct keyval **comments)
+{
+	struct bass_private *priv = ip_data->private;
+	GROWING_KEYVALS(c);
+	const char *val;
+
+	val = BASS_ChannelGetTags(priv->file, BASS_TAG_MUSIC_NAME);
+	if (val && val[0])
+		comments_add_const(&c, "title", val);
+
+	val = BASS_ChannelGetTags(priv->file, BASS_TAG_MUSIC_MESSAGE);
+	if (val && val[0])
+		comments_add_const(&c, "comment", val);
+
+	keyvals_terminate(&c);
+	*comments = c.keyvals;
+
+	return 0;
+}
+
+static int bass_duration(struct input_plugin_data *ip_data)
+{
+	struct bass_private *priv = ip_data->private;
+
+	return BASS_ChannelBytes2Seconds(priv->file, BASS_ChannelGetLength(priv->file, BASS_POS_BYTE));
+}
+
+static long bass_bitrate(struct input_plugin_data *ip_data)
+{
+	return -IP_ERROR_FUNCTION_NOT_SUPPORTED;
+}
+
+static char *bass_codec(struct input_plugin_data *ip_data)
+{
+	return NULL;
+}
+
+static char *bass_codec_profile(struct input_plugin_data *ip_data)
+{
+	return NULL;
+}
+
+const struct input_plugin_ops ip_ops = {
+	.open = bass_open,
+	.close = bass_close,
+	.read = bass_read,
+	.seek = bass_seek,
+	.read_comments = bass_read_comments,
+	.duration = bass_duration,
+	.bitrate = bass_bitrate,
+	.bitrate_current = bass_bitrate,
+	.codec = bass_codec,
+	.codec_profile = bass_codec_profile
+};
+
+const int ip_priority = 55;
+const char * const ip_extensions[] = {
+	"mo3", "it", "xm", "s3m", "mtm", "mod", "umx", NULL
+};
+const char * const ip_mime_types[] = { NULL };
+const char * const ip_options[] = { NULL };
diff --git a/configure b/configure
index 83e9ce4..39dde5b 100755
--- a/configure
+++ b/configure
@@ -357,6 +357,13 @@ check_ffmpeg()
 	return 0
 }
 
+check_bass()
+{
+	check_header bass.h &&
+	check_library BASS "" "-lbass"
+	return $?
+}
+
 check_string_function()
 {
 	msg_checking "for function $1"
@@ -407,6 +414,7 @@ Optional Features: y/n
   CONFIG_MAD      	MPEG Audio Decoder (.mp3, .mp2, streams)        [auto]
   CONFIG_MODPLUG  	libmodplug (.mod, .x3m, ...)                    [auto]
   CONFIG_MIKMOD   	libmikmod (.mod, .x3m, ...)                     [n]
+  CONFIG_BASS     	libbass (.mod, .x3m, ...)                       [auto]
   CONFIG_MPC      	libmpcdec (Musepack .mpc, .mpp, .mp+)           [auto]
   CONFIG_VORBIS   	Ogg/Vorbis (.ogg, application/ogg, audio/x-ogg) [auto]
   CONFIG_TREMOR   	Use Tremor as Ogg/Vorbis input plugin           [n]
@@ -468,6 +476,7 @@ check check_flac    CONFIG_FLAC
 check check_mad     CONFIG_MAD
 check check_mikmod  CONFIG_MIKMOD
 check check_modplug CONFIG_MODPLUG
+check check_bass    CONFIG_BASS
 check check_mpc     CONFIG_MPC
 check check_vorbis  CONFIG_VORBIS
 check check_wavpack CONFIG_WAVPACK
@@ -517,7 +526,7 @@ config_header config/xmalloc.h HAVE_STRDUP HAVE_STRNDUP
 config_header config/cue.h CONFIG_CUE
 
 makefile_vars bindir datadir libdir mandir exampledir
-makefile_vars CONFIG_CDIO CONFIG_FLAC CONFIG_MAD CONFIG_MIKMOD CONFIG_MODPLUG CONFIG_MPC CONFIG_VORBIS CONFIG_WAVPACK CONFIG_WAV CONFIG_MP4 CONFIG_AAC CONFIG_FFMPEG CONFIG_CUE
+makefile_vars CONFIG_CDIO CONFIG_FLAC CONFIG_MAD CONFIG_MIKMOD CONFIG_MODPLUG CONFIG_BASS CONFIG_MPC CONFIG_VORBIS CONFIG_WAVPACK CONFIG_WAV CONFIG_MP4 CONFIG_AAC CONFIG_FFMPEG CONFIG_CUE
 makefile_vars CONFIG_ROAR CONFIG_PULSE CONFIG_ALSA CONFIG_AO CONFIG_ARTS CONFIG_OSS CONFIG_SUN CONFIG_WAVEOUT
 
 generate_config_mk
