The paper introduces JFlow, a new programming language extension to Java that enables static checking of information flow annotations. JFlow addresses the limitations of previous static information flow control languages by providing a more flexible and practical programming model. Key features include a decentralized label model, label polymorphism, run-time label checking, and automatic label inference. These features allow for fine-grained control over data security while supporting complex language features such as objects, subclassing, dynamic type tests, access control, and exceptions. The paper also presents formal rules for static checking and discusses the translation process from JFlow to standard Java. JFlow aims to support secure applications that manipulate sensitive data, ensuring privacy and integrity without the overhead of dynamic security classes.The paper introduces JFlow, a new programming language extension to Java that enables static checking of information flow annotations. JFlow addresses the limitations of previous static information flow control languages by providing a more flexible and practical programming model. Key features include a decentralized label model, label polymorphism, run-time label checking, and automatic label inference. These features allow for fine-grained control over data security while supporting complex language features such as objects, subclassing, dynamic type tests, access control, and exceptions. The paper also presents formal rules for static checking and discusses the translation process from JFlow to standard Java. JFlow aims to support secure applications that manipulate sensitive data, ensuring privacy and integrity without the overhead of dynamic security classes.