diff --git a/test/ThriftTest.thrift b/test/ThriftTest.thrift
index 568ed1b..7ca194e 100644
--- a/test/ThriftTest.thrift
+++ b/test/ThriftTest.thrift
@@ -35,6 +35,7 @@
 namespace php ThriftTest
 namespace delphi Thrift.Test
 namespace cocoa ThriftTest
+namespace lua ThriftTest
 
 // Presence of namespaces and sub-namespaces for which there is
 // no generator should compile with warnings only
diff --git a/test/lua/test_basic_client.lua b/test/lua/test_basic_client.lua
new file mode 100644
index 0000000..e2e0d48
--- /dev/null
+++ b/test/lua/test_basic_client.lua
@@ -0,0 +1,136 @@
+-- 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.                                                                                                                                                                                                                 
+
+
+require('TSocket')
+require('TBinaryProtocol')
+require('ThriftTest_ThriftTest')
+require('liblualongnumber')
+
+local client
+
+function teardown()
+  if client then
+    -- Shuts down the server
+    client:testVoid()
+
+    -- close the connection
+    client:close()
+  end
+end
+
+function assertEqual(val1, val2, msg)
+  assert(val1 == val2, msg)
+end
+
+function testBasicClient()
+  local socket = TSocket:new{
+    port = 9090
+  }
+  assert(socket, 'Failed to create client socket')
+  socket:setTimeout(5000)
+
+  local protocol = TBinaryProtocol:new{
+    trans = socket
+  }
+  assert(protocol, 'Failed to create binary protocol')
+
+  client = ThriftTestClient:new{
+    protocol = protocol
+  }
+  assert(client, 'Failed to create client')
+
+  -- Open the socket
+  local status, _ = pcall(socket.open, socket)
+  assert(status, 'Failed to connect to server')
+
+  -- String
+  assertEqual(client:testString('lala'),  'lala',  'Failed testString')
+  assertEqual(client:testString('wahoo'), 'wahoo', 'Failed testString')
+
+  -- Byte
+  assertEqual(client:testByte(0x01), 1,    'Failed testByte 1')
+  assertEqual(client:testByte(0x40), 64,   'Failed testByte 2')
+  assertEqual(client:testByte(0x7f), 127,  'Failed testByte 3')
+  assertEqual(client:testByte(0x80), -128, 'Failed testByte 4')
+  assertEqual(client:testByte(0xbf), -65,  'Failed testByte 5')
+  assertEqual(client:testByte(0xff), -1,   'Failed testByte 6')
+  assertEqual(client:testByte(128), -128,  'Failed testByte 7')
+  assertEqual(client:testByte(255), -1,    'Failed testByte 8')
+
+  -- I32
+  assertEqual(client:testI32(0x00000001), 1,           'Failed testI32 1')
+  assertEqual(client:testI32(0x40000000), 1073741824,  'Failed testI32 2')
+  assertEqual(client:testI32(0x7fffffff), 2147483647,  'Failed testI32 3')
+  assertEqual(client:testI32(0x80000000), -2147483648, 'Failed testI32 4')
+  assertEqual(client:testI32(0xbfffffff), -1073741825, 'Failed testI32 5')
+  assertEqual(client:testI32(0xffffffff), -1,          'Failed testI32 6')
+  assertEqual(client:testI32(2147483648), -2147483648, 'Failed testI32 7')
+  assertEqual(client:testI32(4294967295), -1,          'Failed testI32 8')
+
+  -- I64 (lua only supports 16 decimal precision so larger numbers are
+  -- initialized by their string value)
+  local long = liblualongnumber.new
+  assertEqual(client:testI64(long(0x0000000000000001)),
+                   long(1),
+                   'Failed testI64 1')
+  assertEqual(client:testI64(long(0x4000000000000000)),
+                   long(4611686018427387904),
+                   'Failed testI64 2')
+  assertEqual(client:testI64(long('0x7fffffffffffffff')),
+                   long('9223372036854775807'),
+                   'Failed testI64 3')
+  assertEqual(client:testI64(long(0x8000000000000000)),
+                   long(-9223372036854775808),
+                   'Failed testI64 4')
+  assertEqual(client:testI64(long('0xbfffffffffffffff')),
+                   long('-4611686018427387905'),
+                   'Failed testI64 5')
+  assertEqual(client:testI64(long('0xffffffffffffffff')),
+                   long(-1),
+                   'Failed testI64 6')
+
+  -- Double
+  assertEqual(
+      client:testDouble(1.23456789), 1.23456789, 'Failed testDouble 1')
+  assertEqual(
+      client:testDouble(0.123456789), 0.123456789, 'Failed testDouble 2')
+  assertEqual(
+      client:testDouble(0.123456789), 0.123456789, 'Failed testDouble 3')
+
+  -- Accuracy of 16 decimal digits (rounds)
+  local a, b = 1.12345678906666663, 1.12345678906666661
+  assertEqual(a, b)
+  assertEqual(client:testDouble(a), b, 'Failed testDouble 5')
+
+  -- Struct
+  local a = {
+    string_thing = 'Zero',
+    byte_thing = 1,
+    i32_thing = -3,
+    i64_thing = long(-5)
+  }
+
+  -- TODO fix client struct equality
+  --assertEqual(client:testStruct(a), a, 'Failed testStruct')
+
+  -- Call the void function and end the test (handler stops server)
+  client:testVoid()
+end
+
+testBasicClient()
+teardown()
\ No newline at end of file
diff --git a/test/lua/test_basic_server.lua b/test/lua/test_basic_server.lua
new file mode 100644
index 0000000..7c175da
--- /dev/null
+++ b/test/lua/test_basic_server.lua
@@ -0,0 +1,104 @@
+-- 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.                                                                                                                                                                                                                 
+
+require('ThriftTest_ThriftTest')
+require('TSocket')
+require('TFramedTransport')
+require('TBinaryProtocol')
+require('TServer')
+require('liblualongnumber')
+
+--------------------------------------------------------------------------------
+-- Handler
+TestHandler = ThriftTestIface:new{}
+
+-- Stops the server
+function TestHandler:testVoid()
+  self.__server:stop()
+end
+
+function TestHandler:testString(str)
+  return str
+end
+
+function TestHandler:testByte(byte)
+  return byte
+end
+
+function TestHandler:testI32(i32)
+  return i32
+end
+
+function TestHandler:testI64(i64)
+  return i64
+end
+
+function TestHandler:testDouble(d)
+  return d
+end
+
+function TestHandler:testStruct(thing)
+  return thing
+end
+
+--------------------------------------------------------------------------------
+-- Test
+local server
+
+function teardown()
+  if server then
+    server:close()
+  end
+end
+
+function testBasicServer()
+  -- Handler & Processor
+  local handler = TestHandler:new{}
+  assert(handler, 'Failed to create handler')
+  local processor = ThriftTestProcessor:new{
+    handler = handler
+  }
+  assert(processor, 'Failed to create processor')
+
+  -- Server Socket
+  local socket = TServerSocket:new{
+    port = 9090
+  }
+  assert(socket, 'Failed to create server socket')
+
+  -- Transport & Factory
+  local trans_factory = TFramedTransportFactory:new{}
+  assert(trans_factory, 'Failed to create framed transport factory')
+  local prot_factory = TBinaryProtocolFactory:new{}
+  assert(prot_factory, 'Failed to create binary protocol factory')
+
+  -- Simple Server
+  server = TSimpleServer:new{
+    processor = processor,
+    serverTransport = socket,
+    transportFactory = trans_factory,
+    protocolFactory = prot_factory
+  }
+  assert(server, 'Failed to create server')
+
+  -- Serve
+  server:serve()
+  server = nil
+end
+
+testBasicServer()
+teardown()
\ No newline at end of file
