Index: src/Actor/Slave.pm
===================================================================
--- src/Actor/Slave.pm	(revision 7993)
+++ src/Actor/Slave.pm	(working copy)
@@ -9,6 +9,7 @@
 	my ($class, $type) = @_;
 	
 	my $actorType =
+		($type >= 2114 && $type <= 2125) ? 'Summon' :
 		($type >= 6001 && $type <= 6016) ? 'Homunculus' :
 		($type >= 6017 && $type <= 6046) ? 'Mercenary' :
 	'Unknown';
Index: src/Commands.pm
===================================================================
--- src/Commands.pm	(revision 7993)
+++ src/Commands.pm	(working copy)
@@ -174,6 +174,7 @@
 	st                 => \&cmdStats,
 	stand              => \&cmdStand,
 	stat_add           => \&cmdStatAdd,
+	summon             => \&cmdSlave,
 	switchconf         => \&cmdSwitchConf,
 	take               => \&cmdTake,
 	talk               => \&cmdTalk,
@@ -1847,6 +1848,8 @@
 		$slave = $char->{homunculus};
 	} elsif ($cmd eq 'merc') {
 		$slave = $char->{mercenary};
+	} elsif ($cmd eq 'summon') {
+		$slave = $char->{summon};
 	} else {
 		error T("Error: Unknown command in cmdSlave\n");
 	}
@@ -1859,6 +1862,23 @@
 	) {
 		error T("Error: No slave detected.\n");
 
+	} elsif ($cmd eq "summon") {
+		my $hp_string = $slave->{'hp'}. '/' .$slave->{'hp_max'} . ' (' . sprintf("%.2f",$slave->{'hpPercent'}) . '%)';
+		my $sp_string = $slave->{'sp'}."/".$slave->{'sp_max'}." (".sprintf("%.2f",$slave->{'spPercent'})."%)";
+		
+		my $msg = swrite(
+		center(T(" Summon Status "), 78, '-') . "\n" .
+		T("Name: \@<<<<<<<<<<<<<<<<<<<<<<<<< HP: \@>>>>>>>>>>>>>>>>>>\n" .
+		"Type: \@<<<<<<<<<<<<<<<<<<<<<<<<< SP: \@>>>>>>>>>>>>>>>>>>"),
+		[$slave->{name}, $hp_string,
+		$slave->{actorType}, $sp_string]);
+		
+		$msg .= ('-'x78) . "\n";
+		
+		
+		
+		message $msg, "info";
+
 	} elsif ($subcmd eq "s" || $subcmd eq "status") {
 		my $hp_string = $slave->{'hp'}. '/' .$slave->{'hp_max'} . ' (' . sprintf("%.2f",$slave->{'hpPercent'}) . '%)';
 		my $sp_string = $slave->{'sp'}."/".$slave->{'sp_max'}." (".sprintf("%.2f",$slave->{'spPercent'})."%)";
Index: src/Globals.pm
===================================================================
--- src/Globals.pm	(revision 7993)
+++ src/Globals.pm	(working copy)
@@ -183,6 +183,19 @@
 	180 => 'Clown',
 	181 => 'Gypsy',
 
+	2114 => 'Agni 1',
+	2115 => 'Agni 2',
+	2116 => 'Agni 3',
+	2117 => 'Aqua 1',
+	2118 => 'Aqua 2',
+	2119 => 'Aqua 3',
+	2120 => 'Ventus 1',
+	2121 => 'Ventus 2',
+	2122 => 'Ventus 3',
+	2123 => 'Tera 1',
+	2124 => 'Tera 2',
+	2125 => 'Tera 3',
+	
 	4001 => 'High Novice',
 	4002 => 'High Swordsman',
 	4003 => 'High Magician',
Index: src/Misc.pm
===================================================================
--- src/Misc.pm	(revision 7993)
+++ src/Misc.pm	(working copy)
@@ -3729,7 +3729,36 @@
 			return 0 if $char->{mercenary}->statusActive($config{$prefix . "_mercenary_whenStatusInactive"});
 		}
 	}
-
+	
+	
+	
+	#summon block start
+	if ($config{$prefix."_summon"} =~ /\S/) {
+		return 0 if (!!$config{$prefix."_summon"}) ^ (!!$char->{summon});
+	}
+	
+	if ($char->{summon}) {
+		if ($config{$prefix . "_summon_hp"}) {
+			if ($config{$prefix."_summon_hp"} =~ /^(.*)\%$/) {
+				return 0 if (!inRange($char->{summon}{hpPercent}, $1));
+			} else {
+				return 0 if (!inRange($char->{summon}{hp}, $config{$prefix."_summon_hp"}));
+			}
+		}
+ 
+		if ($config{$prefix."_summon_sp"}) {
+			if ($config{$prefix."_summon_sp"} =~ /^(.*)\%$/) {
+				return 0 if (!inRange($char->{summon}{spPercent}, $1));
+			} else {
+				return 0 if (!inRange($char->{summon}{sp}, $config{$prefix."_summon_sp"}));
+			}
+		}
+		
+		if ($config{$prefix."_summon_type"}) {
+			return 0 if ($config{$prefix."_summon_type"} ne $char->{summon}{name});
+		}
+	}
+	
 	# check skill use SP if this is a 'use skill' condition
 	if ($prefix =~ /skill/i) {
 		my $skill = Skill->new(auto => $config{$prefix});
Index: src/Network/Receive.pm
===================================================================
--- src/Network/Receive.pm	(revision 7993)
+++ src/Network/Receive.pm	(working copy)
@@ -437,7 +437,7 @@
 =cut
 	#### Step 1: create/get the correct actor object ####
 	if ($jobs_lut{$args->{type}}) {
-		unless ($args->{type} > 6000) {
+		unless (($args->{type} > 6000) || (($args->{type} >= 2114) && ($args->{type} <= 2125))) {
 			# Actor is a player
 			$actor = $playersList->getByID($args->{ID});
 			if (!defined $actor) {
@@ -449,7 +449,7 @@
 			}
 			$actor->{nameID} = $nameID;
 		} else {
-			# Actor is a homunculus or a mercenary
+			# Actor is a homunculus, a mercenary or a summon
 			$actor = $slavesList->getByID($args->{ID});
 			if (!defined $actor) {
 				$actor = ($char->{slaves} && $char->{slaves}{$args->{ID}})
@@ -682,6 +682,9 @@
 
 		} elsif (UNIVERSAL::isa($actor, "Actor::Slave")) {
 			$slavesList->add($actor);
+			if (defined $char->{summon} && ($char->{summon}{ID} == $args->{ID}) && !defined $char->{summon}{name}) {#set global name of summon
+				$char->{summon}->setName($jobs_lut{$args->{type}});
+			}
 		}
 	}
 
@@ -930,7 +933,11 @@
 			$slave->{gone_time} = time;
 			Plugins::callHook('slave_disappeared', {slave => $slave});
 		}
-
+		
+		if ($char->{summon}{ID} == $ID) {
+			delete $char->{summon};
+		}
+		
 		$slavesList->remove($slave);
 
 	} else {
Index: src/Network/Receive/ServerType0.pm
===================================================================
--- src/Network/Receive/ServerType0.pm	(revision 7993)
+++ src/Network/Receive/ServerType0.pm	(working copy)
@@ -495,7 +495,8 @@
 		'0816' => ['buying_store_lost', 'a4', [qw(ID)]],
 		'0818' => ['buying_store_items_list', 'v a4 a4', [qw(len buyerID buyingStoreID zeny)]],
 		'081C' => ['buying_store_item_delete', 'v2 V', [qw(index amount zeny)]],
-		'081E' => ['stat_info', 'v V', [qw(type val)]], # 8, Sorcerer's Spirit - not implemented in Kore
+		'081D' => ['summon_init', 'a4 V4', [qw(ID hp hp_max sp sp_max)]],
+		'081E' => ['stat_info', 'v V', [qw(type val)]], # 8, Sorcerer's Spirit
 		'082D' => ['received_characters', 'v C x2 C2 x20 a*', [qw(len total_slot premium_start_slot premium_end_slot charInfo)]],
 		'0839' => ['guild_expulsion', 'Z40 Z24', [qw(message name)]],
 		'083E' => ['login_error', 'V Z20', [qw(type unknown)]],
@@ -2265,6 +2266,23 @@
 	}
 }
 
+
+# 081D
+sub summon_init {
+	my ($self, $args) = @_;
+	$char->{summon} = Actor::get($args->{ID});
+	
+	my $slave = $char->{summon};
+	
+	foreach (@{$args->{KEYS}}) {
+		$slave->{$_} = $args->{$_};
+	}
+	$slave->{appear_time} = time;
+	$slave->{actorType} = "Summon";
+	slave_calcproperty_handler($slave, $args);
+}
+
+
 # 022E
 sub homunculus_property {
 	my ($self, $args) = @_;
@@ -5540,7 +5558,7 @@
 		'01AB' => exists $args->{ID} && Actor::get($args->{ID}),
 		'02A2' => $char->{mercenary},
 		'07DB' => $char->{homunculus},
-		#'081E' => Sorcerer's Spirit - not implemented in Kore
+		'081E' => $char->{summon},
 	}->{$args->{switch}};
 
 	unless ($actor) {
