How to Perform DNS and SMTP Checks in Akka Streaming Jobs with Scala
Learn how to integrate DNS and SMTP validation into Akka streaming jobs using Scala. Reduce bounces, improve deliverability, and clean lists at scale with.
Why DNS and SMTP checks matter in real-time email validation
You’re processing thousands of email addresses per second in an Akka Streaming job. One bad address might seem trivial—but when it’s part of a stream, that one invalid email can silently propagate errors, waste bandwidth, and delay downstream logic. You don’t want to send to addresses that don’t exist—or worse, to those that reject messages outright.
DNS and SMTP checks are the first line of defense. They catch invalid or non-responsive addresses early, before you commit resources to sending a message that will fail. In real-time streaming, where every millisecond counts, this isn’t just cleanup—it’s optimization.
how to perform DNS and SMTP checks in Akka streaming jobs with Scala isn’t just a technical question. It’s about reducing bounces, protecting your sender reputation, and ensuring your pipeline doesn’t drown in failed deliveries. Without them, even a small fraction of bad emails can trigger rate limits or blacklist warnings.
Key takeaways
- DNS and SMTP checks in Akka Streaming reduce bounce rates by validating email addresses before outbound delivery.
- Early validation prevents resource waste on non-responsive or invalid emails in high-throughput streaming pipelines.
- Unverified emails, even at low volume, degrade sender reputation and increase the risk of spam filter triggers over time.
What DNS and SMTP checks actually verify in a streaming pipeline
You’re verifying email addresses in a real-time Akka streaming job when DNS and SMTP checks work together: DNS resolves the domain’s MX record to confirm the email domain exists and accepts mail, while SMTP simulates the initial handshake with the mail server to test if the full address is accepted. Together, they reduce false positives from catch-all domains and temporary server issues, keeping your pipeline accurate and reliable.
DNS checks confirm the domain is mail-ready
In Akka streaming, DNS lookups happen first. They resolve the MX record — the authoritative pointer to the mail server responsible for a domain. Without a valid MX record, the domain either doesn’t handle email or lacks formal mail routing, meaning any address on it is likely invalid.
It’s not just about existence. A valid MX record also signals that the domain is set up to receive messages. You’re not just checking if an address ends in “@example.com” — you’re confirming the domain can receive mail at all. This early filter stops garbage data from advancing to more costly SMTP checks.
For example, a domain like “no-mail.com” might have no MX record at all. Skipping such domains early saves time and bandwidth, especially when processing thousands of addresses per second. The RFC 5321 specification details how mail routing is defined via MX records — a foundational layer for email deliverability. Learn more about mail transfer standards.
SMTP checks validate the full address by simulating delivery
Once the domain is confirmed, SMTP checks step in. They simulate the initial handshake: HELO, MAIL FROM, and RCPT TO commands. The server responds with a 250 code if the address is accepted, or a 5xx error if it’s rejected.
While some address formats pass DNS, the server might still reject them. This is key in streaming jobs — you’re not just checking syntax, but real-time server behavior. An inbox like [email protected] might have the right domain, but the server denies RCPT TO if the user doesn’t exist.
Combined with DNS, SMTP avoids false positives. A catch-all domain will accept *any* address at the SMTP level, but with only DNS, you’d still think it’s valid. By requiring both checks, your stream excludes these false leads — especially important when building customer lists or campaigns.
Tools like bulk verification or real-time API checks automate this dual-layer validation without blocking your Akka stream. You’re not just scrubbing data — you’re ensuring every address has a chance to land in a real inbox.
How to perform DNS and SMTP checks in Akka streaming jobs with Scala
You can validate email addresses in Akka Streams by ingesting them from Kafka or a file, extracting domains, resolving MX records via Netty’s DnsNameResolver, then testing SMTP responsiveness by connecting to port 25 or 587, sending EHLO, MAIL FROM, and RCPT TO commands, and filtering out failed or invalid results. Valid, invalid, and suspicious addresses are logged or forwarded downstream for action.
Set up the streaming pipeline
- Use Akka Streams’
Sourceto read email addresses from Kafka, a file, or another external source. This ensures backpressure and fault tolerance across large data volumes. - Apply a
mapstage to extract the domain from each email using a simple regex or string split. This allows you to route validation to the correct mail server. - Use Netty’s
DnsNameResolverto perform DNS lookups for MX records. This is the standard way to find the actual email server responsible for a domain and confirms it’s not a typo or dead domain.
Validate via SMTP handshake
- For domains with successful MX resolution, initiate a TCP connection to port 25 (SMTP) or port 587 (submission). Use Akka TCP client or Netty’s
Bootstrapto handle the connection lifecycle. - Send the
EHLOcommand to start the SMTP session. The server should respond with a 250 code if it’s ready. - Issue the
MAIL FROM:<[email protected]>command. This simulates a sender—some servers reject invalid or malformed addresses here. - Follow with
RCPT TO:<[email protected]>for the target address. If the server returns a 5xx error (e.g., 550, 553), the address is invalid or rejected. - Interpret the response codes: 2xx = valid, 5xx = invalid, 4xx = temporary failure. Use this logic to filter and route each email accordingly.
- Log or emit the result (valid/invalid/risky) to downstream sinks like Kafka, a database, or a monitoring system for further action. Be sure to handle timeouts and connection resets in production.
To avoid reinventing the wheel, consider integrating a third-party email verification service like EmailListChecker’s API for higher accuracy and reduced infrastructure overhead. It handles DNS, SMTP, and syntax checks at scale with 98.9% accuracy.
For batch processing, tools like Bulk Verification can pre-validate large lists before streaming. This reduces unnecessary network calls and improves overall throughput.
SMTP validation follows industry standards—see RFC 5321 for the full protocol specification. DNS resolution aligns with DNS standards (RFC 1034, RFC 1035). Always respect throttling and avoid sending too many requests to avoid being blacklisted.
Common pitfalls when validating emails in real-time streaming
Validating emails in Akka streaming jobs with DNS and SMTP checks is risky if you don’t handle load, timeouts, and retries properly. You’ll stall your pipeline, trigger IP blocks, or break throughput guarantees if you blindly connect to every email in a stream without rate control. The key is balancing depth of validation against system stability—especially when scaling to thousands of checks per second.
Overloading mail servers with unbounded connection attempts
You can’t treat every email like a low-volume test. Aggressive DNS and SMTP probes in a streaming job can overwhelm mail servers, especially if you’re hitting the same domain repeatedly. Many providers implement connection rate limits; exceeding them triggers IP-level throttling or temporary blacklisting. If your Akka stream opens dozens of connections per second to the same domain, you risk being tagged as a spam source, not a valid client.
Instead of probing all emails in parallel without bounds, apply domain-level batching and exponential backoff. Tools like RFC 7231 define HTTP semantics for retry behavior, but similar principles apply: respect remote server limits. Your stream should not assume all domains will respond instantly or without rate restriction.
Ignoring timeouts and malformed responses
If you don’t set a hard timeout on each DNS or SMTP connection, your Akka stream can stall indefinitely. A single misbehaving server or network hiccup can block a stream stage for minutes, violating your real-time processing promises. This isn’t just about responsiveness—it’s about avoiding resource exhaustion.
Malformed or unexpected responses from mail servers are common, especially during maintenance or misconfiguration. If your code assumes every response follows a predictable structure, you’ll hit unhandled exceptions. Always wrap external calls in resilient actors or guards. Use structured error handling to mark messages as invalid instead of crashing the pipeline. For example, use akka.stream.stage.Stage or AskPattern with bounded timeouts to avoid hangs.
For production-grade email validation, consider offloading the heavy lifting. You can verify email lists at scale using real-time verification APIs that implement these safeguards by default—including built-in rate limiting, timeout policies, and IP reputation tracking. These services handle the edge cases so your stream stays stable and your inbox placement remains high.
How to prevent your application from being flagged as spam
You reduce spam risk in Akka streaming jobs by isolating verification traffic, throttling checks to respect server limits, and pacing domain-level requests. This avoids triggering abuse detection systems that flag rapid, high-volume validation as spam-like behavior. Use a dedicated IP, implement exponential backoff, and limit concurrent checks per domain.
Key practices to avoid abuse flags
- Use a dedicated IP address for your verification jobs. Mixing verification traffic with transactional email volumes can correlate your IP with spam behavior, even if your content is clean. A dedicated IP allows your sender reputation to be evaluated independently.
- Apply exponential backoff between SMTP and DNS checks. Starting at 1 second and doubling on each retry (with a cap at 30 seconds) keeps your request rate within typical mail server limits. This mimics human-like pacing and reduces the chance of your IP being rate-limited.
- Limiter concurrent checks per domain. Most mail servers limit connections from a single IP to 3–5 concurrent checks. Exceeding this can trigger anti-abuse systems. Use a domain-level semaphore or queue to enforce this rule across your Akka stream.
- Respect RFC 5321 and RFC 5322 guidelines for legitimate email validation. Avoid sending full SMTP HELO/EHLO commands or trying to deliver to non-existent addresses. Only verify the existence of the mailbox and its syntax via DNS and SMTP checks, not delivery.
- Monitor your IP’s reputation using public blocklists like Spamhaus or MXToolbox. These tools provide real-time feedback on whether your IP is associated with spam activity — a key signal for email providers.
Integrate tools that automate safe verification
Instead of manually implementing backoff and throttling in Akka, use a verified service that handles these concerns for you. For example, EmailListChecker’s API performs DNS and SMTP validation while respecting rate limits, backoff, and domain pacing — all built-in. You can integrate it directly into your Akka stream via HTTP calls, with minimal code and maximum reliability.
For large-scale list cleaning, Bulk Verification lets you validate thousands of addresses with the same safeguards, ensuring your lists stay clean and your sender reputation intact. The service is designed to avoid abuse flags by distributing load across servers and adhering to email provider standards.
Deliverability is not just about content — it's about how you send.
When to offload validation to a third-party SaaS like Emaillistchecker.io
You should offload email validation to a SaaS like Emaillistchecker.io when you need accuracy beyond custom DNS/SMTP checks—real-world results show 98.9% precision—and when you need to test inbox placement, not just syntax or basic reachability. If your Akka streaming job handles high-volume lists or must filter out disposable domains, role accounts, or catch-alls efficiently, a dedicated service saves time and reduces false positives.
Accuracy and speed are non-negotiable in production pipelines
Running DNS lookups and SMTP handshakes in Akka streams gives you control, but it's fragile. You're exposed to timeouts, greylisting delays, and ambiguous responses—especially with catch-all domains. Emaillistchecker.io uses multi-layered validation, including real SMTP trials and behavioral analysis, which consistently outperforms raw implementation in both speed and correctness. A single poorly tuned socket timeout in your stream can inflate bounce rates by 15–20% in real traffic.
For teams managing hundreds of thousands of emails, processing time matters. Even optimized DNS queries add up. Emaillistchecker.io’s bulk verification engine returns full results in under 10 seconds per 1,000 emails, which is hard to match with custom logic at scale. This isn't just faster—it means you’re not blocking your stream while waiting on unreliable network responses.
Deliverability testing and intelligent filtering go beyond validity
Bounce rates and blocklist hits don’t just hurt engagement—reputation damage is real and cumulative. You can't tell if an email is “valid” and still land in spam with poorly configured headers or weak sender reputation. You need inbox placement testing, which only SaaS providers with historical data can offer. Emaillistchecker.io’s inbox placement tool simulates real-world delivery across major providers like Gmail, Outlook, and Yahoo, using data collected from thousands of test campaigns.
It also detects disposable domains (like mailinator.com), role accounts (admin@, support@), and known spam traps—all indicators you want to catch before sending. For example, 60% of role-based emails in a list will fail to engage, and many are marked as high-risk by anti-spam systems. Manually filtering these with regex or lists is error-prone. Emaillistchecker.io does it in near real time, with data fed from verified sources like Spamhaus and MxToolbox—an industry-standard reference for spam infrastructure.
While you can simulate some checks, the cost of a misconfigured stream—wasted sends, blacklisting, ruined sender reputation—is too high. For high-throughput, high-integrity streaming jobs, leveraging a proven SaaS is more reliable than rolling your own. If you're building on Akka, you’re already in a production-grade environment: your email validation shouldn’t be the weak link.
See how it works: bulk verification, API integration, or inbox placement testing for real-world delivery checks. You get 100 free verifications to start—no expiration.
How to integrate Emaillistchecker.io’s real-time API into Akka Streams
You can integrate Emaillistchecker.io’s real-time API into Akka Streams by using Akka HTTP or HttpClient within a map stage to call the endpoint for each email. The API returns a verdict—valid, invalid, catch-all, or risky—along with HTTP status codes and TTL values to guide retries. Process results through a sink with structured output like JSON or Kafka for auditability and reporting.
Set up the HTTP client and map to API calls
- Initialize an Akka HTTP client or HttpClient instance in your stream’s context. This handles the HTTP transport layer and manages connections efficiently.
- Use the
mapoperator to transform each incoming email into an HTTP request to Emaillistchecker.io’s verification API. Include the email and your API key in the request body. - Parse the response into a case class or map that captures the verdict, HTTP status code, and TTL (time-to-live) value. This enables consistent downstream logic.
Handle responses and manage failures safely
- Check the HTTP status code: 200 means success. 429 indicates rate limiting—wait and retry with exponential backoff, as defined in RFC 6585.
- Use the TTL value to decide if results can be cached. Short TTLs (e.g., under 30 minutes) indicate volatile data; do not cache. Long TTLs may allow temporary storage.
- If the response is 4xx or 5xx, apply a retry policy (e.g., max 3 attempts with jitter). Never retry indefinitely—use a bounded backoff to avoid overwhelming the service.
- For
invalidorcatch-allverdicts, route to a rejection sink for logging.riskyemails should be flagged in the audit trail without blocking the stream. - Finalize output by writing structured data—JSON or to a Kafka topic—via a
sink. Use the integration features if syncing with tools like Kafka or AWS S3.
When you’re working with high-throughput streams, consistent retry logic and TTL handling prevent data loss while respecting rate limits. You’re not just validating—it’s about building resilient, auditable pipelines.
Real-time email verification isn’t about catching every bad address; it’s about reducing bounce rates and protecting sender reputation, especially at scale.
Using Emaillistchecker.io’s API, you get a 98.9% accuracy rate on validations, which translates directly into better deliverability over time. The service supports both bulk processing (via bulk verification) and real-time checks, giving you flexibility across your data pipeline use cases.
For more details on using the API in production systems, refer to the official documentation and consider testing with real endpoints using tools like Spamhaus or RFC 5321, which define SMTP behavior and sender policies.
What email verification verdicts mean in practice
You need to understand email verification verdicts to filter out invalid, risky, or unreliable addresses in your Akka streaming jobs. A "valid" address is confirmed to exist and accept mail. "Invalid" means the domain doesn’t resolve or the server rejects the address outright. "Catch-all" domains accept all emails—useful for routing but bad for engagement. "Risky" flags syntactically valid addresses like noreply@ or admin@, which are often role-based, disposable, or low engagement. These signals help you clean lists before sending.
What each verdict means in your stream processing pipeline
- Valid: The email address passed DNS MX checks and SMTP validation. The server responded with a 250 code—meaning delivery is likely. Use these addresses in production streams without delay.
- Invalid: The domain fails DNS resolution, or the SMTP server returns a hard bounce (e.g., 550 code). This is a permanent failure. Remove these from any downstream processing to avoid send failures.
- Catch-all: The server accepts all emails regardless of existence. Common in shared hosting setups or outdated mail systems. High risk of bounce or spam scoring. Filter these out early to preserve sender reputation.
- Risky: Format is valid but patterns suggest low engagement. Examples:
noreply@,info@,admin@, or temporary domains. These are often automated or low-intent. Use caution when including them in targeted campaigns.
How to act on verification results in Akka Streams
Let’s say you're processing email lists in a stream. You should filter out invalid and catch-all addresses early using a filter stage. For risky addresses, consider tagging them for further validation or applying different delivery logic—like sending to a separate, lower-priority queue. This protects deliverability and prevents wasted resources.
| Item | Details |
|---|---|
| Valid | The email address passed DNS MX checks and SMTP validation. The server responded with a 250 code—meaning delivery is likely. Use these addresses in production streams without delay. |
| Invalid | The domain fails DNS resolution, or the SMTP server returns a hard bounce (e.g., 550 code). This is a permanent failure. Remove these from any downstream processing to avoid send failures. |
| Catch-all | The server accepts all emails regardless of existence. Common in shared hosting setups or outdated mail systems. High risk of bounce or spam scoring. Filter these out early to preserve sender reputation. |
| Risky | Format is valid but patterns suggest low engagement. Examples: noreply@, info@, admin@, or temporary domains. These are often automated or low-intent. Use caution when including them in targeted campaigns. |
According to an RFC 5321 specification, SMTP servers must respond with distinct codes to indicate acceptability or rejection. This is the foundation of real-time validation. Tools like RFC 5321 define the standard, but in practice, not all servers adhere strictly—especially catch-all domains. This is why DNS and SMTP checks in Akka must be stateful and resilient.
For bulk email list cleanup before ingestion into streams, consider bulk verification using Emaillistchecker.io. It applies real-time checks across thousands of email addresses, returning verdicts that integrate directly into your streaming logic.
Proper verification verdicts mean you don’t just clean lists—you reduce bounce rates, protect sender reputation, and improve inbox placement.
For real-time validation in your Akka Streams, use the verification API to query individual addresses as they arrive. It integrates cleanly with Scala-based backends and returns structured results, including verdicts and metadata.
You might also need to extract new leads. Try our email finder to augment your dataset with valid addresses. Use the inbox placement test to validate your deliverability before launching campaigns.
Emaillistchecker.io’s role in maintaining list hygiene at scale
You can maintain clean, deliverable email lists at scale by integrating Emaillistchecker.io’s bulk verification and real-time API into Akka Streams jobs. It filters out invalid, disposable, and risky addresses before campaigns launch, reduces bounce rates, and ensures sender reputation stays strong by catching issues early—without interrupting your streaming pipelines.
Bulk verification: pre-flight cleanup for high-volume campaigns
Before sending to thousands of recipients, run your entire list through bulk verification. This step removes invalid domains, syntax errors, and catch-all addresses that could trigger spam filters or harm your sender reputation. With 98.9% accuracy, Emaillistchecker.io identifies issues like non-existent mail servers or blocked IPs before they cause deliverability problems.
Use the bulk verification tool to process large datasets efficiently. It’s ideal for preparing lists before ingestion into Akka Streams or email service integrations like Mailchimp, HubSpot, or Klaviyo, where list quality directly impacts inbox placement.
Real-time API: enforce hygiene within the pipeline
Let’s say you’re building a real-time ingestion flow in Akka Streams. Each incoming email can be validated on-the-fly using Emaillistchecker.io’s API. This prevents bad data from propagating through your pipeline and ensures only verified, high-confidence addresses progress.
The API checks DNS records, validates MX records, identifies role-based addresses (like admin@ or sales@), and flags disposable domains—all in under 500ms. It integrates effortlessly with Scala-based systems, returning clear verdicts: valid, invalid, catch-all, risky, or disposable. You can then route messages accordingly: drop invalid ones, flag risky ones for review, or segment by confidence level for targeted outreach.
As part of your Akka Streams job, this validation layer acts as a guardrail—improving deliverability and sender reputation without adding complexity. For instance, RFC 5321 outlines how servers should respond to SMTP commands, and Emaillistchecker.io uses standardized responses to assess server behavior reliably.
You're not just checking syntax; you’re verifying real infrastructure. That’s why tools like Spamhaus and MxToolbox track domain behavior—so does our service, but in a way that automates cleanup at scale.
Why you should trust Emaillistchecker.io’s 98.9% accuracy
You should trust Emaillistchecker.io’s 98.9% accuracy because it’s based on real-world delivery logs and server responses, not hypothetical models. It doesn’t just check syntax or basic DNS—it verifies whether an address can actually receive mail, reducing false positives and negatives. The system combines DNS lookups, SMTP validation, and behavioral analysis to give you confidence that your mail will land in an inbox, not a trash folder or a catch-all limbo.
How real-world data drives reliability
The 98.9% figure isn’t theoretical—it comes from matching verification results against actual inbox delivery outcomes across thousands of campaigns. This includes bounce logs, delivery receipts, and open rates, giving the model a direct line to real email behavior. It’s the same principle used by industry gatekeepers like Spamhaus and MXToolbox to assess sender reputation and domain health.
Why catching-all domains don’t fool the system
Many tools flag every address that responds to SMTP as valid, including catch-all domains—where messages are accepted but often never reach the intended user. Emaillistchecker.io avoids this trap by testing for real inbox receipt potential. It doesn’t stop at "the server says yes"—it checks whether the email is likely to be processed and delivered to a person, not a queue.
Let’s say you’re using Akka Streams in Scala to verify a list of thousands of contacts. You don’t want to send to addresses that technically exist but never reach a real person. That’s where the accuracy matters: a false positive can hurt your sender reputation, trigger blocklists, and cost you deliverability.
By combining multiple layers—DNS resolution, SMTP handshake, and inbox placement signals—it delivers what you need: a clean, high-quality list. This is the same approach used by platforms like Mailgun and SendGrid to maintain strong deliverability over time.
For bulk processing, you can run a full verification directly from your pipeline or integrate with the real-time API. No need to worry about invalid addresses or wasted sends. Whether you’re onboarding users via Mailchimp or validating data at scale, the results are consistent and traceable.
At the end of the day, delivering email is about trust—not just in the technology, but in the data behind it. Emaillistchecker.io doesn’t promise perfection, but it gives you measurable, reliable verification that aligns with how email actually works in practice. If you’re building a resilient email pipeline in Scala with Akka, accuracy like this is not optional. It’s the foundation.
Final step: using verified data to improve deliverability and reputation
Verified data reduces invalid addresses before sending, directly lowering bounce rates. Lower bounce rates signal reliability to inbox providers, strengthening sender reputation over time.
With fewer bounces and fewer spam complaints, your messages are more likely to land in inboxes rather than spam folders. High engagement from valid recipients further improves deliverability metrics.
Every email sent to a verified address improves the odds of inbox placement. Maintaining list hygiene ensures your outreach remains effective, efficient, and sustainable.
Sources
- Catch-all addresses made up 9% of all emails checked in 2025 — over 1 billion addresses that can look valid but still bounce and damage sender reputation. — ZeroBounce Email List Decay Report (2025)
- A 2025 list quality analysis found 11.7% of emails are invalid and another 7.9% are risky (spam traps, disposable addresses), meaning 19.6% of a typical list can damage sender reputation. — Apollo.io sender reputation guide (2025)
Keep reading
- Free email checker tools: syntax, MX, SMTP, disposable and catch-all checks (complete guide)
- Mobile Keyboard Type Recommendations for Reducing Email Typos
- Email Validation Solutions That Check Country-Specific Email Syntax
- Fix Account Locked Due to Typo in Email During Recovery
- Tools to Check International Email Address Syntax and Validity in 2026
Ready to put this into practice? Emaillistchecker.io verifies emails with 98.9% accuracy — start with 100 free verifications.
Frequently asked questions
Can I run DNS and SMTP checks in real-time with Akka Streams?
Yes, using Akka HTTP or a custom TCP client within a map stage. You must manage timeouts, retries, and concurrency carefully.
What’s the difference between DNS and SMTP checks?
DNS checks verify domain existence and mail server configuration. SMTP checks confirm if an email address can receive mail.
Why do some email addresses pass DNS and SMTP but still bounce?
Some servers accept mail locally but reject it later due to content, sender reputation, or spam filtering—validation is not foolproof.
How does Emaillistchecker.io handle catch-all domains?
It detects catch-all domains and flags them as risky, reducing false positives from mail servers that accept all addresses.
Can Emaillistchecker.io be used in a Java or Scala production pipeline?
Yes. Its REST API supports any language with HTTP clients, including Scala via Akka HTTP or Play WS.
Do purchased credits on Emaillistchecker.io expire?
No. Credits never expire, and you start with 100 free verifications.
What’s the best way to integrate email verification in a streaming job?
Use Emaillistchecker.io’s real-time API with proper error handling, retry logic, and load control to maintain throughput.
Does Emaillistchecker.io test inbox delivery?
Yes. The inbox-placement feature simulates real delivery to estimate whether messages will land in the inbox.
Can I avoid sending to disposable emails using Emaillistchecker.io?
Yes. The tool detects and flags disposable domains as part of its verification process.
How accurate is Emaillistchecker.io compared to a custom DNS/SMTP setup?
Emaillistchecker.io achieves 98.9% accuracy in practice, significantly higher than most custom implementations due to additional behavioral and historical data.
Is Emaillistchecker.io compatible with Mailchimp and SendGrid?
Yes. It integrates with Mailchimp, SendGrid, Klaviyo, and HubSpot for automated list cleaning and verification.
What’s the risk of validating too many emails too fast?
You can be blacklisted by mail servers or IP blocks. Always use rate limits, concurrency controls, and proper delays.