217 stories
·
1 follower

Project Loom in IntelliJ IDEA: Virtual Threads, Scoped Values, and Structured Concurrency

1 Share

Java concurrency is a powerful feature, but it can be difficult to get right. Writing correct multithreaded code requires a deep understanding of thread pools, synchronization, cancellation, and error propagation. Even experienced developers regularly introduce subtle bugs like thread leaks, swallowed exceptions, and race conditions that only surface under specific circumstances.

Traditionally, Java concurrency has had several limitations: 

  • Scalability and resource costs from blocking threads.
  • Difficulty sharing contextual data between threads safely.
  • Problems managing threads such as leaks and cancellation delays.
  • Concurrent code that is hard to understand, debug, and maintain.

Project Loom aims to eliminate the tradeoff between simplicity and efficiency in concurrent Java code, making it easier to write, debug, profile, and maintain code that is correct, readable, and scalable. It does this through three features that work together:

  • Virtual Threads (JEP 444, stable since Java 21) – Platform threads are expensive and limited in number, making highly concurrent applications resource-heavy and hard to scale. Virtual threads are lightweight and managed by the JVM, allowing many more threads to run concurrently without the same overhead.
  • Scoped Values (JEP 506, stable since Java 25) – ThreadLocal variables are mutable, hard to reason about, and prone to memory leaks. Scoped values provide immutable, automatically cleaned-up data sharing that scales efficiently with virtual threads.
  • Structured Concurrency (JEP 533, seventh preview in Java 27) – Unstructured concurrency leads to thread leaks, cancellation delays, and code that is difficult to debug and maintain. Structured concurrency treats a group of related threads as a single unit of work, making cancellation and error handling predictable and consistent. It also provides a clear parent-child thread hierarchy that improves observability and makes concurrent code easier to trace and inspect.

In this post, we’ll give you an overview of these features, explain some of the problems they solve, show how they work together, and demonstrate how IntelliJ IDEA supports you along the way.

Problems with Java concurrency before Project Loom

To illustrate some of the problems with concurrency and how Project Loom can solve them, let’s look at an example of how we could write concurrent code without using any of the features of Project Loom. We’ll then rewrite this code to take advantage of these features and see how they compare.

As an example, we will use an application that loads a customer profile. It fetches order history and product recommendations for a customer in parallel. You can find the project’s source code here.

The method getProfile() in the CustomerProfileService (which you can find here) loads the customer profile using CompletableFuture to run the calls concurrently:

public CustomerProfile getProfile(String customerId) throws OrderServiceException, RecommendationServiceException {
        CompletableFuture<List<Order>> orderFuture =
                CompletableFuture.supplyAsync(() -> orderServiceClient.getOrders(customerId), executor);
        CompletableFuture<List<Recommendation>> recFuture =
                CompletableFuture.supplyAsync(() -> recommendationServiceClient.getRecommendations(customerId), executor);

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(orderFuture, recFuture);

        try {
            allFutures.get(2, TimeUnit.SECONDS); // single timeout covering both futures
            return new CustomerProfile(customerId, orderFuture.join(), recFuture.join());
        }

        // catch block 

The catch block handles any exceptions. This code does what it is supposed to do: It runs the independent calls in parallel, has a timeout, and makes an effort to cancel remaining tasks on failure. But there are still several potential problems:

  • Thread leaks. cancel(true) marks the future as cancelled, but for CompletableFuture the interrupt flag is ignored and the work already running in the pool continues to completion unless it was explicitly wired to a cancellation signal.
  • Awkward error handling. ExecutionException wraps the real cause and must be unwrapped manually (shown in the code snippet below and also available here). The unwrapping chain will need to be updated every time a new exception type is introduced.
        catch (ExecutionException e) {
            Throwable cause = e.getCause();
            orderFuture.cancel(true);
            recFuture.cancel(true);

            if (cause instanceof RestClientResponseException ex && ex.getStatusCode().value() == 503) {
                if (orderFuture.isCompletedExceptionally()) {
                    throw new OrderServiceException("Order service unavailable", e.getCause());
                }
                if (recFuture.isCompletedExceptionally()) {
                    throw new RecommendationServiceException("Recommendation service unavailable", e.getCause());
                }
            }
            throw new RuntimeException("Unexpected error", e.getCause());
  • Duplicated cancellation logic. The cancel() calls are repeated across both the TimeoutException and ExecutionException catch blocks. If any additional parallel call is added later, it needs a cancel() call in both catch blocks, which is easy to forget. These blocks could drift out of sync as the code evolves.
  • Fragile context propagation. Passing contextual data such as a logged-in user’s session or a trace ID across threads using ThreadLocal is fragile. ThreadLocal variables are mutable, their values persist for the lifetime of a thread unless explicitly removed, and child threads do not automatically inherit them unless you use InheritableThreadLocal, which has its own pitfalls.
  • Poor observability. A thread dump shows a flat list of pool threads with no indication of which threads belong to which request, or which are still waiting on something that already failed. To see running threads, you can get a thread dump in IntelliJ IDEA when the program is suspended (either stopped at a breakpoint or paused). In the Debug tool window, click More and select Get Thread Dump while the service is handling a request.
Pause output and Get Thread Dump

Sidenote: To add the Get Thread Dump button to your Debugger tool window, right-click the Debugger tool window and select Customize Toolbar. In the popup, click Add, search for and select Get Thread Dump, and click OK.

Customize Toolbar with the Get Thread Dump button

Let’s take a look at how Project Loom addresses these problems.

Virtual Threads (JEP 444, stable since Java 21)

The first feature of Project Loom is Virtual Threads, which drastically improve throughput in Java applications with blocking code.  

Traditionally, the number of available threads in a Java application is limited because platform threads wrap operating system (OS) threads, and the number of OS threads is limited. Platform threads are also expensive; creating them can take milliseconds, each one consumes significant memory, and context switching between them has considerable overhead. To manage these costs, applications use thread pools – a fixed set of reusable threads managed by an ExecutorService.

In contrast, virtual threads are lightweight threads. They are cheap to create (taking microseconds instead of milliseconds), and since they are not tied to OS threads, they are not limited in number; you could run millions of them. When a virtual thread blocks, the underlying platform thread is released for other work and reassigned when the virtual thread is ready to continue. This means that virtual threads can significantly improve throughput for blocking workloads, such as I/O (anything that waits on databases, network calls, or file access), pauses, or synchronization.

In Java 24, an additional improvement was made to improve the scalability of Java code. With JEP 491: Synchronize Virtual Threads without Pinning, virtual threads that block in synchronized methods and statements release their underlying platform threads. You can see this in action in the What’s New in IntelliJ IDEA 2025.2 livestream.

We already briefly discussed virtual threads in Java 25 LTS and IntelliJ IDEA. For more information about using virtual thread dumps, have a look at Thread Dumps and Project Loom (Virtual Threads).

To debug problems with concurrent threads, check out the new, improved logpoint functionality described in Println Debugging Done Right.

Scoped Values (JEP 506, stable since Java 25)

The second feature of Project Loom is Scoped Values – a safer, more scalable alternative to ThreadLocal variables, designed with virtual threads in mind. They solve the problem of sharing contextual data across threads cleanly and safely.

To share data between components of an application, we can use thread-local variables, but these have several downsides. A ThreadLocal variable is mutable and, therefore, hard to reason about. Data persists for the thread’s lifetime unless manually removed (risking memory leaks and security issues), and child threads inherit copies that increase memory footprint.

ScopedValue provides a better model: A value is bound once within a defined scope, automatically available to all code running within that scope, and cleaned up automatically when the scope ends. The binding cannot be changed from within the scope, eliminating the risk of accidental mutation and guaranteeing that any code reading the value will see the same one. When used with structured concurrency, scoped values require no explicit propagation to child threads, making context sharing both safer and simpler.

Note that even if your code does not explicitly use ThreadLocal, frameworks like Spring use it under the hood.

For more details, see the section on Scoped Values in Java 25 LTS and IntelliJ IDEA.

Structured Concurrency (JEP 533, seventh preview in Java 27)

The third feature of Project Loom is Structured Concurrency, which is currently still in preview. Java 27 again brings some changes to this preview feature. As we have already added some support for this feature in IntelliJ IDEA, now is the perfect time to try it out.

Structured concurrency is designed to promote a style of concurrent programming that reduces common problems such as thread leaks and cancellation delays, duplicated cancellation logic, and awkward error handling. The core idea is that a group of related concurrent tasks is treated as a single unit of work with a clear owner, a clearly defined lifetime, and clear rules. Subtasks cannot outlive their scope, failures propagate cleanly, and cancellation flows automatically from parent to children.

The StructuredTaskScope lets you break a task down into concurrent subtasks that are coordinated as a single unit. Subtasks are forked to run on their own thread and joined as a unit when the work completes.

StructuredTaskScope has a factory method StructuredTaskScope.open(). This method has several overloads that allow you to provide a Joiner and/or a configuration callback. This lets you define the failure policy, a name for observability, and a timeout all in one place when opening the scope.

In our example, we want both methods (fetchOrders() and fetchRecommendations()) to succeed in order to correctly assemble the customer profile. We can provide a name for our scope and set a timeout for how long we are willing to wait on the results. If either of them fails, the other is cancelled. When a subtask fails or the timeout expires, join() throws an ExecutionException with the underlying cause. We switch on that cause to handle each case explicitly – including CancelledByTimeoutException, which is what the joiner uses to signal a timeout.

What if we don’t need results from all methods called in parallel? For example, imagine recommendations are available from two different caches and you only need the result of one of the calls to succeed. If one task succeeds, the other can be shut down. To accomplish this, we can use a different Joiner, anySuccessfulOrThrow(). As soon as one cache returns a result, the scope shuts down and the other task is cancelled automatically. If both fail, the join() method throws an ExecutionException with the exception of one of the failed subtasks as the cause.

To quickly scaffold a StructuredTaskScope in IntelliJ IDEA, use the built-in live template sts

Use the live template sts to create and open a StructuredTaskScope.

Structured concurrency is still a preview feature in Java 27, so it is not yet recommended for production use. That said, the feature has been relatively stable in its broad shape for several preview rounds, with some changes to the API, and now is a great time to experiment with it. To identify where you could use structured concurrency in your code, look for places where the code performs multiple tasks in parallel and awaits the results. This code is a candidate to be rewritten using structured concurrency.

Rewriting CustomerProfileService using Project Loom features

The “modern” branch of our demo project contains the same application rewritten using the features from Project Loom. The structure follows the same pattern as before: Orders and recommendations are fetched in parallel inside the scope.

The updated method getProfile() in the CustomerProfileService (which you can find here) now uses a StructuredTaskScope:

public CustomerProfile getProfile(String customerId) throws InterruptedException, TimeoutException {
        try {
            return ScopedValue.where(CUSTOMER_ID, customerId).call(() -> {
                try (var scope = StructuredTaskScope.open(
                        Joiner.awaitAllSuccessfulOrThrow(),
                        config -> config.withName("customer-profile").withTimeout(Duration.ofSeconds(2)))) {
                    var orderTask = scope.fork(() -> orderServiceClient.getOrders(CUSTOMER_ID.get()));
                    var recTask = scope.fork(() -> recommendationServiceClient.getRecommendations(CUSTOMER_ID.get()));
                    scope.join();
                    return new CustomerProfile(customerId, orderTask.get(), recTask.get());
                } catch (ExecutionException e) {
                    switch (e.getCause()) {
                        case StructuredTaskScope.CancelledByTimeoutException _ -> throw new TimeoutException("Request timed out");
                        case OrderServiceException ose -> throw ose;
                        case RuntimeException rte -> throw rte;
                        default -> throw new RuntimeException(e.getCause());
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    throw new RuntimeException("Interrupted", e);
                }
            });
        } catch (InterruptedException | TimeoutException | RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

   

Notice that we no longer need the duplicated cancel() calls in two catch blocks. If either task fails or the timeout is exceeded, all remaining subtasks are cancelled automatically. There is no longer any need for manual cancel() calls.

The code now clearly expresses its intent: Fetch orders and recommendations in parallel, wait up to two seconds, and fail cleanly if anything goes wrong. Because the pattern of what the code does is clearly captured in the code, this code is easier to read, understand, and reason about.

To see the difference structured concurrency makes, run the updated service in IntelliJ IDEA and take a thread dump while requests are being processed. You can create a thread dump, as described earlier. From IntelliJ IDEA 2026.1, virtual threads forked within a StructuredTaskScope are grouped into containers representing their scopes. The IntelliJ IDEA debugger now shows you the structure in structured concurrency.

Get Thread Dump with StructuredTaskScope

Using Java 27 (EA) in IntelliJ IDEA

To try out the features described in this post, you will need Java 27. You can download it from inside IntelliJ IDEA via Project Structure | Project Settings | Project, and then open the SDK dropdown and select Download JDK. Set Version to 27 and select the Early-Access version. 

Download the JDK from IntelliJ IDEA

If you are using a different way to download JDKs, you can point IntelliJ IDEA to your installation. Go to Project Structure | Project Settings | Project, open the SDK dropdown, select Add JDK from disk, and point IntelliJ IDEA to your installation of Java 27.

If you’re using command-line tools like SDKMAN! or asdf, you can use inlay hints to make version management easier. If your .sdkmanrc or .tool-versions file specifies a JDK version that is not yet installed, an inlay hint will appear that allows you to download it directly. 

Download the JDK via .sdkmanrc

If the JDK is already installed but not configured for the project, you can use the inlay hint to set it as the project JDK.

Set the JDK via .sdkmanrc

For more information, see the documentation.

To get support for new language features, like structured concurrency, when using an early access version of the JDK, set the Language level to X – Experimental features.

If Java 27 has already been released when you’re reading this post, download the Java 27 distribution you want to use from IntelliJ IDEA or, if you already have Java 27 installed, point the IDE to your installation. To use structured concurrency, you also need to enable preview features. Set the Language level to 27 (Preview) – Primitive types in patterns, instanceof, and switch (5th preview) in Project Structure. IntelliJ IDEA will flag usage of preview features in the editor, so you are always aware which features are not yet stable.

Conclusion

Virtual threads, scoped values, and structured concurrency are designed as a cohesive system, each addressing a different dimension of the problem:

  • Virtual Threads improve scalability. They remove the need to manage thread pool sizes and make it practical to run one thread per task, even at high concurrency.
  • Scoped Values improve context propagation. This JEP solves some of the downsides of ThreadLocal (and framework workarounds), giving all tasks in a scope automatic, safe access to shared immutable context.
  • Structured Concurrency solves the structural problems in concurrency by giving concurrent tasks a clear lifetime, a clear owner, and a clean failure model, thus eliminating thread leaks, duplicated cancellation logic, and ExecutionException unwrapping.

Together, they let you write concurrent code that is much easier to read than traditional concurrent code, while being safe and scalable. The boilerplate that currently may take multiple steps to get right is replaced by code that is more concise and reads exactly like the problem it is solving.

You can use these features in IntelliJ IDEA. If you have questions or feedback, please let us know in the comments below.

Read the whole story
jhunorss
19 hours ago
reply
Share this story
Delete

Software Architecture in the AI Era: What Doesn’t Change, What Does

1 Share
Read the whole story
jhunorss
10 days ago
reply
Share this story
Delete

10 Cute Japanese Words: Kawaii Vocabulary for Beginners

1 Share
Read the whole story
jhunorss
18 days ago
reply
Share this story
Delete

Agent Skills in IntelliJ IDEA

1 Share

Agent Skills have become a key building block of the Agent Harness for AI-driven agentic development. They give AI agents additional capabilities and knowledge, enabling them to complete tasks in a way that aligns with your preferences.

If you are new to Agent Skills, I recommend reading AI-Assisted Java Application Development with Agent Skills first.

IntelliJ IDEA and other JetBrains IDEs include AI Assistant, which helps developers with AI agentic development. AI Assistant provides an elegant and secure way to use and manage Agent Skills.

If you missed the announcement, see Introducing the Skill Manager and Skill Repository.

In this article, we will explore:

  • How to install Agent Skills via the Skills Manager.
  • Managing skills with the Skill Repository.
  • Installing skills globally, per project, or per agent.
  • Adding your own Skill Repository.

Skills Manager

AI Assistant supports a wide range of AI agents through ACP (Agent Client Protocol).

The Skills Manager in AI Assistant lets you view the list of available skills and install them.

If you have already installed Agent Skills globally, the Skills Manager detects them and helps you install them as IntelliJ IDEA agent skills.

You can install a skill globally, at the project level, or per agent.

Skill Repositories

The Skill Repository lets you manage a list of locations where your verified skills are stored.

By default, JetBrains provides a Skill Repository hosted at https://github.com/JetBrains/skills.

These skills are verified by JetBrains for security vulnerabilities.

It is essential to check for security issues before using agent skills downloaded from the internet. A better approach is to maintain an organization-wide Skill Repository, verified by your team, and add it to the Skill Repository list.

Agent Skills in action

Based on the prompt description, the AI agent automatically detects and uses relevant agent skills.

For example, I installed spring-boot-skill, and when I asked the AI agent to write tests for Spring Boot REST API endpoints, it used the spring-boot-skill.

You can also explicitly invoke an agent skill using $skill-name [prompt] with Codex or `/skill-name [prompt]` with Claude.

Summary

AI Assistant’s Skills Manager makes agent skills part of your regular IDE workflow. You can discover, install, and manage skills without leaving IntelliJ IDEA, then make them available globally, for a specific project, or only to a particular AI agent. The AI agent can automatically select a relevant skill from your prompt, while explicit invocation gives you control when you need it.

Just as importantly, the Skill Repository provides access to skills verified by JetBrains for security vulnerabilities. Teams can also add their own repositories containing internally reviewed skills. This makes it easier to benefit from reusable agent capabilities while maintaining control over which skills developers use in their projects.

Read the whole story
jhunorss
18 days ago
reply
Share this story
Delete

Haltung erlaubt: Keine Angst vor dem Neutralitätsgebot – ein Leitfaden

1 Share

Die AfD versucht, zivilgesellschaftliche Akteure mit Verweis auf ein vermeintlich allgemeingültiges Neutralitätsgebot zu verunsichern. Doch im Gegenteil gilt: Wer menschenfeindliche Positionen zurückweist, erfüllt seine Pflicht zur Verteidigung des Grundgesetzes.

Die AfD beruft sich seit einigen Jahren strategisch auf „Neutralität“, um Kritik an ihr zu delegitimieren und zivilgesellschaftliche Akteur*innen einzuschüchtern. Das erzeugt Verunsicherung: Muss ich in Schule, Verwaltung, Hochschule oder Verein „neutral“ bleiben, während andere immer radikalere Positionen vertreten? Nein! In einer wehrhaften Demokratie gibt es keine Pflicht zur Neutralität gegenüber menschenverachtenden Positionen. Im Gegenteil: Häufig ist ein klares Einstehen für die freiheitlich demokratische Grundordnung (FDGO) sogar Pflicht.

Es gibt nicht das eine Neutralitätsgebot

Auch wenn ständig davon die Rede ist: Ein allgemeines Neutralitätsgebot steht nicht im Grundgesetz. Neutralitätspflichten gelten nur in eng umgrenzten Situationen, in denen eine besondere Nähe zum Staat besteht. Dann kann es rechtlich geboten sein, keine politische Partei zu bevorzugen oder zu benachteiligen und vor allem keine staatlichen Ressourcen zu nutzen, um Parteipolitik zu machen oder eigene parteipolitische Präferenzen zu bewerben. Das betrifft insbesondere Regierungsmitglieder, staatliche Öffentlichkeitsarbeit, Beamt*innen oder die steuerliche Gemeinnützigkeit von Vereinen. Außerdem gibt es Pflichten zur Sachlichkeit oder Mäßigung, etwa für Beamt*innen oder bei amtlichen Verlautbarungen. 

Freiheitlich demokratische Grundordnung: Warum klare Haltung erlaubt und nötig ist

Aber selbst dort, wo Neutralität verlangt wird, wird sie durch den Schutz der freiheitlich demokratischen Grundordnung begrenzt. Die FDGO umfasst die zentralen Prinzipien des Grundgesetzes: Schutz der Menschenwürde, Demokratieprinzip und Rechtsstaatsprinzip. Menschenwürdefeindlich sind etwa Positionen, die von einem ethnisch homogenen „Volk“ ausgehen, Zugewanderten die Zugehörigkeit absprechen oder Grundrechte nur einer vermeintlichen „Volksgemeinschaft“ zubilligen. Dazu gehören auch rassistische, antisemitische, antimuslimische, antiziganistische, misogynen, ableistische oder transfeindliche Forderungen.

Für Beamt*innen und viele Beschäftigte im öffentlichen Dienst gilt eine Pflicht zur Treue zur Verfassung. Sie sollen also nicht neutral gegenüber Verfassungsfeinden sein, sondern aktiv die Werte des Grundgesetzes schützen. Aus dieser wehrhaften Demokratie folgt: Wer im Dienst menschenwürdefeindliche Aussagen klar zurückweist, verletzt nicht die Neutralität, sondern erfüllt seine Pflicht. 

Regierung, Amt und Partei: Wo Neutralität gilt – und wo nicht

Für die Chancengleichheit der Parteien ist wichtig, dass staatliche Ressourcen und die Autorität eines Regierungsamtes nicht zur direkten Bekämpfung einer bestimmten Partei eingesetzt werden. Deswegen hat das Bundesverfassungsgericht kritische Äußerungen von Regierungsmitgliedern in offiziellen Formaten gegenüber der AfD teilweise als Verstoß gegen die Chancengleichheit gewertet. Es ging dabei jedoch immer um staatliche Öffentlichkeitsarbeit: die Webseite des Innenministeriums, eine Pressekonferenz von Angela Merkel, eine Pressemitteilung der Berliner Bildungsministerin zur AfD.

Doch das Landesverfassungsgericht Rheinland-Pfalz hat klargestellt, dass auch eine Verletzung der Chancengleichheit der Parteien gerechtfertigt sein kann, wenn sie dem Schutz der FDGO dient. So war der Aufruf der ehemaligen Ministerpräsidentin Malu Dreyer, an einer Demonstration „gegen Rechts“ teilzunehmen und rechtsextreme Deportationsfantasien klar zu benennen, zulässig, weil er dem Schutz der freiheitlich demokratischen Grundordnung diente und nicht willkürlich oder unsachlich war.

Das bedeutet: Wer in amtlicher Funktion spricht, muss zwar besonders auf die Chancengleichheit der Parteien achten, darf aber menschenwürdewidrige Positionen klar benennen – auch wenn dies der Haltung einer einzelnen Partei widerspricht. 

Schule: Wie Lehrkräfte Haltung zeigen können

Gerade an Schulen versucht die AfD, das Neutralitätsgebot zur Einschüchterung zu nutzen, etwa über Meldeportale, in denen Schüler*innen Lehrkräfte wegen angeblicher „Parteinahme“ melden sollten. Tatsächlich sind Lehrkräfte ähnlich wie Beamt*innen zur Treue zur Verfassung verpflichtet, und Schulgesetze verlangen, dass Unterricht der Achtung und Verwirklichung der Werte des Grundgesetzes dient.

Die Leitlinie dafür ist seit Jahrzehnten der sogenannte Beutelsbacher Konsens, der Grundsätze für die politische Bildung vorgibt: Schüler*innen sollen nicht „überwältigt“, also etwa mit einer Meinung so überrumpelt werden. Themen, die gesellschaftlich umstritten sind, sollen auch als kontrovers und nicht nur einseitig dargestellt werden. Und Schüler*innen sollen zur eigenen demokratischen Urteilsbildung befähigt werden. Das heißt aber nicht, dass rechtsextreme, rassistische oder menschenfeindliche Aussagen im Unterricht „neutral“ stehen gelassen werden müssten. Im Gegenteil: Sie sollen eingeordnet und mit den Werten des Grundgesetzes konfrontiert werden.

Gerichtliche Entscheidungen haben bestätigt, dass politische Zeichen, die dem Schutz von Minderheiten dienen – wie eine Progress-Pride-Flagge in einem Grundschulhort –, zulässig sind. Ebenso kann eine Schule ein Praktikum bei einem Abgeordneten der AfD untersagen, gerade wenn der entsprechende Landesverband der Partei als gesichert rechtsextrem eingestuft ist. Lehrkräfte dürfen also im Rahmen ihres Bildungsauftrags klar gegen Rechtsextremismus auftreten, solange sie sachlich bleiben, Schüler*innen nicht überwältigen und kontroverse Themen als solche kenntlich machen.

Hochschule: Wissenschaftsfreiheit und politisches Engagement

An Hochschulen gilt die Wissenschaftsfreiheit, die nicht durch eine allgemeine Neutralitätspflicht begrenzt wird. Im wissenschaftlichen Bereich gibt es keine Inhaltskontrolle im Sinne einer politischen Mäßigung. Professor*innen und Studierende dürfen forschen, veröffentlichen und argumentieren, auch zu Rechtsextremismus und autoritäre Tendenzen und auch ganz konkret zu Parteien.

Politisches Engagement von Studierenden – zum Beispiel Bündnisse gegen Rechts, Veranstaltungen, Banner oder Demonstrationen – steht kein Neutralitätsgebot entgegen, sondern eher Hausordnungen und hochschulrechtliche Regelungen. Manche Universitäten haben Proteste unter Hinweis auf Neutralität oder Hausordnung unterbunden, andere dulden seit Jahren politische Banner und Aktionen. Ein Gericht hat betont, dass ein Banner mit der Aufschrift „AFD-JUGEND STOPPEN“ nicht entfernt werden musste, weil die Uni politische Banner generell duldet und die Meinungsfreiheit der Studierenden sowie die Hochschulselbstverwaltung zu berücksichtigen sind.

Verfasste Studierendenschaften (AStA) haben ein hochschulpolitisches Mandat. Sie dürfen sich politisch äußern, solange ein Bezug zu den Belangen der Studierenden und zur Hochschule erkennbar bleibt. Praktisch heißt das: Proteste gegen rechtsextreme Akteur*innen, die das Campusklima, die Sicherheit oder die Chancengleichheit von Studierenden berühren, können von diesem Mandat gedeckt sein.

Remonstration: Wenn Widerspruch im Staatsdienst Pflicht ist

Für verbeamtete Personen gilt nicht nur die Pflicht zur Gesetzestreue, sondern auch zur Remonstration: Wenn Zweifel an der Rechtmäßigkeit einer Weisung bestehen, müssen sie diese gegenüber Vorgesetzten anmelden. Geschieht das nicht, kann die betroffene Person später selbst für rechtswidriges Handeln verantwortlich gemacht werden.

Wer also eine Anordnung erhält, die möglicherweise Grundrechte verletzt oder offenkundig unverhältnismäßig ist, sollte dies schriftlich begründen, eine Überprüfung verlangen und im Zweifel auch eine höhere Dienststelle einbeziehen. Wenn eine Maßnahme klar rechtswidrig bleibt, ist es möglich und geboten, die Mitwirkung zu verweigern. Ein Beispiel dafür ist der Fall geplanter Ausweisungen von Studierenden in Berlin, die nach palästina-solidarischen Protesten erfolgen sollten. Eine verantwortliche Beamtin remonstrierte, weil die Maßnahme nur auf Ermittlungsberichten ohne Verurteilung beruhte. Das Gericht stoppte später die Ausweisungen. 

Zivilgesellschaft und Vereine: Politisch aktiv trotz Gemeinnützigkeit

Zivilgesellschaftliche Organisationen werden zunehmend unter Druck gesetzt. Ein Mittel sind etwa umfangreiche parlamentarische Anfragen, in denen schon die Ausübung von Grundrechten wie der Versammlungsfreiheit mit Misstrauen betrachtet wird. Trotzdem gilt: Für Vereine gibt es kein allgemeines staatliches Neutralitätsgebot. Gemeinnützige Vereine müssen zwar parteipolitisch neutral im steuerrechtlichen Sinn bleiben, also keine einzelne Partei direkt fördern. Sie dürfen aber politisch wirken, wenn dies ihrem Satzungszweck entspricht.

Deshalb ist es wichtig, Satzungen klar zu formulieren: Wer Anti-Rassismus-Arbeit, Gleichberechtigung oder, Klimaschutz ausdrücklich als Vereinszweck in der Satzung verankert, kann zu diesen Themen auch deutlich Stellung beziehen. Die Kritik sollte sich primär gegen rechtsextreme Inhalte und menschenwürdewidriges Verhalten richten, nicht pauschal gegen eine Partei als solche. 

Fazit: Widerstand ist Pflicht

In einer wehrhaften Demokratie ist Neutralität gegenüber menschenverachtendem Verhalten keine Pflicht, sondern das Problem. Neutralitätspflichten sind eng begrenzt und können nicht als allgemeiner Maulkorb gegen Engagement für Menschenwürde und Demokratie verstanden werden. Wer sich auf die freiheitlich demokratische Grundordnung beruft, menschenwürdefeindliche Positionen klar benennt und seine Rolle reflektiert, bewegt sich in der Regel auf sicherem rechtlichen Boden.

Wenn ihr mit dem Vorwurf fehlender Neutralität konfrontiert werdet, lohnt es sich, ruhig zu bleiben, die eigene Rolle zu klären, Vorgänge zu dokumentieren und rechtliche Unterstützung in Anspruch zu nehmen. Keiner muss neutral sein gegenüber Rassismus, Antisemitismus, Sexismus oder anderen Formen von Menschenverachtung – ihr dürft, und in vielen Funktionen müsst ihr ihnen entschieden entgegentreten.

Der Gegenrechtsschutz von FragDenStaat und der Gesellschaft für Freiheitsrechte unterstützt euch, wenn Behörden autoritär handeln und eure Rechte missachten. Wir verteidigen euer demokratisches Engagement, Presse- und Wissenschaftsfreiheit gegen juristische Angriffe von rechts und informieren auch zum Neutralitätsgebot.

→ Hier gibt’s den Vortrag „Wer hat Angst vor dem Neutralitätsgebot?“ von Hannah Vos und Vivian Kube auf dem Chaos Communication Congress 39C3


❤️ Hilf mit! Stärke die Informationsfreiheit mit Deiner Spende.

Read the whole story
jhunorss
18 days ago
reply
Share this story
Delete

Dobrindts Grenzpolitik: Rechtsbruch mit Ansage

1 Share

Der Innenminister verstößt mit seiner Grenzpolitik womöglich gegen EU-Recht. Seine eigenen Fachleute warnten davor. Doch interne Dokumente zeigen das Kalkül: Bis ein Gericht das Ganze stoppt, spielt er auf Zeit. 

Keine 24 Stunden ist Alexander Dobrindt (CSU) im Amt, als er den ersten Rechtsbruch anordnet. Am 7. Mai 2025 weist der Innenminister die Bundespolizei an, Asylsuchende an den Grenzen zurückzuweisen. Ein Vorgehen, das inzwischen mehrere Gerichte für rechtswidrig erklärt haben. Nun ist klar: Dobrindts eigene Beamt*innen aus dem Innenministerium warnten, dass die Zurückweisungen rechtlich nicht haltbar sein würden. Doch dem Minister schien es nicht darum zu gehen, ob der Schritt rechtmäßig ist, sondern wie lange er sich halten lässt, bis ihn ein Gericht stoppt.  

Wir veröffentlichen die internen Dokumente zu Dobrindts Grenzpolitik. Die mehr als tausend Seiten zeigen, wie früh im Ministerium vor einem Rechtsbruch gewarnt wurde – und Dobrindt die Warnungen ignorierte. Der Spiegel hat im März bereits über die Dokumente berichtet.

Sowohl der Spiegel als auch wir haben die Dokumente über das Informationsfreiheitsgesetz erhalten – also über das Gesetz, das Dobrindt faktisch abschaffen will. Laut einem internen Dokument, über das die Tagesschau berichtet hat, sollen auch wir und unsere Anfrage-Plattform unmöglich gemacht werden. Ohne das Informationsfreiheitsgesetz wäre die folgende Rekonstruktion nicht möglich. 

Union und SPD wollen das Informationsfreiheitsgesetz entkernen. Dagegen wehren wir uns mit allen Mitteln – und Deiner Hilfe! Hier kannst Du uns unterstützen.

Neue Belege zu Anzeige

Im Juni 2025 haben wir Dobrindt wegen seiner Weisung, Asylsuchende an der Grenze abzuweisen, angezeigt. Die Staatsanwaltschaft teilte uns jedoch mit, es gebe keinen Verdacht, dass Dobrindt wissentlich rechtswidrige Weisungen erteilt habe. Die nun veröffentlichten Dokumente liefern Belege, dass Dobrindt bewusst einen Rechtsbruch in Kauf genommen hat.

Mehr Infos zur Anzeige

Damals stellten wir Anzeige, weil Dobrindt mit der Weisung Untergebene – in dem Fall Bundespolizist*innen – zu einer Straftat verleiten könnte. Die Staatsanwaltschaft hat die Anzeige geprüft, konnte aber keinen Anfangsverdacht feststellen. Es seien keine „tatsächlichen Anhaltspunkte“ gegeben, dass Dobrindt wissentlich rechtswidrige Anweisungen erteilt habe. Vielmehr dürfte er von einer Vereinbarkeit der Zurückweisungen mit dem EU-Recht ausgegangen sein. Insbesondere gebe es keine Hinweise, dass die „jeweiligen Verwaltungsmitarbeiter zu einer kategorischen Nichtanwendbarkeit des Artikel 72 AEUV“ gelangten und Dobrindt dahingehend gebrieft hätten. Das sei lediglich eine Mutmaßung des Anzeigenstellers. Die nun veröffentlichten Dokumente belegen, dass Dobrindt entgegen der Annahme der Staatsanwaltschaft Bescheid wusste und einen Rechtsbruch in Kauf nahm.

Chronologie eines Rechtsbruchs

Ende August/Anfang September 2024
Bereits während der Ampel-Regierung unter Bundesinnenministerin Nancy Faeser (SPD) prüft das Ministerium, ob es möglich ist, Asylsuchende an den Grenzen zurückzuweisen. Auslöser ist der islamistische Messerangriff in Solingen. Daraufhin fordert der damalige Oppositionspolitiker Friedrich Merz (CDU) öffentlich, Asylsuchende an den Grenzen zurückzuweisen. 

Die Fachabteilung kommt zu dem Ergebnis, dass Zurückweisungen „aus fachlicher Sicht mit erheblichen rechtlichen und politischen Risiken verbunden“ wären. Die Entscheidung ließe sich letztlich nur politisch treffen. 

„Mit erheblichen rechtlichen und politischen Risiken verbunden“

„Mit erheblichen rechtlichen und politischen Risiken verbunden“
E-Mail vom 28. August 2024

Wenige Tage später wird die Fachabteilung noch deutlicher. Man habe „intensiv geprüft“, das Ergebnis sei „eindeutig“. Die Zurückweisungen seien „europarechtlich nicht tragfähig, innenpolitisch fragwürdig und europapolitisch gefährlich“. 

„Europarechtlich nicht tragfähig“

„Europarechtlich nicht tragfähig“
Gesprächsvorbereitung für Minister*innenrunde zum Sicherheitspaket am 09. September 2024

Im Zentrum steht schon damals ein Artikel, der später Dobrindts Weisung tragen soll: Artikel 72 des Vertrags über die Arbeitsweise der EU (AUEV). Er beinhaltet eine juristische Ausnahme, die es Mitgliedstaaten ermöglicht, sich in bestimmten Fällen über EU-Recht hinweg zu setzen. Die Hürde ist sehr hoch, bislang hat kein Staat sie überwunden. Um sich darauf berufen zu können, bräuchte Deutschland belastbare Daten, die zeigen, dass die öffentliche Sicherheit und Ordnung gefährdet sind. Solche Daten lägen nicht vor, schreibt das Ministerium. Zudem stellt die Abteilung fest: Der Vorschlag aus der CDU, sich auf Artikel 72 zu berufen, ist ein Vorschlag der AfD.

Belastbare Daten liegen derzeit nicht vor

Belastbare Daten liegen derzeit nicht vor
Sachdarstellung für Frage aus dem Bundestag vom 11.09.2024

16. September 2024
Bundesinnenministerin Faeser weitet die Grenzkontrollen aus. Schutzsuchende können dennoch einen Asylantrag an den Grenzen stellen. 

6. November 2024 
Die Ampel-Koalition zerbricht und der Wahlkampf verändert die politische Tonlage. Die Union und ihr Kanzlerkandidat Merz versprechen, Schutzsuchende an der Grenze abzuweisen, sodass sie keinen Asylantrag stellen können. 

29. Januar 2025
Wie ernst es der Union mit ihrer Migrationspolitik ist und welche Grenzen sie dafür bereit ist einzureißen, zeigt sich bei der Abstimmung zum sogenannten 5-Punkte-Plan: Erstmals schafft die Union mit Stimmen der AfD eine Mehrheit für einen Entschließungsantrag – eine Absichtserklärung, die rechtlich nicht bindend ist, die Regierung allerdings zum Handeln auffordert. Das macht absehbar, wie die Migrationspolitik unter Bundeskanzler Friedrich Merz aussehen wird.

30. Januar 2025
Ein leitender Beamter aus dem Bundesinnenministerium bereitet sich vor. Der parteilose Staatssekretär Bernd Krösser bittet um eine Einschätzung, wie wahrscheinlich es sei, dass die EU gegen Deutschland gerichtlich vorgeht, wenn Asylsuchende an den Grenzen zurückgewiesen werden. Die Fachabteilung hält das für wahrscheinlich und rechnet vor, wie lange ein solches Verfahren dauern würde – insgesamt mehr als ein halbes Jahr. 

„Erst nach einiger Zeit“

„Erst nach einiger Zeit“
Sachdarstellung nach einer mündlichen Aufforderung von Staatssekretär Krösser vom 30. Januar 2025

Das bringt Staatssekretär Krösser zu einem Schluss, der später unter Dobrindt den Weg vorgibt: Bewusster Rechtsbruch. Es sei von einem „längeren Zeitraum“ auszugehen, bis der Europäische Gerichtshof (EuGH) über ein Eilverfahren entscheiden würde, als bislang angenommen. Das würde die Position derer stärken, „die zwar auch davon ausgehen, dass ein solches Vorgehen Deutschlands vor dem EuGH keinen Bestand hätte, aber man die Maßnahme ‘einfach mal macht, weil es dauert bis sie aufgehoben werden muss und sie in dieser Zeit ja faktisch wirkt’“. „Negative Folgen“ habe Deutschland ohnehin kaum zu befürchten. Im schlimmsten Fall müssten die Maßnahmen eben wieder gestoppt werden. 

Einfach machen

Einfach machen
Anmerkung von Staatssekretär Krösser vom 20. Januar 2025

23. Februar 2025 
Bei der Bundestagswahl wird die Union stärkste Fraktion im Bundestag. Merz bringt sich als Kanzler in Stellung. 

9. April 2025
Die Koalitionsvereinbarung wird veröffentlicht. Darin steht das migrationspolitische Ziel der Regierung: Asylsuchende sollen an den Grenzen zurückgewiesen werden

7. Mai 2025 
Alexander Dobrindt ist noch keine 24 Stunden Bundesinnenminister, als er die entscheidende Weisung unterzeichnet. Asylsuchende sollen ohne Prüfung an den Grenzen zurückgewiesen werden. Als Rechtsgrundlage nennt er in der Pressekonferenz Artikel 72 AEUV – jener Artikel, von dem seine eigene Fachabteilung mehrfach gesagt hatte, er lasse sich hier nicht anwenden. 
 

Schutzsuchenenden die Einreise verweigern

Schutzsuchenenden die Einreise verweigern
Weisung von Bundesinnenminister Dobrindt vom 7. Mai 2025

Mai 2025
Nach Dobrindts Weisung und der Pressekonferenz schicken die zuständigen Fachabteilungen zahlreiche Emails hin und her. In der Folge verschwindet der Hinweis auf den fragwürdigen Artikel 72. Am 7. Mai 2026 findet sich der Verweis auf Artikel 72 noch in einer Sprachregelung für die Presse. Zwei Tage später ist das geändert. Aus „in Anwendung von Artikel 72“ wird „im Einklang mit europäischen Recht“. 

Statt Artikel 72 nur „im Einklang mit europäischem Recht“

Statt Artikel 72 nur „im Einklang mit europäischem Recht“
Sprachregelung für Presse- und Öffentlichkeitsarbeit vom 15. Mai 2025

Die Fachabteilung erklärt in einer E-Mail, dass für Dobrindts Berufung auf Artikel 72 „bislang kein Sachverhalt bekannt ist, mit der diese Anwendung begründet werden soll“ und die Sprachregelung entsprechend geändert werden soll. 

„Bislang kein Sachverhalt bekannt“

„Bislang kein Sachverhalt bekannt“
E-Mail zur Änderung der Sprachregelung für Presse- und Öffentlichkeitsarbeit vom 15. Mai 2025

20. Mai 2025
Auch andere Ministerien gehen auf Distanz. Das Bundeskanzleramt und das Bundesjustizministerium streichen Artikel 72 aus ihren öffentlichen Stellungnahmen. 

Aus öffentlicher Stellungnahme gestrichen

Aus öffentlicher Stellungnahme gestrichen
Vermerk vom 20. Mai 2025

2. Juni 2025
Nach nur wenigen Tagen landet Dobrindts umstrittene Weisung vor Gericht. Das Berliner Verwaltungsgericht entscheidet, dass die Zurückweisung von Asylsuchenden gegen EU-Recht verstößt. Das Gericht macht auch klar, dass sich die Regierung nicht auf Artikel 72 berufen könne. Es fehle an der Darlegung, dass die öffentliche Sicherheit und Ordnung gefährdet sei.

Dobrindts Strategie: Gerichte ignorieren, Transparenz abschaffen

Trotz der Gerichtsentscheidung setzt Dobrindt seine Politik fort. Seine rechtswidrige Strategie scheint bislang aufzugehen. Die EU-Kommission hat bisher keine Klage eingereicht. Auch die Verfahren bei nationalen Gerichten, die bisher ausnahmslos gegen Dobrindts Grenzpolitik entschieden wurden, ignoriert er. Bislang setzt sich die Bundesregierung mit dem Argument darüber hinweg, es handle sich dabei bloß um Einzelfallentscheidungen.

Ein Urteil, das die Praxis insgesamt kippt, gäbe es erst am Ende eines jahrelangen Wegs durch die Instanzen bis zum Bundesverwaltungsgericht oder zum EuGH. Und den müssten ausgerechnet die Betroffenen selbst gehen. Es sind Schutzsuchende, die vor allem wollen, dass ihr Aufenthalt gesichert ist. Für einen Musterprozess über Jahre bleibt da wenig Kraft. 

Anfang Juni 2026 forderte die EU-Kommission Deutschland auf, die Kontrollen zu beenden. Doch Dobrindt möchte die Grenzkontrollen nach der Ankunft Zehntausender Menschen in der spanischen Exklave Ceuta sogar verlängern. Wie schief seine Rechtfertigungen gegenüber Brüssel sind, haben wir bereits gezeigt. Eine belastbare Begründung für den behaupteten Ausnahmefall hat der Minister bis heute nicht geliefert. 

Stattdessen greift Dobrindt nun das Gesetz an, das eine Politik offenlegt: das Informationsfreiheitsgesetz.

Zur Anfrage

Zu den Dokumenten

 


❤️ Hilf mit! Stärke die Informationsfreiheit mit Deiner Spende.

Read the whole story
jhunorss
19 days ago
reply
Share this story
Delete
Next Page of Stories