diff --git a/tutorial/perl/PerlServer.pl b/tutorial/perl/PerlServer.pl
new file mode 100644
index 0000000..a40ec69
--- /dev/null
+++ b/tutorial/perl/PerlServer.pl
@@ -0,0 +1,124 @@
+#!/usr/bin/perl
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+use strict;
+use lib '../gen-perl';
+use Thrift::Socket;
+use Thrift::Server;
+use tutorial::Calculator;
+
+package CalculatorHandler;
+use base qw(tutorial::CalculatorIf);
+
+sub new {
+    my $classname = shift;
+    my $self      = {};
+
+    return bless($self,$classname);
+}
+
+
+sub ping
+{
+  print "ping()\n";
+}
+
+sub add
+{
+  my($self, $n1, $n2) = @_;
+  printf("add(%d,%d)\n", $n1, $n2);
+  return $n1 + $n2;
+}
+
+sub calculate
+{
+  my($self, $logid, $work) = @_;
+  my $op   = $work->{op};
+  my $num1 = $work->{num1};
+  my $num2 = $work->{num2};
+  printf("calculate(%d, %d %d %d)\n", $logid, $num1, $num2, $op);
+
+  my $val;
+
+  if ($op == tutorial::Operation::ADD) {
+    $val = $num1 + $num2;
+  } elsif ($op == tutorial::Operation::SUBTRACT) {
+    $val = $num1 - $num2;
+  } elsif ($op == tutorial::Operation::MULTIPLY) {
+    $val = $num1 * $num2;
+  } elsif ($op == tutorial::Operation::DIVIDE) {
+    if ($num2 == 0)
+    {
+      my $x = new tutorial::InvalidOperation;
+      $x->what($op);
+      $x->why('Cannot divide by 0');
+      die $x;
+    }
+    $val = $num1 / $num2;
+  } else {
+    my $x = new tutorial::InvalidOperation;
+    $x->what($op);
+    $x->why('Invalid operation');
+    die $x;
+  }
+
+  my $log = new shared::SharedStruct;
+  $log->key($logid);
+  $log->value(int($val));
+  $self->{log}->{$logid} = $log;
+
+  return $val;
+}
+
+sub getStruct
+{
+  my($self, $key) = @_;
+  printf("getStruct(%d)\n", $key);
+  return $self->{log}->{$key};
+}
+
+sub zip
+{
+  my($self) = @_;
+  print "zip()\n";
+}
+
+
+
+eval {
+  my $handler       = new CalculatorHandler;
+  my $processor     = new tutorial::CalculatorProcessor($handler);
+  my $serversocket  = new Thrift::ServerSocket(9090);
+  my $forkingserver = new Thrift::ForkingServer($processor, $serversocket);
+  print "Starting the server...\n";
+  $forkingserver->serve();
+  print "done.\n";
+}; if ($@) {
+  if ($@ =~ m/TException/ and exists $@->{message}) {
+    my $message = $@->{message};
+    my $code    = $@->{code};
+    my $out     = $code . ':' . $message;
+    die $out;
+  } else {
+    die $@;
+  }
+}
+
