diff --git a/Gulpfile.js b/Gulpfile.js
new file mode 100644
index 0000000..e4da418
--- /dev/null
+++ b/Gulpfile.js
@@ -0,0 +1,61 @@
+var gulp = require('gulp');
+var clean = require('gulp-clean');
+var copy = require('gulp-copy');
+var zip = require('gulp-zip');
+var composer = require('gulp-composer');
+var phpunit = require('gulp-phpunit');
+var exec = require('child_process').exec;
+var phpcs = require('gulp-phpcs');
+var config = require('./package.json');
+
+// Clean the target directory.
+gulp.task('clean', function () {
+	console.log('Cleaning up target directory  ...');
+	return gulp.src('dist', {read: false})
+		.pipe(clean());
+});
+
+// Prepare composer.
+gulp.task('compose', function () {
+	console.log('Preparing Composer ...');
+	return composer('install');
+});
+
+// Execute unit tests.
+gulp.task('test', ['compose'], function () {
+	console.log('Running PHPUnit tests ...');
+	return gulp.src('phpunit.xml')
+		.pipe(phpunit('./vendor/bin/phpunit', {debug: false}));
+});
+
+// Execute PHP Code Sniffer.
+gulp.task('test-cs', function (cb) {
+	return exec('./vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs', function (err, stdout, stderr) {
+		console.log(stdout);
+		console.log(stderr);
+		if (null === err) {
+			console.log('Running PHP Code Sniffer tests ...');
+			gulp.src(['statify-blacklist.php', 'inc/**/*.php'])
+				.pipe(phpcs({bin: './vendor/bin/phpcs', standard: 'phpcs.xml'}))
+				.pipe(phpcs.reporter('log'));
+		}
+		cb(err);
+	});
+});
+
+// Bundle files as required for plugin distribution..
+gulp.task('bundle', ['clean'], function () {
+	console.log('Collecting files for package dist/' + config.name + config.version + ' ...');
+	return gulp.src(['**/*.php', '!test/**', '!vendor/**', 'README.md', 'LICENSE.md'], {base: './'})
+		.pipe(copy('./dist/' + config.name + '.' + config.version + '/' + config.name));
+});
+
+// Create a ZIP package of the relevant files for plugin distribution.
+gulp.task('package', ['bundle'], function () {
+	console.log('Building package dist/' + config.name + config.version + '.zip ...');
+	return gulp.src('./dist/' + config.name + '.' + config.version + '/**')
+		.pipe(zip(config.name + '.' + config.version + '.zip'))
+		.pipe(gulp.dest('./dist'));
+});
+
+gulp.task('default', ['clean', 'compose', 'test', 'test-cs', 'bundle', 'package']);
\ No newline at end of file
diff --git a/includes/admin/dashboard.php b/includes/admin/dashboard.php
deleted file mode 100644
index d968c0e..0000000
--- a/includes/admin/dashboard.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * @package Dashboard
- */
-
-// Exit if accessed directly
-if ( !defined( 'ABSPATH' ) ) exit;
-
-/**
- * Add to Right Now Widget
- *
- * @return void
- */
-function wplt_dashboard_right_now() {
-	$total_files = wp_count_posts( 'wplt_tick' );
-	
-	echo '<tr>';
-	echo '<td class="first b b-tags"><a href="edit.php?post_type=wplt_tick">' . $total_files->publish . '</a></td>';
-	echo '<td class="t tags"><a href="edit.php?post_type=wplt_tick">' . __( 'Ticks', 'wplt2' ) . '</a></td>';
-	echo '</tr>';
-}
-add_action( 'right_now_content_table_end' , 'wplt_dashboard_right_now' );
-
-/**
- * Register dashboard widgets
- *
- * @return void
- */
-function wplt_register_dashboard_widgets() {
-	wp_add_dashboard_widget( 'wplt_dashboard_downloads', __( 'Download Stats', 'wplt2' ), 'wplt_dashboard_downloads_widget' );
-}
-//add_action( 'wp_dashboard_setup', 'wplt_register_dashboard_widgets' );
-
-/**
- * Ticks Dashboard Widget
- *
- * @access      private
- * @since       1.0 
- * @return      void
-*/
-function wplt_dashboard_ticks_widget() {
-	echo 'Content to follow...';
-}
\ No newline at end of file
diff --git a/includes/class-wpliveticker2-admin.php b/includes/class-wpliveticker2-admin.php
new file mode 100644
index 0000000..2eb414c
--- /dev/null
+++ b/includes/class-wpliveticker2-admin.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * WP Liveticker 2: Plugin admin class.
+ *
+ * This file contains the derived class for the plugin's administration features.
+ *
+ * @package WPLiveticker2
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * WP Liveticker 2 admin configuration.
+ *
+ * @since   1.0.0
+ */
+class WPLiveticker2_Admin extends WPLiveticker2 {
+	/**
+	 * Add to Right Now Widget
+	 *
+	 * @return void
+	 */
+	function dashboard_right_now() {
+		$total_files = wp_count_posts( 'wplt2_tick' );
+
+		echo '<tr>';
+		echo '<td class="first b b-tags"><a href="edit.php?post_type=wplt_tick">' . $total_files->publish . '</a></td>';
+		echo '<td class="t tags"><a href="edit.php?post_type=wplt_tick">' . __( 'Ticks', 'wplt2' ) . '</a></td>';
+		echo '</tr>';
+	}
+}
diff --git a/includes/class-wpliveticker2-system.php b/includes/class-wpliveticker2-system.php
new file mode 100644
index 0000000..7e429ec
--- /dev/null
+++ b/includes/class-wpliveticker2-system.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * WP Liveticker 2: Plugin system class.
+ *
+ * This file contains the derived class for the plugin's system operations.
+ *
+ * @package WPLiveticker2
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * WP Liveticker 2 system configuration.
+ *
+ */
+class WPLiveticker2_System extends WPLiveticker2 {
+
+	/**
+	 * Activation hook.
+	 *
+	 * Initializes default options.
+	 *
+	 * @return void
+	 */
+	public static function activate() {
+		// Load current options.
+		self::update_options();
+
+		// Add default settings to database.
+		$defaults = self::default_options();
+
+		if ( self::$_options['reset_settings'] ) {
+			// Reset requested, overwrite existing options with default.
+			update_option( self::OPTION, $defaults );
+		} else {
+			// Otherwise add new options.
+			add_option( self::OPTION, $defaults );
+		}
+	}
+}
diff --git a/includes/class-wpliveticker2.php b/includes/class-wpliveticker2.php
new file mode 100644
index 0000000..6d7abce
--- /dev/null
+++ b/includes/class-wpliveticker2.php
@@ -0,0 +1,211 @@
+<?php
+/**
+ * WP Liveticker 2: Plugin main class.
+ *
+ * This file contains the plugin's base class.
+ *
+ * @package WPLiveticker2
+ */
+
+// Exit if accessed directly.
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * WP Liveticker 2.
+ */
+class WPLiveticker2 {
+	/**
+	 * Options tag.
+	 *
+	 * @var string OPTIONS
+	 */
+	const OPTION = 'wplt2';
+
+	/**
+	 * Plugin options.
+	 *
+	 * @var array $_options
+	 */
+	protected static $_options;
+
+	/**
+	 * Plugin options.
+	 *
+	 * @var boolean $shortcode_present
+	 */
+	protected static $shortcode_present = false;
+
+	/**
+	 * Plugin initialization.
+	 *
+	 * @return void
+	 */
+	public static function init() {
+		// Skip on autosave or AJAX.
+		if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
+			return;
+		}
+
+		// Load plugin options.
+		self::update_options();
+
+		// Load Textdomain.
+		load_plugin_textdomain( 'wplt2', false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );
+
+		// Allow shortcodes in widgets.
+		add_filter( 'widget_text', 'do_shortcode' );
+
+		// Add shortcode.
+		add_shortcode( 'liveticker', array( 'WPLiveticker2', 'shortcode_ticker_show' ) );
+
+		// Admin only actions.
+		if ( is_admin() ) {
+			// Add dashboard "right now" functionality.
+			add_action( 'right_now_content_table_end', array( 'WPLiveticker2_Admin', 'dashboard_right_now' ) );
+		}
+	}
+
+	/**
+	 * Register tick post type.
+	 *
+	 * @return void
+	 */
+	public static function register_types() {
+		// Add new taxonomy, make it hierarchical (like categories).
+		$labels = array(
+			'name'              => _x( 'Ticker', 'taxonomy general name' ),
+			'singular_name'     => _x( 'Ticker', 'taxonomy singular name' ),
+			'search_items'      => __( 'Search Tickers', 'wplt2' ),
+			'all_items'         => __( 'All Tickers', 'wplt2' ),
+			'parent_item'       => __( 'Parent Ticker', 'wplt2' ),
+			'parent_item_colon' => __( 'Parent Ticker:', 'wplt2' ),
+			'edit_item'         => __( 'Edit Ticker', 'wplt2' ),
+			'update_item'       => __( 'Update Ticker', 'wplt2' ),
+			'add_new_item'      => __( 'Add New Ticker', 'wplt2' ),
+			'new_item_name'     => __( 'New Ticker', 'wplt2' ),
+			'menu_name'         => __( 'Ticker', 'wplt2' ),
+		);
+
+		register_taxonomy(
+			'wplt2_ticker',
+			array( 'wplt2_tick' ),
+			array(
+				'hierarchical'      => true,
+				'labels'            => $labels,
+				'show_ui'           => true,
+				'show_admin_column' => true,
+				'query_var'         => true,
+			)
+		);
+
+		// Post type arguments.
+		$args = array(
+			'labels'          => array(
+				'name'               => __( 'Ticks', 'wplt2' ),
+				'singular_name'      => __( 'Tick', 'wplt2' ),
+				'add_new'            => __( 'Add New', 'wplt2' ),
+				'add_new_item'       => __( 'Add New Tick', 'wplt2' ),
+				'edit_item'          => __( 'Edit Tick', 'wplt2' ),
+				'new_item'           => __( 'New Tick', 'wplt2' ),
+				'all_items'          => __( 'All Ticks', 'wplt2' ),
+				'view_item'          => __( 'View Tick', 'wplt2' ),
+				'search_items'       => __( 'Search Ticks', 'wplt2' ),
+				'not_found'          => __( 'No Ticks found', 'wplt2' ),
+				'not_found_in_trash' => __( 'No Ticks found in Trash', 'wplt2' ),
+				'parent_item_colon'  => '',
+				'menu_name'          => __( 'Liveticker', 'wplt2' ),
+			),
+			'public'          => false,
+			'show_ui'         => true,
+			'show_in_menu'    => true,
+			'menu_icon'       => 'dashicons-rss',
+			'capability_type' => 'post',
+			'supports'        => array( 'title', 'editor', 'author' ),
+			'taxonomies'      => array( 'wplt2_ticker' ),
+		);
+
+		register_post_type( 'wplt2_tick', $args );
+	}
+
+	/**
+	 * Output Liveticker
+	 *
+	 * @param array $atts Shortcode attributes.
+	 *
+	 * @return string
+	 */
+	public static function shortcode_ticker_show( $atts ) {
+		// Indicate presence of shortcode (to enqueue styles/scripts later).
+		self::$shortcode_present = true;
+
+		// Initialize output.
+		$output = '';
+
+		// Check if first attribute is filled.
+		if ( $atts['ticker'] ) {
+			// Set limit to infinite, if not set explicitly.
+			if ( ! isset( $atts['limit'] ) ) {
+				$atts['limit'] = - 1;
+			}
+
+			$output = '<ul class="wplt2_ticker">';
+
+			$args = array(
+				'post_type'      => 'wplt2_tick',
+				'posts_per_page' => $atts['limit'],
+				'tax_query'      => array(
+					array(
+						'taxonomy' => 'wplt2_ticker',
+						'field'    => 'slug',
+						'terms'    => $atts['ticker'],
+					)
+				)
+			);
+
+			$wp_query = new WP_Query( $args );
+
+			while ( $wp_query->have_posts() ) {
+				$wp_query->the_post();
+				$output .= '<li class="wplt2_tick">
+						  <p><span class="wplt2_tick_time">' . get_the_time( 'd.m.Y H.i' ) . '</span>
+						  <span class="wplt2_tick_title">' . get_the_title() . '</span></p>
+						  <p class="wplt2_tick_content">' . get_the_content() . '</p></li>';
+			}
+
+			$output .= '</ul>';
+
+			// Show RSS feed link, if configured.
+			if (1 === self::$_options['show_feed']) {
+				$output .= '<a href="/feed/liveticker/' . esc_html( $atts['ticker'] ) . '"><img class="wplt2_rss" src="/wp-content/plugins/wp-liveticker2/images/rss.jpg" alt="RSS" /></a>';
+			}
+		}
+
+		return $output;
+	}
+
+	/**
+	 * Update options.
+	 *
+	 * @param array $options Optional. New options to save.
+	 */
+	protected static function update_options( $options = null ) {
+		self::$_options = wp_parse_args(
+			get_option( self::OPTION ),
+			self::default_options()
+		);
+	}
+
+	/**
+	 * Create default plugin configuration.
+	 *
+	 * @return array The options array.
+	 */
+	protected static function default_options() {
+		return array(
+			'enable_ajax'    => 1,
+			'enable_css'     => 1,
+			'show_feed'      => 0,
+			'reset_settings' => 0,
+		);
+	}
+}
diff --git a/includes/functions.php b/includes/functions.php
deleted file mode 100644
index 0d7a124..0000000
--- a/includes/functions.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-/**
- * @package Functions
- */
-
-// Exit if accessed directly
-if ( !defined( 'ABSPATH' ) ) exit;
-
-/**
- * Returns default options
- *
- * @return array
- */
-function wplt_get_default_options() {
-	return array(
-		'enable_css'		=> 1,
-		'reset_settings'	=> 0,
-		'shortcode_present' => false
-	);
-}
\ No newline at end of file
diff --git a/includes/post-types.php b/includes/post-types.php
deleted file mode 100644
index 9b9bfad..0000000
--- a/includes/post-types.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/**
- * @package Post Types
- */
-
-// Exit if accessed directly
-if ( !defined( 'ABSPATH' ) ) exit;
-
-/**
- * Register tick post type
- *
- * @return void
- */
-function wplt_tick_post_type() {
-  $args = array(
-    'labels' 			=> array( 
-     	'name' 					=> __( 'Ticks', 'wplt2' ),
-	    'singular_name' 		=> __( 'Tick', 'wplt2' ),
-	    'add_new' 				=> __( 'Add New', 'wplt2' ),
-	    'add_new_item' 			=> __( 'Add New Tick', 'wplt2' ),
-	    'edit_item' 			=> __( 'Edit Tick', 'wplt2' ),
-	    'new_item' 				=> __( 'New Tick', 'wplt2' ),
-	    'all_items' 			=> __( 'All Ticks', 'wplt2' ),
-	    'view_item' 			=> __( 'View Tick', 'wplt2' ),
-	    'search_items' 			=> __( 'Search Ticks', 'wplt2' ),
-	    'not_found' 			=> __( 'No Ticks found', 'wplt2' ),
-	    'not_found_in_trash' 	=> __( 'No Ticks found in Trash', 'wplt2' ), 
-	    'parent_item_colon' 	=> '',
-	    'menu_name' 			=> __( 'Liveticker', 'wplt2' )
-	    						),
-    'public' 			=> false,
-    'show_ui' 			=> true, 
-    'show_in_menu' 		=> true, 
-  	'menu_icon'			=> 'dashicons-rss',  
-    'capability_type' 	=> 'post', 
-    'supports' 			=> array( 'title', 'editor', 'author'),
-  	'taxonomies' 		=> array('wplt_ticker')
-  ); 
-
-  register_post_type( 'wplt_tick', $args );
-}
-add_action( 'init', 'wplt_tick_post_type' );
-
-
-/**
- * Register custom taxamony (category)
- * 
- * @return void
- */
-//hook into the init action and call create_book_taxonomies when it fires
-add_action( 'init', 'wplt_ticker_taxonomy', 0 );
-
-//create two taxonomies, genres and writers for the post type "book"
-function wplt_ticker_taxonomy()
-{
-	// Add new taxonomy, make it hierarchical (like categories)
-	$labels = array(
-			'name' => _x( 'Ticker', 'taxonomy general name' ),
-			'singular_name' => _x( 'Ticker', 'taxonomy singular name' ),
-			'search_items' =>  __( 'Search Tickers', 'wplt2' ),
-			'all_items' => __( 'All Tickers', 'wplt2' ),
-			'parent_item' => __( 'Parent Ticker', 'wplt2' ),
-			'parent_item_colon' => __( 'Parent Ticker:', 'wplt2' ),
-			'edit_item' => __( 'Edit Ticker', 'wplt2' ),
-			'update_item' => __( 'Update Ticker', 'wplt2' ),
-			'add_new_item' => __( 'Add New Ticker', 'wplt2' ),
-			'new_item_name' => __( 'New Ticker', 'wplt2' ),
-			'menu_name' => __( 'Ticker', 'wplt2' ),
-	);
-
-	register_taxonomy('wplt_ticker',array('wplt_tick'), array(
-			'hierarchical' => true,
-			'labels' => $labels,
-			'show_ui' => true,
-			'show_admin_column' => true,
-			'query_var' => true,
-	));
-}
\ No newline at end of file
diff --git a/includes/shortcodes.php b/includes/shortcodes.php
deleted file mode 100644
index bbdabbd..0000000
--- a/includes/shortcodes.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * @package Shortcodes
- */
-
-// Exit if accessed directly
-if ( !defined( 'ABSPATH' ) ) exit;
-
-/**
- * Allow shortcodes in widgets
- */
-add_filter( 'widget_text', 'do_shortcode' );
-add_filter( 'wp_ajax_get_new_ticks', array( $this, 'wplt_ajax_get_new_ticks' ) );
-
-
-/**
- * Output Liveticker
- *
- * @param array atts shortcode options
- *
- * @return string
- */
-function wplt_shortcode_ticker_show( $atts ) {
-	global $wplt_options;
-
-	$wplt_options['shortcode_present'] = true;
-
-	/*$wplt_ticker_options = array();
-
-	extract(
-		shortcode_atts( array(
-			'id'	=> $wplt_ticker_options['id'],
-			'count'	=> $wplt_ticker_options['count'],
-			'order'	=> $wplt_ticker_options['order']
-		), $atts )
-	);*/
-
-	if($atts[0])
-	{
-		if(!$atts[1]) $atts[1] = -1;
-	
-		$output = '<ul class="wplt_ticker">';
-	
-		$args = array(	'post_type' => 'wplt_tick',
-				'posts_per_page' => $atts[1],
-				'tax_query' => array(
-						array(	'taxonomy' => 'wplt_ticker',
-								'field' => 'slug',
-								'terms' => $atts[0]
-						)
-				)
-		);
-	
-		$wp_query = new WP_Query($args);
-	
-		while ($wp_query->have_posts()) : $wp_query->the_post();
-		$output .= '<li class="wplt_tick">
-						  <p><span class="wplt_tick_time">'.get_the_time('d.m.Y H.i').'</span>
-						  <span class="wplt_tick_title">'.get_the_title().'</span></p>
-						  <p class="wplt_tick_content">'.get_the_content().'</p></li>';
-		endwhile;
-	
-		$output .= '</ul>';
-		$output .= '<a href="/feed/liveticker/lager-live"><img class="wplt_rss" src="/wp-content/plugins/wp-liveticker2/images/rss.jpg" alt="RSS" /></a>';
-	}
-	
-	return $output;
-}
-
-add_shortcode( 'liveticker', 'wplt_shortcode_ticker_show' );
\ No newline at end of file
diff --git a/includes/widget.php b/includes/widget.php
index eeb17ff..3671a57 100644
--- a/includes/widget.php
+++ b/includes/widget.php
@@ -1,128 +1,192 @@
 <?php
+
 class wplt_widget extends WP_Widget {
-  function wplt_widget() {
-    parent::WP_Widget( false, $name = 'Liveticker' );
-  }
+	function __construct() {
+		parent::__construct( false, $name = 'Liveticker' );
+	}
 
-  function widget( $args, $instance ) {
-    extract( $args );
-    $title = apply_filters( 'wplt_catlit', $instance['title'] );
-    $category = apply_filters( 'wplt_catlit', $instance['category'] );
-    $count = apply_filters( 'wplt_catlit', $instance['count'] );
-    $link = apply_filters( 'wplt_catlit', $instance['link'] );
-    $highlight = apply_filters( 'wplt_catlit', $instance['highlight'] );
-    $highlight_time = apply_filters( 'wplt_catlit', $instance['highlight_time'] );
-    $ajax = apply_filters( 'wplt_catlit', $instance['ajax'] );
-    ?>
+	function widget( $args, $instance ) {
+		extract( $args );
+		$title          = apply_filters( 'wplt_catlit', $instance['title'] );
+		$category       = apply_filters( 'wplt_catlit', $instance['category'] );
+		$count          = apply_filters( 'wplt_catlit', $instance['count'] );
+		$link           = apply_filters( 'wplt_catlit', $instance['link'] );
+		$highlight      = apply_filters( 'wplt_catlit', $instance['highlight'] );
+		$highlight_time = apply_filters( 'wplt_catlit', $instance['highlight_time'] );
+		$ajax           = apply_filters( 'wplt_catlit', $instance['ajax'] );
+		?>
 
-    <?php
-	echo $before_widget;
-    ?>
+		<?php
+		echo $before_widget;
+		?>
 
-    <?php
-      if ($title) {
-	    echo $before_title . $title . $after_title;
-      }
-      
-	?>   
-	<ul class="wplt_widget">
-	<?php
-   	$args = array(	'post_type' => 'wplt_tick',
-    				'tax_query' => array(
-    					array(	'taxonomy' => 'wplt_ticker',
-    							'field' => 'slug',
-    							'terms' => $category,
-    					)
-    				)
-      			);
+		<?php
+		if ( $title ) {
+			echo $before_title . $title . $after_title;
+		}
 
-      	$wp_query = new WP_Query($args);
-      	while ($wp_query->have_posts()) : $wp_query->the_post();
-     ?>
-	     <li><span class="wplt_widget_time"><?php echo get_the_time('d.m.Y - H.i'); ?></span><span class="wplt_widget_content<?php if($highlight=="1" && get_the_time('U') > (time()-$highlight_time)) echo '_new'; ?>"><br /><?php echo the_title(); ?></span></li>
-     <?php
-     	if( $count > 0 && ++$cnt == $count ) break;
-      	endwhile;
-      ?>
-      </ul>
+		?>
+		<ul class="wplt_widget">
+			<?php
+			$args = array(
+				'post_type' => 'wplt_tick',
+				'tax_query' => array(
+					array(
+						'taxonomy' => 'wplt_ticker',
+						'field'    => 'slug',
+						'terms'    => $category,
+					)
+				)
+			);
 
-     <?php
-       if ($link)
-         print '<p class="wplt_widget_link"><a href="'.$link.'">'.__( 'show all', 'wplt2' ).'...</a></p>';
-         
-       echo $after_widget;
-     ?>
-     <?php
-  }
+			$wp_query = new WP_Query( $args );
+			while ( $wp_query->have_posts() ) : $wp_query->the_post();
+				?>
+				<li>
+					<span class="wplt_widget_time"><?php echo get_the_time( 'd.m.Y - H.i' ); ?></span><span class="wplt_widget_content<?php if ( $highlight == "1" && get_the_time( 'U' ) > ( time() - $highlight_time ) ) {
+						echo '_new';
+					} ?>"><br /><?php echo the_title(); ?></span></li>
+				<?php
+				if ( $count > 0 && ++ $cnt == $count ) {
+					break;
+				}
+			endwhile;
+			?>
+		</ul>
 
-  function update( $new_instance, $old_instance ) {
-    return $new_instance;
-  }
+		<?php
+		if ( $link ) {
+			print '<p class="wplt_widget_link"><a href="' . $link . '">' . __( 'show all', 'wplt2' ) . '...</a></p>';
+		}
 
-  function form( $instance ) {
-    $title = esc_attr( $instance['title'] );
-    $category = esc_attr( $instance['category'] );
-    $count = esc_attr( $instance['count'] );
-    $link = esc_attr( $instance['link'] );
-    $highlight = esc_attr( $instance['highlight'] );
-    $highlight_time = esc_attr( $instance['highlight_time'] );
-    $ajax = esc_attr( $instance['ajax'] );
-    $categories = get_terms('wplt_ticker', 'orderby=name&order=ASC');
-    ?>
-    
-    <table>
-     <tr>
-      <td><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label></td>
-      <td><input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /></td>
-     </tr>
-     <tr>
-      <td> <label for="<?php echo $this->get_field_id( 'category' ); ?>"><?php _e( 'Ticker:', 'wplt2' ); ?></label></td>
-      <td>
-       <select id="<?php echo $this->get_field_id( 'category' ); ?>" name="<?php echo $this->get_field_name( 'category' ); ?>">
-        <?php foreach ($categories as $cat) {
-         echo '<option value="'.$cat->slug.'"'; if($category==$cat->slug) echo ' selected="selected"'; echo '>'.$cat->name.'</option>';
-        } ?>
-       </select>
-      </td>
-     </tr>
-     <tr>
-      <td><label for="<?php echo $this->get_field_id( 'count' ); ?>"><?php _e( 'Number of Ticks:', 'wplt2' ); ?></label></td>
-      <td>
-       <select id="<?php echo $this->get_field_id( 'count' ); ?>" name="<?php echo $this->get_field_name( 'count' ); ?>">
-        <option value="0"<?php if($count==0) echo ' selected="selected"' ?>><?php _e('all','wplt2');?></option>
-        <option value="1"<?php if($count==1) echo ' selected="selected"' ?>>1</option><option value="2"<?php if($count==2) echo ' selected="selected"' ?>>2</option>
-        <option value="3"<?php if($count==3) echo ' selected="selected"' ?>>3</option><option value="4"<?php if($count==4) echo ' selected="selected"' ?>>4</option>
-        <option value="5"<?php if($count==5) echo ' selected="selected"' ?>>5</option><option value="6"<?php if($count==6) echo ' selected="selected"' ?>>6</option>
-        <option value="7"<?php if($count==7) echo ' selected="selected"' ?>>7</option><option value="8"<?php if($count==8) echo ' selected="selected"' ?>>8</option>
-        <option value="9"<?php if($count==9) echo ' selected="selected"' ?>>9</option><option value="10"<?php if($count==10) echo ' selected="selected"' ?>>10</option>
-       </select>
-      </td>
-     </tr>
-     <tr>
-      <td><label for="<?php echo $this->get_field_id( 'link' ); ?>"><?php _e( 'Link (optional):', 'wplt2' ); ?></label></td>
-      <td><input class="widefat" id="<?php echo $this->get_field_id( 'link' ); ?>" name="<?php echo $this->get_field_name( 'link' ); ?>" type="text" value="<?php echo $link; ?>" /></td>
-     </tr>
-     <tr>
-      <td><label for="<?php echo $this->get_field_id( 'highlight' ); ?>"><?php _e( 'Highlight new:', 'wplt2' ); ?></label></td>
-      <td><input class="widefat" id="<?php echo $this->get_field_id( 'highlight' ); ?>" name="<?php echo $this->get_field_name( 'highlight' ); ?>" type="checkbox" value="1" <?php if($highlight=="1") echo ' checked="checked"'; ?> /></td>
-     </tr>
-     <tr>
-      <td><label for="<?php echo $this->get_field_id( 'highlight_time' ); ?>"><?php _e( 'Highlight time [s]:', 'wplt2' ); ?></label></td>
-      <td><input class="widefat" id="<?php echo $this->get_field_id( 'highlight_time' ); ?>" name="<?php echo $this->get_field_name( 'highlight_time' ); ?>" type="text" value="<?php echo $highlight_time; ?>" /></td>
-     </tr>
-     <tr>
-      <td><label for="<?php echo $this->get_field_id( 'ajax' ); ?>"><?php _e( 'Auto refresh:', 'wplt2' ); ?></label></td>
-      <td><input class="widefat" id="<?php echo $this->get_field_id( 'ajax' ); ?>" name="<?php echo $this->get_field_name( 'ajax' ); ?>" type="checkbox" value="1"<?php if($ajax=="1") echo ' checked="checked"'; ?> disabled="disabled" /> <small><?php _e( '(enables ajax)', 'wplt2' ); ?></small></td>
-     </tr>
-    </table>
-    
-    
-     
-    <?php
-  }
+		echo $after_widget;
+		?>
+		<?php
+	}
+
+	function update( $new_instance, $old_instance ) {
+		return $new_instance;
+	}
+
+	function form( $instance ) {
+		$title          = esc_attr( $instance['title'] );
+		$category       = esc_attr( $instance['category'] );
+		$count          = esc_attr( $instance['count'] );
+		$link           = esc_attr( $instance['link'] );
+		$highlight      = esc_attr( $instance['highlight'] );
+		$highlight_time = esc_attr( $instance['highlight_time'] );
+		$ajax           = esc_attr( $instance['ajax'] );
+		$categories     = get_terms( 'wplt_ticker', 'orderby=name&order=ASC' );
+		?>
+
+		<table>
+			<tr>
+				<td><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label></td>
+				<td>
+					<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<label for="<?php echo $this->get_field_id( 'category' ); ?>"><?php _e( 'Ticker:', 'wplt2' ); ?></label>
+				</td>
+				<td>
+					<select id="<?php echo $this->get_field_id( 'category' ); ?>" name="<?php echo $this->get_field_name( 'category' ); ?>">
+						<?php foreach ( $categories as $cat ) {
+							echo '<option value="' . $cat->slug . '"';
+							if ( $category == $cat->slug ) {
+								echo ' selected="selected"';
+							}
+							echo '>' . $cat->name . '</option>';
+						} ?>
+					</select>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<label for="<?php echo $this->get_field_id( 'count' ); ?>"><?php _e( 'Number of Ticks:', 'wplt2' ); ?></label>
+				</td>
+				<td>
+					<select id="<?php echo $this->get_field_id( 'count' ); ?>" name="<?php echo $this->get_field_name( 'count' ); ?>">
+						<option value="0"<?php if ( $count == 0 )
+							echo ' selected="selected"' ?>><?php _e( 'all', 'wplt2' ); ?></option>
+						<option value="1"<?php if ( $count == 1 )
+							echo ' selected="selected"' ?>>1
+						</option>
+						<option value="2"<?php if ( $count == 2 )
+							echo ' selected="selected"' ?>>2
+						</option>
+						<option value="3"<?php if ( $count == 3 )
+							echo ' selected="selected"' ?>>3
+						</option>
+						<option value="4"<?php if ( $count == 4 )
+							echo ' selected="selected"' ?>>4
+						</option>
+						<option value="5"<?php if ( $count == 5 )
+							echo ' selected="selected"' ?>>5
+						</option>
+						<option value="6"<?php if ( $count == 6 )
+							echo ' selected="selected"' ?>>6
+						</option>
+						<option value="7"<?php if ( $count == 7 )
+							echo ' selected="selected"' ?>>7
+						</option>
+						<option value="8"<?php if ( $count == 8 )
+							echo ' selected="selected"' ?>>8
+						</option>
+						<option value="9"<?php if ( $count == 9 )
+							echo ' selected="selected"' ?>>9
+						</option>
+						<option value="10"<?php if ( $count == 10 )
+							echo ' selected="selected"' ?>>10
+						</option>
+					</select>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<label for="<?php echo $this->get_field_id( 'link' ); ?>"><?php _e( 'Link (optional):', 'wplt2' ); ?></label>
+				</td>
+				<td>
+					<input class="widefat" id="<?php echo $this->get_field_id( 'link' ); ?>" name="<?php echo $this->get_field_name( 'link' ); ?>" type="text" value="<?php echo $link; ?>" />
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<label for="<?php echo $this->get_field_id( 'highlight' ); ?>"><?php _e( 'Highlight new:', 'wplt2' ); ?></label>
+				</td>
+				<td>
+					<input class="widefat" id="<?php echo $this->get_field_id( 'highlight' ); ?>" name="<?php echo $this->get_field_name( 'highlight' ); ?>" type="checkbox" value="1" <?php if ( $highlight == "1" ) {
+						echo ' checked="checked"';
+					} ?> /></td>
+			</tr>
+			<tr>
+				<td>
+					<label for="<?php echo $this->get_field_id( 'highlight_time' ); ?>"><?php _e( 'Highlight time [s]:', 'wplt2' ); ?></label>
+				</td>
+				<td>
+					<input class="widefat" id="<?php echo $this->get_field_id( 'highlight_time' ); ?>" name="<?php echo $this->get_field_name( 'highlight_time' ); ?>" type="text" value="<?php echo $highlight_time; ?>" />
+				</td>
+			</tr>
+			<tr>
+				<td>
+					<label for="<?php echo $this->get_field_id( 'ajax' ); ?>"><?php _e( 'Auto refresh:', 'wplt2' ); ?></label>
+				</td>
+				<td>
+					<input class="widefat" id="<?php echo $this->get_field_id( 'ajax' ); ?>" name="<?php echo $this->get_field_name( 'ajax' ); ?>" type="checkbox" value="1"<?php if ( $ajax == "1" ) {
+						echo ' checked="checked"';
+					} ?> disabled="disabled" />
+					<small><?php _e( '(enables ajax)', 'wplt2' ); ?></small>
+				</td>
+			</tr>
+		</table>
+
+
+		<?php
+	}
 }
 
 add_action( 'widgets_init', 'wplt_widget_init' );
 function wplt_widget_init() {
-  register_widget( 'wplt_widget' );
+	register_widget( 'wplt_widget' );
 }
diff --git a/styles/wp-liveticker2.css b/styles/wp-liveticker2.css
index 6c1c7f3..b6ab194 100644
--- a/styles/wp-liveticker2.css
+++ b/styles/wp-liveticker2.css
@@ -1,58 +1,58 @@
-ul.wplt_ticker {
+ul.wplt2_ticker {
 	list-style-type: none;
 }
 
-li.wplt_tick {
+li.wplt2_tick {
 	background-color: #F5F5F5;
 	margin: 0.1em;
 	padding: 0.1em 0.3em;
 }
 
-li.wplt_tick p {
+li.wplt2_tick p {
 	margin: 0.3em;
 }
 
-span.wplt_tick_time {
+span.wplt2_tick_time {
 	color: #002C58;
 	font-size: 0.7em;
 	font-style: italic;
 }
 
-span.wplt_tick_title {
+span.wplt2_tick_title {
 	color: #002C58;
 	font-weight: bold;
 	margin-left: 0.5em;
 }
 
-p.wplt_tick_content {
+p.wplt2_tick_content {
 	margin-top: -0.7em;
 	text-indent: 0.5em;
 }
 
-ul.wplt_widget {
+ul.wplt_2widget {
 	list-style-type: none;
 	margin-top: -0.5em;
 }
 
-ul.wplt_widget li {
+ul.wplt2_widget li {
 	text-align: left;
 }
 
-span.wplt_widget_time {
+span.wplt2_widget_time {
 	font-size: 0.7em;
 	font-style: italic;
 }
 
-span.wplt_widget_content {
+span.wplt2_widget_content {
 	color: #002C58;
 	text-indent: 0.2em;
 }
 
-span.wplt_widget_content_new {
+span.wplt2_widget_content_new {
 	color: #800000;
 	text-indent: 0.2em;
 }
 
-p.wplt_widget_link {
+p.wplt2_widget_link {
 	text-align: right;
 }
diff --git a/wp-liveticker2.php b/wp-liveticker2.php
index 68f18c0..9de19ea 100644
--- a/wp-liveticker2.php
+++ b/wp-liveticker2.php
@@ -34,56 +34,45 @@
 defined( 'ABSPATH' ) || exit;
 
 // Constants.
-define( 'WPLT_VERSION', '0.4' );
-define( 'WPLT_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
-define( 'WPLT_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
-define( 'WPLT_TEXTDOM', 'wplt2' );
-define( 'WPLT_OPTIONS', 'wplt2' );
+define( 'WPLT2_FILE', __FILE__ );
+define( 'WPLT2_DIR', plugin_dir_path( __FILE__ ) );
+define( 'WPLT2_BASE', plugin_basename( __FILE__ ) );
+
+// System Hooks.
+add_action( 'init', array( 'WPLiveticker2', 'register_types' ) );
+add_action( 'plugins_loaded', array( 'WPLiveticker2', 'init' ) );
+register_activation_hook( WPLT2_FILE, array( 'WPLiveticker2_System', 'activate' ) );
+
+// Allow shortcodes in widgets.
+add_filter( 'widget_text', 'do_shortcode' );
+
+// Add shortcode.
+add_shortcode( 'liveticker', array( 'WPLiveticker2', 'shortcode_ticker_show' ) );
+
+
+// Autoload.
+spl_autoload_register( 'wplt2_autoload' );
 
 /**
- * Localization.
+ * Autoloader for StatifyBlacklist classes.
+ *
+ * @param string $class  Name of the class to load.
+ *
+ * @since 1.0.0
  */
-function wplt2_localization() {
-	load_plugin_textdomain( WPLT_TEXTDOM, false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );
-}
-
-add_action( 'plugins_loaded', 'wplt2_localization' );
-
-/**
- * Options.
- */
-global $wplt_options;
-$wplt_options = get_option( WPLT_OPTIONS );
-
-/**
- * Include required plugin files.
- */
-include_once( WPLT_PLUGIN_DIR . 'includes/functions.php' );
-include_once( WPLT_PLUGIN_DIR . 'includes/post-types.php' );
-include_once( WPLT_PLUGIN_DIR . 'includes/scripts.php' );
-include_once( WPLT_PLUGIN_DIR . 'includes/rss.php' );
-include_once( WPLT_PLUGIN_DIR . 'includes/shortcodes.php' );
-include_once( WPLT_PLUGIN_DIR . 'includes/widget.php' );
-if ( is_admin() ) {
-	include_once( WPLT_PLUGIN_DIR . 'includes/admin/page-settings.php' );
-	include_once( WPLT_PLUGIN_DIR . 'includes/admin/post-types-columns.php' );
-}
-
-/**
- * On activation.
- */
-function wplt2_activation() {
-	global $wplt_options;
-
-	// Add default settings to database.
-	$defaults = WPLT_get_default_options();
-
-	if ( $wplt_options['reset_settings'] ) {
-		update_option( WPLT_OPTIONS, $defaults );
-	} else {
-		add_option( WPLT_OPTIONS, $defaults );
+function wplt2_autoload( $class ) {
+	$plugin_classes = array(
+		'WPLiveticker2',
+		'WPLiveticker2_Admin',
+		'WPLiveticker2_System',
+	);
+	if ( in_array( $class, $plugin_classes, true ) ) {
+		require_once(
+		sprintf(
+			'%s/includes/class-%s.php',
+			WPLT2_DIR,
+			strtolower( str_replace( '_', '-', $class ) )
+		)
+		);
 	}
-
 }
-
-register_activation_hook( __FILE__, 'wplt2_activation' );