diff --git a/serial/serialjava.py b/serial/serialjava.py
index d9ee515..e5f2bbc 100644
--- a/serial/serialjava.py
+++ b/serial/serialjava.py
@@ -4,12 +4,13 @@
 # module for serial IO for Jython and JavaComm
 # see __init__.py
 #
-# (C) 2002-2008 Chris Liechti <cliechti@gmx.net>
+# (C) 2002-2015 Chris Liechti <cliechti@gmx.net>
 #
 # SPDX-License-Identifier:    BSD-3-Clause
 
 from serial.serialutil import *
 
+
 def my_import(name):
     mod = __import__(name)
     components = name.split('.')
@@ -34,8 +35,8 @@
 # http://mho.republika.pl/java/comm/
 
 comm = detect_java_comm([
-    'javax.comm', # Sun/IBM
-    'gnu.io',     # RXTX
+    'javax.comm',  # Sun/IBM
+    'gnu.io',      # RXTX
 ])
 
 
@@ -63,7 +64,7 @@
         """
         if self._port is None:
             raise SerialException("Port must be configured before it can be used.")
-        if self._isOpen:
+        if self.is_open:
             raise SerialException("Port is already open.")
         if type(self._port) == type(''):      # strings are taken directly
             portId = comm.CommPortIdentifier.getPortIdentifier(self._port)
@@ -71,13 +72,13 @@
             portId = comm.CommPortIdentifier.getPortIdentifier(device(self._port))     # numbers are transformed to a comport id obj
         try:
             self.sPort = portId.open("python serial module", 10)
-        except Exception, msg:
+        except Exception as msg:
             self.sPort = None
             raise SerialException("Could not open port: %s" % msg)
         self._reconfigurePort()
         self._instream = self.sPort.getInputStream()
         self._outstream = self.sPort.getOutputStream()
-        self._isOpen = True
+        self.is_open = True
 
     def _reconfigurePort(self):
         """Set communication parameters on opened port."""
@@ -120,11 +121,11 @@
 
         jflowin = jflowout = 0
         if self._rtscts:
-            jflowin  |=  comm.SerialPort.FLOWCONTROL_RTSCTS_IN
-            jflowout |=  comm.SerialPort.FLOWCONTROL_RTSCTS_OUT
+            jflowin |= comm.SerialPort.FLOWCONTROL_RTSCTS_IN
+            jflowout |= comm.SerialPort.FLOWCONTROL_RTSCTS_OUT
         if self._xonxoff:
-            jflowin  |=  comm.SerialPort.FLOWCONTROL_XONXOFF_IN
-            jflowout |=  comm.SerialPort.FLOWCONTROL_XONXOFF_OUT
+            jflowin |= comm.SerialPort.FLOWCONTROL_XONXOFF_IN
+            jflowout |= comm.SerialPort.FLOWCONTROL_XONXOFF_OUT
 
         self.sPort.setSerialPortParams(self._baudrate, jdatabits, jstopbits, jparity)
         self.sPort.setFlowControlMode(jflowin | jflowout)
@@ -136,22 +137,21 @@
 
     def close(self):
         """Close port"""
-        if self._isOpen:
+        if self.is_open:
             if self.sPort:
                 self._instream.close()
                 self._outstream.close()
                 self.sPort.close()
                 self.sPort = None
-            self._isOpen = False
-
-    def makeDeviceName(self, port):
-        return device(port)
+            self.is_open = False
 
     #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
 
-    def inWaiting(self):
+    @property
+    def in_waiting(self):
         """Return the number of characters currently in the input buffer."""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         return self._instream.available()
 
     def read(self, size=1):
@@ -160,7 +160,8 @@
         return less characters as requested. With no timeout it will block
         until the requested number of bytes is read.
         """
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         read = bytearray()
         if size > 0:
             while len(read) < size:
@@ -174,63 +175,78 @@
 
     def write(self, data):
         """Output the given string over the serial port."""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         if not isinstance(data, (bytes, bytearray)):
             raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
         self._outstream.write(data)
         return len(data)
 
-    def flushInput(self):
+    def reset_input_buffer(self):
         """Clear input buffer, discarding all that is in the buffer."""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         self._instream.skip(self._instream.available())
 
-    def flushOutput(self):
+    def reset_output_buffer(self):
         """\
         Clear output buffer, aborting the current output and
         discarding all that is in the buffer.
         """
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         self._outstream.flush()
 
-    def sendBreak(self, duration=0.25):
+    def send_break(self, duration=0.25):
         """Send break condition. Timed, returns to idle state after given duration."""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         self.sPort.sendBreak(duration*1000.0)
 
-    def setBreak(self, level=1):
+    def _update_break_state(self):
         """Set break: Controls TXD. When active, to transmitting is possible."""
-        if self.fd is None: raise portNotOpenError
-        raise SerialException("The setBreak function is not implemented in java.")
+        if self.fd is None:
+            raise portNotOpenError
+        raise SerialException("The _update_break_state function is not implemented in java.")
 
-    def setRTS(self, level=1):
+    def _update_rts_state(self):
         """Set terminal status line: Request To Send"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.setRTS(level)
+        if not self.sPort:
+            raise portNotOpenError
+        self.sPort.setRTS(self._rts_state)
 
-    def setDTR(self, level=1):
+    def _update_dtr_state(self):
         """Set terminal status line: Data Terminal Ready"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.setDTR(level)
+        if not self.sPort:
+            raise portNotOpenError
+        self.sPort.setDTR(self._dtr_state)
 
-    def getCTS(self):
+    @property
+    def cts(self):
         """Read terminal status line: Clear To Send"""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         self.sPort.isCTS()
 
-    def getDSR(self):
+    @property
+    def dsr(self):
         """Read terminal status line: Data Set Ready"""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         self.sPort.isDSR()
 
-    def getRI(self):
+    @property
+    def ri(self):
         """Read terminal status line: Ring Indicator"""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         self.sPort.isRI()
 
-    def getCD(self):
+    @property
+    def cd(self):
         """Read terminal status line: Carrier Detect"""
-        if not self.sPort: raise portNotOpenError
+        if not self.sPort:
+            raise portNotOpenError
         self.sPort.isCD()
 
 
@@ -246,11 +262,10 @@
     )
     s.setRTS(1)
     s.setDTR(1)
-    s.flushInput()
-    s.flushOutput()
+    s.reset_input_buffer()
+    s.reset_output_buffer()
     s.write('hello')
     sys.stdio.write('%r\n' % s.read(5))
-    sys.stdio.write('%s\n' % s.inWaiting())
+    sys.stdio.write('%s\n' % s.in_waiting())
     del s
 
-
